Pakrunner je Spring REST servis za kontrolu i monitoring dugotrajnih proračuna. Servis je nastao iz potrebe da se dugotrajni proračuni zasnovani na metodi konačnih elemenata pokreću preko standardizovanog REST interfejsa iz bilo koje aplikacije, sa bilo kojeg operativnog sistema, običnim HTTP pozivima. Pored mogućnosti pokretanja proračuna, servis omogućava i mnoge druge funkcionalnosti, kao što su čitanje logova u realnom vremenu, rad sa posebnim poslovima, upit statusa, operacije sa fajlovima i direktorijumima, upload ulaznih fajlova, preuzimanje rezultata proračuna itd.
Zamišljeno je da servis radi u okviru bezbednog okruženja, kao što je VPN (Virtual Private Network), pa u protokol za sada nije ugrađeno ništa od sigurnosnih protokola. Implementacija sigurnosnih mehanizama planirana je za narednu verziju. Servis je napisan korišćenjem programskog jezika Java, kao i dodatnih biblioteka. Neke od dodatnih biblioteka su Jackson
za rad sa JSON dokumentima i Apache Commons
za rad sa fajl sistemom. Za izgradnju se koristi Maven
. Iako je softver testiran samo na Linux-u, trebalo bi da bez problema funkcioniše i na drugim operativnim sistemima koji podržavaju Javu, obzirom da su tokom razvoja izbegavani direktni sistemski pozivi.
Konfiguracija se nalazi u fajlu application.properties
, koji postavlja sledeće varijable:
# Direktorijum u kome se nalaze fajlovi potrebni za proračune
MASTER_DIR = /home/milos/pakrunner/master
# Radni direktorijum u kome se kreiraju poddirektorijumi sa poslovima
RESULT_DIR = /home/milos/pakrunner/proracuni
# Komanda za terminaciju stabla procesa (argument je naziv posla)
KILL_PROCESSES_COMMAND = /home/milos/pakrunner/kill_processes.sh
# Naziv log fajla
LOG_FILE = pak.log
# Naziv ZIP-a sa rezultatima proračuna
RESULT_ZIP = results.zip
Osnovna jedinica rada je posao, koji se kreira pozivom /createnew
, kopiranjem sadržaja direktorijuma MASTER_DIR
u direktorijum RESULT_DIR/GUID
. Kopiranje direktorijuma NIJE rekurzivno. Ukoliko dati posao već postoji, nastaje greška. Kreiranje posla NE POKREĆE proračun, već ga samo priprema.
curl -d '{"guid":"3333-4444"}' -H "Content-Type: application/json" -X POST http://147.91.200.5:8081/pakrunner/rest/api/createnew
Izlaz većine poziva je JSON, sa dva obavezna polja. Prvo polje je status
operacije, koje može biti true
ili false
, u zavisnosti da li je poziv ispravno obavljen ili je došlo do greške. Drugo obavezno polje povratnog JSON-a je message
, koje u slučaju greške sadrži njen bliži opis. U nastavku će biti dati pojedinačni pozivi, sa nekim specifičnim detaljima.
Za svrhu testiranja odziva servisa i ispravnosti JSON-a u smislu formata, postoji poziv koji vraća isti JSON koji mu je poslat:
curl -d '{"guid":"3333-5555", "command":"./proba.sh"}' -H "Content-Type: application/json" -X POST http://localhost:8080/pakrunner/echo
Kreiran posao se ne pokreće automatski. Potrebno je uz GUID navesti i komandu koja pokreće proračun:
curl -d '{"guid":"3333-4444", "command":"./proba.sh"}' -H "Content-Type: application/json" -X POST http://localhost:8080pakrunner/start
Status pokrenutog posla se može ispitati upitom. Vraća se true
u slučaju da proračun trenutno radi, kao i vreme u sekundama koje je proveo u tekućem statusu:
curl -H "Content-Type: application/json" -X GET http://localhost:8080/pakrunner/isrunning/3333-4444
Posao se može u svakom trenutku zaustaviti jednostavnim pozivom. Terminacija procesa implicira i terminaciju procesa koje je osnovni proces eventualno pokrenuo.
curl -d '{"guid":"3333-4444"}' -H "Content-Type: application/json" -X POST http://localhost:8080/pakrunner/stop
Vraća se GUID trenutno aktivnog posla i status true
u slučaju da bilo koji proračun trenutno radi. U suprotnom se vraća status false
i prazan string za GUID.
curl -H "Content-Type: application/json" -X GET http://localhost:8080/pakrunner/runningtask
Lista tekućih poslova u direktorijumu RESULT_DIR može se dobiti sledećim GET pozivim:
curl -H "Content-Type: application/json" -X GET http://localhost:8080/pakrunner/tasklist
Poslednjih n
linija loga za posao GUID. Ako je n
=0, preuzima se ceo log:
curl -H "Content-Type: application/json" -X GET http://localhost:8080/pakrunner/logtail/3333-4444/4
za posao GUID, preuzimanje celog loga u formi priloga (attachment), vrši se pomoću:
curl -H "Content-Type: application/json" -X GET http://localhost:8080/pakrunner/logdownload/3333-4444
Rezultati (ili bilo koji fajlovi u argumentu files
) iz nekog posla se mogu preuzeti u formi priloga pomoću poziva:
curl -d '{"guid":"3333-4444", "files":["proba.sh","pak.log"]}' -H "Content-Type: application/json" -X POST http://localhost:8080/pakrunner/getresults --output rezultati.zip
Ceo posao se može ukloniti. Pre toga se zaustavlja ukoliko je proračun bio aktivan:
curl -H "Content-Type: application/json" -X GET http://localhost:8080/pakrunner/remove/3333-4444/
Svi poslovi se mogu obrisati jednim GET pozivom:
curl -H "Content-Type: application/json" -X GET http://localhost:8080/pakrunner/removeall
Upload i raspakovavanje ZIP fajla u radni direktorijum posla GUID vrši se sledećim pozivom:
curl -F 'file=@proba.zip' -F 'guid=3333-1111' -X POST http://localhost:8080/pakrunner/uploadzip
Kopiranje se vrši iz osnovnog MASTER_DIR ili nekog njegovog podfoldera u radni direktorijum posla GUID. Navodi se relativna putanja fajla koji se kopira i ciljno ime fajla:
curl -d '{"guid":"3333-1111", "path":"L10/ttt.txt", "name":"ttt-kopija.txt"}' -H "Content-Type: application/json" -X POST http://localhost:8080/pakrunner/localcopy
Kopiranje se vrši iz radnog direktorijuma guidsrc
u direktorijum guiddest
, pri čemu je moguće zadati i novo ime fajla.
curl -d '{"guidsrc":"3333-1111", "guiddest":"3333-2222", "namesrc":"pom.xml", "namedest":"pom.xml"}' -H "Content-Type: application/json" -X POST http://localhost:8080/pakrunner/copyfiletasktotask
U svrhu brisanja fajla iz radnog direktorijuma posla, koristi se sledeći poziv. Može se navesti i relativna putanja.
curl -d '{"guid":"3333-1111", "path":"ttt.txt"}' -H "Content-Type: application/json" -X POST http://localhost:8080/pakrunner/removefile
U svrhu preimenovanja fajla iz radnog direktorijuma posla, koristi se sledeći poziv. Mogu se navesti i relativne putanje.
curl -d '{"guid":"3333-1111", "pathold":"Ulaz.csv", "pathnew":"Ulaz1.csv"}' -H "Content-Type: application/json" -X POST http://localhost:8080/pakrunner/renamefile
Ako je path
prazan, lista se radni direktorijum GUID, a ako path
nije prazan string, vraća se sadržaj direktorijuma MASTER_DIR/path
! Vraća posebno niz fajlova, a posebno niz direktorijuma.
curl -d '{"guid":"3333-4444", "path":"/L10"}' -H "Content-Type: application/json" -X POST http://localhost:8080/pakrunner/listfiles
Ovaj poziv se koristi za razne pomoćne skriptove (kopiranje, brisanje, promena prava pristupa...) za koje se ne očekuje da dugo traju. Poziv je blokirajući, a ovakvi pozivi se loguju u poseban log fajl pod nazivom shorttask.log
.
curl -d '{"guid":"3333-4444", "command":"./proba1.sh"}' -H "Content-Type: application/json" -X POST http://localhost:8080/pakrunner/runshorttask