#!/bin/bash ################################################################################ ## Home Config Backup Script ## 2012-07-04 ################################################################################ ## Note for Zsh: because of the Ksh-style arrays (index starting at 0), you ## cannot use array index to append elements to arrays -- otherwise the ## KSH_ARRAYS option for zsh must be used. ##============================================================================== ## Options ##============================================================================== ## Set Debug mode on DEBUG=no if [ "$DEBUG" = "yes" ]; then set -x fi ## Variables OLDPATH="$(pwd)" cd "$HOME" SCRIPTPATH="$(readlink -f $(dirname "$0"))" COMPRESSION="gz" ARCHIVENAME="$HOME/home-config-$(date "+%y-%m-%d-%H%M%S")" ARCEXT="tar.gz" ARCOPT="cvzf" print_help() { echo "Synopsis:" echo " $1 [-o ARCHIVENAME] [-m COMPRESSION]" echo echo "Usage:" echo " default: " echo " -h:\t\tDisplay this help." echo " -m: compression method among" echo " * gz (default)" echo " * xz" echo " -o: output archive name (without extension)." echo "" echo "Note: xz is not available on older Unices." } while getopts ":hm:o:" opt; do case $opt in h) print_help "$0" exit 1 ;; m) COMPRESSION="$OPTARG" ;; o) ARCHIVENAME="${OLDPATH}/$OPTARG" ;; ?) print_help "$0" exit 1 ;; :) echo "Missing argument." echo "Use $0 -h for help." exit 1 ;; esac done shift $(($OPTIND - 1)) case $COMPRESSION in "gz") ARCEXT="tar.gz" ARCOPT="cvzf" ;; "xz") ARCEXT="tar.xz" ARCOPT="cvJf" ;; *) ARCEXT="tar.gz" ARCOPT="cvzf" ;; esac if [ "${DEBUG}" = "yes" ]; then echo "COMPRESSION=[$COMPRESSION]" echo "ARCHIVENAME=[$ARCHIVENAME]" echo "ARCEXT=[$ARCEXT]" echo "ARCOPT=[$ARCOPT]" fi if [ -e "${ARCHIVENAME}.${ARCEXT}" ]; then echo "Error: ${ARCHIVENAME}.${ARCEXT} already exists!">&2 exit 0 fi ##============================================================================== ## Arch Linux packages list ##============================================================================== if [ -e "/usr/bin/pacman" ]; then ARCH_PKG_OFFICIAL="$HOME/.arch-pkg-official" ARCH_PKG_EXPLICIT="$HOME/.arch-pkg-explicit" ARCH_PKG_AUR="$HOME/.arch-pkg-aur" ARCH_MIRRORS="$HOME/.arch-mirrors" PKG_LOCAL='pacman -Qq | sort' PKG_FOREIGN='pacman -Qmq | sort' PKG_EXPLICIT='pacman -Qeq | sort' diff <(eval "${PKG_LOCAL}") <(eval "${PKG_FOREIGN}") --new-line-format='' --unchanged-group-format='%>' >"${ARCH_PKG_OFFICIAL}-$(hostname)" eval "${PKG_EXPLICIT}" >"${ARCH_PKG_EXPLICIT}-$(hostname)" eval "${PKG_FOREIGN}" >"${ARCH_PKG_AUR}-$(hostname)" cat /etc/pacman.conf | grep "^\[">"${ARCH_MIRRORS}-$(hostname)" fi ##============================================================================== ## Let's fill the file list: ##============================================================================== FILELIST=() ## Arch Linux package list if [ -e "/usr/bin/pacman" ]; then for i in $(find . -maxdepth 1 -name '.arch*' -exec basename {} \;) do FILELIST=(${FILELIST[*]} "$i") done fi ## Awesome for i in $(find .config/awesome \( -name "*.lua" -o -name "*.sh" \) -type f) do FILELIST=(${FILELIST[*]} "$i") done ## cmus # FILELIST=(${FILELIST[*]} "$(ls .cmus/{autosave,*.theme}) ") FILELIST=(${FILELIST[*]} ".cmus/autosave") ## Conky FILELIST=(${FILELIST[*]} ".conkyrc") ## Emacs FILELIST=(${FILELIST[*]} ".emacs") FILELIST=(${FILELIST[*]} ".emacs.d/plugins") FILELIST=(${FILELIST[*]} ".emacs.d/abbrev_defs") ## GnuPG FILELIST=(${FILELIST[*]} ".gnupg/gpg-agent.conf") ## GTK FILELIST=(${FILELIST[*]} ".gtkrc-2.0") FILELIST=(${FILELIST[*]} ".config/gtk-3.0/settings.ini") ## Luakit FILELIST=(${FILELIST[*]} ".config/luakit/") ## LXTerminal FILELIST=(${FILELIST[*]} ".config/lxterminal/lxterminal.conf") ## MPlayer # FILELIST=(${FILELIST[*]} ".mplayer") ## Mutt FILELIST=(${FILELIST[*]} ".muttrc") for i in $(ls -ad --indicator-style=none .mutt.d/* | grep -vi 'cache') do FILELIST=(${FILELIST[*]} "$i") done ## Nano FILELIST=(${FILELIST[*]} ".nanorc") ## Netinit FILELIST=(${FILELIST[*]} ".netinit") ## Ranger for i in $(ls -ad --indicator-style=none .config/ranger/* | grep -vi 'pycache\|bookmarks\|history\|tagged') do FILELIST=(${FILELIST[*]} "$i") done ## rtorrent FILELIST=(${FILELIST[*]} ".rtorrent.rc") ## Shells FILELIST=(${FILELIST[*]} ".bashrc") FILELIST=(${FILELIST[*]} ".zshrc") for i in $(ls -a .shell.d/*|grep -vi 'bhistory') do FILELIST=(${FILELIST[*]} "$i") done ## Taskwarrior FILELIST=(${FILELIST[*]} ".taskrc") ## Terminfo FILELIST=(${FILELIST[*]} ".terminfo/x/xterm") ## TeXlive # for i in $(find texmf -type f|grep -vi 'moderncv/examples\|moderncv/manual\|.bzr') # do # FILELIST=(${FILELIST[*]} "$i") # done ## Urlview FILELIST=(${FILELIST[*]} ".urlview") ## Vim FILELIST=(${FILELIST[*]} ".vimrc") ## WMFS FILELIST=(${FILELIST[*]} ".config/wmfs") ## Xinit FILELIST=(${FILELIST[*]} ".xinitrc") ## Xresource FILELIST=(${FILELIST[*]} ".Xresources") ## Xscreensaver # FILELIST=(${FILELIST[*]} ".xscreensaver") ##============================================================================== ## Archiving ##============================================================================== if [ "$DEBUG" = "yes" ]; then tar ${ARCOPT} "$ARCHIVENAME" -C "$HOME" ${FILELIST[*]} -C "$SCRIPTPATH" "$(basename "$0")" --exclude-vcs else tar ${ARCOPT} "${ARCHIVENAME}.${ARCEXT}" -C "$HOME" ${FILELIST[*]} -C "$SCRIPTPATH" "$(basename "$0")" --exclude-vcs >/dev/null fi ##============================================================================== ## Cleaning ##============================================================================== cd "${OLDPATH}" ## Set Debug mode off if [ "$DEBUG" = "yes" ]; then set +x fi