[Risolto] Creazione script per invio informazioni al forum

Bash, Perl, Python, Ruby, ...

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda s3v » 28/12/2014, 18:50

Dimenticato di convertire ciò che si ottiene dal comando (&lt;) con il carattere corretto (<).
Colpa mia che, come sempre, non controllo a fondo quando modifico qualcosa.
Grazie ;)
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda Aki » 28/12/2014, 19:34

Grazie a te per il rapidissimo intervento.

Se lo ritieni opportuno, potrebbe essere utile nella sede di questa discussione spiegare la sintassi del comando sed utilizzata in congiunzione con il comando wget per il download facilitato dello script.
Aki
Global Moderator
Global Moderator
 
Messaggi: 7750
Iscritto il: 27/12/2007, 16:59

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda s3v » 28/12/2014, 22:18

Mi sembra giusto.

Faccio una premessa importante: il motore mediawiki interpreta alcuni caratteri, per cui bisogna adattarsi.
Se si scarica il sorgente della pagina:
Codice: Seleziona tutto
wget -q -O sorgentepaginawiki "http://guide.debianizzati.org/index.php?title=Creazione_automatica_di_un_file_di_log_per_inviare_quesiti_al_forum&action=edit"

si vede che molti caratteri sono convertiti internamente in codice HTML.
"<" è diventato "&lt;"
"&" è diventato "&amp;"
Quando si visualizza la pagina del Wiki, queste stringhe vengono visualizzate correttamente (riconvertite) nei caratteri che ci si aspetta, il problema è che il comando preleva il "sorgente" della pagina per cui bisogna sostituire necessariamente tutte le stringhe "&lt;" con "<" e tutte le stringhe "&amp;" con "&".

Procedo.
sed -n
Questa opzione è necessaria per far funzionare il successivo "p".
/^== Script/
sed inizia a elaborare il file ottenuto con wget riga per riga, quando incontra una riga che inizia (carattere ^) per "== Script" allora elabora le istruzioni contenute tra parentesi graffe.
Il blocco / .... / indica che le istruzioni seguenti tra parentesi si applicheranno solo a questa riga.
primo n
sed all'inizio si trova sulla riga che comincia per "== Script" ma questa non ci interessa e non va inserita nel file finale. L'istruzione "n" (next) passa alla riga successiva.
:a n
La riga successiva contiene "<pre>" e neppure questa deve essere contenuta nel file finale. Questa istruzione, come la precedente passa alla riga successiva (n). C'è un'etichetta (a) contrassegnata dai due punti e il cui nome è ininfluente (potrebbe essere :b :c :d :z). L'etichetta è necessaria per marcare un punto e implementare una sorta di ciclo (come avveniva per il vecchio GOTO) senza uscire dalle parentesi graffe.
/^&lt;/ !
Ora la riga contiene "#! /bin/bash" e deve essere inserita nel file finale. Viene definito un secondo blocco che ha corrispondenza con tutte le righe che *non* (carattere !) iniziano con "&lt;". Le successive istruzioni tra graffe si applicheranno solo a questo blocco.
Notare che nel sorgente si ha "&lt;" ma nella pagina del wiki si vede il carattere "<". Questo blocco può essere cambiato in "&lt;\/pre>". L'ho mantenuto perché occupa meno spazio.
s/\&amp;/\&/g
Siamo ancora sulla riga che inizia con "#! /bin/bash" (in quanto non inizia con "&lt;").
Questa istruzione sostituisce (s) la stringa "&amp;" con "&" in tutte le occorrenze (g) della riga. Senza "g" verrebbe sostituita solo la prima occorrenza trovata.
s/\&lt;/</g
Come sopra.
La sostituzione avviene tra "&lt;" e "<".
Notare il carattere di escape "\" necessario all'interno della sostituzione poiché il carattere "&" è un carattere speciale.
p
stampa la riga corrente in output
ba
salta all'etichetta definita prima in base al nome scelto (potrebbe essere anche bb bc bd bz).

A questo punto si ritorna all'etichetta "a" a cui corrisponde l'istruzione "n". Si passa alla riga successiva e ricomincia il tutto.

Quando viene incontrata una riga che inizia per "&lt;" (aka "<") allora le istruzioni tra le graffe interne non vengono eseguite (in particolare non viene eseguita la "p") e sed questa volta passa alla riga successiva senza utilizzare il ciclo. Da questo punto in poi non accade più nulla in quanto non esistono più righe che cominciano per "== Script" e sed legge fino alla fine del file e poi termina.
Le righe stampate con "p" sono reindirizzate al file "nomefile".

Il comando per funzionare ha bisogno che:
- Esista solo una riga che inizi con "== Script"
- Questa riga sia separata da "#! /bin/bash" da un'unica altra riga.
- All'interno dello script non esistano righe che inizino con "&lt;" (aka carattere "<")

Bisognerebbe controllare quanti accessi in scrittura avvengono per il file "nomefile". Se uno solo o uno per ogni ciclo, in quest'ultimo caso il comando andrebbe modificato per avere un'unica istruzione di print che stampi il contenuto dell'hold space (riempito con N anziché utilizzare n).

P.S. scusate l'"aka"
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda s3v » 07/03/2015, 20:27

Quando lancio lo script compare a video:
Codice: Seleziona tutto
[•]  Firmware[ ]  Pacchetti esterni

con le due righe attaccate.
Il problema,stranamente, riguarda la funzione _firmware. Infatti, commentandola:
Codice: Seleziona tutto
...
  _comando "/usr/bin/apt-get check"
#  _firmware
  _extpack
...

il problema non si presenta.
Capita anche a voi? Se sì, sapete come risolvere?
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda s3v » 07/03/2015, 22:18

Il problema era qui:
Codice: Seleziona tutto
dpkg -l | grep -i firmware >> "$log" && _ok

Il comando:
Codice: Seleziona tutto
$ dpkg -l | grep -i firmware

non restituiva output e:
Codice: Seleziona tutto
$ dpkg -l | grep -i firmware
$ echo $?
1

Quindi non veniva eseguita la funzione _ok (che stampa il pallino e va a capo).
Si risolve con:
Codice: Seleziona tutto
dpkg -l | grep -i firmware >> "$log" && _ok || _error
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda s3v » 16/04/2015, 13:50

marcomg ha scritto:Buona idea, python3 si?


Ho comprato un libro di Python e penso di scrivere usando Eclipse+Python3+git
Il mio account è ancora attivo? IDE grafici da suggerire con supporto a git senza dover capire come funzionano? :)
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda marcomg » 16/04/2015, 14:01

Si, l'account dovrebbe rimanere attivo. Comunque io opterei per eclipse ;D
Windows is what you open when you want fresh air from outside.
Avatar utente
marcomg
Global Moderator
Global Moderator
 
Messaggi: 5534
Iscritto il: 22/08/2011, 18:54

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda s3v » 16/04/2015, 19:45

Configurato Eclipse + Egit (pacchetto "eclipse-egit") + PyDev (pacchetto "eclipse-pydev" da Sid): tutto ok.
@marcomg
Fatto un commit e un push ma: "git-receive-pack not permitted". Devi consentirmi le modifiche altrimenti non va ;)
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda s3v » 29/04/2015, 13:07

Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda marcomg » 30/04/2015, 10:02

Ah ah ah, siamo diventati famosi ;) Speriamo sia un contributo a doppio senso e non a senso unico...
Windows is what you open when you want fresh air from outside.
Avatar utente
marcomg
Global Moderator
Global Moderator
 
Messaggi: 5534
Iscritto il: 22/08/2011, 18:54

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda HAL 9000 » 04/05/2015, 12:33

Possibili aggiunte:
- in caso la connessione Internet funzioni, controllo di versione e aggiornamento automatico dello script;
- lettura automatica dei codename di stable, testing, oldstable e oldoldstable direttamente dall'output di "apt-cache policy", se le informazioni di APT sono aggiornate (timestamp di /var/lib/apt/extended_state?), oppure con controllo da almeno un file Release dei rispettivi repository (con salvataggio in /var/tmp/).
Ricordarsi di modificare il primo messaggio della discussione per aggiungere [RISOLTO] prima del titolo, quando conclusa.

Wiki: APT e Repository, Comandi utili, Collabora.
Manuali di Debian 9 "Stretch" (amd64): installazione, aggiornamento da Debian 8.
Avatar utente
HAL 9000
wiki member
wiki member
 
Messaggi: 1483
Iscritto il: 10/08/2009, 10:01

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda marcomg » 04/05/2015, 12:54

Ma non sarebbe meglio hostare lo script su bitbucker, github o altro servizio? Almeno si ha una gestione delle versioni più facile!
Windows is what you open when you want fresh air from outside.
Avatar utente
marcomg
Global Moderator
Global Moderator
 
Messaggi: 5534
Iscritto il: 22/08/2011, 18:54

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda HAL 9000 » 04/05/2015, 13:07

Perderebbe però la sua natura di progetto collaborativo e aperto a tutti, anche se ne guadagnerebbe nel garantire che ogni versione è stata approvata da qualcuno di fiducia.
Forse si potrebbe dedicare il lab specificatamente a questo progetto e altri eventuali progetti collettivi di debianizzati.org? Con indicazione di un account e una password di default per l'upload.

Prima di pubblicarlo ci sarebbe anche da considerare la licenza, che al momento (essendo quella della Wiki) è non libera, per via della clausola sull'uso "non commerciale". Ci vorrebbe il consenso di tutti quelli che hanno contributo per cambiarla, ma penso che andrebbe fatto almeno per quello script.
Se si può chiudere un occhio per la documentazione, in fondo anche quella di vari progetti GNU ha clausole simili, sarebbe ironico che lo script di debianizzati.org non risulti pienamente come software libero.

Inoltre, almeno secondo me, lo script andrebbe diviso in più parti prima, così da facilitarne la leggibilità e le future aggiunte. :)
Ricordarsi di modificare il primo messaggio della discussione per aggiungere [RISOLTO] prima del titolo, quando conclusa.

Wiki: APT e Repository, Comandi utili, Collabora.
Manuali di Debian 9 "Stretch" (amd64): installazione, aggiornamento da Debian 8.
Avatar utente
HAL 9000
wiki member
wiki member
 
Messaggi: 1483
Iscritto il: 10/08/2009, 10:01

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda s3v » 04/05/2015, 13:48

HAL 9000 ha scritto:in caso la connessione Internet funzioni, controllo di versione e aggiornamento automatico dello script;

Penso tu intenda un'opzione dello script che ne effettui l'aggiornamento e *non* un aggiornamento senza che l'utente ne sappia qualcosa ;)
HAL 9000 ha scritto:lettura automatica dei codename di stable, testing, oldstable e oldoldstable direttamente dall'output di "apt-cache policy"

Ho cercato a lungo in passato e non sono riuscito a trovare un modo che automaticamente ricavasse la corrispondenza suite/codename, Bisogna tener conto anche di un eventuale pinning che porta ad avere in "sources.list" più di una suite/codename.

La modifica delle guide da parte di "tutti" è una base fondante del Wiki per cui, comunque si decida i procedere, la possibilità di modifica va garantita.
A mio parere sarebbe opportuno pacchettizzare lo script ma mantenendo una fonte aperta a tutti.
Il problema è che non c'è un posto in cui postare il pacchetto .deb :)

Inoltre lo script è diventato lunghissimo e praticamente incomprensibile (nonostante i commenti) per cui (io e marcomg) abbiamo deciso di riscriverlo in Python (linguaggio che, va detto, conosciamo e padroneggiamo da anni :) )

EDIT
Dimenticavo la licenza.
I contenuti del Wiki sono rilasciati con licenza CC-BY-SA 2.0 che è incompatibile con le DFSG.
Si può modificare la licenza come CC-BY-SA 3.0 o GPL 3 ma, come scriveva HAL 9000, serve il consenso di coloro che lo hanno modificato. Per me nulla osta.
https://wiki.debian.org/DFSGLicenses#Cr ... SA.29_v3.0
Avatar utente
s3v
Global Moderator
Global Moderator
 
Messaggi: 5503
Iscritto il: 31/12/2008, 11:54

Re: [Risolto] Creazione script per invio informazioni al for

Messaggioda HAL 9000 » 04/05/2015, 14:12

Sì, la shell è orrenda come linguaggio di programmazione non appena si supera una certa lunghezza. L'unico vantaggio è nella portabilità e nel non richiedere software esterno, se si usa solo quello sempre (o quasi) presente nel sistema.
Con Python io ho rinunciato dopo i casini delle ultime versioni, anche se avevo iniziato ad approfondirlo, e ora non saprei più usarlo oltre qualcosa di banale, ma ha sicuramente senso, soprattutto se si vuole distribuire come pacchetto deb.

La licenza attuale è la CC-BY-NC-SA 2.0, ed è la clausola NC a renderla una licenza non libera.

Ovviamente mi esprimo a favore del cambio di licenza verso CC-BY-SA o GPL 3, ma preferirei la GPL 3+, che credo sia più diffusa per progetti software (inoltre non ha l'obbligo di attribuzione) e sarebbe compatibile anche con future versioni della GPL. Ora però restano da contattare anche Aki, metaldaze e Selky.
Ricordarsi di modificare il primo messaggio della discussione per aggiungere [RISOLTO] prima del titolo, quando conclusa.

Wiki: APT e Repository, Comandi utili, Collabora.
Manuali di Debian 9 "Stretch" (amd64): installazione, aggiornamento da Debian 8.
Avatar utente
HAL 9000
wiki member
wiki member
 
Messaggi: 1483
Iscritto il: 10/08/2009, 10:01

PrecedenteProssimo

Torna a Scripting

Chi c’è in linea

Visitano il forum: Nessuno e 2 ospiti