diff --git a/mysqlbu-scripts.sh b/mysqlbu-scripts.sh index ca90e01..a5127ec 100755 --- a/mysqlbu-scripts.sh +++ b/mysqlbu-scripts.sh @@ -1,473 +1,129 @@ #!/usr/bin/env bash -# LinUPx - Linux Update Scripts +# MySQL-BU - MySQL Backup Scripts action="$1" -FOLDER='/opt/LinUPx' +FOLDER='/opt/mysqlbu' VERS='4.11232018' -if [ ! -f /opt/LinUPx/settings.conf ]; then - echo -ne "useAutoremove=1 -opennms=false" > /opt/LinUPx/settings.conf +source /opt/mysqlbu/settings.conf +source /dev/stdin <<< "$(curl -sL http://scity.xyz/colorsinc)" +source /dev/stdin <<< "$(curl -sL http://scity.xyz/defaultinc)" + +# ========================================================= # + +if [ $(id -u) != "0" ]; then + echo "Sorry, I need root privileges!" fi -source /opt/LinUPx/settings.conf +MYSQLDATA="`grep --perl-regexp --only-match '(?<=datadir=).+' "$MYSQLCFG"`" +DAY_BACKUP_DIR="${BACKUP_PATH}`date +%Y-%m-%d`/" +BASE_BACKUP="`ls -1 $DAY_BACKUP_DIR 2> /dev/null | grep --max-count=1 --perl-regexp '^.+_BASE'`" -Color_Off='\033[0m' -Blue='\033[0;34m' -BBlue='\033[1;34m' -Green='\033[0;32m' -LGreen='\033[1;32m' -BOrange='\033[0;33m' -DGray='\033[1;30m' -Red='\033[10;31m' -LRed='\033[1;31m' - - -if type apt &>/dev/null; then - ATYPE="apt" - if [ "$EUID" -ne 0 ]; then APTFUNC='sudo apt' - else APTFUNC='apt' - fi -elif type apt-get &>/dev/null; then - ATYPE="apt-get" - if [ "$EUID" -ne 0 ]; then APTFUNC='sudo apt-get' - else APTFUNC='apt-get' - fi -elif type yum &>/dev/null; then - ATYPE="yum" - if [ "$EUID" -ne 0 ]; then APTFUNC='sudo yum' - else APTFUNC='yum' - fi -else - ATYPE="unknown" -fi - -######## NEWRELIC REMOVAL ######## -if [ -e /etc/apt/sources.list.d/newrelic.list ]; then - $APTFUNC remove -y newrelic-sysmond - rm -f /etc/apt/sources.list.d/newrelic.list - echo -e "${BBlue}NOTICE:${Color_Off} NewRelic Removed." - sleep 5 -fi - -UPDATE1() { - if [ "$opennms" = true ]; then - sudo apt-mark unhold libopennms-java libopennmsdeps-java opennms-common opennms-db - fi - if type yum &>/dev/null; then - $APTFUNC -y update - else - if [ "$useAutoremove" -ne 0 ]; then - AUTOREMOVE - $APTFUNC update - $APTFUNC upgrade -y - AUTOREMOVE - fi - fi - if [ "$opennms" = true ]; then - sudo apt-mark hold libopennms-java libopennmsdeps-java opennms-common opennms-db - fi - touch "${FOLDER}/lastrun" - echo "" - echo -e "${Green}Updates have completed${Color_Off}" - if [ ${action-x} ]; then exit 0; fi - read -n 1 -s -p "Press any key to continue" -} -UPDATE2() { - if [ "$opennms" = true ]; then - sudo apt-mark unhold libopennms-java libopennmsdeps-java opennms-common opennms-db - fi - if [ "$useAutoremove" -ne 0 ]; then - AUTOREMOVE - $APTFUNC upgrade -y - AUTOREMOVE - fi - if [ "$opennms" = true ]; then - sudo apt-mark hold libopennms-java libopennmsdeps-java opennms-common opennms-db - fi - touch "${FOLDER}/lastrun" - echo "" - echo -e "${Green}Updated Upgrades have completed${Color_Off}" - if [ ${action-x} ]; then exit 0; fi - read -n 1 -s -p "Press any key to continue" -} -UPDATE3() { - restart_flag=''; - export DEBIAN_FRONTEND="noninteractive" - source /etc/environment - bash /etc/skel/.profile - - while getopts 'r' flag; do - case "${flag}" in - r) restart_flag='true' ;; - esac - done - - if [ "$autorun_logging" = true ]; then - mv -f /opt/runupdates.log.2 /opt/runupdates.log.3 - mv -f /opt/runupdates.log.1 /opt/runupdates.log.2 - mv -f /opt/runupdates.log /opt/runupdates.log.1 - fi - if type yum &>/dev/null; then - yum -y update >> /opt/runupdates.log - else - if [ "$opennms" = true ]; then - sudo apt-mark unhold libopennms-java libopennmsdeps-java opennms-common opennms-db - fi - if [ "$useAutoremove" -ne 0 ]; then - apt-get -y autoremove >> /opt/runupdates.log - apt-get update >> /opt/runupdates.log - apt-get upgrade -y >> /opt/runupdates.log - apt-get -y autoremove >> /opt/runupdates.log - fi - if [ "$opennms" = true ]; then - sudo apt-mark hold libopennms-java libopennmsdeps-java opennms-common opennms-db - fi - fi - touch "${FOLDER}/lastrun" - echo "" - echo -e "${Green}Updates have completed${Color_Off}" - if [ "$autorun_restart_after" = true ] || [ "$restart_flag" = true ]; then - echo -e "${BOrange}Rebooting now...${Color_Off}" - sleep 3 - /sbin/shutdown -r now - fi - exit 0 -} - -UPDATE4() { - restart_flag=''; - - while getopts 'r' flag; do - case "${flag}" in - r) restart_flag='true' ;; - esac - done - - if type yum &>/dev/null; then - yum -y update - else - if [ "$useAutoremove" -ne 0 ]; then - apt-get -y autoremove - apt-get update - apt-get upgrade -y - apt-get -y autoremove - fi - fi - touch "${FOLDER}/lastrun" - echo "" - echo -e "${Green}Updates have completed${Color_Off}" - if [ "$autorun_restart_after" = true ] || [ "$restart_flag" = true ]; then - echo -e "${BOrange}Rebooting now...${Color_Off}" - sleep 3 - /sbin/shutdown -r now - fi - exit 0 -} -DISTUPGRADE() { - if type yum &>/dev/null; then - $APTFUNC upgrade - else - $APTFUNC dist-upgrade - fi - if [ "$useAutoremove" -ne 0 ] && type apt-get &>/dev/null; then - AUTOREMOVE - fi - echo "" - echo -e "${Green}Dist Upgrades has completed${Color_Off}" - if [ ${action-x} ]; then exit 0; fi - read -n 1 -s -p "Press any key to continue" -} -PIPUPGRADE() { - if [ "$EUID" -ne 0 ]; then - sudo pip install --upgrade pip - sudo pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U - else - pip install --upgrade pip - pip freeze --local | grep -v '^\-e' | cut -d = -f 1 | xargs -n1 pip install -U - fi - echo "" - echo -e "${Green}Python-Pip Upgrades has completed${Color_Off}" - if [ ${action-x} ]; then exit 0; fi - read -n 1 -s -p "Press any key to continue" -} -AUTOREMOVE() { - if [ "$useAutoremove" -ne 0 ]; then - if [ "$EUID" -ne 0 ]; then - sudo apt-get autoremove +case $1 in + 'backup') + if [ "$BASE_BACKUP" = "" ]; then + $0 backup-base else - apt-get autoremove + $0 backup-incremental fi - fi -} -DRYRUN1() { - if type apt &>/dev/null; then - $APTFUNC update - $APTFUNC list --upgradable - elif type apt-get &>/dev/null; then - $APTFUNC update - $APTFUNC upgrade --dry-run - elif type yum &>/dev/null; then - $APTFUNC check-update - fi - echo "" - echo -e "${Green}Upgrade dry-run has completed${Color_Off}" - if [ ${action-x} ]; then exit 0; fi - read -n 1 -s -p "Press any key to continue" -} -DRYRUN2() { - if type yum &>/dev/null; then - $APTFUNC --obsoletes check-update - else - $APTFUNC dist-upgrade --dry-run - fi - echo "" - echo -e "${Green}Dist-Upgrade dry-run has completed${Color_Off}" - if [ ${action-x} ]; then exit 0; fi - read -n 1 -s -p "Press any key to continue" -} -GO_REBOOT() { - read -n 1 -p "Are you sure you wish to reboot (y/n)?" choice - case "$choice" in - [Yy]) if [ "$EUID" -ne 0 ]; then sudo shutdown -r now - else shutdown -r now + + allfiles=`ls -1 ${BACKUP_PATH}` + files=(`ls -1 ${BACKUP_PATH} | tail -${BACKUPSTOKEEP}`) + for i in $allfiles; do + keep=0; + for a in ${files[@]}; do + if [ $i == $a ]; then + keep=1; + fi; + done; + if [ $keep == 0 ]; then + rm -rf ${BACKUP_PATH}$i; + fi; + done +;; + 'backup-base') + DEST_DIR="${DAY_BACKUP_DIR}`date +%H-%M-%S`_BASE" + + if [ "$BASE_BACKUP" != "" ]; then + echo -e "${CS[color,Green]}Daily base backup already done. Running incremental backup...${CS[color,Default]}" + $0 backup-incremental + exit 1 fi - echo 'The system is now rebooting...' - sleep 60 - exit 0;; - * ) SCRIPT_MENU;; - esac -} -SHUTDOWN() { - read -n 1 -p "Are you sure you wish to shutdown (y/n)?" choice - case "$choice" in - [Yy]) if [ "$EUID" -ne 0 ]; then sudo shutdown -h now - else shutdown -h now + + if [ ! -d "$DAY_BACKUP_DIR" ]; then + mkdir -p "$DAY_BACKUP_DIR" fi - echo 'The system is now shutting down...' - sleep 60 - exit 0;; - * ) SCRIPT_MENU;; - esac -} -ENDISASU() { - if [ "$EUID" -ne 0 ]; then sudo dpkg-reconfigure --priority=low unattended-upgrades - else dpkg-reconfigure --priority=low unattended-upgrades - fi -} - -EXIT1() { - clear - exit 0 -} - -WEBMIN_INSTALL() { - read -n 1 -p "Are you sure you wish to install Webmin (y/n)?" choice - case "$choice" in - [Yy]) - echo "" - bash <(curl -sL https://git.schroedercity.com/voltron/Misc-Scripts/raw/master/webmin-install.sh) - echo "" - echo -e "${Green}Webmin has been Installed${Color_Off}" - if [ ${action-x} ]; then exit 0; fi - read -n 1 -s -p "Press any key to continue";; - * ) INSTALL_MENU;; - esac -} -GLANCES_INSTALL() { - read -n 1 -p "Are you sure you wish to install Glances (y/n)?" choice - case "$choice" in - [Yy]) - echo "" - bash <(curl -sL https://git.schroedercity.com/voltron/Misc-Scripts/raw/master/glances-install.sh) - echo "" - echo -e "${Green}Glances has been Installed${Color_Off}" - if [ ${action-x} ]; then exit 0; fi - read -n 1 -s -p "Press any key to continue";; - * ) INSTALL_MENU;; - esac -} -X11VNC_INSTALL() { - read -n 1 -p "Are you sure you wish to install x11vnc (y/n)?" choice - case "$choice" in - [Yy]) - echo "" - bash <(curl -sL https://git.schroedercity.com/voltron/Misc-Scripts/raw/master/vnc-install-ubuntu.sh) - echo "" - echo -e "${Green}x11vnc has been Installed${Color_Off}" - if [ ${action-x} ]; then exit 0; fi - read -n 1 -s -p "Press any key to continue";; - * ) INSTALL_MENU;; - esac -} -LINUPX_UNINSTALL() { - read -n 1 -p "Are you sure you wish to remove LinUPx (y/n)?" choice - case "$choice" in - [Yy]) - echo "" - bash <(curl -sL https://git.schroedercity.com/voltron/Misc-Scripts/raw/master/linupx-uninstall.sh) - exit 0;; - * ) INSTALL_MENU;; - esac -} -FW_INSTALL() { - read -n 1 -p "Are you sure you wish to install Filewatcher (y/n)?" choice - case "$choice" in - [Yy]) - echo "" - bash <(curl -sL https://git.schroedercity.com/voltron/Misc-Scripts/raw/master/filewatcher-install.sh) - exit 0;; - * ) INSTALL_MENU;; - esac -} - -SCRIPT_MENU() { - LASTRUND=$(stat -c %y /opt/LinUPx/lastrun | cut -d ' ' -f1) - LASTRUNT=$((stat -c %y /opt/LinUPx/lastrun | cut -d ' ' -f2) | cut -d '.' -f1) - while : - do - clear - echo "" - echo -e " ${LGreen}LinUPx - L I N U X U P D A T E S C R I P T S${Color_Off} ${DGray}(ver-${VERS})${Color_Off}" - echo -e "${LGreen}---------------------------------------------------------------------------${Color_Off}" - echo -e "Hostname: ${BBlue}$(hostname -s)${Color_Off}" - echo -e "Domain: ${BBlue}$(hostname -d)${Color_Off}" - echo "" - echo -e "Last run: ${Green}${LASTRUND} ${LASTRUNT}${Color_Off}" - echo "---------------------------------------------------------------------------" - if type lsb_release &>/dev/null; then - lsb_release -i - lsb_release -d - lsb_release -r - lsb_release -c - else - cat /etc/*release + + innobackupex --defaults-file="$MYSQLCFG" --user="$MYSQLUSER" --password="$MYSQLPASS" --no-timestamp "$DEST_DIR" +;; + 'backup-incremental') + DEST_DIR="${DAY_BACKUP_DIR}`date +%H-%M-%S`" + + if [ "$BASE_BACKUP" = "" ]; then + echo -e "${CS[color,Green]}Daily base backup not found. Running base backup...${CS[color,Default]}" + $0 backup-base + exit 1 fi - cat /proc/cpuinfo | grep 'model name' - cat /proc/cpuinfo | grep 'cpu cores' - cat /proc/cpuinfo | grep 'stepping' - echo -e "${LGreen}---------------------------------------------------------------------------${Color_Off}" - echo "" - echo " [1] Check for Updates/Upgrades" - echo " [2] Run Updates" - if [ "$ATYPE" != 'yum' ]; then - echo " [3] Run Updates w/o retrieving new repo list" + + innobackupex --defaults-file="$MYSQLCFG" --user="$MYSQLUSER" --password="$MYSQLPASS" \ + --incremental-basedir="${DAY_BACKUP_DIR}${BASE_BACKUP}" \ + --incremental "$DEST_DIR" \ + --no-timestamp +;; + 'restore') + if [ "`ps aux | grep --only-match mysqld`" != "" ]; then + read -p "I think mysql-server still running. It's STRONGLY recommended to stop it before restoring any backup to avoid corrupted files. Do you want to continue anyway? [Y/N]" yn + case $yn in + [Yy]* ) break;; + * ) exit;; + esac fi - echo "" - echo " [4] Check for Upgrades with obsoletes enabled" - echo " [5] Run Dist-Upgrade" - echo " [6] Run Python-Pip Upgrades" - echo "" - if [ "$ATYPE" != 'yum' ]; then - echo " [0] Enable/Disable Automatic Security Updates" - echo "" + + REQUEST_BACKUP="${BACKUP_PATH}${2}/${3}" + BASE_BACKUP="${BACKUP_PATH}${2}/`ls ${BACKUP_PATH}${2} | grep --max-count=1 --perl-regexp '^.+_BASE'`" + TMP_BACKUP="${BACKUP_PATH}${2}/.current_backup" + + if [ ! -d "$REQUEST_BACKUP" ] || [ ! $2 ] || [ ! $3 ]; then + echo -e "${CS[color,Red]}Backup not found!${CS[color,Default]}" + echo "Usage: $0 restore 2019-01-05 13-00-10" + exit 1 fi - echo " [I] Installation Scripts" - echo "" - echo " [R] Reboot System" - echo " [S] Shutdown System" - echo " [Q] Quit" - echo "" - echo "" - echo -e -n "${BOrange}Please select an [ActionItem] from above:${Color_Off} " - read -n 1 opt - echo "" - case $opt in - 1) DRYRUN1 - SCRIPT_MENU;; - 2) UPDATE1 - SCRIPT_MENU;; - 3) UPDATE2 - SCRIPT_MENU;; - 4) DRYRUN2 - SCRIPT_MENU;; - 5) DISTUPGRADE - SCRIPT_MENU;; - 6) PIPUPGRADE - SCRIPT_MENU;; - 0) ENDISASU - SCRIPT_MENU;; - [Ii]) INSTALL_MENU;; - [Rr]) GO_REBOOT - SCRIPT_MENU;; - [Ss]) SHUTDOWN - SCRIPT_MENU;; - [Qq]) EXIT1 - exit 1;; - *) echo "Thats an invaild option,"; - echo "please select a valid option only."; - sleep 1;; - esac - done -} -INSTALL_MENU() { - while : - do - clear - echo "" - echo -e " ${LGreen}LinUPx - L I N U X U P D A T E S C R I P T S${Color_Off} ${DGray}(ver-${VERS})${Color_Off}" - echo -e " ${Green}INSTALLATION SCRIPTS${Color_Off}" - echo -e "${LGreen}---------------------------------------------------------------------------${Color_Off}" - echo -e "Hostname: ${BBlue}$(hostname -s)${Color_Off}" - echo -e "Domain: ${BBlue}$(hostname -d)${Color_Off}" - echo -e "${LGreen}---------------------------------------------------------------------------${Color_Off}" - echo "" - echo " [1] Webmin Install" - echo " [2] Glances Install" - echo " [3] x11vnc Install" - echo " [4] Filewatcher Install" - echo "" - echo " [0] Remove LinUPx" - echo "" - echo " [B] Back to Update Scripts" - echo " [Q] Quit" - echo "" - echo "" - echo -e -n "${BOrange}Please select an [ActionItem] from above:${Color_Off} " - read -n 1 opt - echo "" - case $opt in - 1) WEBMIN_INSTALL - INSTALL_MENU;; - 2) GLANCES_INSTALL - INSTALL_MENU;; - 3) X11VNC_INSTALL - INSTALL_MENU;; - 4) FW_INSTALL - INSTALL_MENU;; - 0) LINUPX_UNINSTALL - INSTALL_MENU;; - [Bb]) SCRIPT_MENU;; - [Qq]) EXIT1 - exit 1;; - *) echo "Thats an invaild option,"; - echo "please select a valid option only."; - sleep 1;; - esac - done -} - -if [ ${action-x} ]; then - case $1 in - update) UPDATE3;; - up) UPDATE4;; - # *) echo "Thats an invaild option,"; - # exit 1;; - esac -else - if [ -e ~/runup.sh ]; then - rm -f ~/runup.sh - ln -s $FOLDER/run.sh /usr/local/bin/runup - echo "" - echo "" - echo -e "${BBlue}NOTICE:${Color_Off} To start this program from now on, simply execute the command ${Green}runup${Color_Off}." - echo -e "${BBlue}NOTICE:${Color_Off} The ~/runup.sh command will no longer work." - echo "" - echo "" - read -n 1 -s -p "Press any key to continue" - fi - - SCRIPT_MENU -fi + + if [ -d "$MYSQLDATA" ]; then + mv "$MYSQLDATA" "`grep --perl-regexp --only-match '^.*(?=/$)' <<< ${MYSQLDATA}`_restore-`date +%Y-%m-%d_%H-%M-%S`" + mkdir "$MYSQLDATA" + fi + + if [ -d "$TMP_BACKUP" ]; then + rm -rf "$TMP_BACKUP" + fi + + cp --recursive "$BASE_BACKUP" "$TMP_BACKUP" + innobackupex --apply-log --redo-only "$TMP_BACKUP" + + if [ REQUEST_BACKUP != BASE_BACKUP ]; then + innobackupex --apply-log "$TMP_BACKUP" --incremental-dir="$REQUEST_BACKUP" + fi + + innobackupex --apply-log "$TMP_BACKUP" + innobackupex --copy-back "$TMP_BACKUP" + chown -R mysql:mysql "$MYSQLDATA" + + rm -rf "$TMP_BACKUP" +;; + 'list') + echo -e "${CS[color,Yellow]}============ Available Backups ============${CS[color,Default]}" + for day in $BACKUP_PATH* ; do + echo -e "${CS[color,Green]}-> `sed 's/.*\///' <<< $day`${CS[color,Default]}" + for hour in $day/* ; do + echo -e "${CS[color,LightGreen]} -> `sed 's/.*\///' <<< $hour`${CS[color,Default]}" + done + done + echo -e "${CS[color,Yellow]}===========================================${CS[color,Default]}" +;; + *) + echo "Usage: $0 { backup | backup-base | backup-incremental | restore | list }" +;; +esac exit 0 \ No newline at end of file