BackupUpload

Esse script serve para copiar o arquivo mais recente cujo nome atenda a uma determinada máscara, para outro servidor via SCP. É útil para copiar um arquivo de backup, por exemplo, de um servidor para outro.

CÓDIGO

#!/usr/bin/python
# -*- coding: UTF-8 -*-
# Programa: backupUpload.py
# Função..: Faz upload do arq. de backup mais recente por scp para
#           um servidor especificado.
# Autor...: Megumi Jr. ([email protected])
VERSION = "1.1"
#
# Historico de versoes:
# v1.1: 
#  - Adicionada exibicao do nome do arquivo na msg de log.
#  - Adicionado parâmetro para porta SSH

import commands, getopt
import os, sys, time, glob

#Variáveis globais
SCRIPTNAME = ""                          # Nome desse script
MATCH = ""                               # Padrão de pesquisa
DEST = ""                                # Host de destino
PORT = "22"                              # Porta do SSH
TEST = False
SILENT = False

def main():
   global TEST, SCRIPTNAME, MATCH, DEST, PORT, SILENT

   #Obtem argumentos
   getArgs()
   
   #Início
   printLogMsg("Inicio de execucao.", SILENT)

   #Envia arquivo
   uploadFile(MATCH, DEST, PORT, TEST, SILENT)
   
   #Fim
   printLogMsg("Fim de execucao.", SILENT)
#end main


def getArgs():
   """Obtem e faz consistência dos argumentos"""
   global TEST, SCRIPTNAME, MATCH, DEST, PORT, SILENT

   #Captura parâmetros
   try:
      opts, args = getopt.getopt(sys.argv[1:], "htsm:d:p:", \
         ["help", "test", "silent", "match=", "dest=", "port="])
   except getopt.GetoptError, err:
      # print help information and exit:
      print str(err) # will print something like "option -a not recognized"
      usage()
      sys.exit(2)
   #endTry
   
   #Obtem o nome do script
   SCRIPTNAME = os.path.basename(sys.argv[0])
   
   #Trata opções
   MATCH = None
   for o, a in opts:
      if o in ("-h", "--help"):
         usage()
         sys.exit()
      elif o in ("-t", "--test"):
         TEST = True
      elif o in ("-s", "--silent"):
         SILENT = True
      elif o in ("-m", "--match"):
         MATCH = a
      elif o in ("-d", "--dest"):
         DEST = a
      elif o in ("-p", "--port"):
         PORT = a
      else:
         assert False, "unhandled option"
   #endfor
   
   #Verifica argumentos
   errmsg = ""
   if (opts == []): #Se não houver parametro nenhum...
      errmsg = "missing options"
   else:
      if (MATCH == None):
         errmsg = "missing option: -m"
      elif (MATCH == SCRIPTNAME) or (MATCH == ""):
         errmsg = "invalid argument for -m"
      #endIf
      if (DEST == None):
         errmsg = "missing option: -d"
      #endIf
   #endIf
   if (errmsg != ""):
      print errmsg
      usage()
      sys.exit(2)
   #endIf

#endDef   


def usage():
   """Exibe help"""
   global VERSION
   print 
   print "BackupUpload v", VERSION
   print
   print "Uso: backupUpload [-h]|[-t -s] -m {mascara} -d {destino}"
   print 
   print "Realiza upload por scp ao servidor de destino, do arquivo mais recente "
   print "que atenda a mascara especificada."
   print
   print "Opções:"
   print "-h, --help    Exibe o help de comandos."
   print "-m, --match   Mascara que especifique o nome de arquivo desejado"
   print "              para envio. Deve ser especificado com o caminho e"
   print "              entre aspas."
   print "-d, --dest    Destino do arquivo no memso formato do scp:"
   print "              usuario@host:/caminho_de_destino/"
   print "-p, --port    Porta do servico SSH do servidor. (default 22)"
   print "-t, --test    Exibe comando scp, sem executa-lo."
   print "-s, --silent  Nao exibe mensagens."
   print
   print "Exemplo:"
   print 'backupUpload -m "/backup/backupdodia*.bkp" -d [email protected]:/backups/ -p 2222'
   print
   
#endDef

def uploadFile(match, dest, port, test, silent):
   """Envia arq. mais recente do padrão 'match', para 'dest'"""

   printLogMsg("Verificando arquivos...", silent)
   
   #Processa arquivos que atendam ao padrão
   files = filter(os.path.isfile, glob.glob(match))
   
   #Classifica os arquivos por data descendente
   files.sort(key=lambda x: os.path.getmtime(x))
   files.reverse()

   #Identifica arquivo mais recente
   file_name = ""
   for fname in files:
      fn = os.path.basename(fname)
      if (fn != os.path.basename(sys.argv[0])): #evita o arquivo do script
         file_name = fname
         break
      #endIf
   #endFor
   if (file_name == ""):
      printLogMsg("Nenhum arquivo localizado...", silent)
      sys.exit(2)
   #endIf
   
   #Envia arquivo
   dest = dest.strip()
   if (dest[len(dest)-1:] != "/"):
      dest += "/"
   #endIf
   dest += os.path.basename(file_name)
   cmd = "scp -P%s -C %s %s" % (port, file_name, dest)
   if (test == True):
      printLogMsg(cmd, silent)
   else:
      msg = "Iniciando upload do arq. %s" % (os.path.basename(file_name))
      printLogMsg(msg, silent)
      var = commands.getoutput(cmd)
      if (var.strip() != ""):
         printLogMsg(var, silent)
      else:
         printLogMsg("Upload bem sucedido!", silent)
      #endIf
   #endIf
#end cleanUpFiles   

#----- Funções Genericas -----------------------------------------------

def printLogMsg(msg, silent):
   """Imprime mensagem de log com data e hora correntes."""
   if (silent == True):
      return
   #endIf
   t = time.localtime(time.time())
   lmsg = "%02d/%02d/%d %02d:%02d - %s" % (t[2], t[1], t[0], t[3], t[4], msg)
   print lmsg
   sys.stdout.flush()
   return
#end printLogMsg


if __name__ == "__main__":
   main()

 

Os comentários estão desativados.