#!/bin/sh awk=awk me() { basename "$0"; } printhelp() { cat << HELPDOC Usage: $(me): [-gh] [COMMAND] [COMMAND ARGS]... Args: -g, --gen-cache : Force generate cache -h, --help : show this help message Config Syntax: +host [HOSTNAME] Add a new host. Hosts can be referenced using their number starting with 1. [COMMAND] launch [COMMAND] will start the process specified for the specific hostname. Aliases are separated by |. [TAB][SHELL] Run this shell command when the above [COMMAND] is specified. In order of hostnames. Can be a number to reference to a hostname, a '-' to disregard this command for the specific host, or a '^' to reference the previous command. HELPDOC } # Make sure user is using GNU Awk (gawk) checkawk() { if ! ($awk -V >/dev/null 2>/dev/null && $awk -V | grep "GNU Awk" >/dev/null); then if command -v gawk > /dev/null; then awk=gawk else echo "$(me) requires GNU Awk (gawk) to function properly. Please install GNU Awk and try again." exit 0 fi fi } gencache() { $awk ' BEGIN { print "run=\"$1\"; shift" print "case \"$run\" in" } { sub(/#.*/, "") # Remove comments if (!/^\s*$/) { if (/^\+host/) { sub(/\s*\+host\s*/, "") h++ hosts[h] = $0 } else { if (!/^\t/) { hostnum = 1 o++ opts[o] = $0 } else { sub(/^\t/, "") if ($0 == "^") $0 = cache else if ($0 ~ /^[0-9]*$/) $0 = cmds[hosts[$0]":"opts[o]] cmds[hosts[hostnum]":"opts[o]] = cache = $0 hostnum++ } } } } END { for (host in hosts) { if (hosts[host] != "'`hostname`'") continue for (cmd in cmds) { if (cmd ~ hosts[host] && cmds[cmd] && cmds[cmd] != "-") { i = cmd sub(/.*:/, "", cmd) print "\t"cmd") "cmds[i]" \"$@\" & ;;" } } } print "\t*) command -v \"$run\" >/dev/null && exec \"$run\" \"$@\" || echo \"\\`$run${@:+ $@}\\` Does not exist or exited with an error\" ;;" print "esac" } ' $conf > $cache chmod +x $cache } # Config file setup confdir=${XDG_CONFIG_HOME:-~/.config}/launch conf=$confdir/config if [ ! -e $conf ]; then mkdir -p $confdir echo "#HOSTS\n+host $(hostname)\n\n#OPTS\ntest\n\techo \"Tested!\"" > $conf echo "No config file exists! new config file created at $conf! Exiting\n" printhelp exit 1 fi # Cache file setup cachedir=${XDG_CACHE_HOME:-~/.cache}/launch cache=$cachedir/cache [ ! -e $cache ] && mkdir -p $cachedir && gencache [ $conf -nt $cache ] && gencache # Command line options checkawk case "$1" in -g|--gen-cache) echo "Generating new cache: $cache"; gencache && cat $cache ;; -h|--help|'') printhelp ;; *) exec $cache "$@" ;; # Run esac