From 772070519951dac6f8a95fb77b3624a0dee4382d Mon Sep 17 00:00:00 2001 From: James Fraser Date: Fri, 15 Apr 2016 16:06:40 +1000 Subject: [PATCH] added first pass to fork --- plugins/history-sync/README.md | 23 ++++ plugins/history-sync/history-sync.plugin.zsh | 105 +++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 plugins/history-sync/README.md create mode 100644 plugins/history-sync/history-sync.plugin.zsh diff --git a/plugins/history-sync/README.md b/plugins/history-sync/README.md new file mode 100644 index 000000000..d79a4dfbf --- /dev/null +++ b/plugins/history-sync/README.md @@ -0,0 +1,23 @@ +## An oh-my-zsh plugin for gpg encrypted, internet synchronized zsh history using git. +
+That is, if you'd like an easy way to securely synchronise your zsh_history across many computers connected to the internet, this plugin will help you. You could even automate it using something like cron for a daily or even hourly sync. + +### How do I use it? + +1. Create a git repo for housing your encrypted zsh_history file (local or remote) + - Mine is $HOME/.zsh_history_proj +2. Activate history-sync plugin in your .zshrc + - git clone git@github.com:wulfgarpro/history-sync.git $HOME/.oh-my-zsh/plugins/. +3. Export environment variables (or use defaults found in history-sync.plugin.zsh) +
These are: + - ZSH_HISTORY_FILE + - ZSH_HISTORY_PROJ + - ZSH_HISTORY_FILE_ENC + - GIT_COMMIT_MSG +4. Ensure your gpg/pgp setup is complete and you have a public/private key pair +
i.e.: + - gpg --list-keys +5. Run zhpl alias to pull +6. Run zhps alias to push +7. Run zhsync to pull/push + diff --git a/plugins/history-sync/history-sync.plugin.zsh b/plugins/history-sync/history-sync.plugin.zsh new file mode 100644 index 000000000..1a1d103d7 --- /dev/null +++ b/plugins/history-sync/history-sync.plugin.zsh @@ -0,0 +1,105 @@ +### +# James Fraser +# +### + +autoload -U colors +colors + +ZSH_HISTORY_FILE=$HOME/.zsh_history +ZSH_HISTORY_PROJ=$HOME/.zsh_history_proj +ZSH_HISTORY_FILE_ENC=$ZSH_HISTORY_PROJ/zsh_history +GIT_COMMIT_MSG="latest $(date)" + +function print_git_error_msg() { + echo "$bold_color$fg[red]Fix your git repo...${reset_color}"; +} + +function print_gpg_encrypt_error_msg() { + echo "$bold_color$fg[red]GPG failed to encrypt history file... exiting.${reset_color}"; +} + +function print_gpg_decrypt_error_msg() { + echo "$bold_color$fg[red]GPG failed to decrypt history file... exiting.${reset_color}"; +} + +# Pull current master and merge with .zsh_history +function history_sync_pull() { + cp -a $HOME/{.zsh_history,.zsh_history.backup} + DIR=$CWD + cd $ZSH_HISTORY_PROJ && git pull + if [[ $? != 0 ]]; then + print_git_error_msg + cd $DIR + return + fi + + # Decrypt + gpg --output zsh_history_decrypted --decrypt zsh_history + if [[ $? != 0 ]]; then + print_gpg_decrypt_error_msg + cd $DIR + return + fi + + # Merge using sort unique + cat $HOME/.zsh_history zsh_history_decrypted | sort -u > $HOME/.zsh_history + rm zsh_history_decrypted + cd $DIR +} + +# Push current history to master +function history_sync_push() { + echo -n "Please enter GPG recipient name: " + read name + +# Encrypt + if [[ -n $name ]]; then + gpg -v -r $NAME --encrypt --sign --armor --output $ZSH_HISTORY_FILE_ENC $ZSH_HISTORY_FILE + if [[ $? != 0 ]]; then + print_gpg_encrypt_error_msg + return + fi + + echo -n "$bold_color$fg[yellow]Do you want to commit current local history file? ${reset_color}" + read commit + if [[ -n $commit ]]; then + case $commit in + [Yy]* ) + DIR=$CWD + cd $ZSH_HISTORY_PROJ && git add * && git commit -am $GIT_COMMIT_MSG + echo -n "$bold_color$fg[yellow]Do you want to push to remote? ${reset_color}" + read push + if [[ -n $push ]]; then + case $push in + [Yy]* ) + git push + if [[ $? != 0 ]]; then + print_git_error_msg + cd $DIR + return + fi + cd $DIR + ;; + esac + fi + + if [[ $? != 0 ]]; then + print_git_error_msg + cd $DIR + return + fi + ;; + [Nn]* ) + ;; + * ) + ;; + esac + fi + fi +} + +alias zhpl=history_sync_pull +alias zhps=history_sync_push +alias zhsync="history_sync_pull && history_sync_push" +