Skip to content

Instantly share code, notes, and snippets.

@erikw
Last active Oct 19, 2021
Embed
What would you like to do?
snp: Wrap shell command in BTRFS snapper pre-post snapshots and log outputs.
#!/usr/bin/env bash
# Runs a command wrapped in btrfs snapper pre-post snapshots.
# Usage: $ snp <commands>
# e.g.: $ snp pacman -Syyu
# Requirements: snapper (https://wiki.archlinux.org/title/snapper)
# The latest version of this script is hosted at https://gist.github.com/erikw/5229436
log_path="/var/local/log/snp"
date=$(date "+%Y-%m-%d-%H%M%S")
log_file="${log_path}/snp_${date}.log"
! [ -d $log_path ] && mkdir -p $log_path
# Log stdout and stderr. Reference: http://stackoverflow.com/questions/3173131/redirect-copy-of-stdout-to-log-file-from-within-bash-script-itself
exec > >(tee -a "$log_file")
exec 2> >(tee -a "$log_file" >&2)
cmd="$@"
echo "> Logging to: ${log_file}"
snapshot_nbr=$(snapper create --type=pre --cleanup-algorithm=number --print-number --description="${cmd}")
echo "> New pre snapshot with number ${snapshot_nbr}."
echo -e "> Running command \"${cmd}\".\n"
eval "$cmd"
snapshot_nbr=$(snapper create --type=post --cleanup-algorithm=number --print-number --pre-number="$snapshot_nbr")
echo -e "\n> New post snapshot with number ${snapshot_nbr}."
# Snapper has a --command option nowadays. But it works worse, the output from the command is not printed separately from the snaptshot number, just becomes a mess.
#echo "> Running command \"${cmd}\"."
#snapshot_nbr=$(snapper create --command "${cmd}" --print-number --cleanup-algorithm=number --description="${cmd}" | tail -1)
#echo -e "\n> New pre-post snapshot with numbers ${snapshot_nbr}."
@cig0

This comment has been minimized.

Copy link

@cig0 cig0 commented Nov 3, 2014

Hi! Out of curiosity, why did you choose /var/local/log instead /var/log?

@erikw

This comment has been minimized.

Copy link
Owner Author

@erikw erikw commented Nov 16, 2014

Hi msx!

I use the local directory to not confuse my custom files and scripts with the systems. The very same reason people put their own system scripts under /usr/local/{bin,sbin} instead of /usr/{bin,sbin} :)

@cig0

This comment has been minimized.

Copy link

@cig0 cig0 commented Jun 2, 2015

Just passing by to say TY and let you know that I'm using snp all the time for all sort of things. Cheers!

@erikw

This comment has been minimized.

Copy link
Owner Author

@erikw erikw commented May 29, 2018

ZFS users!

Check out znp

=)

@Fire100265

This comment has been minimized.

Copy link

@Fire100265 Fire100265 commented Dec 20, 2020

Hi,
May I submit a PKGBUILD for this script to the AUR? I believe it will help out a lot of people.

@erikw

This comment has been minimized.

Copy link
Owner Author

@erikw erikw commented Dec 20, 2020

@Fire100265 Hey, you're very welcome to make a PKGBUILD for this! I too find this little utility immensely useful for many semi- to dangerous Linux operational tasks.

I don't know how well PKGBUILDs work with gists. If it's not working out well, I can move this script to a proper Github git repo. Let me know if the Gist works first though

@Fire100265

This comment has been minimized.

Copy link

@Fire100265 Fire100265 commented Dec 21, 2020

@erikw Thank you! I have written a PKGBUILD and I will be submitting it to the AUR soon. As you have predicted, gists do not work very well with PKGBUILDs. Due to this, I copied all the text into a file and used it as the source.
Edit: Here is the link to the AUR page. Please let me know of any changes I should make. I can add you as a maintainer if you wish.

@erikw

This comment has been minimized.

Copy link
Owner Author

@erikw erikw commented Dec 30, 2020

@Fire100265 The PKGBUILD looks great!

There can only be 1 maintainer in AUR right? To distribute comments and future maintenance questions you could tell people to reach out to me as well of your unavailable, here at Github or my AUR profile https://aur.archlinux.org/account/erikw :)

@Fire100265

This comment has been minimized.

Copy link

@Fire100265 Fire100265 commented Dec 30, 2020

Thank you for your reply! I added you as a maintainer. Please let me know if you can access the package.
Edit: please edit the PKGBUILD to add your email.

@erikw

This comment has been minimized.

Copy link
Owner Author

@erikw erikw commented Dec 30, 2020

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment