#!/usr/bin/python
#
# mtsqld.py
#
# Consuma una coda di script verso un comando.
# Gli script eseguiti con successo sono eliminati o spostati su cartella di backup.
# In caso di errore tenta di rieseguirli dopo 5 secondi.
#
# Viene passato come unico parametro il nome del JOB.
# I parametri del JOB passato sono letti da risorse.txt.
#

import sys
import subprocess
import time
from os import listdir
from os import rename
from os.path import isfile, join

# interpreta il parametro passato
if (len(sys.argv) <> 2):
   print "Errore: invocare con parametro JOB"
   sys.exit(1)

job = sys.argv[1]

# ciclo infinito (e' un daemon!)
while (1):
   # legge risorse.txt e lo copia ripulito sulla lista risorse
   risorse = [line.rstrip('\n').rstrip('\r').strip().replace("\t", " ") for line in open('risorse.txt')]
   for line in risorse[:]:
      if (line.startswith(('#', '\r')) or line == ''):
         risorse.remove(line)

   # estre i parametri che ci servono:
   # MTSQLD-JOB-QUEUE   percorso cartella da scansionare
   # MTSQLD-JOB-BACKUP  percorso cartella backup
   # MTSQLD-JOB-COMMAND comando 
   # MTSQLD-JOB-LOG     file di log
   for line in risorse[:]:
      word = line.split(" ", 1)
      # print word[0], word[1]
      if (word[0] == 'MTSQLD-' + job + '-QUEUE'):
         queue = word[1].strip()
      elif (word[0] == 'MTSQLD-' + job + '-BACKUP'):
         backup = word[1].strip()
      elif (word[0] == 'MTSQLD-' + job + '-COMMAND'):
         command = word[1].strip()
      elif (word[0] == 'MTSQLD-' + job + '-LOG'):
         log = word[1].strip()

   if 'queue' not in locals():
      print "Errore: non trovato parametro 'MTSQLD-" + job + "-QUEUE'"
      sys.exit(1)

   if 'command' not in locals():
      print "Errore: non trovato parametro 'MTSQLD-" + job + "-COMMAND'"
      sys.exit(1)

   # processa i job presenti in coda
   onlyfiles = [f for f in sorted(listdir(queue)) if isfile(join(queue, f))]
   for file in onlyfiles[:]:
      # rimpiazza il nome del file da consumare nella stringa del comando
      cmd = command.replace("%%INPUT%%", join(queue, file))
      # esegue il comando
      exit_code = subprocess.call(cmd, shell=True)
      if exit_code == 0:
         # se processato senza errori toglie il job dalla coda
         if 'backup' in locals():
            # e lo muove nella cartella di backup se prevista
            rename(join(queue, file), join(backup, file))
         else:
            # altrimenti lo cancella semplicemente
            remove(join(queue, file))
      else:
         # in caso di errore di esecuzione fa pausa di 5 secondi, interrompe l'esecuzione della coda e riprova
         time.sleep(5)
         break

   # un secondo di pausa prima del prossimo ciclo
   time.sleep(1)