Commit | Line | Data |
---|---|---|
4e2acbd1 | 1 | #!/bin/bash |
bbc21163 | 2 | |
4e2acbd1 IK |
3 | trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR |
4 | set -eE -o pipefail | |
3f7ab73a | 5 | |
4e2acbd1 IK |
6 | # verbose command |
7 | v() { | |
8 | printf "$0 running: %s\n" "$*" | |
9 | "$@" | |
10 | } | |
21ead159 | 11 | |
21ead159 | 12 | |
4e2acbd1 IK |
13 | usage() { |
14 | cat <<EOF | |
f083a667 | 15 | Basic Usage: libremanage poweroff|poweron|reboot HOSTNAME |
e799dcd1 | 16 | |
f083a667 IK |
17 | Available HOSTNAMEs defined in /etc/libremanage.conf on this machine: |
18 | ||
19 | EOF | |
20 | ||
21 | if [[ -e /etc/libremanage.conf ]]; then | |
22 | sed -r '/\s*#/d;/^\s*$/d;s/_.*//' /etc/libremanage.conf | |
23 | else | |
24 | echo "/etc/libremanage.conf does not exist." | |
25 | fi | |
26 | ||
27 | cat <<EOF | |
28 | ||
29 | Thats all you need to know unless you are defining configuration or | |
ea470321 IK |
30 | setting up a new device. |
31 | ||
32 | ||
33 | ||
34 | ||
f083a667 | 35 | |
8de1992e | 36 | Advanced Usage: libremanage [--switch] poweroff|poweron|reboot HOSTNAME|CHANNEL [BOARD_ID] |
d8ddde1a | 37 | |
4e2acbd1 | 38 | Note, the relay's channels default state when plugged in are off. |
6e59af0c | 39 | |
f083a667 | 40 | Example /etc/libremanage.conf: |
a7d15c92 IK |
41 | |
42 | # This config is sourced from bash, so make sure its valid bash. | |
43 | cephserver3_channel=1 | |
44 | cephserver3_board_id=HURTM | |
45 | cephserver2_channel=2 | |
46 | cephserver2_board_id=HURTM | |
8de1992e IK |
47 | |
48 | librecmc1_type=switch | |
49 | cephserver2_type=button # default | |
50 | ||
a7d15c92 IK |
51 | # end of config |
52 | ||
a7d15c92 | 53 | |
8de1992e IK |
54 | Example use: |
55 | ||
56 | $ libremanage reboot cephserver3 | |
57 | ||
58 | --switch means means that the relay controls on an on/off switch (with | |
59 | default on), instead of a pc power button, which is the default. This | |
60 | corresponds to the config option HOST_type=switch. | |
a7d15c92 IK |
61 | |
62 | BOARD_ID is not needed if only 1 relay device is connected, or if it is | |
63 | defined in the config. To understand CHANNEL and BOARD_ID, run | |
64 | hidusb-relay-cmd and hidusb-relay-cmd state. | |
65 | ||
66 | ||
397823a6 IK |
67 | WARNING: Avoid ever manually running "hidusb-relay-cmd on" in |
68 | production, because if you lose connectivity and can't turn it off, its | |
69 | like the server's power button is stuck being pushed in and it won't | |
70 | turn on in that state. You will need to physically replug usb power to | |
71 | the relay so the channel goes back to its default off state. If this | |
72 | script somehow dies after turning a relay on, running it again will turn | |
73 | it off. That is why this script runs locally and ignores signals when | |
74 | its running. If you run this script over ssh and lose connection as this | |
75 | script is running, it will continue to run and complete. | |
e14d7650 | 76 | |
4e2acbd1 IK |
77 | EOF |
78 | if [[ -e /etc/libremanage.conf ]]; then | |
f083a667 | 79 | echo "Current /etc/libremanage.conf:" |
a7d15c92 | 80 | cat /etc/libremanage.conf |
4e2acbd1 IK |
81 | else |
82 | echo "Note: /etc/libremanage.conf does not exist on the current machine" | |
83 | fi | |
84 | exit 0 | |
d8ddde1a AR |
85 | } |
86 | ||
22f864bb | 87 | |
4e2acbd1 | 88 | |
8de1992e IK |
89 | switch=false |
90 | if [[ $1 == --switch ]]; then | |
91 | switch=true | |
f00bdb0e | 92 | shift |
8de1992e IK |
93 | fi |
94 | ||
ef3ced53 IK |
95 | if (( $# < 2 )); then |
96 | usage | |
97 | fi | |
98 | ||
99 | read action hostchan board_id <<<"$@" | |
4e2acbd1 IK |
100 | |
101 | if [[ -e /etc/libremanage.conf ]]; then | |
102 | source /etc/libremanage.conf | |
103 | fi | |
104 | ||
a7d15c92 IK |
105 | # Use config vars when appropriate. We know the arg is a HOSTNAME if it |
106 | # doesn't start with a number. | |
ef3ced53 IK |
107 | case $hostchan in |
108 | [0-9]*) | |
109 | chan=$hostchan | |
110 | ;; | |
111 | *) | |
4e2acbd1 | 112 | |
ef3ced53 IK |
113 | # allow board_id to be empty if its unset |
114 | if [[ ! $board_id ]]; then | |
115 | board_id_var=${hostchan}_board_id | |
116 | board_id=${!board_id_var} | |
117 | fi | |
118 | ||
119 | chan_var=${hostchan}_channel | |
120 | chan=${!chan_var} | |
121 | if [[ ! $chan ]]; then | |
122 | echo "error: channel not set on cli and not found in /etc/libremanage.conf" >&2 | |
123 | exit 1 | |
124 | fi | |
125 | ||
126 | type_var=${hostchan}_type | |
127 | type=${!type_var} | |
128 | if [[ $type == switch ]]; then | |
129 | switch=true | |
130 | fi | |
131 | ;; | |
132 | esac | |
4e2acbd1 IK |
133 | |
134 | ||
ef3ced53 IK |
135 | if ! $switch && hidusb-relay-cmd state | grep -F R$CHAN=ON; then |
136 | cat >&2 <<EOF | |
137 | $0: ERROR: Output from hidusb-relay-cmd state shows an ON relay, as if | |
138 | the power button is stuck in the pressed state. This could mean another | |
139 | command instance is running, or it got stuck on due to an uncompleted | |
140 | run. Exiting now so you can investigate. To manually switch it back to | |
141 | OFF, run the following command, or unplug the relay from usb power. | |
142 | ||
143 | hidusb-relay-cmd $board_id_arg off $chan | |
144 | ||
145 | EOF | |
146 | exit 1 | |
4e2acbd1 IK |
147 | fi |
148 | ||
149 | ||
150 | case $(hidusb-relay-cmd state|wc -l) in | |
151 | 0) | |
152 | echo "error: got 0 lines from running hidusb-relay-cmd state" >&2 | |
153 | exit 1 | |
154 | ;; | |
155 | 1) : ;; | |
156 | *) | |
157 | if [[ ! $board_id ]]; then | |
158 | echo "error: more than 1 relay device, so passing its id is required" >&2 | |
159 | exit 1 | |
160 | fi | |
161 | ;; | |
162 | esac | |
163 | ||
164 | ||
165 | if [[ $board_id ]]; then | |
166 | # leave this as an empty var if its not passed | |
167 | board_id_arg="id=$board_id" | |
168 | fi | |
169 | ||
170 | # ignore errors and continue on if a command fails from here | |
171 | set +eE +o pipefail | |
172 | # ignore hup so we complete even if there is a connection problem, and | |
173 | # force anyone to kill -9 so we might complete in more cases, for | |
174 | # example if a reboot is happening | |
175 | trap '' HUP INT QUIT TERM | |
176 | echo "$0: doing $action. shell commands will be printed to the terminal." | |
177 | case $action in | |
178 | poweroff) | |
8de1992e | 179 | if $switch; then |
7078ccb2 | 180 | v hidusb-relay-cmd $board_id_arg on $chan |
8de1992e IK |
181 | else |
182 | v hidusb-relay-cmd $board_id_arg on $chan | |
183 | v sleep 6 | |
184 | v hidusb-relay-cmd $board_id_arg off $chan | |
185 | fi | |
4e2acbd1 IK |
186 | ;; |
187 | poweron) | |
8de1992e | 188 | if $switch; then |
7078ccb2 | 189 | v hidusb-relay-cmd $board_id_arg off $chan |
8de1992e IK |
190 | else |
191 | v hidusb-relay-cmd $board_id_arg on $chan | |
192 | v sleep 1 | |
193 | v hidusb-relay-cmd $board_id_arg off $chan | |
194 | fi | |
4e2acbd1 IK |
195 | ;; |
196 | reboot) | |
8de1992e | 197 | if $switch; then |
8de1992e | 198 | v hidusb-relay-cmd $board_id_arg on $chan |
7078ccb2 IK |
199 | v sleep 4 |
200 | v hidusb-relay-cmd $board_id_arg off $chan | |
8de1992e IK |
201 | else |
202 | v hidusb-relay-cmd $board_id_arg on $chan | |
203 | v sleep 6 | |
204 | v hidusb-relay-cmd $board_id_arg off $chan | |
205 | v sleep 1 | |
206 | v hidusb-relay-cmd $board_id_arg on $chan | |
207 | v sleep 1 | |
208 | v hidusb-relay-cmd $board_id_arg off $chan | |
209 | fi | |
4e2acbd1 IK |
210 | ;; |
211 | *) | |
212 | echo "error: action arg not supported" >&2 | |
213 | exit 1 | |
214 | esac | |
215 | echo "$0: script ended. exiting" |