Do not delete placeholder multiple email address for deleted accounts.
[project/infrastructure.git] / snapshot / snapshot.sh
1 #!/bin/bash
2
3 # Exit immediately on uninitialized variable or error, and print each command.
4 set -uex
5
6 # Run a snapshot phase. See below for how it is called. ${suffix} is the phase
7 # and used in filenames.
8 function snapshot {
9   # Allow skipping common sanitization. For CiviCRM and anything else
10   # non-Drupal.
11   if [ ! "${skip_common-}" ]; then
12     # Execute common SQL commands.
13     [ -f "snapshot/common${suffix}.sql" ] && mysql -o ${tmp_args} < "snapshot/common${suffix}.sql"
14     # Execute common SQL commands, but don't exit if they fail.
15     [ -f "snapshot/common-force${suffix}.sql" ] && mysql -f -o ${tmp_args} < "snapshot/common-force${suffix}.sql"
16   fi
17
18   # Skip if this sanitization and phase does not exit.
19   [ ! -f "snapshot/${sanitization}${suffix}.sql" ] && return
20   # Execute SQL for this sanitization and phase.
21   mysql -o ${tmp_args} < "snapshot/${sanitization}${suffix}.sql"
22
23   # Remove initial '.'
24   subdir=$(echo "${suffix}" | sed -e 's/^\.//')
25   # Store reduce with dev, they are the same level of sanitization.
26   if [ "${subdir}" = 'reduce' ]; then
27     subdir='dev'
28   fi
29   # Save the DB dump.
30   mysqldump --single-transaction --quick ${tmp_args} | sed -e 's/^) ENGINE=[^ ]*/)/' | bzip2 > "/var/dumps/${subdir}/${JOB_NAME}${suffix}-${BUILD_NUMBER}-in-progress.sql.bz2"
31   mv -v "/var/dumps/${subdir}/${JOB_NAME}${suffix}-${BUILD_NUMBER}-in-progress.sql.bz2" "/var/dumps/${subdir}/${JOB_NAME}${suffix}-${BUILD_NUMBER}.sql.bz2"
32   ln -sfv "${JOB_NAME}${suffix}-${BUILD_NUMBER}.sql.bz2" "/var/dumps/${subdir}/${JOB_NAME}${suffix}-current.sql.bz2"
33
34   # Remove old snapshots.
35   old_snapshots=$(ls -t /var/dumps/${subdir}/${JOB_NAME}${suffix}-[0-9]*.sql.{bz2,gz} | tail -n +2)
36   if [ -n "${old_snapshots}" ]; then
37     rm -v ${old_snapshots}
38   fi
39 }
40
41 function clear_tmp {
42   echo "DROP DATABASE ${tmp_db}; CREATE DATABASE ${tmp_db};" | mysql ${tmp_args}
43 }
44
45 # Configure credentials
46 db_name=$1
47 db_user=$2
48 db_pass=$3
49
50 # Temporarily use austin2014 for amsterdam2014 snapshots
51 # until staging contains features and content.
52 #if [ "${db_name}" == "amsterdam2014" ]; then
53 #  db_name="austin2014"
54 #  echo $db_name
55 #fi
56
57 # If the sanitization is not set, use the DB name.
58 [ "${sanitization-}" ] || sanitization=${db_name}
59 # If the DB host is not set, use db4-static.
60 [ "${db_host-}" ] || db_host=db4-static.drupal.org
61
62 tmp_db=drupal_sanitize
63 tmp_user=sanitize_rw
64 tmp_pass=$4
65 tmp_host=db4-static.drupal.org
66 tmp_args="-h${tmp_host} -u${tmp_user} -p${tmp_pass} ${tmp_db}"
67
68 clear_tmp
69
70 # Make a copy of live.
71 mysqldump -h$db_host -u$db_user -p$db_pass --single-transaction --quick $db_name 2> "${WORKSPACE}/mysqldump-errors.txt" | gzip > "${WORKSPACE}/tmp.mysql.gz"
72 # Check for errors.
73 if [ -s "${WORKSPACE}/mysqldump-errors.txt" ]; then
74   rm "${WORKSPACE}/tmp.mysql.gz"
75   cat "${WORKSPACE}/mysqldump-errors.txt"
76   exit 1
77 fi
78 # Copy live to tmp database.
79 gunzip < "${WORKSPACE}/tmp.mysql.gz" | sed -e 's/^) ENGINE=[^ ]*/) ENGINE=MyISAM/' | mysql -o ${tmp_args}
80 rm "${WORKSPACE}/tmp.mysql.gz"
81
82 # Save a copy of the schema.
83 mysqldump --single-transaction --quick ${tmp_args} -d --compact --skip-opt > "${WORKSPACE}/schema.mysql"
84
85 # Truncate all tables with cache in the name.
86 echo "SHOW TABLES LIKE '%cache%';" | mysql -o ${tmp_args} | tail -n +2 | sed -e "s/^\(.*\)$/TRUNCATE \1;/" | mysql -o ${tmp_args}
87 echo "SHOW TABLES LIKE 'civicrm_export_temp%';" | mysql -o ${tmp_args} | tail -n +2 | sed -e "s/^\(.*\)$/TRUNCATE \1;/" | mysql -o ${tmp_args}
88 echo "SHOW TABLES LIKE 'civicrm_import_job%';" | mysql -o ${tmp_args} | tail -n +2 | sed -e "s/^\(.*\)$/TRUNCATE \1;/" | mysql -o ${tmp_args}
89
90 # Snapshot in stages.
91
92 # Raw is nearly unsanitized, excpet for some keys. Git-dev uses this for emails.
93 suffix=.raw
94 snapshot
95
96 # A snapshot suitable for staging. We remove emails to avoid emailing people.
97 suffix=.staging
98 snapshot
99
100 # A snapshot suitable for dev. We remove all private information.
101 suffix=.dev
102 snapshot
103
104 # A smaller snapshot for taking up less space on dev.
105 suffix=.reduce
106 snapshot
107
108 clear_tmp