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()