md (2660B)
1 #!/usr/bin/env zsh 2 3 MDCFG="$XDG_CONFIG_HOME/mdcfg" 4 5 [ -f $MDCFG ] || exit 1 6 7 local p_start=0 8 local p_restart=0 9 local p_attach='' 10 local p_stop=0 11 local p_info=0 12 local p_debug=0 13 14 local opt 15 while getopts da:srthi opt; do 16 case $opt in 17 d) 18 p_debug=1 19 ;; 20 a) 21 p_attach=$OPTARG 22 ;; 23 s) 24 p_start=1 25 ;; 26 t) 27 p_stop=1 28 ;; 29 r) 30 p_restart=1 31 ;; 32 i) 33 p_info=1 34 ;; 35 h) 36 cat <<EOF 37 Dtach shortucts 38 39 USAGE: 40 md [FLAGS] [<app>...] 41 42 FLAGS: 43 -d Print debug messages 44 -a <app> Attach 45 -s Start 46 -r Restart 47 -i <app> Print info about app w/o proceeding 48 -h Print usage w/o proceeding 49 EOF 50 exit 0 51 ;; 52 esac 53 done 54 ((OPTIND > 1)) && shift $((OPTIND - 1)) 55 typeset -a apps 56 apps=($*) 57 58 E() { 59 print $@ >&2 60 exit 1 61 } 62 63 D() { 64 [[ $p_debug -eq 1 ]] && print $@ 65 } 66 67 D Actions\\n debug: $p_debug\\n info: $p_info\\n start: $p_start\\n stop: $p_stop\\n restart: $p_restart\\n attach: $p_attach 68 69 # LOAD CONFIG 70 . $MDCFG 71 72 info() { 73 local app="$1" 74 local cwd="$2" 75 local cmd="$3" 76 cat <<EOF 77 $app 78 CWD: $cwd 79 CMD: $cmd 80 EOF 81 } 82 83 [[ $p_info -eq 1 && $#apps -eq 0 ]] && apps=(${(k)serves}) 84 typeset -a valid 85 for app in ${apps[@]}; do 86 local cwd="${cwds[$app]}" 87 local serve_cmd="${serves[$app]}" 88 [[ -z $cwd || -z $serve_cmd ]] && E "$app not found." 89 [[ $p_info -eq 1 ]] && info "$app" "$cwd" "$serve_cmd" 90 valid=($app $valid) 91 done 92 [[ $p_info -eq 1 ]] && exit 0 93 D Valid apps: $valid 94 95 spath() { 96 name="$1" 97 echo "/tmp/dpgw_$name" 98 } 99 100 start() { 101 local app="$1" 102 local cmd="$2" 103 local cwd="$3" 104 session=$(spath $app) 105 (cd $cwd && dtach -n $session zsh -c "$cmd") 106 } 107 108 stop() { 109 local app="$1" 110 local session=$(spath $app) 111 if [[ -e $session ]]; then 112 echo -ne '\x03' | dtach -p $session 113 else 114 E $session not exist. 115 fi 116 } 117 118 restart() { 119 local app="$1" 120 local cmd="$2" 121 local cwd="$3" 122 local session=$(spath $app) 123 stop $app 124 while test -e $session; do sleep 0.1; done 125 start $app "$cmd" "$cwd" 126 } 127 128 attach() { 129 local app="$1" 130 local session=$(spath $app) 131 if [[ -e $session ]]; then 132 dtach -a $session -r winch 133 else 134 E $session not exist. 135 fi 136 } 137 138 # TODO(tms) 23.11.21: List 139 # TODO(tms) 23.11.21: Possibility to stop all dpgw_* sessions 140 141 if [[ $p_stop -eq 1 ]]; then 142 for app in ${valid[@]}; do 143 D Stopping $app 144 stop $app 145 done 146 fi 147 148 if [[ $p_start -eq 1 ]]; then 149 for app in ${valid[@]}; do 150 D Starting $app 151 start $app "${serves[$app]}" "${cwds[$app]}" 152 done 153 fi 154 155 if [[ $p_restart -eq 1 ]]; then 156 for app in ${valid[@]}; do 157 D Restarting $app 158 restart $app "${serves[$app]}" "${cwds[$app]}" 159 done 160 fi 161 162 if [[ -n $p_attach ]]; then 163 attach $p_attach 164 fi