{"id":4263,"date":"2017-02-01T08:27:46","date_gmt":"2017-02-01T10:27:46","guid":{"rendered":"https:\/\/blog.clusterweb.com.br\/?p=4263"},"modified":"2017-02-01T08:27:46","modified_gmt":"2017-02-01T10:27:46","slug":"script-de-backup-envio-de-e-mail","status":"publish","type":"post","link":"https:\/\/blog.clusterweb.com.br\/?p=4263","title":{"rendered":"SCRIPT DE BACKUP + ENVIO DE E-MAIL"},"content":{"rendered":"<p>Recentemente precisei criar um script de backup com algumas exig\u00eancias&#8230; n\u00e3o entrarei muito em detalhes sobre os recursos utilizados, a ideia \u00e9 compartilhar e passar um overview do que faz o script.<\/p>\n<p>As exig\u00eancias:<\/p>\n<ol>\n<li>Realizar backup logo ap\u00f3s que a m\u00eddia externa for conectada (HDD externo)<\/li>\n<li>Deletar dados no diret\u00f3rio de backup com 15 dias ou mais<\/li>\n<li>Realizar backup para diret\u00f3rio em servidor remoto<\/li>\n<li>Enviar mensagem de e-mail notificando o administrador dos servidores<\/li>\n<\/ol>\n<p>As solu\u00e7\u00f5es:<\/p>\n<p>1. Existem algumas maneiras de obter informa\u00e7\u00f5es de um device via Udev &#8230; no meu caso utilizei o seguinte:<\/p>\n<p><strong># udevadm info &#8211;query=all &#8211;name=\/dev\/sdc<\/strong><\/p>\n<p>Obs.: as linhas iniciadas com &#8220;P&#8221; (PATH) mostram o caminho absoluto do device, &#8220;S&#8221; (SYMLINK) links simb\u00f3licos para o device e &#8220;E&#8221; (ENVIRONMENT) vari\u00e1veis de ambiente que podemos usar nas regras do Udev.<\/p>\n<div class=\"codigo\">\/etc\/udev\/rules.d\/90-CustomUdev.rules<br \/>\nACTION==&#8221;add&#8221;, SUBSYSTEM==&#8221;block&#8221;, ENV{ID_SERIAL_SHORT}==&#8221;5758323145393436444B4134&#8243;, SYMLINK+=&#8221;BackupUSB&#8221;<br \/>\nACTION==&#8221;add&#8221;, SUBSYSTEM==&#8221;block&#8221;, ENV{ID_SERIAL_SHORT}==&#8221;5758323145393436444B4134&#8243;, RUN+=&#8221;SEU SCRIPT&#8221;<\/div>\n<p>Quando plugado o HDD (ACTION==&#8221;add&#8221;) com n\u00famero serial (ENV{ID_SERIAL_SHORT}==&#8221;5758323145393436444B4134&#8243;) e seja um block device (SUBSYSTEM==&#8221;block&#8221;), crie um link simb\u00f3lico em \/dev com nome BackupUSB (SYMLINK+=&#8221;BackupUSB) e execute o script RUN+=&#8221;SEU SCRIPT&#8221;.<\/p>\n<p>2. Tal comando encontra-se em fun\u00e7\u00e3o dentro do script, mas seguindo a ordem das exig\u00eancias &#8230; o comando \u00e9:<br \/>\n<!--more--><br \/>\n<strong># \/bin\/find $BKPDIR -maxdepth 1 -type d -not -name lost+found -ctime 15 -exec rm -rfv &#8216;{}&#8217; \\;<\/strong><\/p>\n<p>Procura somente (-maxdepth 1) em $BKPDIR diret\u00f3rios (-type d) mas n\u00e3o o diret\u00f3rio &#8220;lost+found&#8221; (-not -name lost+found) e deleta diret\u00f3rios com 15 dias ou mais ( -ctime 15 -exec rm -rfv &#8216;{}&#8217; \\; )<\/p>\n<p>3. O backup para servidor remoto ser\u00e1 feito via SMB\/CIFS, que nada mais \u00e9 do que uma pasta compartilhada no Windows. Para isso \u00e9 preciso instalar o pacote <em>cifs-utils<\/em>.<\/p>\n<p>Crie um arquivo e insira as seguintes informa\u00e7\u00f5es:<\/p>\n<div class=\"codigo\">username=USUARIO<br \/>\npassword=SENHA<\/div>\n<p>Teste com:<\/p>\n<p>mount.cifs -o credentials=ArquivoComUsuarioeSenha \/\/IpServidor\/NomedoCompartilhamento \/mnt<\/p>\n<p>Exemplo:<\/p>\n<p><strong># mount.cifs -o credentials=\/root\/windows \/\/192.168.4.2\/BackupDB \/mnt\/SERVIDOR\/<\/strong><\/p>\n<p>4. Para envio de e-mail foi instalado o &#8220;mutt.x86_64&#8221;.<\/p>\n<p>Crie o arquivo &#8220;\/root\/.muttrc&#8221; e insira o seguinte conte\u00fado:<\/p>\n<div class=\"codigo\">set from = &#8220;meuemail@gmail.com&#8221;<br \/>\nset realname = &#8220;Descricao&#8221;<br \/>\nset imap_user = &#8220;meuemail@gmail.com&#8221;<br \/>\nset imap_pass = &#8220;senha&#8221;<\/p>\n<p>##REMOTE GMAIL FOLDERS<br \/>\nset folder = &#8220;imaps:\/\/imap.gmail.com:993&#8221;<br \/>\nset spoolfile = &#8220;+INBOX&#8221;<br \/>\nset postponed =&#8221;+[Google Mail]\/Drafts&#8221;<br \/>\n#set trash = &#8220;+[Google Mail]\/Trash&#8221;<\/p>\n<p>##SMTP Settings to sent email<br \/>\nset smtp_url = &#8220;smtp:\/\/meuemail@smtp.gmail.com:587\/&#8221;<br \/>\nset smtp_pass = &#8220;senha&#8221;<\/p>\n<p>##LOCAL FOLDERS FOR CACHED HEADERS AND CERTIFICATES<br \/>\nset header_cache =~\/.mutt\/cache\/headers<br \/>\nset message_cachedir =~\/.mutt\/cache\/bodies<br \/>\nset certificate_file =~\/.mutt\/certificates<\/p>\n<p>##SECURING<br \/>\nset move = no #Stop asking to &#8220;move read messages to mbox&#8221;!<br \/>\nset imap_keepalive = 900<\/p>\n<p>##Sort by newest conversation first.<br \/>\nset sort = reverse-threads<br \/>\nset sort_aux = last-date-received<\/p>\n<p>##Set editor to create new email<br \/>\nset editor=&#8217;nano&#8217;<\/p><\/div>\n<p>Obs.: acesse seu email via &#8220;mutt&#8221;, confirme os certificados e ap\u00f3s isso n\u00e3o ser\u00e1 mais solicitado confirma\u00e7\u00e3o. Para acessar digite &#8220;mutt&#8221; e enter.<\/p>\n<p>Antes do script&#8230;<\/p>\n<p>Para a montagem do HD e do compartilhamento foi instalado &#8220;autofs.x86_64&#8221; que faz a montagem sobre demanda.<\/p>\n<p>Dentro de &#8220;\/etc\/auto.master&#8221; adicione as seguintes linhas:<\/p>\n<div class=\"codigo\">\/mnt\/SERVIDOR \/etc\/auto.CIFS &#8211;timeout=120<br \/>\n\/mnt\/HD_EXTERNO \/etc\/auto.HD_EXTERNO &#8211;timeout=120<\/div>\n<p>Crie os diret\u00f3rios &#8220;\/mnt\/SERVIDOR&#8217; e &#8220;\/mnt\/HD_EXTERNO&#8221;.<\/p>\n<p>Crie o arquivo &#8220;\/etc\/auto.CIFS&#8221; e &#8220;\/etc\/auto.HD_EXTERNO&#8221; e adicione as linhas abaixo:<\/p>\n<p>\/etc\/auto.CIFS:<\/p>\n<div class=\"codigo\">windows_backup\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 -fstype=cifs,rw,username=USUARIO,password=SENHA\u00a0\u00a0\u00a0\u00a0:\/\/IPServidor\/Compartilhamento<\/div>\n<p>\/etc\/auto.HD_EXTERNO:<\/p>\n<div class=\"codigo\">hd_backup\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0-fstype=ext4,rw,sync,nosuid,noexec\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0:UUID=&#8221;a4a6b614-7ed8-4a94-a7ed-c1df57ccf311&#8243;<\/div>\n<p>Script para HD:<\/p>\n<pre class=\"prettyprint\">LANG=C\r\nDATE=$(date +%d-%m-%Y)\r\nTIME=$(date +%H-%M)\r\nWEEKDAY=$(date +%A)\r\nBASEDIR=\"\/var\/backup\"\r\nBKPDIR=\"\/mnt\/HD_EXTERNO\/hd_backup\"\r\nLOGDIR=\"\/var\/log\/rsync\"\r\nIPDB=\"192.168.4.18\"\r\n\r\nbackup (){\r\n\r\n\/bin\/find $BKPDIR -maxdepth 1 -type d -not -name lost+found -ctime 15 -exec rm -rfv '{}' \\;\r\n\r\n                if [ -d $BKPDIR\/$DATE ];then\r\n\r\n                        \/bin\/rsync -avz --progress -h --delete --log-file=$LOGDIR\/$DATE-HD.log $BASEDIR\/ $BKPDIR\/$DATE\/\r\n                        \/bin\/echo \"Backup DB realizado no servidor $IPDB\" \\\r\n                        | \/bin\/mutt emaildestino@gmail -s \"Backup da manha para HD externo,\" -a $LOGDIR\/$DATE-HD.log -b copiaoculta@gmail.com\r\n                else\r\n                        \/bin\/umask 006 ; \/bin\/mkdir -m 1770 $BKPDIR\/$DATE\r\n                        \/bin\/rsync -avz --progress -h --log-file=$LOGDIR\/$DATE-HD.log $BASEDIR\/ $BKPDIR\/$DATE\/\r\n                        \/bin\/echo \"Backup DB realizado no servidor $IPDB\" \\\r\n                        | \/bin\/mutt emaildestino@gmail.com -s \"Script de Backup para HD externo\" -a $LOGDIR\/$DATE-HD.log -b copiaoculta@gmail.com\r\n                fi\r\n}\r\n\r\nif [ $(\/bin\/lsusb -d 1058:0820 &amp;&gt; \/dev\/null)$? -eq 0 ] &amp;&amp; [ -L \/dev\/disk\/by-uuid\/a4a6b614-7ed8-4a94-a7ed-c1df57ccf311 ]; then\r\n\r\n        echo -e \"HD externo conectado, Iniciando script as $TIME  \\n\"\r\n\r\n                if [ $(\/bin\/ls $BKPDIR &amp;&gt; \/dev\/null)$? -eq 0 ]; then\r\n\r\n                        backup\r\n\r\n                else\r\n                        \/bin\/systemctl status autofs.service\r\n\r\n                                case $? in\r\n                        3)\r\n\r\n                                if [ $(\/bin\/systemctl start autofs.service)$? -eq 0 ] &amp;&amp; \\\r\n                                        [ $(\/bin\/systemctl status autofs.service|grep -i error)$? -eq 1 ]; then\r\n\r\n                                        sleep 5\r\n                                                backup\r\n                                        exit\r\n                                fi\r\n                        ;;\r\n\r\n                        0)\r\n\r\n                                \/bin\/echo \"`\/bin\/systemctl status autofs.service`\" \\\r\n                                | \/bin\/mutt emaildestino@gmail.com -e \"set content_type=text\/html\" -s \"ERRO no Daemon AutoFS\" \\\r\n                                -b copiaoculta@gmail.com -a alerta.gif\r\n                                        exit\r\n                        ;;\r\n\r\n                        *)exit\r\n\r\n                                esac\r\n\r\n\r\n\r\n                fi\r\n\r\nelse\r\n\r\n        \/bin\/echo \"HDD nao conectado ou mau conectado\" \\\r\n        | \/bin\/mutt emaildestino@gmail.com -e \"set content_type=text\/html\" -s \"ERRO NO BACKUP !!!\" -a alerta.gif -b copiaoculta@gmail.com\r\n        exit\r\n\r\nfi\r\n<\/pre>\n<p>Script para servidor:<\/p>\n<pre class=\"prettyprint\">LANG=C\r\nDATE=$(date +%d-%m-%Y)\r\nTIME=$(date +%H-%M)\r\nWEEKDAY=$(date +%A)\r\nBASEDIR=\"\/var\/backup\"\r\nBKPDIR=\"\/mnt\/SERVIDOR\/windows_backup\"\r\nLOGDIR=\"\/var\/log\/rsync\"\r\nIPDB=\"192.168.4.18\"\r\nIPSRV=\"192.168.4.2\"\r\n\r\nbackup (){\r\n\r\n\/bin\/find $BKPDIR -maxdepth 1 -type d -ctime 15 -exec rm -rv '{}' \\;\r\n                        \/bin\/umask 006 ; \/bin\/mkdir -m 1770 $BKPDIR\/$DATE\r\n                        \/bin\/rsync -avz --progress -h --log-file=$LOGDIR\/$DATE-SRVWIN.log $BASEDIR\/ $BKPDIR\/$DATE\/\r\n                        \/bin\/echo \"Backup DB realizado no servidor $IPDB -&gt; $IPSRV\" \\\r\n                        | \/bin\/mutt emaildestino@gmail.com -s \"Script de Backup para $IPSRV\" -a $LOGDIR\/$DATE-SRVWIN.log -b copiaoculta@gmail.com\r\n}\r\n\r\nif [ $(\/bin\/ping -c 2 $IPSRV &amp;&gt; \/dev\/null)$? -eq 0 ] ; then\r\n\r\n        echo -e \"$IPSRV esta UP , Iniciando backup as $TIME \\n\"\r\n\r\n                if [ $(\/bin\/ls $BKPDIR &amp;&gt; \/dev\/null)$? -eq 0 ]; then\r\n\r\n                        backup\r\n\r\n                else\r\n                        \/bin\/systemctl status autofs.service\r\n\r\n                                case $? in\r\n                        3)\r\n\r\n                                if [ $(\/bin\/systemctl start autofs.service)$? -eq 0 ] &amp;&amp; \\\r\n                                        [ $(\/bin\/systemctl status autofs.service|grep -i error)$? -eq 1 ]; then\r\n\r\n                                        sleep 5\r\n                                                backup\r\n                                        exit\r\n                                fi\r\n                        ;;\r\n\r\n                        0)\r\n\r\n                                \/bin\/echo \"`\/bin\/systemctl status autofs.service`\" \\\r\n                                | \/bin\/mutt emaildestino@gmail.com -e \"set content_type=text\/html\" -s \"ERRO no Daemon AutoFS\" \\\r\n                                -b copiaoculta@gmail.com -a alerta.gif\r\n                                        exit\r\n                        ;;\r\n\r\n                        *)exit\r\n\r\n                                esac\r\n\r\n\r\n\r\n                fi\r\n\r\nelse\r\n\r\n        \/bin\/echo \"Sem conexao com $IPSRV\" \\\r\n        | \/bin\/mutt emaildestino@gmail.com -e \"set content_type=text\/html\" -s \"ERRO NO BACKUP !!!\" -a alerta.gif -b copiaoculta@gmail.com\r\n        exit\r\n\r\nfi\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Recentemente precisei criar um script de backup com algumas exig\u00eancias&#8230; n\u00e3o entrarei muito em detalhes sobre os recursos utilizados, a ideia \u00e9 compartilhar e passar um overview do que faz o script. As exig\u00eancias: Realizar backup logo ap\u00f3s que a m\u00eddia externa for conectada (HDD externo) Deletar dados no diret\u00f3rio de backup com 15 dias [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[477,91,1,730,42,495,271,501],"tags":[1023,248,353,76,1024,502],"class_list":["post-4263","post","type-post","status-publish","format-standard","hentry","category-backup-2","category-banco-de-dados","category-viazap","category-clusterweb","category-leitura-recomendada","category-profissional-de-ti","category-seguranca-2","category-shell-script","tag-1023","tag-backup","tag-de","tag-e-mail","tag-envio","tag-script"],"_links":{"self":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4263","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4263"}],"version-history":[{"count":1,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4263\/revisions"}],"predecessor-version":[{"id":4264,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=\/wp\/v2\/posts\/4263\/revisions\/4264"}],"wp:attachment":[{"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4263"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4263"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.clusterweb.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4263"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}