6 echo >&2 "novaboot-shell: $*"
13 - console (default command)
24 if [ "$NB_ADMIN" ]; then
27 - shell (use with ssh -t)
35 [ "$NB_ADMIN" ] || return 1
38 0) die "Usage: ssh ... add-key USERNAME < id_rsa.pub";;
40 *) die "User name must not contain spaces: $*";;
45 tmp=$(mktemp ~/.ssh/authorized_keys.XXXXXXXX)
47 cat ~/.ssh/authorized_keys
48 echo "command=\"user $user\" $key"
51 mv $tmp ~/.ssh/authorized_keys
55 [ "$NB_ADMIN" ] || die "Permission denied"
56 if ! tty > /dev/null; then
57 echo "novaboot-shell: Consider starting the shell with 'ssh -t'"
59 exec /bin/bash || exec /bin/sh
63 lslocks | awk '{ if ($9 == "'"$RUN_DIR"'") { print $2 } }'
70 for pid in $(lock_queue); do
71 echo $pid $(sed --null-data -ne '/^NOVABOOT_ID=/ s///p' /proc/$pid/environ)
74 echo "Target is occupied by:"
75 ( echo "PID USER LOGIN_TIME FROM"; echo "$queue" ) | column -t
81 exec flock --no-fork "$RUN_DIR" "$@"
89 . "${NOVABOOT_SHELL_CONFIG:-$HOME/.novaboot-shell}"
95 "on") cmd="${on_cmd:?}";;
96 "off") cmd="${off_cmd:?}";;
97 *) die "Unexpected power parameter";;
100 if [ "$PPID" -ne 1 ] && systemctl --user is-enabled --quiet novaboot-delayed-power-off.service; then
101 sudo novaboot-power "$1"
107 # run_subcommand should be called only after permission checks and/or locking
112 trap "rm -f $RUN_DIR/ppid" EXIT
113 echo $NOVABOOT_PPID > $RUN_DIR/ppid
114 echo 'novaboot-shell: Connected'
115 # TODO: $reset_begin_cmd
116 [ -n "${on_cmd}" ] && power on
117 eval exec "${console_cmd:?}";;
119 eval exec "${reset_cmd:?}";;
120 "rsync --server "*" . .")
121 if ! [ $# -eq 5 -o \( $# -eq 6 -a "$4" = '--log-format=X' \) ]; then
122 die "Unexpected rsync invocation: $*"
124 mkdir -p "$HOME/tftproot"
134 die "Unknown command: $*";;
139 if [ "$1" = "-c" ]; then
141 elif [ $# -gt 0 ]; then
142 die "Permission denied"
146 if [ "$1" = "user" ]; then
147 # Get user name encoded in ~/.ssh/authorized_keys
149 [ "$3" = "admin" ] && NB_ADMIN=1
150 set -- $SSH_ORIGINAL_COMMAND
153 IP=${SSH_CONNECTION%% *}
155 HOST=$(getent hosts $IP) || HOST=$IP
160 DATE=$(LANG=C date +'%F_%T')
161 export NOVABOOT_ID="${NB_USER:-?} $DATE ${REMOTE}"
162 export NOVABOOT_PPID=$PPID
167 # Commands allowed at any time
168 "console"|"") locked $0 console;;
169 "get-config") read_config && echo -n "${target_config}"; exit;;
170 "add-key") shift; add_key "$@"; exit;;
171 "shell") exec_shell; exit;;
174 # Commands allowed only when nobody or the same user is connected
175 # to the console. "The same user" means that we were executed by
176 # the same sshd process that has the lock. This is ensured by
177 # using SSH connection sharing on client side.
178 reset | rsync | on | off)
179 ALLOWED_PPID=$(cat $RUN_DIR/ppid 2>/dev/null || :)
180 if [ "$PPID" -eq "${ALLOWED_PPID:-0}" ]; then run=unlocked; else run=locked; fi
183 echo >&2 "novaboot-shell: Command not allowed: $*"
184 logger -p error "novaboot-shell: Command not allowed: $*"
189 if [ -d "$HOME" ]; then
192 RUN_DIR="/tmp/novaboot-shell@$USER"
196 if [ -z "$NOVABOOT_ID" ] && [ "$PPID" -ne 1 ]; then
208 novaboot-shell - provides novaboot with unified SSH-based interface for controlling target hardware
212 B<novaboot-shell> -c "[command [arguments...]]"
214 B<novaboot-shell> [command [arguments...]]
216 B<ssh target@server> [command [arguments...]]
220 B<novaboot-shell> provides L<novaboot(1)> with a unified SSH-based
221 interface for controlling the target hardware. This simplifies
222 client-side configuration, because clients typically need only the
223 I<--ssh=...> option. B<novaboot-shell> is typically configured as a
224 login shell of special user accounts associated with the target
225 hardware (as set by L<adduser-novaboot(8)>). It ensures that users can
226 perform only a limited set of actions (see L</COMMANDS> below) with
227 the target and have no shell access on the server.
235 Connect to target console (usually serial line). When somebody is
236 connected to the console, other users are blocked from controlling the
237 target. Blocked users see a message indicating who blocks them.
239 The user connected to the console is able to invoke other commands
240 such as L</reset>, but only when the command is invoked via the same
241 SSH connection. This can be accomplished by using SSH connection
242 sharing, which is what L<novaboot(1)> uses (see I<-M> and I<-S> in
245 This is the default command when no command is specified on command
250 Reset the target hardware.
254 Power on the target hardware.
258 Power off the target hardware.
262 This command is not meant to be invoked directly by the user. It
263 allows using L<rsync(1)> to copy files to the target, perhaps for TFTP
264 server. The rsync command must be invoked as: C<rsync ...
265 target@server:>, i.e. without specifying destination path. The files
266 will be stored into I<$HOME/tftproot>.
268 =item user <uernamename> [admin]
270 User command is meant to be used with C<command=> option in SSH's
271 L<authorized_keys(5)> file. It allows the shell to display
272 human-readable names when printing information about who blocks the
273 target. Then, the real command is taken from SSH_ORIGINAL_COMMAND
274 environment variable.
276 When "admin" is specified after the user name, this user is considered
277 an administrator and is allowed to run L</add-key> and L</shell>
282 Prints novaboot configuration options needed for the target. One
287 =head2 Administration commands
289 Only administrators (see L</user>) are allowed to execute these
294 =item add-key <username>
296 Reads the SSH public key from standard input and adds it into in
297 F<~/.ssh/authorized_keys>.
299 Example: C<ssh target@server add-key johndoe < john_rsa.pub>
303 Runs shell on the server. Useful for editing configuration file. It is
304 better used with allocated pseudo-terminal.
306 Example: C<ssh -t target@server shell>
310 =head1 CONFIGURATION FILE
312 B<novaboot-shell> reads configuration file from
313 F<$HOME/.novaboot-shell>. It should define values for the following
314 variables in the SH syntax.
320 Command to C<exec> that connects to target's console.
324 Command to C<exec> that resets the Target.
328 Command to C<exec> that powers the target on.
332 Command to C<exec> that powers the target off.
336 Novaboot command line options that specify which boot loader is used
337 by the target (L<novaboot(1)> rejects other, possibly dangerous, options).
338 Each option is on its own line and no quoting, escaping or stripping
339 is performed on the values.
345 --uboot-init=setenv serverip 192.168.1.1; setenv ipaddr 192.168.1.10
346 --uboot-addr=kernel=0x8100000
347 --uboot-addr=fdt=0x83000000
348 --uboot-addr=ramdisk=0x83100000
356 Michal Sojka <sojkam1@fel.cvut.cz>
358 Latest version can be found at
359 L<https://github.com/wentasah/novaboot>.