blob: 009e0eb980266d1d0bfd06fa4d474fac18a4e199 (
plain)
- #!/bin/sh
- set -e
- PRG=`basename $0`
- TEMP=`getopt -s sh -o ah:fk -l all,host:,force,kill -n "$PRG" -- "$@"`
- if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
- eval set -- "$TEMP"
- all="no"
- host="localhost"
- force="no"
- kill="no"
- while true ; do
- case "$1" in
- -a|--all) all="yes" ; shift ;;
- -h|--host) host="$2" ; shift 2 ;;
- -f|--force) force="yes" ; shift ;;
- -k|--kill) kill="yes" ; shift ;;
- --) shift ; break ;;
- *) echo "Internal error!" ; exit 1 ;;
- esac
- done
- USER="`whoami`"
- if [ "$all" = yes ]; then
- # users=$(find /home -mindepth 2 -maxdepth 2 -type f -name .offlineimaprc -printf '%h\n' | sed 's,.*/,,')
- users=$(members mailmirrors)
- else
- users="${@:-$USER}"
- fi
- #for user in $(find /home -mindepth 2 -maxdepth 2 -type f -name .offlineimaprc -printf '%h\n' | sed 's,.*/,,'); do
- for user in $users; do
- # x-terminal-emulator -e sh -c "echo \"while true; do pkill -u $user offlineimap || offlineimap -u Curses.Blinkenlights; done\" | ssh $user@localhost sh -s" &
- if [ "$host" = localhost ] && [ "$user" = "$USER" ]; then
- ssh=""
- else
- ssh="ssh $user@$host"
- fi
- if [ "$kill" = yes ]; then
- $ssh killall -wq -u $user offlineimap
- exit $?
- fi
- if $ssh pgrep -u $user offlineimap; then
- if [ "$force" = yes ]; then
- $ssh killall -wq -u $user offlineimap || true
- else
- x-terminal-emulator -e sh -c "echo \"Error: offlineimap process(es) already running. Use --force to kill before use.\"; echo \"Press enter to quit this terminal\"; read" &
- fi
- fi
- if [ -n "$ssh" ]; then
- # SSH expands shell command twice: protect semicolons by double-quoting
- x-terminal-emulator -e $ssh -t sh -c "\"while true; do offlineimap -u Curses.Blinkenlights; done; read\"" &
- else
- x-terminal-emulator -e sh -c "while true; do offlineimap -u Curses.Blinkenlights; done; read" &
- fi
- done
- exit 0
- unbreakshell() {
- echo "$@" | perl -pe 's/(\S*[\\\|";'\'']\S*)/'\''$1'\''/g'
- # echo "$@" | perl -pe 's/(\S+)/'\''$1'\''/g'
- # echo "$@" | perl -pe 's/'\''/'\'\\\''/g; s/(\S+)/'\''$1'\''/g'
- }
- execute() {
- TEMP=`getopt -s sh -o xtf --long fork,loop -n "$PRG" -- "$@"`
- eval set -- "$TEMP"
- fork=""
- loop=""
- x11=""
- term=""
- force=""
- while true ; do
- case "$1" in
- --fork) fork="1" ; shift ;;
- --loop) loop="1" ; shift ;;
- -x) x11="-x" ; shift ;;
- -t) term="-t" ; shift ;;
- -f) force="-f" ; shift ;;
- --) shift ; break ;;
- *) echo >&2 "Internal error in execute subroutine!" ; exit 1 ;;
- esac
- done
- user=$1; shift
- host=$1; shift
- shellbreaks=0
- if [ -n "$loop" ]; then
- # TEMP="sh -c \"while true; do $(unbreakshell "$@"); done\""
- # eval set -- "$TEMP"
- eval set -- "sh -c \"while true; do" "$@" "; done\""
- fi
- # if [ -n "$fork" ]; then
- # command="sh -c \"eval $@ \& \""
- # eval set -- `unbreakshell $command`
- # fi
- ssh=""
- if [ "$host" != localhost ] || [ "$user" != "$USER" ]; then
- ssh="1"
- fi
- sshopts="-e none"
- xterm=""
- if [ "$host" != localhost ]; then
- sshopts="$sshopts -C"
- fi
- if [ -n "$x11" ]; then
- if [ -n "$term" ]; then
- xterm="1"
- sshopts="$sshopts -T"
- else
- sshopts="$sshopts -X"
- fi
- fi
- # while [ "$shellbreaks" -gt 0 ]; do
- # eval set -- "`unbreakshell "$@"`"
- # shellbreaks=`expr $shellbreaks - 1`
- # done
- if [ -n "$ssh" ]; then
- TEMP="ssh $sshopts \"$user@$host\" -- $(unbreakshell "$@")"
- eval set -- "$TEMP"
- fi
- if [ -n "$x11" ] && [ -n "$term" ]; then
- TEMP="x-terminal-emulator -e sh -c \"$(unbreakshell "$@")\""
- eval set -- "$TEMP"
- fi
- if [ -n "$fork" ]; then
- $@ &
- else
- $@
- fi
- }
- findusers() {
- user=$1; shift
- host=$1; shift
- execute $force "$user" "$host" -- find /home -mindepth 2 -maxdepth 2 -type f -name .offlineimaprc -printf '%h\n' | sed 's,.*/,,'
- }
- dosync() {
- TEMP=`getopt -s sh -o xtf -n "$PRG" -- "$@"`
- eval set -- "$TEMP"
- x11=""
- term=""
- force=""
- while true ; do
- case "$1" in
- -x) x11="-x" ; shift ;;
- -t) term="-t" ; shift ;;
- -f) force="-f" ; shift ;;
- --) shift ; break ;;
- *) echo >&2 "Internal error in dosync subroutine!" ; exit 1 ;;
- esac
- done
- user=$1; shift
- host=$1; shift
- killfork=""
- if [ "$1" = KILL ]; then
- killfork="--fork"
- fi
- execute $x11 $term $force $killfork "$user" "$host" -- killall -u $user -wq -v -r "sh offlineimap" || [ $? -lt 2 ]
- if [ "$1" != KILL ]; then
- execute $x11 $term $force --loop --fork "$user" "$host" -- offlineimap "$@"
- # execute $x11 $term $force --loop "$user" "$host" -- offlineimap "$@"
- fi
- # execute "$user" "$host" pkill -u $user offlineimap || [ $? -lt 2 ]
- # execute "$user" "$host" pkill -u $user offlineimap || echo $?
- # execute "$user" "$host" sh -c \"pkill -u $user offlineimap \|\| echo \$?\"
- # execute "$user" "$host" sh -c \"pkill -u $user offlineimap\" || [ $? -lt 2 ]
- # while true; do execute "$user" "$host" offlineimap "$@"; done
- # while true; do execute "$user" "$host" sh -c \"pkill -u $user offlineimap \|\|offlineimap "$@"\"; done &
- }
- case "$user" in
- ALL)
- if [ -z "$x11" ]; then
- echo >&2 "Error: checking multiple accounts requires the --x11 option."
- exit 1
- fi
- realusers="`findusers "$USER" "$host"`"
- for realuser in $realusers; do
- dosync $x11 $term $force "$realuser" "$host" -- "$@"
- done
- ;;
- *)
- dosync $x11 $term $force "$user" "$host" -- "$@"
- ;;
- esac
- exit 0
|