### Hub Snapshot Tools

Hubzilla developers frequently need to switch between branches that might have 
incompatible database schemas or content. The following two scripts create and 
restore complete snapshots of a Hubzilla instance, including both the hub web 
root and the entire database state. Each script requires a config file called 
`hub-snapshot.conf` residing in the same folder and containing the specific 
directories and database details of your hub.

### Config

The format of the config file is very strict. There must be no spaces between the 
variable name and the value. Replace only the content inside the quotes with your 
configuration. Save this file as `hub-snapshot.conf` alongside the scripts.

    # Location of hub root. Typically this is the location of the Hubzilla repo clone.
    HUBROOT="/var/www/"
    # MySQL database name
    DBNAME="hubzilla"
    # MySQL database user
    DBUSER="hubzilla"
    # MySQL database password
    DBPWD="akeufajeuwfb"
    # The target snapshot folder where the git repo will be initialized
    SNAPSHOTROOT="/root/snapshots/hubzilla/"
    
### Snapshot

Example usage:

    sh hub-snapshot.sh my-hub.conf "Commit message for the snapshot" 

**hub-snapshot.sh**:

    #!/bin/bash
    
    if ! [ -f "$1" ]; then
    	echo "$1 is not a valid file. Aborting..."
    	exit 1
    fi
    source "$1"
    #echo "$DBNAME"
    #echo "$DBUSER"
    #echo "$DBPWD"
    #echo "$HUBROOT"
    #echo "$SNAPSHOTROOT"
    MESSAGE="snapshot: $2"
    
    if [ "$DBPWD" == "" -o "$SNAPSHOTROOT" == "" -o "$DBNAME" == "" -o "$DBUSER" == "" -o "$HUBROOT" == "" ]; then
    	echo "Required variable is not set. Aborting..."
    	exit 1
    fi
    
    if [ ! -d "$SNAPSHOTROOT"/db/ ]; then
    	mkdir -p "$SNAPSHOTROOT"/db/
    fi
    if [ ! -d "$SNAPSHOTROOT"/www/ ]; then
    	mkdir -p "$SNAPSHOTROOT"/www/
    fi
    
    if [ ! -d "$SNAPSHOTROOT"/www/ ] || [ ! -d "$SNAPSHOTROOT"/db/ ]; then
    	echo "Error creating snapshot directories. Aborting..."
    	exit 1
    fi
    
    echo "Export database..."
    mysqldump -u "$DBUSER" -p"$DBPWD" "$DBNAME" > "$SNAPSHOTROOT"/db/"$DBNAME".sql
    echo "Copy hub root files..."
    rsync -va --delete --exclude=.git* "$HUBROOT"/ "$SNAPSHOTROOT"/www/
    
    cd "$SNAPSHOTROOT"
    
    if [ ! -d ".git" ]; then
    	git init
    fi
    if [ ! -d ".git" ]; then
    	echo "Cannot initialize git repo. Aborting..."
    	exit 1
    fi
    
    git add -A
    echo "Commit hub snapshot..."
    git commit -a -m "$MESSAGE"
    
    exit 0

### Restore

    #!/bin/bash
    # Restore hub to a previous state. Input hub config and commit hash
    
    if ! [ -f "$1" ]; then
            echo "$1 is not a valid file. Aborting..."
            exit 1
    fi
    source "$1"
    COMMIT=$2
    
    if [ "$DBPWD" == "" -o "$SNAPSHOTROOT" == "" -o "$DBNAME" == "" -o "$DBUSER" == "" -o "$HUBROOT" == "" ]; then
            echo "Required variable is not set. Aborting..."
            exit 1
    fi
    RESTOREDIR="$(mktemp -d)/"
    
    if [ ! -d "$RESTOREDIR" ]; then
    	echo "Cannot create restore directory. Aborting..."
    	exit 1
    fi
    echo "Cloning the snapshot repo..."
    git clone "$SNAPSHOTROOT" "$RESTOREDIR"
    cd "$RESTOREDIR"
    echo "Checkout requested snapshot..."
    git checkout "$COMMIT"
    echo "Restore hub root files..."
    rsync -a --delete --exclude=.git* "$RESTOREDIR"/www/ "$HUBROOT"/
    echo "Restore hub database..."
    mysql -u "$DBUSER" -p"$DBPWD" "$DBNAME" < "$RESTOREDIR"/db/"$DBNAME".sql
    
    chown -R www-data:www-data "$HUBROOT"/{store,extend,addon,.htlog,.htconfig.php}
    
    echo "Restored hub to snapshot $COMMIT"
    echo "Removing temporary files..."
    
    rm -rf "$RESTOREDIR"
    
    exit 0