[1578] | 1 | #!/bin/ksh |
---|
| 2 | |
---|
| 3 | out=~fcm/FCM/daily_cron.out |
---|
| 4 | svn_live=/data/local/fcm/svn/live |
---|
| 5 | svn_backup=~fcm/svn/backups |
---|
| 6 | svn_tmp=/var/tmp/fcm/svn/backups |
---|
| 7 | svn_dump=~fcm/svn/dumps |
---|
| 8 | trac_live=~fcm/trac/live |
---|
| 9 | trac_backup=~fcm/trac/backups |
---|
| 10 | trac_tmp=/var/tmp/fcm/trac/backups |
---|
| 11 | err='' |
---|
| 12 | |
---|
| 13 | export RSYNC_RSH=rsh # remote shell for "rsync" |
---|
| 14 | |
---|
| 15 | { |
---|
| 16 | |
---|
| 17 | # Verify and backup Subversion repository database |
---|
| 18 | # ---------------------------------------------------------------------------- |
---|
| 19 | cd $svn_live |
---|
| 20 | tmpfile=/tmp/${USER}.$$ |
---|
| 21 | now=$(date +%s) |
---|
| 22 | for dir in *; do |
---|
| 23 | if [[ ! -d $dir ]]; then continue; fi |
---|
| 24 | |
---|
| 25 | # Verify |
---|
| 26 | # -------------------------------------------------------------------------- |
---|
| 27 | echo "$(date): Verifying $dir ..." |
---|
| 28 | sed '/^\* Verified revision [0-9][0-9]*\./d'<<EOF |
---|
| 29 | $(svnadmin verify $dir 2>&1; echo $? > $tmpfile) |
---|
| 30 | EOF |
---|
| 31 | RC=$(cat $tmpfile) |
---|
| 32 | |
---|
| 33 | if ((RC != 0)); then |
---|
| 34 | err="${err}Error in $dir repository integrity. " |
---|
| 35 | continue |
---|
| 36 | fi |
---|
| 37 | |
---|
| 38 | # Backup |
---|
| 39 | # -------------------------------------------------------------------------- |
---|
| 40 | # Create the temporary backup location if it does not exists |
---|
| 41 | if [[ ! -d $svn_tmp ]]; then |
---|
| 42 | mkdir -p $svn_tmp |
---|
| 43 | |
---|
| 44 | if (($? != 0)); then |
---|
| 45 | err="${err}Error creating $svn_tmp. " |
---|
| 46 | break |
---|
| 47 | fi |
---|
| 48 | fi |
---|
| 49 | |
---|
| 50 | # Hotcopy to temporary location |
---|
| 51 | tmp_backup_dir=$svn_tmp/$dir |
---|
| 52 | echo "$(date): Hotcopying $dir SVN repository to $tmp_backup_dir ..." |
---|
| 53 | svnadmin hotcopy $dir $tmp_backup_dir |
---|
| 54 | |
---|
| 55 | if (($? != 0)); then |
---|
| 56 | err="${err}Error hotcopying $dir SVN repository to $tmp_backup_dir. " |
---|
| 57 | continue |
---|
| 58 | fi |
---|
| 59 | |
---|
| 60 | # Create the backup location if it does not exists |
---|
| 61 | if [[ ! -d $svn_backup ]]; then |
---|
| 62 | mkdir -p $svn_backup |
---|
| 63 | |
---|
| 64 | if (($? != 0)); then |
---|
| 65 | err="${err}Error creating $svn_backup. " |
---|
| 66 | break |
---|
| 67 | fi |
---|
| 68 | fi |
---|
| 69 | |
---|
| 70 | # Tar and gzip the backup |
---|
| 71 | new_backup=$svn_backup/$dir.$(date +%Y%m%d).tgz |
---|
| 72 | echo "$(date): Creating tar archive in $new_backup ..." |
---|
| 73 | tar -C $svn_tmp -c -z -f $new_backup $(basename $tmp_backup_dir) |
---|
| 74 | |
---|
| 75 | if (($? != 0)); then |
---|
| 76 | err="${err}Error creating tar archive in $new_backup. " |
---|
| 77 | continue |
---|
| 78 | fi |
---|
| 79 | |
---|
| 80 | # Remove the temporary hotcopy |
---|
| 81 | rm -rf $tmp_backup_dir |
---|
| 82 | |
---|
| 83 | if (($? != 0)); then |
---|
| 84 | err="${err}Error removing $tmp_backup_dir. " |
---|
| 85 | fi |
---|
| 86 | |
---|
| 87 | # Remove the old backup, if necessary |
---|
| 88 | backup=$svn_backup/$dir.tgz |
---|
| 89 | |
---|
| 90 | if [[ -f $backup ]]; then |
---|
| 91 | rm -f $backup |
---|
| 92 | |
---|
| 93 | if (($? != 0)); then |
---|
| 94 | err="${err}Error removing old copy of $backup. " |
---|
| 95 | continue |
---|
| 96 | fi |
---|
| 97 | fi |
---|
| 98 | |
---|
| 99 | # Move today's backup to the final location |
---|
| 100 | echo "$(date): Renaming $new_backup to $backup ..." |
---|
| 101 | mv $new_backup $backup |
---|
| 102 | |
---|
| 103 | if (($? != 0)); then |
---|
| 104 | err="${err}Error renaming $new_backup to $backup. " |
---|
| 105 | fi |
---|
| 106 | |
---|
| 107 | # Housekeep the revision dumps |
---|
| 108 | # -------------------------------------------------------------------------- |
---|
| 109 | if [[ -d $svn_dump/$dir ]]; then |
---|
| 110 | # Keep dumps created in the last 3 days |
---|
| 111 | echo "$(date): Housekeeping dumps in $svn_dump/$dir ..." |
---|
| 112 | |
---|
| 113 | cd $svn_dump/$dir |
---|
| 114 | for rev in *; do |
---|
| 115 | # Check that $rev is a regular file |
---|
| 116 | if [[ ! -f $rev ]]; then |
---|
| 117 | continue |
---|
| 118 | fi |
---|
| 119 | |
---|
| 120 | # 3 days = 24 * 60 * 60 * 3 = 259200 seconds |
---|
| 121 | if (($now - $(stat -c %Y $rev) > 259200)); then |
---|
| 122 | echo "$(date): Removing $svn_dump/$dir/$rev ..." |
---|
| 123 | rm -f $rev |
---|
| 124 | if (($? != 0)); then |
---|
| 125 | err="${err}Error removing dump $svn_dump/$dir/$rev. " |
---|
| 126 | fi |
---|
| 127 | fi |
---|
| 128 | done |
---|
| 129 | |
---|
| 130 | cd $OLDPWD |
---|
| 131 | fi |
---|
| 132 | done |
---|
| 133 | |
---|
| 134 | # Backing up Trac systems |
---|
| 135 | # ---------------------------------------------------------------------------- |
---|
| 136 | cd $trac_live |
---|
| 137 | for dir in *; do |
---|
| 138 | if [[ ! -d $dir ]]; then continue; fi |
---|
| 139 | |
---|
| 140 | # Backup |
---|
| 141 | # -------------------------------------------------------------------------- |
---|
| 142 | # Create the temporary backup location if it does not exists |
---|
| 143 | if [[ ! -d $trac_tmp ]]; then |
---|
| 144 | mkdir -p $trac_tmp |
---|
| 145 | |
---|
| 146 | if (($? != 0)); then |
---|
| 147 | err="${err}Error creating $trac_tmp. " |
---|
| 148 | break |
---|
| 149 | fi |
---|
| 150 | fi |
---|
| 151 | |
---|
| 152 | # Hotcopy to temporary location |
---|
| 153 | tmp_backup_dir=$trac_tmp/$dir |
---|
| 154 | echo "$(date): Hotcopying $dir Trac system to $tmp_backup_dir ..." |
---|
| 155 | trac-admin $dir hotcopy $tmp_backup_dir |
---|
| 156 | |
---|
| 157 | if (($? != 0)); then |
---|
| 158 | err="${err}Error hotcopying $dir Trac system to $tmp_backup_dir. " |
---|
| 159 | continue |
---|
| 160 | fi |
---|
| 161 | |
---|
| 162 | # Create the backup location if it does not exists |
---|
| 163 | if [[ ! -d $trac_backup ]]; then |
---|
| 164 | mkdir -p $trac_backup |
---|
| 165 | |
---|
| 166 | if (($? != 0)); then |
---|
| 167 | err="${err}Error creating $trac_backup. " |
---|
| 168 | break |
---|
| 169 | fi |
---|
| 170 | fi |
---|
| 171 | |
---|
| 172 | # Tar and gzip the backup |
---|
| 173 | new_backup=$trac_backup/$dir.$(date +%Y%m%d).tgz |
---|
| 174 | echo "$(date): Creating tar archive in $new_backup ..." |
---|
| 175 | tar -C $trac_tmp -c -z -f $new_backup $(basename $tmp_backup_dir) |
---|
| 176 | |
---|
| 177 | if (($? != 0)); then |
---|
| 178 | err="${err}Error creating tar archive in $new_backup. " |
---|
| 179 | continue |
---|
| 180 | fi |
---|
| 181 | |
---|
| 182 | # Remove the temporary hotcopy |
---|
| 183 | rm -rf $tmp_backup_dir |
---|
| 184 | |
---|
| 185 | if (($? != 0)); then |
---|
| 186 | err="${err}Error removing $tmp_backup_dir. " |
---|
| 187 | fi |
---|
| 188 | |
---|
| 189 | # Rename backups on success |
---|
| 190 | # -------------------------------------------------------------------------- |
---|
| 191 | # Shift backup "1" to backup "2", and then backup "0" to backup "1" |
---|
| 192 | for i in 1 0; do |
---|
| 193 | old_file=$trac_backup/$dir.$i.tgz |
---|
| 194 | new_file=$trac_backup/$dir.$((i + 1)).tgz |
---|
| 195 | |
---|
| 196 | # Check if move is necessary |
---|
| 197 | if [[ ! -f $old_file ]]; then |
---|
| 198 | continue |
---|
| 199 | fi |
---|
| 200 | |
---|
| 201 | if [[ -f $new_file ]]; then |
---|
| 202 | echo "$(date): Removing $new_file ..." |
---|
| 203 | rm -f $new_file |
---|
| 204 | |
---|
| 205 | if (($? != 0)); then |
---|
| 206 | err="${err}Error removing $new_file. " |
---|
| 207 | break |
---|
| 208 | fi |
---|
| 209 | fi |
---|
| 210 | |
---|
| 211 | echo "$(date): Renaming $old_file to $new_file ..." |
---|
| 212 | mv $old_file $new_file |
---|
| 213 | if (($? != 0)); then |
---|
| 214 | err="${err}Error renaming $old_file. " |
---|
| 215 | break |
---|
| 216 | fi |
---|
| 217 | done |
---|
| 218 | |
---|
| 219 | # Move today's backup to "0", if possible |
---|
| 220 | backup=$trac_backup/$dir.0.tgz |
---|
| 221 | if [[ ! -f $backup ]]; then |
---|
| 222 | echo "$(date): Renaming $new_backup to $backup ..." |
---|
| 223 | mv $new_backup $backup |
---|
| 224 | if (($? != 0)); then |
---|
| 225 | err="${err}Error renaming $new_backup to $backup. " |
---|
| 226 | fi |
---|
| 227 | fi |
---|
| 228 | done |
---|
| 229 | |
---|
| 230 | # Update the Trac password file and databases with latest login information |
---|
| 231 | # ---------------------------------------------------------------------------- |
---|
| 232 | echo "$(date): Updating password files and Trac databases ..." |
---|
| 233 | $(dirname $0)/fcm_manage_login.py |
---|
| 234 | if (($? != 0)); then |
---|
| 235 | err="${err} Error updating Trac password file and databases. " |
---|
| 236 | fi |
---|
| 237 | |
---|
| 238 | # Sync the working copy to the NEC |
---|
| 239 | # ---------------------------------------------------------------------------- |
---|
| 240 | echo "$(date): Updating NEC ..." |
---|
| 241 | rsync -a -v --timeout=1800 --exclude='.*' --exclude='FCM/doc' \ |
---|
| 242 | --delete-excluded ~/FCM/work/FCM fcm@tx01:~/FCM/work |
---|
| 243 | if (($? != 0)); then |
---|
| 244 | err="${err}Error updating NEC. " |
---|
| 245 | fi |
---|
| 246 | |
---|
| 247 | # Update "synch" path from "synch" machine |
---|
| 248 | # ---------------------------------------------------------------------------- |
---|
| 249 | echo "$(date): Updating synch machine ..." |
---|
| 250 | for subdir in bin lib etc; do |
---|
| 251 | rsync -a -v --timeout=1800 --exclude='.*' ~/FCM/work/FCM/src/$subdir/* \ |
---|
| 252 | fcm@hc0100:/opt/ukmo/utils/supported/portable/$subdir/ |
---|
| 253 | |
---|
| 254 | if (($? != 0)); then |
---|
| 255 | err="${err}Error updating $subdir/ on synch machine. " |
---|
| 256 | fi |
---|
| 257 | done |
---|
| 258 | |
---|
| 259 | # Final report |
---|
| 260 | # ---------------------------------------------------------------------------- |
---|
| 261 | if [[ -n $err ]]; then |
---|
| 262 | subject="$(basename $0) finished with errors: $err" |
---|
| 263 | |
---|
| 264 | else |
---|
| 265 | subject="$(basename $0) finished normally." |
---|
| 266 | fi |
---|
| 267 | |
---|
| 268 | echo "$(date): $subject" |
---|
| 269 | } 1>$out 2>&1 |
---|
| 270 | |
---|
| 271 | # Report completion via e-mail |
---|
| 272 | # ------------------------------------------------------------------------------ |
---|
| 273 | mail -s "$subject" my.name@somewhere.org <<EOF |
---|
| 274 | $(<$out) |
---|
| 275 | EOF |
---|
| 276 | |
---|
| 277 | # EOF |
---|