### 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