Last active
September 27, 2017 16:31
-
-
Save steverobbins/b68308b7323d53664f72 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
################################################################################ | |
# FUNCTIONS | |
################################################################################ | |
# 1. Check required system tools | |
_check_installed_tools() { | |
local missed="" | |
until [ -z "$1" ]; do | |
type -t $1 >/dev/null 2>/dev/null | |
if (( $? != 0 )); then | |
missed="$missed $1" | |
fi | |
shift | |
done | |
echo $missed | |
} | |
# 2. Selftest for checking tools which will used | |
checkTools() { | |
REQUIRED_UTILS='nice sed tar mysqldump head gzip getopt lsof' | |
MISSED_REQUIRED_TOOLS=`_check_installed_tools $REQUIRED_UTILS` | |
if (( `echo $MISSED_REQUIRED_TOOLS | wc -w` > 0 )); | |
then | |
echo -e "Unable to create backup due to missing required bash tools: $MISSED_REQUIRED_TOOLS" | |
exit 1 | |
fi | |
} | |
# 3. Create code/logs dump function | |
createCodeDump() { | |
# Content of file archive | |
DISTR=" | |
app | |
downloader | |
errors | |
includes | |
js | |
lib | |
pkginfo | |
shell | |
skin | |
.htaccess | |
api.php | |
cron.php | |
get.php | |
index.php | |
install.php | |
mage | |
*.patch | |
*.sh" | |
LOGS=" | |
var/log/system.log | |
var/log/exception.log | |
var/log/shipping*.log | |
var/log/payment*.log | |
var/log/paypal*.log" | |
# Create code dump | |
DISTRNAMES= | |
for ARCHPART in $DISTR; do | |
if [ -r "$MAGENTOROOT$ARCHPART" ]; then | |
DISTRNAMES="$DISTRNAMES $MAGENTOROOT$ARCHPART" | |
fi | |
done | |
if [ -n "$DISTRNAMES" ]; then | |
echo nice -n 15 tar -czhf $CODEFILENAME $DISTRNAMES | |
nice -n 15 tar -czhf $CODEFILENAME $DISTRNAMES | |
fi | |
# Create logs dump | |
DISTRNAMES= | |
for ARCHPART in $LOGS; do | |
if [ -r "$MAGENTOROOT$ARCHPART" ]; then | |
DISTRNAMES="$DISTRNAMES $MAGENTOROOT$ARCHPART" | |
fi | |
done | |
if [ -n "$DISTRNAMES" ]; then | |
echo nice -n 15 tar -czhf $LOGFILENAME $DISTRNAMES | |
nice -n 15 tar -czhf $LOGFILENAME $DISTRNAMES | |
fi | |
} | |
# 4. Create DB dump function | |
createDbDump() { | |
# Set path of local.xml | |
LOCALXMLPATH=${MAGENTOROOT}app/etc/local.xml | |
# Get mysql credentials from local.xml | |
getLocalValue() { | |
PARAMVALUE=`sed -n "/<resources>/,/<\/resources>/p" $LOCALXMLPATH | sed -n -e "s/.*<$PARAMNAME><!\[CDATA\[\(.*\)\]\]><\/$PARAMNAME>.*/\1/p" | head -n 1` | |
} | |
# Connection parameters | |
DBHOST= | |
DBUSER= | |
DBNAME= | |
DBPASSWORD= | |
TBLPRF= | |
# Include DB logs option | |
SKIPLOGS=1 | |
# Ignored table names | |
IGNOREDTABLES=" | |
core_cache | |
core_cache_tag | |
core_session | |
log_customer | |
log_quote | |
log_summary | |
log_summary_type | |
log_url | |
log_url_info | |
log_visitor | |
log_visitor_info | |
log_visitor_online | |
enterprise_logging_event | |
enterprise_logging_event_changes | |
index_event | |
index_process_event | |
report_event | |
report_viewed_product_index | |
dataflow_batch_export | |
dataflow_batch_import | |
enterprise_support_backup | |
enterprise_support_backup_item" | |
# Sanitize data | |
SANITIZE= | |
# Sanitazed tables | |
SANITIZEDTABLES=" | |
customer_entity | |
customer_entity_varchar | |
customer_address_entity | |
customer_address_entity_varchar" | |
# Get DB HOST from local.xml | |
if [ -z "$DBHOST" ]; then | |
PARAMNAME=host | |
getLocalValue | |
DBHOST=$PARAMVALUE | |
fi | |
# Get DB USER from local.xml | |
if [ -z "$DBUSER" ]; then | |
PARAMNAME=username | |
getLocalValue | |
DBUSER=$PARAMVALUE | |
fi | |
# Get DB PASSWORD from local.xml | |
if [ -z "$DBPASSWORD" ]; then | |
PARAMNAME=password | |
getLocalValue | |
DBPASSWORD=${PARAMVALUE//\\/\\\\} | |
DBPASSWORD=${DBPASSWORD//\"/\\\"} | |
DBPASSWORD=${DBPASSWORD//\$/\\\$} | |
DBPASSWORD=${DBPASSWORD//\`/\\\`} | |
fi | |
# Get DB NAME from local.xml | |
if [ -z "$DBNAME" ]; then | |
PARAMNAME=dbname | |
getLocalValue | |
DBNAME=$PARAMVALUE | |
fi | |
# Get DB TABLE PREFIX from local.xml | |
if [ -z "$TBLPRF" ]; then | |
PARAMNAME=table_prefix | |
getLocalValue | |
TBLPRF=$PARAMVALUE | |
fi | |
# Check DB credentials for existsing | |
if [ -z "$DBHOST" -o -z "$DBUSER" -o -z "$DBNAME" ]; then | |
echo "Skip DB dumping due lack of parameters host=$DBHOST; username=$DBUSER; dbname=$DBNAME;"; | |
exit 0 | |
fi | |
# Set connection params | |
if [ -n "$DBPASSWORD" ]; then | |
CONNECTIONPARAMS=" -u$DBUSER -h$DBHOST -p\"$DBPASSWORD\" $DBNAME --force --triggers --single-transaction --opt --skip-lock-tables" | |
else | |
CONNECTIONPARAMS=" -u$DBUSER -h$DBHOST $DBNAME --force --triggers --single-transaction --opt --skip-lock-tables" | |
fi | |
# Create DB dump | |
IGN_SCH= | |
IGN_IGN= | |
SAN_CMD= | |
if [ -n "$SANITIZE" ] ; then | |
for TABLENAME in $SANITIZEDTABLES; do | |
SAN_CMD="$SAN_CMD $TBLPRF$TABLENAME" | |
IGN_IGN="$IGN_IGN --ignore-table='$DBNAME'.'$TBLPRF$TABLENAME'" | |
done | |
PHP_CODE=' | |
while ($line=fgets(STDIN)) { | |
if (preg_match("/(^INSERT INTO\s+\S+\s+VALUES\s+)\((.*)\);$/",$line,$matches)) { | |
$row = str_getcsv($matches[2],",","\x27"); | |
foreach($row as $key=>$field) { | |
if ($field == "NULL") { | |
continue; | |
} elseif ( preg_match("/[A-Z]/i", $field)) { | |
$field = md5($field . rand()); | |
} | |
$row[$key] = "\x27" . $field . "\x27"; | |
} | |
echo $matches[1] . "(" . implode(",", $row) . ");\n"; | |
continue; | |
} | |
echo $line; | |
}' | |
SAN_CMD="nice -n 15 mysqldump $CONNECTIONPARAMS --skip-extended-insert $SAN_CMD | php -r '$PHP_CODE' ;" | |
fi | |
if [ -n "$SKIPLOGS" ] ; then | |
for TABLENAME in $IGNOREDTABLES; do | |
IGN_SCH="$IGN_SCH $TBLPRF$TABLENAME" | |
IGN_IGN="$IGN_IGN --ignore-table='$DBNAME'.'$TBLPRF$TABLENAME'" | |
done | |
IGN_SCH="nice -n 15 mysqldump --no-data $CONNECTIONPARAMS $IGN_SCH ;" | |
fi | |
IGN_IGN="nice -n 15 mysqldump $CONNECTIONPARAMS $IGN_IGN" | |
DBDUMPCMD="( $SAN_CMD $IGN_SCH $IGN_IGN) | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | gzip > $DBFILENAME" | |
echo ${DBDUMPCMD//"p\"$DBPASSWORD\""/p[******]} | |
eval "$DBDUMPCMD" | |
} | |
################################################################################ | |
# CODE | |
################################################################################ | |
# Selftest | |
checkTools | |
# Magento folder | |
MAGENTOROOT=./ | |
# Output path | |
OUTPUTPATH=$MAGENTOROOT | |
# Input parameters | |
MODE= | |
NAME= | |
OPTS=`getopt -o m:n:o: -l mode:,name:,outputpath: -- "$@"` | |
if [ $? != 0 ] | |
then | |
exit 1 | |
fi | |
eval set -- "$OPTS" | |
while true ; do | |
case "$1" in | |
-m|--mode) MODE=$2; shift 2;; | |
-n|--name) NAME=$2; shift 2;; | |
-o|--outputpath) OUTPUTPATH=$2; shift 2;; | |
--) shift; break;; | |
esac | |
done | |
if [ -n "$NAME" ]; then | |
CODEFILENAME="$OUTPUTPATH$NAME.tar.gz" | |
LOGFILENAME="$OUTPUTPATH$NAME.logs.tar.gz" | |
DBFILENAME="$OUTPUTPATH$NAME.sql.gz" | |
else | |
# Get random file name - some secret link for downloading from magento instance :) | |
MD5=`php -r 'echo md5(gmdate("r") . mt_rand(0, 32767));'` | |
DATETIME=`date -u +"%Y%m%d%H%M"` | |
CODEFILENAME="$OUTPUTPATH$MD5.$DATETIME.tar.gz" | |
LOGFILENAME="$OUTPUTPATH$MD5.$DATETIME.logs.tar.gz" | |
DBFILENAME="$OUTPUTPATH$MD5.$DATETIME.sql.gz" | |
fi | |
if [ -n "$MODE" ]; then | |
case $MODE in | |
db) createDbDump; exit 0;; | |
code) createCodeDump; exit 0;; | |
check) exit 0;; | |
*) echo Invalid mode; exit 1;; | |
esac | |
fi | |
createCodeDump | |
createDbDump | |
exit 0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment