#!/bin/sh set -e # Copyright © 2011-2017 Carlos Zuferri License GPLv3+: GNU # GPL version 3 or later . # This is free software: you are free to change and redistribute it. # There is NO WARRANTY, to the extent permitted by law. # # 'pharc' or 'phlog archiver' is a simple script to automatically archive phlog # posts on a yearly basis. See wiki at # # Depends on 'mkphlog', otherwise, it is completely useless unless you have your # posts in directories named in the form $(date +%m-%d-%y).'mkphlog' was written # by Chris Yealy (octotep). The newest version can be found at: # # # or # # # Suggestions: # -Use it with 'cron'. Ideally on December 31st just before midnight: # 55 23 31 12 * # -To change the working directory: export PHARC_WORKDIR="/path/to/phlog" # -To change the log filename: export PHARC_LOGFILE="/path/to/pharc.log" # # Limitations: # # -pharc only works with the 21st century year range (2000-2099). # # Notes: # # - pharc makes a backup of your gophermap -> gophermap~ in case things go wrong. # # TODO: # * Improve it (as usual). # # Changelog: # # * v.6.0 # # * Sort Archives in reverse mode. # # * v.5.0 # # * Add '-A|--all' option to archive all years at once. # # * v.4.0 # # * Changed shebang to #!/bin/sh to make script more portable. # * Improved if[...]else statements to make script more robust. # * Added functionality to choose year of archive. # * Added functionality to specify several years in one go. # * Added '-l|--list' option to list unarchived phlog posts. # * Logging by default to "$HOME/pharc.log" # * Split code into functions. # * Added option '-d|--delete to delete the log file. # # * v.3.0 # # * Added option -a to specify year of archive (Redundant). # * Added -v (version information option). # * Added -h (help menu). # * Added -y (year of the archive). # * Help function (usage). # * Improve coding style. # * Leave a backup of gophermap -> gophermap~ (in case things break). # * Test before echoing "You're done now. Thanks for using pharc." # # * v.2.0 # # * Updating for mkphlog v.0.2 # * Adding version number 2.0 # * Adding license (2012) # # * Initial release. # # Setting defaults PHARC_VERSION="6.0" PHARC_WORKDIR="${PHARC_WORKDIR:-"$HOME/gopher/phlog"}" PHARC_ARCHIVE="${PHARC_ARCHIVE:-"$(date +'%Y')"}" PHARC_LOGFILE="${PHARC_LOGFILE:-"$HOME/pharc.log"}" # Writing functions. Usage () { echo "Usage: pharc -a, --archive ... (Specify year or years to archive) pharc -A, --all (Archives all unarchived years at once) pharc -d, --delete (Deletes pharc's log file interactively) pharc -h, --help (Prints help and exits) pharc -l, --list (Lists unarchived phlog posts, if any, and exits) pharc -v, --version (Prints version and exits) pharc -y, --year (Prints year of archive and exits) * pharc's default working directory is "HOME/gopher/phlog" To change it: export PHARC_WORKDIR="/path/to/phlog" * pharc creates a logfile by default in "HOME/pharc.log" To change it: export PHARC_LOGFILE="/path/to/pharc.log" " exit 0 } Initial_test () { # Testing to see if the script can be run. if [ ! -d ${PHARC_WORKDIR} ] then echo "$(date) No working directory found: ${PHARC_WORKDIR} does not exist." | tee -a ${PHARC_LOGFILE} exit 1 elif [ -d ${PHARC_WORKDIR}/${PHARC_ARCHIVE} ] then echo "$(date) Archive ${PHARC_ARCHIVE} already exists. Exiting..." | tee -a ${PHARC_LOGFILE} exit 1 elif [ ! -d ${PHARC_WORKDIR}/*-*-${PHARC_ARCHIVE#20} ] > /dev/null 2>&1 then echo "$(date) No ${PHARC_ARCHIVE} phlog posts to archive." | tee -a ${PHARC_LOGFILE} exit 1 else echo "" | tee -a ${PHARC_LOGFILE} echo "$(date) Archiving ${PHARC_ARCHIVE} posts..." | tee -a ${PHARC_LOGFILE} fi } Move_posts () { # Creating target directory and moving files there. cd ${PHARC_WORKDIR} mkdir ${PHARC_ARCHIVE} chmod 750 ${PHARC_ARCHIVE} mv *-*-${PHARC_ARCHIVE#20} ${PHARC_ARCHIVE} } # Creating and editing gophermaps: Gophermap_1 () { # Archive's gophermap. cp gophermap ${PHARC_ARCHIVE}/gophermap~ cd ${PHARC_WORKDIR}/${PHARC_ARCHIVE} head -n 3 gophermap~ > gophermap sed "/^1.*(*-*-${PHARC_ARCHIVE#20}$/!d" < gophermap~ >> gophermap rm -f gophermap~ chmod 640 gophermap } Gophermap_2 () { # Workdir's gophermap. cd ${PHARC_WORKDIR} mv gophermap gophermap~ sed -e "/1Archive.*/d" -e "/^1.*(*-*-${PHARC_ARCHIVE#20}$/d" < gophermap~ > gophermap chmod 640 gophermap DIRS=$(ls -d 20?? | sort -r) for DIR in ${DIRS} do printf "1Archive $DIR\t$DIR\n" >> gophermap done chmod 640 gophermap } Final_test () { # Perform final tests. if [ -d "${PHARC_ARCHIVE}" ] && [ "$(ls -A ${PHARC_ARCHIVE})" ] then echo "$(date) Done. Thanks for using pharc!" | tee -a ${PHARC_LOGFILE} echo "" | tee -a ${PHARC_LOGFILE} else echo "" | tee -a ${PHARC_LOGFILE} echo "$(date) Maybe unsuccessful!!! Please check it out. If things broke badly there is a backup of your gophermap -> gophermap~" | tee -a ${PHARC_LOGFILE} fi } Archive_phlog () { Initial_test Move_posts Gophermap_1 Gophermap_2 Final_test } # Adding options. if [ "$1" = "" ] then Archive_phlog else case "$1" in -a|--archive) shift for PHARC_YEAR in "$@" do PHARC_ARCHIVE="${PHARC_YEAR}" Archive_phlog done exit 0 ;; -A|--all) shift for PHARC_DIR in $(cd ${PHARC_WORKDIR} && ls -d *-*-* | sed 's/^.*\(..\)$/\1/' | sort | uniq) do PHARC_YEAR=20$(echo $PHARC_DIR) PHARC_ARCHIVE="${PHARC_YEAR}" Archive_phlog done exit 0 ;; -d|--delete) rm -i ${PHARC_LOGFILE} ;; -h|--help) Usage exit 0 ;; -l|--list) set +e cd ${PHARC_WORKDIR} && ls -d *-*-*/ > /dev/null 2>&1 if [ "$?" -eq "0" ] then echo "There are $(ls -d *-*-*/ | wc -w) unarchived phlog posts:" ls -d *-*-*/ | sort else echo "There are no unarchived posts." exit 0 fi ;; -v|--version) echo "${PHARC_VERSION}" exit 0 ;; -y|--year) echo "$(date +'%Y')" exit 0 ;; *) Usage exit 1 esac fi # "You can see the output of this script visiting my gopher hole at:" # "" exit 0