summaryrefslogtreecommitdiff
path: root/misc/launch
diff options
context:
space:
mode:
authorTim Keller <tjkeller.xyz>2024-11-17 23:34:54 -0600
committerTim Keller <tjkeller.xyz>2024-11-17 23:34:54 -0600
commit09ada24d4ec23cf24ab136141b354953d1bbc2fa (patch)
tree2c41e87c71ad3f3cd67a8bea0c1413efbab4087d /misc/launch
parent090a3a31683eb08b91351e4d1508a0a73a310a38 (diff)
downloadscripts-09ada24d4ec23cf24ab136141b354953d1bbc2fa.tar.xz
scripts-09ada24d4ec23cf24ab136141b354953d1bbc2fa.zip
reorganize scripts
Diffstat (limited to 'misc/launch')
-rwxr-xr-xmisc/launch110
1 files changed, 110 insertions, 0 deletions
diff --git a/misc/launch b/misc/launch
new file mode 100755
index 0000000..5947ae7
--- /dev/null
+++ b/misc/launch
@@ -0,0 +1,110 @@
+#!/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