Advertisement
Guest User

Untitled

a guest
Sep 27th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.48 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. ################################################################################
  4. # FUNCTIONS
  5. ################################################################################
  6.  
  7. # 1. Check required system tools
  8. _check_installed_tools() {
  9. local missed=""
  10.  
  11. until [ -z "$1" ]; do
  12. type -t $1 >/dev/null 2>/dev/null
  13. if (( $? != 0 )); then
  14. missed="$missed $1"
  15. fi
  16. shift
  17. done
  18.  
  19. echo $missed
  20. }
  21.  
  22. # 2. Selftest for checking tools which will used
  23. checkTools() {
  24. REQUIRED_UTILS='nice sed tar mysqldump head gzip getopt lsof'
  25. MISSED_REQUIRED_TOOLS=`_check_installed_tools $REQUIRED_UTILS`
  26. if (( `echo $MISSED_REQUIRED_TOOLS | wc -w` > 0 ));
  27. then
  28. echo -e "Unable to create backup due to missing required bash tools: $MISSED_REQUIRED_TOOLS"
  29. exit 1
  30. fi
  31. }
  32.  
  33. # 3. Create code/logs dump function
  34. createCodeDump() {
  35. # Content of file archive
  36. DISTR="
  37. app
  38. downloader
  39. errors
  40. includes
  41. js
  42. lib
  43. pkginfo
  44. shell
  45. skin
  46. .htaccess
  47. api.php
  48. cron.php
  49. get.php
  50. index.php
  51. install.php
  52. mage
  53. *.patch
  54. *.sh"
  55. LOGS="
  56. var/log/system.log
  57. var/log/exception.log
  58. var/log/shipping*.log
  59. var/log/payment*.log
  60. var/log/paypal*.log"
  61.  
  62. # Create code dump
  63. DISTRNAMES=
  64. for ARCHPART in $DISTR; do
  65. if [ -r "$MAGENTOROOT$ARCHPART" ]; then
  66. DISTRNAMES="$DISTRNAMES $MAGENTOROOT$ARCHPART"
  67. fi
  68. done
  69. if [ -n "$DISTRNAMES" ]; then
  70. echo nice -n 15 tar -czhf $CODEFILENAME $DISTRNAMES
  71. nice -n 15 tar -czhf $CODEFILENAME $DISTRNAMES
  72. fi
  73. # Create logs dump
  74. DISTRNAMES=
  75. for ARCHPART in $LOGS; do
  76. if [ -r "$MAGENTOROOT$ARCHPART" ]; then
  77. DISTRNAMES="$DISTRNAMES $MAGENTOROOT$ARCHPART"
  78. fi
  79. done
  80. if [ -n "$DISTRNAMES" ]; then
  81. echo nice -n 15 tar -czhf $LOGFILENAME $DISTRNAMES
  82. nice -n 15 tar -czhf $LOGFILENAME $DISTRNAMES
  83. fi
  84. }
  85.  
  86. # 4. Create DB dump function
  87. createDbDump() {
  88. # Set path of local.xml
  89. LOCALXMLPATH=${MAGENTOROOT}app/etc/local.xml
  90.  
  91. # Get mysql credentials from local.xml
  92. getLocalValue() {
  93. PARAMVALUE=`sed -n "/<resources>/,/<\/resources>/p" $LOCALXMLPATH | sed -n -e "s/.*<$PARAMNAME><!\[CDATA\[\(.*\)\]\]><\/$PARAMNAME>.*/\1/p" | head -n 1`
  94. }
  95.  
  96. # Connection parameters
  97. DBHOST=
  98. DBUSER=
  99. DBNAME=
  100. DBPASSWORD=
  101. TBLPRF=
  102.  
  103. # Include DB logs option
  104. SKIPLOGS=1
  105.  
  106. # Ignored table names
  107. IGNOREDTABLES="
  108. core_cache
  109. core_cache_tag
  110. core_session
  111. log_customer
  112. log_quote
  113. log_summary
  114. log_summary_type
  115. log_url
  116. log_url_info
  117. log_visitor
  118. log_visitor_info
  119. log_visitor_online
  120. enterprise_logging_event
  121. enterprise_logging_event_changes
  122. index_event
  123. index_process_event
  124. report_event
  125. report_viewed_product_index
  126. dataflow_batch_export
  127. dataflow_batch_import
  128. enterprise_support_backup
  129. enterprise_support_backup_item"
  130.  
  131. # Sanitize data
  132. SANITIZE=
  133.  
  134. # Sanitazed tables
  135. SANITIZEDTABLES="
  136. customer_entity
  137. customer_entity_varchar
  138. customer_address_entity
  139. customer_address_entity_varchar"
  140.  
  141. # Get DB HOST from local.xml
  142. if [ -z "$DBHOST" ]; then
  143. PARAMNAME=host
  144. getLocalValue
  145. DBHOST=$PARAMVALUE
  146. fi
  147.  
  148. # Get DB USER from local.xml
  149. if [ -z "$DBUSER" ]; then
  150. PARAMNAME=username
  151. getLocalValue
  152. DBUSER=$PARAMVALUE
  153. fi
  154.  
  155. # Get DB PASSWORD from local.xml
  156. if [ -z "$DBPASSWORD" ]; then
  157. PARAMNAME=password
  158. getLocalValue
  159. DBPASSWORD=${PARAMVALUE//\\/\\\\}
  160. DBPASSWORD=${DBPASSWORD//\"/\\\"}
  161. DBPASSWORD=${DBPASSWORD//\$/\\\$}
  162. DBPASSWORD=${DBPASSWORD//\`/\\\`}
  163. fi
  164.  
  165. # Get DB NAME from local.xml
  166. if [ -z "$DBNAME" ]; then
  167. PARAMNAME=dbname
  168. getLocalValue
  169. DBNAME=$PARAMVALUE
  170. fi
  171.  
  172. # Get DB TABLE PREFIX from local.xml
  173. if [ -z "$TBLPRF" ]; then
  174. PARAMNAME=table_prefix
  175. getLocalValue
  176. TBLPRF=$PARAMVALUE
  177. fi
  178.  
  179. # Check DB credentials for existsing
  180. if [ -z "$DBHOST" -o -z "$DBUSER" -o -z "$DBNAME" ]; then
  181. echo "Skip DB dumping due lack of parameters host=$DBHOST; username=$DBUSER; dbname=$DBNAME;";
  182. exit 0
  183. fi
  184.  
  185. # Set connection params
  186. if [ -n "$DBPASSWORD" ]; then
  187. CONNECTIONPARAMS=" -u$DBUSER -h$DBHOST -p\"$DBPASSWORD\" $DBNAME --force --triggers --single-transaction --opt --skip-lock-tables"
  188. else
  189. CONNECTIONPARAMS=" -u$DBUSER -h$DBHOST $DBNAME --force --triggers --single-transaction --opt --skip-lock-tables"
  190. fi
  191.  
  192. # Create DB dump
  193. IGN_SCH=
  194. IGN_IGN=
  195. SAN_CMD=
  196.  
  197. if [ -n "$SANITIZE" ] ; then
  198.  
  199. for TABLENAME in $SANITIZEDTABLES; do
  200. SAN_CMD="$SAN_CMD $TBLPRF$TABLENAME"
  201. IGN_IGN="$IGN_IGN --ignore-table='$DBNAME'.'$TBLPRF$TABLENAME'"
  202. done
  203. PHP_CODE='
  204. while ($line=fgets(STDIN)) {
  205. if (preg_match("/(^INSERT INTO\s+\S+\s+VALUES\s+)\((.*)\);$/",$line,$matches)) {
  206. $row = str_getcsv($matches[2],",","\x27");
  207. foreach($row as $key=>$field) {
  208. if ($field == "NULL") {
  209. continue;
  210. } elseif ( preg_match("/[A-Z]/i", $field)) {
  211. $field = md5($field . rand());
  212. }
  213. $row[$key] = "\x27" . $field . "\x27";
  214. }
  215. echo $matches[1] . "(" . implode(",", $row) . ");\n";
  216. continue;
  217. }
  218. echo $line;
  219. }'
  220. SAN_CMD="nice -n 15 mysqldump $CONNECTIONPARAMS --skip-extended-insert $SAN_CMD | php -r '$PHP_CODE' ;"
  221. fi
  222.  
  223. if [ -n "$SKIPLOGS" ] ; then
  224. for TABLENAME in $IGNOREDTABLES; do
  225. IGN_SCH="$IGN_SCH $TBLPRF$TABLENAME"
  226. IGN_IGN="$IGN_IGN --ignore-table='$DBNAME'.'$TBLPRF$TABLENAME'"
  227. done
  228. IGN_SCH="nice -n 15 mysqldump --no-data $CONNECTIONPARAMS $IGN_SCH ;"
  229. fi
  230.  
  231. IGN_IGN="nice -n 15 mysqldump $CONNECTIONPARAMS $IGN_IGN"
  232.  
  233. DBDUMPCMD="( $SAN_CMD $IGN_SCH $IGN_IGN) | sed -e 's/DEFINER[ ]*=[ ]*[^*]*\*/\*/' | gzip > $DBFILENAME"
  234.  
  235. echo ${DBDUMPCMD//"p\"$DBPASSWORD\""/p[******]}
  236.  
  237. eval "$DBDUMPCMD"
  238. }
  239.  
  240. ################################################################################
  241. # CODE
  242. ################################################################################
  243.  
  244. # Selftest
  245. checkTools
  246.  
  247. # Magento folder
  248. MAGENTOROOT=./
  249.  
  250. # Output path
  251. OUTPUTPATH=$MAGENTOROOT
  252.  
  253. # Input parameters
  254. MODE=
  255. NAME=
  256.  
  257. OPTS=`getopt -o m:n:o: -l mode:,name:,outputpath: -- "$@"`
  258.  
  259. if [ $? != 0 ]
  260. then
  261. exit 1
  262. fi
  263.  
  264. eval set -- "$OPTS"
  265.  
  266. while true ; do
  267. case "$1" in
  268. -m|--mode) MODE=$2; shift 2;;
  269. -n|--name) NAME=$2; shift 2;;
  270. -o|--outputpath) OUTPUTPATH=$2; shift 2;;
  271. --) shift; break;;
  272. esac
  273. done
  274.  
  275. if [ -n "$NAME" ]; then
  276. CODEFILENAME="$OUTPUTPATH$NAME.tar.gz"
  277. LOGFILENAME="$OUTPUTPATH$NAME.logs.tar.gz"
  278. DBFILENAME="$OUTPUTPATH$NAME.sql.gz"
  279. else
  280. # Get random file name - some secret link for downloading from magento instance :)
  281. MD5=`php -r 'echo md5(gmdate("r") . mt_rand(0, 32767));'`
  282. DATETIME=`date -u +"%Y%m%d%H%M"`
  283. CODEFILENAME="$OUTPUTPATH$MD5.$DATETIME.tar.gz"
  284. LOGFILENAME="$OUTPUTPATH$MD5.$DATETIME.logs.tar.gz"
  285. DBFILENAME="$OUTPUTPATH$MD5.$DATETIME.sql.gz"
  286. fi
  287.  
  288. if [ -n "$MODE" ]; then
  289. case $MODE in
  290. db) createDbDump; exit 0;;
  291. code) createCodeDump; exit 0;;
  292. check) exit 0;;
  293. *) echo Invalid mode; exit 1;;
  294. esac
  295. fi
  296.  
  297. createCodeDump
  298. createDbDump
  299.  
  300. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement