{"id":314,"date":"2017-11-07T16:28:54","date_gmt":"2017-11-07T18:28:54","guid":{"rendered":"http:\/\/megumijr.com\/blog\/?page_id=314"},"modified":"2017-11-07T16:28:54","modified_gmt":"2017-11-07T18:28:54","slug":"backupupload","status":"publish","type":"page","link":"https:\/\/megumijr.com\/blog\/biblioteca-de-scripts\/backupupload\/","title":{"rendered":"BackupUpload"},"content":{"rendered":"<p>Esse script serve para copiar o arquivo mais recente cujo nome atenda a uma determinada m\u00e1scara, para outro servidor via SCP. \u00c9 \u00fatil para copiar um arquivo de backup, por exemplo, de um servidor para outro.<\/p>\n<h3>C\u00d3DIGO<\/h3>\n<pre>#!\/usr\/bin\/python\r\n# -*- coding: UTF-8 -*-\r\n# Programa: backupUpload.py\r\n# Fun\u00e7\u00e3o..: Faz upload do arq. de backup mais recente por scp para\r\n#           um servidor especificado.\r\n# Autor...: Megumi Jr. (mail@megumijr.com)\r\nVERSION = \"1.1\"\r\n#\r\n# Historico de versoes:\r\n# v1.1: \r\n#  - Adicionada exibicao do nome do arquivo na msg de log.\r\n#  - Adicionado par\u00e2metro para porta SSH\r\n\r\nimport commands, getopt\r\nimport os, sys, time, glob\r\n\r\n#Vari\u00e1veis globais\r\nSCRIPTNAME = \"\"                          # Nome desse script\r\nMATCH = \"\"                               # Padr\u00e3o de pesquisa\r\nDEST = \"\"                                # Host de destino\r\nPORT = \"22\"                              # Porta do SSH\r\nTEST = False\r\nSILENT = False\r\n\r\ndef main():\r\n   global TEST, SCRIPTNAME, MATCH, DEST, PORT, SILENT\r\n\r\n   #Obtem argumentos\r\n   getArgs()\r\n   \r\n   #In\u00edcio\r\n   printLogMsg(\"Inicio de execucao.\", SILENT)\r\n\r\n   #Envia arquivo\r\n   uploadFile(MATCH, DEST, PORT, TEST, SILENT)\r\n   \r\n   #Fim\r\n   printLogMsg(\"Fim de execucao.\", SILENT)\r\n#end main\r\n\r\n\r\ndef getArgs():\r\n   \"\"\"Obtem e faz consist\u00eancia dos argumentos\"\"\"\r\n   global TEST, SCRIPTNAME, MATCH, DEST, PORT, SILENT\r\n\r\n   #Captura par\u00e2metros\r\n   try:\r\n      opts, args = getopt.getopt(sys.argv[1:], \"htsm:d:p:\", \\\r\n         [\"help\", \"test\", \"silent\", \"match=\", \"dest=\", \"port=\"])\r\n   except getopt.GetoptError, err:\r\n      # print help information and exit:\r\n      print str(err) # will print something like \"option -a not recognized\"\r\n      usage()\r\n      sys.exit(2)\r\n   #endTry\r\n   \r\n   #Obtem o nome do script\r\n   SCRIPTNAME = os.path.basename(sys.argv[0])\r\n   \r\n   #Trata op\u00e7\u00f5es\r\n   MATCH = None\r\n   for o, a in opts:\r\n      if o in (\"-h\", \"--help\"):\r\n         usage()\r\n         sys.exit()\r\n      elif o in (\"-t\", \"--test\"):\r\n         TEST = True\r\n      elif o in (\"-s\", \"--silent\"):\r\n         SILENT = True\r\n      elif o in (\"-m\", \"--match\"):\r\n         MATCH = a\r\n      elif o in (\"-d\", \"--dest\"):\r\n         DEST = a\r\n      elif o in (\"-p\", \"--port\"):\r\n         PORT = a\r\n      else:\r\n         assert False, \"unhandled option\"\r\n   #endfor\r\n   \r\n   #Verifica argumentos\r\n   errmsg = \"\"\r\n   if (opts == []): #Se n\u00e3o houver parametro nenhum...\r\n      errmsg = \"missing options\"\r\n   else:\r\n      if (MATCH == None):\r\n         errmsg = \"missing option: -m\"\r\n      elif (MATCH == SCRIPTNAME) or (MATCH == \"\"):\r\n         errmsg = \"invalid argument for -m\"\r\n      #endIf\r\n      if (DEST == None):\r\n         errmsg = \"missing option: -d\"\r\n      #endIf\r\n   #endIf\r\n   if (errmsg != \"\"):\r\n      print errmsg\r\n      usage()\r\n      sys.exit(2)\r\n   #endIf\r\n\r\n#endDef   \r\n\r\n\r\ndef usage():\r\n   \"\"\"Exibe help\"\"\"\r\n   global VERSION\r\n   print \r\n   print \"BackupUpload v\", VERSION\r\n   print\r\n   print \"Uso: backupUpload [-h]|[-t -s] -m {mascara} -d {destino}\"\r\n   print \r\n   print \"Realiza upload por scp ao servidor de destino, do arquivo mais recente \"\r\n   print \"que atenda a mascara especificada.\"\r\n   print\r\n   print \"Op\u00e7\u00f5es:\"\r\n   print \"-h, --help    Exibe o help de comandos.\"\r\n   print \"-m, --match   Mascara que especifique o nome de arquivo desejado\"\r\n   print \"              para envio. Deve ser especificado com o caminho e\"\r\n   print \"              entre aspas.\"\r\n   print \"-d, --dest    Destino do arquivo no memso formato do scp:\"\r\n   print \"              usuario@host:\/caminho_de_destino\/\"\r\n   print \"-p, --port    Porta do servico SSH do servidor. (default 22)\"\r\n   print \"-t, --test    Exibe comando scp, sem executa-lo.\"\r\n   print \"-s, --silent  Nao exibe mensagens.\"\r\n   print\r\n   print \"Exemplo:\"\r\n   print 'backupUpload -m \"\/backup\/backupdodia*.bkp\" -d root@host.com:\/backups\/ -p 2222'\r\n   print\r\n   \r\n#endDef\r\n\r\ndef uploadFile(match, dest, port, test, silent):\r\n   \"\"\"Envia arq. mais recente do padr\u00e3o 'match', para 'dest'\"\"\"\r\n\r\n   printLogMsg(\"Verificando arquivos...\", silent)\r\n   \r\n   #Processa arquivos que atendam ao padr\u00e3o\r\n   files = filter(os.path.isfile, glob.glob(match))\r\n   \r\n   #Classifica os arquivos por data descendente\r\n   files.sort(key=lambda x: os.path.getmtime(x))\r\n   files.reverse()\r\n\r\n   #Identifica arquivo mais recente\r\n   file_name = \"\"\r\n   for fname in files:\r\n      fn = os.path.basename(fname)\r\n      if (fn != os.path.basename(sys.argv[0])): #evita o arquivo do script\r\n         file_name = fname\r\n         break\r\n      #endIf\r\n   #endFor\r\n   if (file_name == \"\"):\r\n      printLogMsg(\"Nenhum arquivo localizado...\", silent)\r\n      sys.exit(2)\r\n   #endIf\r\n   \r\n   #Envia arquivo\r\n   dest = dest.strip()\r\n   if (dest[len(dest)-1:] != \"\/\"):\r\n      dest += \"\/\"\r\n   #endIf\r\n   dest += os.path.basename(file_name)\r\n   cmd = \"scp -P%s -C %s %s\" % (port, file_name, dest)\r\n   if (test == True):\r\n      printLogMsg(cmd, silent)\r\n   else:\r\n      msg = \"Iniciando upload do arq. %s\" % (os.path.basename(file_name))\r\n      printLogMsg(msg, silent)\r\n      var = commands.getoutput(cmd)\r\n      if (var.strip() != \"\"):\r\n         printLogMsg(var, silent)\r\n      else:\r\n         printLogMsg(\"Upload bem sucedido!\", silent)\r\n      #endIf\r\n   #endIf\r\n#end cleanUpFiles   \r\n\r\n#----- Fun\u00e7\u00f5es Genericas -----------------------------------------------\r\n\r\ndef printLogMsg(msg, silent):\r\n   \"\"\"Imprime mensagem de log com data e hora correntes.\"\"\"\r\n   if (silent == True):\r\n      return\r\n   #endIf\r\n   t = time.localtime(time.time())\r\n   lmsg = \"%02d\/%02d\/%d %02d:%02d - %s\" % (t[2], t[1], t[0], t[3], t[4], msg)\r\n   print lmsg\r\n   sys.stdout.flush()\r\n   return\r\n#end printLogMsg\r\n\r\n\r\nif __name__ == \"__main__\":\r\n   main()\r\n<\/pre>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Esse script serve para copiar o arquivo mais recente cujo nome atenda a uma determinada m\u00e1scara, para outro servidor via SCP. \u00c9 \u00fatil para copiar um arquivo de backup, por exemplo, de um servidor para outro. C\u00d3DIGO #!\/usr\/bin\/python # -*- coding: UTF-8 -*- # Programa: backupUpload.py # Fun\u00e7\u00e3o..: Faz upload \u2026 <a class=\"continue-reading-link\" href=\"https:\/\/megumijr.com\/blog\/biblioteca-de-scripts\/backupupload\/\">Continue lendo <span class=\"meta-nav\">&rarr; <\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":292,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":[],"_links":{"self":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/314"}],"collection":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/comments?post=314"}],"version-history":[{"count":1,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/314\/revisions"}],"predecessor-version":[{"id":315,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/314\/revisions\/315"}],"up":[{"embeddable":true,"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/pages\/292"}],"wp:attachment":[{"href":"https:\/\/megumijr.com\/blog\/wp-json\/wp\/v2\/media?parent=314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}