diff --git a/man/freedombone-repair-database.1.gz b/man/freedombone-repair-database.1.gz new file mode 100644 index 00000000..5052e4d7 Binary files /dev/null and b/man/freedombone-repair-database.1.gz differ diff --git a/src/freedombone b/src/freedombone index 70162803..bd9d0b24 100755 --- a/src/freedombone +++ b/src/freedombone @@ -5569,61 +5569,18 @@ function backup_databases_script_header { } function repair_databases_script { + if [ -f /etc/cron.hourly/repair ]; then + sed -i "s|/usr/bin/repairdatabase|${PROJECT_NAME}-repair-database}|g" /etc/cron.hourly/repair + fi + if grep -Fxq "repair_databases_script" $COMPLETION_FILE; then return fi + if [ ! -f $DATABASE_PASSWORD_FILE ]; then return fi - echo '#!/bin/bash' > /usr/bin/repairdatabase - echo '' >> /usr/bin/repairdatabase - echo 'DATABASE=$1' >> /usr/bin/repairdatabase - echo "EMAIL=$MY_EMAIL_ADDRESS" >> /usr/bin/repairdatabase - echo "BACKUP_TYPE='daily'" >> /usr/bin/repairdatabase - echo '' >> /usr/bin/repairdatabase - echo 'if [ $2 ]; then' >> /usr/bin/repairdatabase - echo ' BACKUP_TYPE=$2' >> /usr/bin/repairdatabase - echo 'fi' >> /usr/bin/repairdatabase - echo '' >> /usr/bin/repairdatabase - echo -n 'MYSQL_ROOT_PASSWORD=$(cat ' >> /usr/bin/repairdatabase - echo "$DATABASE_PASSWORD_FILE)" >> /usr/bin/repairdatabase - echo 'TEMPFILE=/root/repairdatabase_$DATABASE' >> /usr/bin/repairdatabase - echo '' >> /usr/bin/repairdatabase - echo 'umask 0077' >> /usr/bin/repairdatabase - echo '' >> /usr/bin/repairdatabase - echo '# check the database' >> /usr/bin/repairdatabase - echo 'mysqlcheck -c -u root --password=$MYSQL_ROOT_PASSWORD $DATABASE > $TEMPFILE' >> /usr/bin/repairdatabase - echo '' >> /usr/bin/repairdatabase - echo '# Attempt to repair the database if it contains errors' >> /usr/bin/repairdatabase - echo 'if grep -q "Error" "$TEMPFILE"; then' >> /usr/bin/repairdatabase - echo ' mysqlcheck -u root --password=$MYSQL_ROOT_PASSWORD --auto-repair $DATABASE' >> /usr/bin/repairdatabase - echo 'else' >> /usr/bin/repairdatabase - echo ' # No errors were found, so exit' >> /usr/bin/repairdatabase - echo ' rm -f $TEMPFILE' >> /usr/bin/repairdatabase - echo ' exit 0' >> /usr/bin/repairdatabase - echo 'fi' >> /usr/bin/repairdatabase - echo 'rm -f $TEMPFILE' >> /usr/bin/repairdatabase - echo '' >> /usr/bin/repairdatabase - echo '# Check the database again' >> /usr/bin/repairdatabase - echo 'mysqlcheck -c -u root --password=$MYSQL_ROOT_PASSWORD $DATABASE > $TEMPFILE' >> /usr/bin/repairdatabase - echo '' >> /usr/bin/repairdatabase - echo '# If it still contains errors then restore from backup' >> /usr/bin/repairdatabase - echo 'if grep -q "Error" "$TEMPFILE"; then' >> /usr/bin/repairdatabase - echo ' mysql -u root --password=$MYSQL_ROOT_PASSWORD $DATABASE -o < /var/backups/${DATABASE}_${BACKUP_TYPE}.sql' >> /usr/bin/repairdatabase - echo '' >> /usr/bin/repairdatabase - echo ' # Send a warning email' >> /usr/bin/repairdatabase - echo ' echo "$DATABASE database corruption could not be repaired. Restored from backup." | mail -s "Freedombone database maintenance" $EMAIL' >> /usr/bin/repairdatabase - echo ' rm -f $TEMPFILE' >> /usr/bin/repairdatabase - echo '' >> /usr/bin/repairdatabase - echo ' exit 1' >> /usr/bin/repairdatabase - echo 'fi' >> /usr/bin/repairdatabase - echo 'rm -f $TEMPFILE' >> /usr/bin/repairdatabase - echo '' >> /usr/bin/repairdatabase - echo 'exit 0' >> /usr/bin/repairdatabase - chmod 600 /usr/bin/repairdatabase - chmod +x /usr/bin/repairdatabase - echo '#!/bin/bash' > /etc/cron.hourly/repair echo '' >> /etc/cron.hourly/repair chmod 600 /etc/cron.hourly/repair @@ -7516,7 +7473,7 @@ quit" > $INSTALL_DIR/batch.sql echo ' cp -f /var/backups/gnusocial_weekly.sql /var/backups/gnusocial_monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly - echo '/usr/bin/repairdatabase gnusocial' >> /etc/cron.hourly/repair + echo "${PROJECT_NAME}-repair-database gnusocial" >> /etc/cron.hourly/repair nginx_ensite $MICROBLOG_DOMAIN_NAME service php5-fpm restart @@ -7838,7 +7795,7 @@ quit" > $INSTALL_DIR/batch.sql echo ' cp -f /var/backups/hubzilla_weekly.sql /var/backups/hubzilla_monthly.sql' >> /etc/cron.monthly/backupdatabasesmonthly echo 'fi' >> /etc/cron.monthly/backupdatabasesmonthly - echo '/usr/bin/repairdatabase hubzilla' >> /etc/cron.hourly/repair + echo "${PROJECT_NAME}-repair-database hubzilla" >> /etc/cron.hourly/repair chown -R www-data:www-data /var/www/$HUBZILLA_DOMAIN_NAME/htdocs diff --git a/src/freedombone-repair-database b/src/freedombone-repair-database new file mode 100755 index 00000000..af6dc0e2 --- /dev/null +++ b/src/freedombone-repair-database @@ -0,0 +1,84 @@ +#!/bin/bash +# +# .---. . . +# | | | +# |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-. +# | | (.-' (.-' ( | ( )| | | | )( )| | (.-' +# ' ' --' --' -' - -' ' ' -' -' -' ' - --' +# +# Freedom in the Cloud +# +# Checks and repairs a given database + +# License +# ======= +# +# Copyright (C) 2015 Bob Mottram +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +PROJECT_NAME='freedombone' +COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt +CONFIG_FILE=$HOME/${PROJECT_NAME}.cfg + +export TEXTDOMAIN=${PROJECT_NAME}-repair-databases +export TEXTDOMAINDIR="/usr/share/locale" + +# The database to be repaired +DATABASE=$1 + +ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | -nawk -F ':' '{print $2}') +ADMIN_EMAIL_ADDRESS=${ADMIN_USERNAME}@${HOSTNAME} + +# Frequency - daily/weekly +BACKUP_TYPE='daily' + +MYSQL_ROOT_PASSWORD=$(cat /root/dbpass) +TEMPFILE=/root/repairdatabase_$DATABASE + +umask 0077 + +if [ $2 ]; then + BACKUP_TYPE=$2 +fi + +# check the database +mysqlcheck -c -u root --password="$MYSQL_ROOT_PASSWORD" $DATABASE > $TEMPFILE + +# Attempt to repair the database if it contains errors +if grep -q "Error" "$TEMPFILE"; then + mysqlcheck -u root --password="$MYSQL_ROOT_PASSWORD" --auto-repair $DATABASE +else + # No errors were found, so exit + rm -f $TEMPFILE + exit 0 +fi +rm -f $TEMPFILE + +# Check the database again +mysqlcheck -c -u root --password="$MYSQL_ROOT_PASSWORD" $DATABASE > $TEMPFILE + +# If it still contains errors then restore from backup +if grep -q "Error" "$TEMPFILE"; then + mysql -u root --password="$MYSQL_ROOT_PASSWORD" $DATABASE -o < /var/backups/${DATABASE}_${BACKUP_TYPE}.sql + + # Send a warning email + echo $"$DATABASE database corruption could not be repaired. Restored from backup." | mail -s $"${PROJECT_NAME} database maintenance" $ADMIN_EMAIL_ADDRESS + rm -f $TEMPFILE + + exit 1 +fi +rm -f $TEMPFILE + +exit 0