aboutsummaryrefslogtreecommitdiff
path: root/lib/hydra/backup
blob: 02095708ba51810bc439b4f0fb841ffdfff7ff66 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#!/bin/bash

# Setup environment for the backups website
function hydra_backup_environment_local_website {
  NODE="$1"
  SITE="$2"
  BACKUPDIR="/var/sites/backups/site/$SITE/$NODE"

  if [ -z "$SITE" ] || [ -z "$NODE" ]; then
    hydra_action_usage
    exit 1
  fi

  if [ ! -z "$DATE" ]; then
    RESTOREDIR="$BACKUPDIR/$DATE"
  else
    RESTOREDIR="$BACKUPDIR/`date +%Y%m%d`"
  fi

  DB_DUMP_BASE="$RESTOREDIR"
  mkdir -p $RESTOREDIR  
}

# Setup environment for backup restored from localhost
function hydra_backup_environment_local {
  BACKUPDIR="/var/backups/duplicity"

  if [ ! -z "$DATE" ]; then
    RESTOREDIR="/var/backups/restore/$DATE"
  else
    RESTOREDIR="/var/backups/restore/`date +%Y%m%d`"
  fi

  DB_DUMP_BASE="$RESTOREDIR/var/backups/mysql/sqldump/"
  mkdir -p $RESTOREDIR    
}

# Setup environment for backup restored from remote source
function hydra_backup_environment_remote {
  NODE="$1"
  METHOD="$2"
  BACKUP_ROOT="/var/backups/remote"
  DOMAIN="`facter domain`"
  BACKUPDIR="$BACKUP_ROOT/$NODE.$DOMAIN"

  if [ ! -z "$DATE" ]; then
    RESTOREDIR="$BACKUPDIR/restore/$DATE"
  else
    RESTOREDIR="$BACKUPDIR/restore/`date +%Y%m%d`"
  fi
  
  if [ -z "$NODE" ]; then
    hydra_action_usage
    exit 1
  fi
  
  if [ ! -d "$BACKUPDIR" ]; then
    echo "No backup found at $BACKUPDIR"
    exit 1
  fi
  
  if [ -z "$METHOD" ]; then
    if [ -d "$BACKUPDIR/rsync" ]; then
      echo "Assuming rsync backup method"
      BACKUPDIR="$BACKUPDIR/rsync/var/backups/duplicity/daily.1"
    elif [ -d "$BACKUPDIR/rdiff" ]; then
      echo "Assuming rdiff backup method"
      BACKUPDIR="$BACKUPDIR/rdiff/var/backups/duplicity"
    else
      echo "Missing backup action"
      exit 1 
    fi
  else
    if [ -d "$BACKUPDIR/$METHOD" ]; then
      BACKUPDIR="$BACKUPDIR/$METHOD"
    else
      echo "Backup folder for $METHOD not found at $BACKUPDIR"
      exit 1 
    fi
  fi
  
  if [ -d "$RESTOREDIR" ] && [ "$METHOD" != "restore" ]; then
    echo "Restoration folder $RESTOREDIR already exists"
    exit 1
  fi
  
  DB_DUMP_BASE="$RESTOREDIR/var/backups/mysql/sqldump/"
  mkdir -p $RESTOREDIR
}

# Restore a database
function hydra_backup_restore_database {
  DATABASE="$1"

  if [ -z "$DATABASE" ]; then
    return
  fi

  # Check if there are database dumps
  if [ -f "$DB_DUMP_BASE/$DATABASE.sql.gz" ]; then
    DB_DUMP_EXT=".gz"
    DB_DUMP_EXTRACT="gunzip"
  elif [ -f "$DB_DUMP_BASE/$DATABASE.sql.bz2" ]; then
    DB_DUMP_EXT=".bz2"
    DB_DUMP_EXTRACT="bunzip2"
  elif [ -f "$DB_DUMP_BASE/$DATABASE.sql" ]; then
    DB_DUMP_EXT=""
    DB_DUMP_EXTRACT="true"
  fi
  
  # Restore database
  if [ ! -z "$DB_DUMP_EXT" ]; then
    echo "Restoring database $DATABASE..."
    hydra_set_tmpfile $DATABASE -d
    cp $DB_DUMP_BASE/$DATABASE.sql$DB_DUMP_EXT $TMPWORK
    ( cd $TMPWORK && $DB_DUMP_EXTRACT $DATABASE.sql$DB_DUMP_EXT )
    hydra_truncate_database $DATABASE
    mysql $DATABASE < $TMPWORK/$DATABASE.sql
    hydra_unset_tmpfile $TMPWORK
  else
    echo "Database should be manually restored"
  fi
}