Gestione delle patch per Attacco/Difesa
Questo file semplifica la gestione delle patch dei servizi. Esso permette di patchare uno o più file per poi ritornare indietro con le versioni.
Il file deve essere posizonato nella directory home dove son presenti i servizi delle AD
Per invocarlo: python3 patcher.py.
python3 patcher.py argsQuando viene avviato senza argomenti, patcher trova automaticamente e mappa i servizi (porte, nome e percorso) su un file json che utilizzerà ogni volta patcher sarà richiesto.
Per essere considerato servizio, deve riuscire a localizzarlo nel disco e a mapparlo nei servizi attivi di docker.
Quando il servizio è mappato correttamente viene inserito un makefile che consente di gestire il docker in maniera rapida (vedi sezione makefile).
python3 patcher.pyStruttura del file json generato
[
{
'directory':s.path, //Percorso dove si trovano i sorgenti del servizio
'name':s.name, //Nome del servizio
'in_port':str(s.port[0]), //Porta interna
'out_port':str(s.port[1]), //Porta esterna
'alias':s.alias //Nome del servizio (mnemonico)
},
...
]Il file json viene generato in
patcher/services.json
I servizi possono essere editati:
- manualmente nel file services.json
- automaticamente usando
python3 patcher.py configure
Usando configure viene usato un for-loop per iterare fra i servizi e modificare gli alias assegnati. Per terminare l'assegnazione è sufficiente usare CTRL+C.
Una volta che il servizio funziona correttamente, si può salvare il sorgente del servizio usando il comando checkpoint.
Questo comando consente di fare un backup del sorgente da cui recuperare i file nel caso di eventuale eliminazione o rottura del servizio.
python3 patcher.py alias_servizio
# oppure
python3 patcher.py nome_servizio
# oppure
python3 patcher.py path_del_servizioOgni file può essere modificato in avanti (applicando una patch) o all'indietro (ripristinando una versione).
Prendiamo per esempio un'albero di file di alcuni servizi d'esempio:
Serv1/ -> main.py -> img/ --> loader.py
Serv2/ -> wifi_loader -> README.md
La sintassi per l'applicazione della patch è
old_file=new_file. old_file deve essere necessariamente un file esistente all'interno del servizio, non è possibile operare al di fuori.Allo stesso modo old_file può essere composto in diversi modi:
absolute_path_to_fileo<service_alias>/relative_path_to_fileorelative_path_to_file.Il new_file invece sarà un percorso relativo o assoluto del file contenente la patch.
Esempio: ho sistemato il file loader.py creando un nuovo file
patch_loader.pye lo voglio applicare
python3 patcher.py alias_serv1/img/loader.py=../patch_loader.pyOppure
python3 patcher.py Serv1/img/loader.py=../patch_loader.pyPiù file possono essere patchati contemporaneamente, aggiungendo dei file
python3 patcher.py old_file1=new_file1 old_file2=new_file2 ...Le regole di scrittura di old_file sono uguali alla sezione di patch.
Per il ripristino di un file, è necessario specificare il file richiesto per poi determinarne la versione.
Esempio: vogliamo che loader.py torni alla versione pre patch
python3 patcher.py Serv1/img/loader.py=-1Esempio2: vogliamo che un file torni alla sua versione n.3
python3 patcher.py file=2Anche qua è possibile ripristinare più file:
python3 patcher.py file1=target_version1 file2=target_version2 ...Questa è un'opzione speciale che è presente nella parte di ripristino.
Infatti se si specifica il nome del servizio e la versione (Serv1=versione) è possibile ripristinare l'intero servizio a quella versione.
Se però è stata applicata una patch e si vuole preservare il file patchato è possibile escludere quel file (o più file) dal ripristino.
python3 patcher.py Serv1=-1 file1_to_preserve file2_to_preserveIn aggiunta a questo, dopo il ripristino possono anche essere eseguite delle patch!!
python3 patcher.py Serv1=-1 file1_to_preserve file_to_patch=path_to_patch-q: si avvia in modo silenzioso, non mostra crediti e versione--no-bkp: non esegue il backup del file prima di sostituirlo con la versione di patch--no-docker: una volta finita l'operazione con i file non eseguirà la compilazione con docker--hard-build: porta giù il container e lo riporta su (comporta l'eliminazione dei dati non salvati). Per utilizzarla è necessario non sia presente--no-docker-vo--verbose: stampa diversi output-y: non chiede conferma all'utente su una determinata operazione ma la esegue automaticamente--strict:
Il makefile viene creato all'interno di ogni servizio automaticamente.
Il makefile contiene una scorciatoia per eseguire il soft reboot del servizio.
make softIl comando di prima equivale a
sudo docker-compose build && sudo docker-compose up --build -d
Attenzione, l'hard reboot cancella tutti i dati non salvati in volumi.
make hardIl comando di prima equivale a
sudo docker-compose build && sudo docker-compose down && sudo docker-compose up --build -d