{"id":4215,"date":"2021-12-02T10:39:11","date_gmt":"2021-12-02T09:39:11","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=4215"},"modified":"2021-12-02T10:39:12","modified_gmt":"2021-12-02T09:39:12","slug":"openwrt-copia-de-seguridad-y-actualizacion","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2021\/12\/02\/openwrt-copia-de-seguridad-y-actualizacion\/","title":{"rendered":"openwrt: copia de seguridad y actualizaci\u00f3n"},"content":{"rendered":"\n<p>Dos scripts que he creado con mucho esfuerzo y que empleo para realizar copias semanales de la configuraci\u00f3n y para actualizar con el m\u00ednimo de problemas.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Siguiendo lo descrito en la <a href=\"https:\/\/esferas.org\/msqlu\/2021\/12\/01\/openwrt-y-sus-problemas-para-actualizar\/\" data-type=\"post\" data-id=\"4209\">publicaci\u00f3n anterior<\/a> decid\u00ed dar forma al proceso de actualizaci\u00f3n y he escrito un peque\u00f1o programa que puede realizarla sin que salten errores por problemas de memoria y similares.<\/p>\n\n\n\n<p>Ha sido costoso porque est\u00e1 escrito en un shell muy simple (busybox y ash) y como siempre en estos casos paso m\u00e1s tiempo asegur\u00e1ndome de que las variables tengan el valor adecuado (o un valor al menos) y de que los test sobre \u00e9stas y sobre los archivos funciones, as\u00ed como que las redirecciones sean las necesarias y no termine con cualquier basura o texto vac\u00edo. <\/p>\n\n\n\n<p>Es m\u00e1s, creo que cuando tengo que escribir un script en lenguaje de shell paso la mayor parte del tiempo asegur\u00e1ndome de que no se me puede ir por libre que por la propia l\u00f3gica en s\u00ed. Pero en este caso es lo que hay y bastante es que funcione de manera regular.<\/p>\n\n\n\n<p>El programa es el que muestro a continuaci\u00f3n y que he instalado en el directorio <em>\/usr\/local\/bin<\/em> junto con el de copias.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">#\/usr\/bin\/sh\n\nVERSION=0.2\nUPGRADABLE=\/tmp\/upgradable.$$.list\nUPDATE_LOG=\/tmp\/upgradable.$$.log\nHOST=portico.home\nEMAIL_TO=root@taquiones.net\nBACKUP=\/usr\/local\/bin\/backup.sh\n\n#       Ajustes en uso de memoria\nsysctl -w vm.overcommit_memory=1 2>&amp;1 >\/dev\/null\n\n#       Actualizamos lista de paquetes \necho \"Actualizando listas de paquetes ...\"\nopkg update\n\n#       Lista de paquetes actualizables\necho \"Comprobando si hay paquetes actualizables ...\"\nopkg list-upgradable | cut -d\" \" -f 1 > $UPGRADABLE\n\nif [ $? -ne 0 ]; then\n        echo \"ERROR: opkg list-upgradable failed\"\nfi\n\n#       Si hay alguno\nTOTAL=$(wc -l $UPGRADABLE | cut -d\" \" -f 1)\nif [ \"$TOTAL\" -gt 0 ]; then \n        # Antes de actualizar hacemos copia si podemos\n        echo \"Hay actualizaciones: copia de seguridad primero ...\"\n        if [ -x $BACKUP ]; then\n                $BACKUP\n        fi \n\n        # Procedemos a actualizar \n        echo \"Actualizamos uno por uno ...\"\n        (\n                for pkg in $(cat $UPGRADABLE)\n                do\n                        opkg upgrade $pkg\n                done \n        )\n        > $UPDATE_LOG\n        echo \"Enviando informe por correo a $EMAIL_TO ...\" \n        ( \n                echo -e \"Subject: [UPGRADE $HOST] $(date +%F)\\n\\n\" \n                cat $UPGRADABLE\n                echo -e \"\\n\\n\"\n                cat $UPDATE_LOG\n        ) | msmtp $EMAIL_TO\n\n        rm -f $UPGRADABLE $UPDATE_LOG\nelse\n        echo \"No hay actualizaciones pendientes ...\" \nfi\n\nexit 0\n\n<\/code><\/pre>\n\n\n\n<p>Y su l\u00f3gica es la siguiente:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Modifica la gesti\u00f3n de memoria en el n\u00facleo. No tengo muy claro si no estar\u00e9 creando efectos secundarios pero no tengo otra manera todav\u00eda de que el resto no se mueran.<\/li><li>Actualiza la lista de paquetes.<\/li><li>Obtiene los paquetes actualizables.<\/li><li>En caso de tenerlo y si tiene acceso al programa de copias realiza una. Este programa empaqueta y transfiere las copias a un servidor externo.<\/li><li>Procede a actualizar uno a uno los paquetes y va guardando un registro de lo que ocurre en un archivo temporal.<\/li><li>Env\u00eda el archivo temporal al administrador de la red explicando qu\u00e9 ten\u00eda que hacer y qu\u00e9 ha ocurrido.<\/li><li>Limpia y finaliza.<\/li><\/ol>\n\n\n\n<p>El programa de copias est\u00e1 explicado ya en la <a href=\"https:\/\/esferas.org\/msqlu\/2021\/01\/26\/portico-home\/\" data-type=\"post\" data-id=\"4026\">entrada relativa al router<\/a>. Aqu\u00ed me limito a transcribir una versi\u00f3n parametrizada del mismo como referencia tambi\u00e9n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">#!\/bin\/sh\n\nVERSION=0.2\nBACKUP_FILE=\"\/tmp\/backup-$(cat \/proc\/sys\/kernel\/hostname)-$(date +%F).tgz\"\nHOST=portico.home\nEMAIL_TO=root@taquiones.net \nCOPY_TO=\"ocs@backup.home:domus\/portico.home\/\"\nTMP=\/tmp\/backup-$$.log\n\n(\n        # Lista de paquetes instalados\n        opkg list-installed > \/etc\/config\/installed.packages\n\n        # Crear copia \n        sysupgrade -v --create-backup $BACKUP_FILE\n\n        # Enviar copia a servidor \n        echo \"Enviando copia a servidor externo ...\" \n        scp $BACKUP_FILE $COPY_TO\n\n        # Borrar copia \n        echo \"Borrando copia $BACKUP_FILE\"\n        rm -f $BACKUP_FILE\n) > $TMP\n\n(\necho -e \"Subject: [BACKUP $HOST] $(date +%F)\\n\\n\" \n\n\ncat $TMP\n) | msmtp $EMAIL_TO\n\nrm -f $TMP\n<\/code><\/pre>\n\n\n\n<p>Me he asegurado de que el script <em>upgrade.sh<\/em> est\u00e9 incluido en la lista de archivos extra que el programa de copias de openwrt y se llama <em>\/etc\/sysupgrade.conf<\/em>. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Dos scripts que he creado con mucho esfuerzo y que empleo para realizar copias semanales de la configuraci\u00f3n y para actualizar con el m\u00ednimo de problemas.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[2],"tags":[1123,18,34,60],"class_list":["post-4215","post","type-post","status-publish","format-standard","hentry","category-software","tag-actualizacion-de-sistemas","tag-administracion-de-sistemas","tag-backups","tag-openwrt"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4215","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=4215"}],"version-history":[{"count":3,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4215\/revisions"}],"predecessor-version":[{"id":4219,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/4215\/revisions\/4219"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=4215"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=4215"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=4215"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}