]> rtime.felk.cvut.cz Git - novaboot.git/blob - server/adduser-novaboot
Simplify systemd logic for automated delayed power off
[novaboot.git] / server / adduser-novaboot
1 #!/bin/sh
2
3 set -e
4
5 die() {
6     echo >&2 "$@"
7     exit 1
8 }
9
10 print_help() {
11     cat <<EOF
12 Usage: adduser-novaboot --key KEY [--admin-id=NAME] [adduser options] user
13 EOF
14 }
15
16 TEMP=$(getopt -o 'h' --long 'admin-id:,key:,help,home:,uid:,firstuid:,lastuid:,gecos:,ingroup:,gid:' -n "${0##*/}" -- "$@")
17 [ $? -ne 0 ] && die "getopt error"
18 eval set -- "$TEMP"
19 unset TEMP
20
21 admin=admin
22 key=
23 while true; do
24     case "$1" in
25         '--admin-id')
26             admin=$2
27             shift 2;;
28         '--key')
29             keysrc=$2
30             shift 2;;
31         '-h' | '--help')
32             print_help; exit;;
33         '--')
34             shift; break;;
35         *)
36             adduser_opts="$adduser_opts $1 $2"
37             shift 2;;
38     esac
39 done
40
41 [ -z "$keysrc" ] && die "Missing --key option"
42
43 if [ "$keysrc" = "-" ]; then
44     key=$(cat)
45 else
46     key=$(cat "$keysrc")
47 fi
48
49 [ -z "$key" -o "$(echo "$key" | wc -l)" -ne 1 ] && die "--key needs to be just one line"
50 echo "$key" | grep -q ssh || die "--key does not look like an SSH public key"
51
52 adduser --disabled-password --ingroup novaboot --shell $(which novaboot-shell) $adduser_opts "$@"
53
54 user="$1"
55 home=$(getent passwd "$user"|awk -F: '{print $6;}')
56 uid=$(id -u "$user")
57
58 echo "Creating $home/.ssh/authorized_keys"
59 mkdir -p -m 700 "$home/.ssh"
60 echo "command=\"user $admin admin\" $key" >> $home/.ssh/authorized_keys
61 chown $user: "$home/.ssh" "$home/.ssh/authorized_keys"
62
63 if [ -d /srv/tftp -a ! -e /srv/tftp/$user  ]; then
64     echo "Creating /srv/tftp/$user and symlink to it from $home/tftproot."
65     mkdir -p /srv/tftp/$user
66     chown $user /srv/tftp/$user
67     ln -s /srv/tftp/$user $home/tftproot
68 else
69     echo "NOT creating /srv/tftp/$user and symlink to it from $home/tftproot."
70 fi
71
72 echo "Creating configuration template in $home/.novaboot-shell"
73 cat <<'CONFIG_EOF' > $home/.novaboot-shell
74 #!/bin/sh
75 #
76 # Configuration for novaboot-shell
77 #
78
79 #console_cmd='sterm -s 115200 /dev/ttyUSB0'
80
81 #reset_cmd='/bin/sh -c "(usbrelay LY03X_2=1; sleep 0.1; usbrelay LY03X_2=0) 2>/dev/null"'
82
83 #on_cmd='/bin/sh -c "(usbrelay LY03X_1=1; sleep 0.1; usbrelay LY03X_1=0) 2>/dev/null"';
84 #off_cmd='/bin/sh -c "(usbrelay LY03X_1=1; sleep 7.0; usbrelay LY03X_1=0) 2>/dev/null"';
85
86 # target_config="\
87 # --prefix=/prefix/
88 # --uboot==>
89 # --uboot-init=setenv serverip 192.168.1.1
90 # --uboot-addr=kernel=0x81000000
91 # --uboot-addr=fdt=0x83000000
92 # --uboot-addr=ramdisk=0x83100000
93 # "
94 CONFIG_EOF
95 chown $user: $home/.novaboot-shell
96
97 if [ -d /run/systemd/system ]; then
98     cat <<EOF
99 To enable automatic delayed power-off run 'systemctl --user enable novaboot-power-off'
100 as the created user (e.g. via shell subcommand)
101 EOF
102     # TODO: Add a way to run in automatically from here (allow shell
103     #subcommand to accept command lines)
104     #systemctl --user enable novaboot-power-off
105 fi
106
107
108
109 echo "Done"
110 exit 0
111
112 : <<EOF
113 =encoding utf8
114
115 =head1 NAME
116
117 adduser-novaboot - create user account for use with novaboot's --ssh option
118
119 =head1 SYNOPSIS
120
121 B<adduser-novaboot> --key KEY [--admin-id NAME] [adduser options] user
122
123 =head1 DESCRIPTION
124
125 B<adduser-novaboot> is a wrapper of L<adduser(8)> command that
126 simplifies creation of user accounts for I<novaboot>'s --ssh option.
127 The created account has its shell set to L<novaboot-shell(1)>. The
128 command also creates a template of the configuration file, sets up
129 administrator's SSH key in L<authorized_keys(5)> prepares directories
130 and symlinks that for integration with TFTP server and, when run under
131 L<systemd(1)>, configures systemd service files to automatically
132 power-off the target after timeout.
133
134 =head1 OPTIONS
135
136 =over 8
137
138 =item --key KEY
139
140 Mandatory argument specifying administrator's public SSH key (e.g.
141 F<~/.ssh/id_rsa.pub>). The key will be copied to the created account's
142 F<~/.ssh/authorized_keys> and marked with administrator flag.
143
144 =item --admin-id NAME
145
146 User name associated with the key. This user name is shown to
147 connecting users when the target is occupied by the administrator.
148 When omitted, I<admin> is used as the user name.
149
150 =back
151
152 =head1 AUTHORS
153
154 Michal Sojka <sojkam1@fel.cvut.cz>
155
156 Latest version can be found at
157 L<https://github.com/wentasah/novaboot>.
158
159 =cut
160 EOF