@@ -0,0 +1,155 @@ | |||||
Embedded Lab 1 | |||||
============== | |||||
This is the configuration and setup information for the lab. | |||||
Settings | |||||
-------- | |||||
The file `settings.conf` contains the various variables to use. | |||||
### Misc | |||||
- labuser - The user that can modify the database, and is used to login | |||||
for generating API Keys. | |||||
- labuserzfs - The root ZFS FS for which user data will be stored. This | |||||
is where board clones will be made, i.e. $labuserzfs/$user/$board. A | |||||
proper user quota should be set on this FS. | |||||
- ifacebridge - The bridge interface to add the epair interface for network | |||||
- devfsdefaultruleset - The base devfs ruleset that all jails start with. | |||||
### Directories | |||||
- labhome - Home directory where state information about the lab is kept. | |||||
This includes things like the database for the API, ssh keys, etc. | |||||
- labbin - Directory where the binaries and scripts live. This is where | |||||
the `settings.conf` file exists, and the scripts like setting up the | |||||
jail, and deploying the ssh keys. Simply, where this repository is | |||||
located. | |||||
- userzfsmount - The directory that the ZFS dataset labuserzfs is mounted | |||||
at. When doing operations like populating jails, or creating them, this | |||||
is the directory that should be used. | |||||
### Resource Dirs | |||||
These list the various resources used/allocated by the system. The | |||||
directory contains directories where the name is the value of the | |||||
resource. Directories are used because posix guarantees atomic | |||||
create/delete of directories, ensuring that an error occures if the | |||||
operation fails. | |||||
- devfsruleresourcedir - This is the set of devfs rules. | |||||
- ipresourcedir - This is the set of IP addresses available. | |||||
### Scripts | |||||
- keygencmd - Command used to generate a key for the specified user, and | |||||
add it to the database. | |||||
### Data files | |||||
- labkeys - File that contains lines of "<user> <ssh public key>". This | |||||
is used by update_authkeys.sh to populate labauthfile (aka | |||||
authorized_keys). | |||||
- db_file - SQLite3 database file that contains API keys and other | |||||
information. | |||||
### Internal | |||||
- labuid - This is 742, and is used by the setup script. It should not | |||||
be modified. | |||||
Misc Files | |||||
---------- | |||||
`base_setup.sh`: Script to setup a base image w/ various defaults | |||||
`board_conf.ucl`: UCL configuration file for the embedded lab daemon | |||||
`board_script`: Script that is run by the daemon, that reserves and | |||||
releases the specific board. It allocates resources (such as local | |||||
IP address) and launches the jail, and when the board is released, | |||||
it frees up the various resources. | |||||
`create_resource`: Script used by `setup_resources.sh` to initalize | |||||
the various resources when this is first configured. | |||||
`keygen`: Script for generating a new API key for the specified user. | |||||
This is used by the `update_authkeys.sh` script. | |||||
`rc.conf.template`: Template `rc.conf` for jails. | |||||
`setup_lab.sh`: Script to setup the machine for the first time to run | |||||
the lab. | |||||
`setup_resources.sh`: Script to setup initial resources. | |||||
`test.*`: File and script to test that `board_script` does what is | |||||
expected. | |||||
`update_authkeys.sh`: A script used to generate the `authorized_keys` | |||||
file. The input is a file with each line containing the user followed | |||||
by their ssh-key. It will restrict that key to run the `keygen` script | |||||
to get the user an API key. | |||||
SNMP | |||||
---- | |||||
SNMP is used to control a PoE switch which provides power to various | |||||
boards. NetSNMP is used. It requires a little bit of setup. First is | |||||
to set the default version to 3. Despite v1 being more common, v3 | |||||
provides better security. | |||||
### Configure NetSNMP | |||||
`~root/.snmp/snmp.conf`: | |||||
``` | |||||
defVersion 3 | |||||
``` | |||||
NetSNMP will use a file `.snmp/hosts/<hostname>.conf` to set various | |||||
parameters. For example: | |||||
``` | |||||
defVersion 3 | |||||
defSecurityName admin | |||||
defAuthPassphrase XXXYYYZZZ | |||||
defAuthType SHA | |||||
defPrivPassphrase WWWUUUVVV | |||||
defPrivType DES | |||||
defSecurityLevel authPriv | |||||
transport <ip address> | |||||
``` | |||||
This segments where authentication credentials are stored, and allows | |||||
using names w/o having to enter them into a DNS server. | |||||
### Configure switch | |||||
The program [vlanmang](https://www.funkthat.com/gitea/jmg/vlanmang) is | |||||
used to maintain the configuration of the switch, most specifically | |||||
what ports are connected to which VLAN. | |||||
The file `data.py` contains the configuration information. It will | |||||
read the auth methods and passwords from the NetSNMP configuration | |||||
files setup in the previous section. | |||||
Setup `vlanmang`: | |||||
``` | |||||
ln -s ~lab/.local ~root | |||||
python3.8 -m venv venv | |||||
. ./venv/bin/activate | |||||
export TMPDIR=/var/tmp | |||||
pip install git+https://www.funkthat.com/gitea/jmg/vlanmang.git | |||||
``` | |||||
Configure switches: | |||||
``` | |||||
. ./venv/bin/activate | |||||
python -m vlanmang | |||||
``` |
@@ -0,0 +1,21 @@ | |||||
#!/bin/sh - | |||||
# setup a base dir | |||||
DESTDIR="$1" | |||||
# copied and modified from release/tools/arm.subr | |||||
# -w yes -> -w no | |||||
/usr/sbin/pw -R ${DESTDIR} groupadd freebsd -g 1001 | |||||
mkdir -p ${DESTDIR}/home/freebsd | |||||
/usr/sbin/pw -R ${DESTDIR} useradd freebsd \ | |||||
-m -M 0755 -w no -n freebsd -u 1001 -g 1001 -G 0 \ | |||||
-c 'FreeBSD User' -d '/home/freebsd' -s '/bin/sh' | |||||
/usr/sbin/pw -R ${DESTDIR} \ | |||||
usermod root -w yes | |||||
/usr/bin/sed -i '.bak' \ | |||||
-e 's/#PasswordAuthentication no/PasswordAuthentication no/' \ | |||||
-e 's/#ChallengeResponseAuthentication yes/ChallengeResponseAuthentication no/' \ | |||||
"${DESTDIR}/etc/ssh/sshd_config" |
@@ -0,0 +1,25 @@ | |||||
setup_script = /ztank/prog/board_script; | |||||
classes { | |||||
cora-z7s = { arch = arm-armv7; } | |||||
pine64-a64-lts = { arch = arm64-aarch64; } | |||||
} | |||||
boards [ | |||||
{ | |||||
name = cora-1; | |||||
brdclass = cora-z7s; | |||||
options = [ | |||||
{ cls = snmppower, host = poe, port = 2 }, | |||||
] | |||||
}, | |||||
{ | |||||
name = a64lts-1; | |||||
brdclass = pine64-a64-lts; | |||||
options = [ | |||||
{ cls = etheriface, val = awg0.103 }, | |||||
{ cls = serialconsole, val = /dev/ttyU0 }, | |||||
{ cls = snmppower, host = poe, port = 3 }, | |||||
] | |||||
}, | |||||
] |
@@ -0,0 +1,163 @@ | |||||
#!/bin/sh - | |||||
# | |||||
# Copyright (c) 2020 The FreeBSD Foundation | |||||
# | |||||
# This software1 was developed by John-Mark Gurney under sponsorship | |||||
# from the FreeBSD Foundation. | |||||
# | |||||
# Redistribution and use in source and binary forms, with or without | |||||
# modification, are permitted provided that the following conditions | |||||
# are met: | |||||
# 1. Redistributions of source code must retain the above copyright | |||||
# notice, this list of conditions and the following disclaimer. | |||||
# 2. Redistributions in binary form must reproduce the above copyright | |||||
# notice, this list of conditions and the following disclaimer in the | |||||
# documentation and/or other materials provided with the distribution. | |||||
# | |||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | |||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | |||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | |||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | |||||
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | |||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | |||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | |||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | |||||
# SUCH DAMAGE. | |||||
# | |||||
set -e | |||||
. $(dirname $0)/settings.conf | |||||
cmd="$1" | |||||
board="$2" | |||||
user="$3" | |||||
sshkey="$4" | |||||
# standard globals | |||||
jaildir="$userzfsmount/$user/$board" | |||||
# XXX - instead, move to an allocated dir, makes cleaning up easier | |||||
allocateresource() | |||||
{ | |||||
resdir="$1" | |||||
while :; do | |||||
res="$(cd "$resdir" && ls | head -n 1)" | |||||
if [ x"$res" = x"" ]; then | |||||
echo "Resource allocation failure for: $resdir" | |||||
exit 1 | |||||
fi | |||||
if rmdir "$resdir/$res" 2>/dev/null; then | |||||
fsync "$resdir" | |||||
break | |||||
fi | |||||
done | |||||
echo "$res" | |||||
} | |||||
releaseresource() | |||||
{ | |||||
resdir="$1" | |||||
res="$2" | |||||
mkdir "$resdir/$res" || exit 1 | |||||
} | |||||
if [ x"$cmd" = x"reserve" ]; then | |||||
zfs clone -p "$basezfs" "$labuserzfs/$user/$board" | |||||
if [ ! -z "$sshkey" ]; then | |||||
mkdir -p $(dirname "$jaildir/$sshkeydest") | |||||
echo "$sshkey" > "$jaildir/$sshkeydest" | |||||
chown -R 1001:1001 $(dirname "$jaildir/$sshkeydest") | |||||
chmod -R 0700 $(dirname "$jaildir/$sshkeydest") | |||||
fi | |||||
ip=$(allocateresource "$ipresourcedir") | |||||
devfsrule=$(allocateresource "$devfsruleresourcedir") | |||||
epair="$(ifconfig epair create)" | |||||
iface="${epair%a}b" | |||||
sed \ | |||||
-e "s/@@BOARD@@/$board/g" \ | |||||
-e "s/@@IP@@/$ip/g" \ | |||||
-e "s/@@IFACE@@/$iface/g" \ | |||||
< "$templatercconf" > "$jaildir/etc/rc.conf" | |||||
ifconfig "$ifacebridge" addm "$epair" | |||||
ifconfig "$epair" up | |||||
# devfs ruleset needs work | |||||
# allow.mount \ | |||||
# allow.mount.devfs \ | |||||
# enforce_statfs=1 \ | |||||
# devfs_ruleset=10 \ | |||||
# copy devfs rulesets from devfsdefaultruleset to devfsrule | |||||
devfspath="$jaildir"/dev | |||||
devfs rule -s "$devfsrule" delset | |||||
devfs rule -s "$devfsdefaultruleset" show | devfs rule -s "$devfsrule" add - | |||||
mount -t devfs -o ruleset="$devfsrule" devfs "$devfspath" | |||||
jailstart=$(jail -c \ | |||||
name="$board" \ | |||||
path="$jaildir" \ | |||||
vnet=new \ | |||||
vnet.interface="$iface" \ | |||||
exec.start="/bin/sh /etc/rc") | |||||
# wait for ssh host keys and add them | |||||
sshhostkeys="$(jexec "$board" cat /etc/ssh/ssh_host_*.pub)" | |||||
# output additional attributes on reserve | |||||
# NOTE: Make sure to update bitelab to pass these variables back. | |||||
export ip | |||||
export iface | |||||
export jailstart | |||||
export devfsrule | |||||
export devfspath | |||||
export sshhostkeys | |||||
jq \ | |||||
--arg allargs "$*" \ | |||||
-n \ | |||||
'{ | |||||
allargs: $allargs, | |||||
ip: $ENV.ip, | |||||
iface: $ENV.iface, | |||||
jailstart: $ENV.jailstart, | |||||
devfsrule: $ENV.devfsrule, | |||||
devfspath: $ENV.devfspath, | |||||
sshhostkeys: $ENV.sshhostkeys | |||||
}' | |||||
elif [ x"$cmd" = x"release" ]; then | |||||
jail -r "$board" | |||||
umount "$devfspath" | |||||
# epair doesn't immediate reappear, schedule it | |||||
nohup sh -c 'for i in $(jot 5 1); do | |||||
if ifconfig "$iface" destroy; then | |||||
break; | |||||
fi; | |||||
sleep 1; | |||||
done' > /dev/null 2>&1 & | |||||
releaseresource "$ipresourcedir" "$ip" | |||||
releaseresource "$devfsruleresourcedir" "$devfsrule" | |||||
# for some reason not all jail processes are terminated, | |||||
# need to retry | |||||
sleep .5 | |||||
for x in $(jot 5 1); do | |||||
if zfs destroy "$labuserzfs/$user/$board"; then | |||||
break | |||||
fi | |||||
sleep 1 | |||||
done | |||||
# no output on release | |||||
fi |
@@ -0,0 +1,18 @@ | |||||
#!/bin/sh - | |||||
dir="$1" | |||||
pref="$2" | |||||
start="$3" | |||||
stop="$4" | |||||
if [ -z "$dir" -o -z "$start" -o -z "$stop" ]; then | |||||
echo "Usage: $0 <dir> <prefix> <start> <stop>" >&2 | |||||
exit 1 | |||||
fi | |||||
mkdir -p "$dir" | |||||
cd "$dir" | |||||
for i in $(jot $(($stop - $start + 1)) "$start"); do | |||||
mkdir "$pref$i" | |||||
done |
@@ -0,0 +1,44 @@ | |||||
# | |||||
# Installation information: | |||||
# ln -s ~lab/.local ~root | |||||
# ~/.local/bin/virtaulenv venv | |||||
# . ./venv/bin/activate | |||||
# export TMPDIR=/var/tmp | |||||
# pip install git+https://www.funkthat.com/gitea/jmg/vlanmang.git | |||||
# | |||||
# Configuration information: | |||||
# . ./venv/bin/activate | |||||
# python -m vlanmang | |||||
# | |||||
import vlanmang | |||||
from pysnmp.hlapi import usmDESPrivProtocol | |||||
protomapping = dict(DES=usmDESPrivProtocol) | |||||
def parse_snmpconf(fname): | |||||
snmpconf = {} | |||||
with open(fname) as fp: | |||||
snmpconf = dict((l.strip().split() for l in fp if l.strip())) | |||||
return snmpconf | |||||
def make_vlanswitch(fname, switch_info, *args): | |||||
snmpconf = parse_snmpconf(fname) | |||||
authdata = dict(username=snmpconf['defSecurityName'], authKey=snmpconf['defAuthPassphrase'], | |||||
privKey=snmpconf['defPrivPassphrase'], privProtocol=protomapping[snmpconf['defPrivType']]) | |||||
switch = vlanmang.SwitchConfig(snmpconf['transport'], authdata, switch_info, *args) | |||||
return switch | |||||
switch = { | |||||
1: { | |||||
'u': [ 1, 24 ], | |||||
} | |||||
} | |||||
for i in range(2, 24): | |||||
switch[i + 100] = dict(t=[ 1 ], u=[ i ]) | |||||
switch = make_vlanswitch('/root/.snmp/hosts/poe.conf', switch, list(range(25, 36))) |
@@ -0,0 +1,43 @@ | |||||
[loggers] | |||||
keys=root,aiosqlite,databases | |||||
[handlers] | |||||
keys=syslog,null | |||||
[formatters] | |||||
keys=simpleFormatter | |||||
[logger_root] | |||||
level=DEBUG | |||||
handlers=syslog | |||||
# Both aiosqlite and databases log sensitive info, DO NOT | |||||
# enable logging on these unless you want to contaminate your | |||||
# logs w/ authentication credentials and other security senstive | |||||
# information | |||||
[logger_aiosqlite] | |||||
level=DEBUG | |||||
handlers=null | |||||
qualname=aiosqlite | |||||
propagate=0 | |||||
[logger_databases] | |||||
level=DEBUG | |||||
handlers=null | |||||
qualname=databases | |||||
propagate=0 | |||||
[handler_null] | |||||
class=NullHandler | |||||
[handler_syslog] | |||||
class=handlers.SysLogHandler | |||||
level=NOTSET | |||||
formatter=simpleFormatter | |||||
args=('/var/run/log', handlers.SysLogHandler.LOG_USER) | |||||
[formatter_simpleFormatter] | |||||
format=bitelab: %(asctime)s.%(msecs)03d - %(name)s - %(levelname)s - %(message)s | |||||
datefmt=%Y-%m-%dT%H:%M:%S | |||||
# XXX This doesn't appear to work | |||||
#converter=time.gmtime |
@@ -0,0 +1,2 @@ | |||||
:programname, isequal, "bitelab" | |||||
*.* /ztank/state/bitelab.log |
@@ -0,0 +1,16 @@ | |||||
#!/bin/sh - | |||||
user="$1" | |||||
. $(dirname $0)/settings.conf | |||||
umask 077 | |||||
key="$(LC_ALL=C tr -c -d 'a-z0-9' < /dev/random | dd bs=1 count=50 2>/dev/null)" | |||||
python3.8 -c 'import hashlib; import sqlite3; import sys; db = sqlite3.connect(sys.argv[1]); db.execute("insert into apikeys (user, key) values (?, ?)", (sys.argv[2], hashlib.blake2s(sys.argv[3].encode()).hexdigest())); db.commit(); db.close()' "$db_file" "$1" "$key" | |||||
#echo "$1 $key" >> "$apikeyfile" | |||||
echo "Your API key is: $key" | |||||
exit 0 |
@@ -0,0 +1,8 @@ | |||||
hostname="@@BOARD@@" | |||||
ifconfig_@@IFACE@@="@@IP@@" | |||||
sshd_enable="YES" | |||||
defaultrouter="172.30.15.1" | |||||
sendmail_enable="NONE" | |||||
sendmail_submit_enable="NO" | |||||
sendmail_outbound_enable="NO" | |||||
sendmail_msp_queue_enable="NO" |
@@ -0,0 +1,28 @@ | |||||
# misc | |||||
labuser="lab" | |||||
labuserzfs="ztank/user" | |||||
basezfs="ztank/base/13-current@r366088" | |||||
sshkeydest="home/freebsd/.ssh/authorized_keys" | |||||
ifacebridge="bridge0" | |||||
devfsdefaultruleset="10" | |||||
# dirs | |||||
labhome="/ztank/state" | |||||
labbin="/ztank/prog" | |||||
userzfsmount="/ztank/user" | |||||
# resource dirs | |||||
ipresourcedir="${labhome}/ips" | |||||
devfsruleresourcedir="${labhome}/devfsrules" | |||||
# scripts | |||||
keygencmd="$labbin/keygen" | |||||
# data files | |||||
labkeys="$labhome/lab_keys" | |||||
labauthfile="$labhome/.ssh/authorized_keys" | |||||
db_file="$labhome/bitelab.sqlite" | |||||
templatercconf="$labbin/rc.conf.template" | |||||
# Values that should not be customized | |||||
labuid="742" |
@@ -0,0 +1,30 @@ | |||||
#!/bin/sh - | |||||
# | |||||
# Script to setup the environment | |||||
# | |||||
. $(dirname $0)/settings.conf | |||||
if ! id $labuser > /dev/null 2>&1; then | |||||
# create the user and group | |||||
echo setting up accounts... | |||||
pw groupadd "$labuser" -g "$labuid" | |||||
# /bin/sh is required for commands specified in authorized_keys to run | |||||
pw useradd "$labuser" -u "$labuid" -c "Embedded Lab User" \ | |||||
-d "$labhome" -g "$labuid" -s "/bin/sh" | |||||
else | |||||
echo accounts already setup... | |||||
fi | |||||
echo 'setting permissions...' | |||||
chown "$labuser" "$labhome" | |||||
if ! zfs list "$labuserzfs" 2>/dev/null; then | |||||
zfs create "$labuserzfs" | |||||
fi | |||||
# XXX - decide how to do ZFS quotas | |||||
# even if a user quota was generic (it isn't), w/ the datasets | |||||
# being root owned, a flat quota for "$labuserzfs/$user" seems | |||||
# to make the most sense |
@@ -0,0 +1,7 @@ | |||||
#!/bin/sh - | |||||
. $(dirname $0)/settings.conf | |||||
${labbin}/create_resource "$ipresourcedir" 172.30.15. 50 100 | |||||
${labbin}/create_resource "$devfsruleresourcedir" "" 50 100 |
@@ -0,0 +1,8 @@ | |||||
{ | |||||
"allargs": "reserve cora-1 jmg ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7idUEks/3mCWne1iEzLN8URpnbiXqas3fz2T4NwDj2eNtofzzwDdP3SWiPghtmqB840jUl47Nsujuwz6stpUUpNtKVDF2V9ziMS/rlTTXAxvQxUdPtiCtdHW+niXedksf/yDq0CQTxATSj4aNnfq34JHlPc0fkaMDaYqSPERJ9JKlt5NxBpw2xQ0S5itX9SHn6zMWUw1VxyZxU8dxi1g0FuLAhMgkXyWpcBTBx7nuuKI1FjlB7TKAhQeoxRZGTDsGrFDxpIf8MbYi8Bg8ljLZFi2mUrf8+HVV7z6qQdOFu1BmfuJQI63ZidrZdh3Y7zoBdJrXEMLsAdoVe8k/xHBf", | |||||
"ip": "172.30.15.100", | |||||
"iface": "epair0b", | |||||
"jailstart": "Setting hostname: cora-1.\nELF ldconfig path: /lib /usr/lib /usr/lib/compat\nStarting Network: lo0 epair0b.\nlo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384\n\toptions=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>\n\tinet6 ::1 prefixlen 128\n\tinet6 fe80::1%lo0 prefixlen 64 scopeid 0x1\n\tinet 127.0.0.1 netmask 0xff000000\n\tgroups: lo\n\tnd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>\nepair0b: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500\n\toptions=8<VLAN_MTU>\n\tether 02:77:fc:66:d9:0b\n\tinet 172.30.15.100 netmask 0xffff0000 broadcast 172.30.255.255\n\tgroups: epair\n\tmedia: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)\n\tstatus: active\n\tnd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>\nadd host 127.0.0.1: gateway lo0 fib 0: route already in table\nadd net default: gateway 172.30.15.1\nadd host ::1: gateway lo0 fib 0: route already in table\nadd net fe80::: gateway ::1\nadd net ff02::: gateway ::1\nadd net ::ffff:0.0.0.0: gateway ::1\nadd net ::0.0.0.0: gateway ::1\nUpdating /var/run/os-release done.\nCreating and/or trimming log files.\nUpdating motd:.\nClearing /tmp (X related).\nStarting syslogd.\nGenerating RSA host key.\n2048 SHA256:ZIe0QWoQwjA+z2aRWXRTgjrXRH82zQcmM9tUObkt6KI root@cora-1 (RSA)\nGenerating ECDSA host key.\n256 SHA256:L+/oYNOqCpRtUoQ3mePm7xCQ3RCWG4k5QKaflfqoY/U root@cora-1 (ECDSA)\nGenerating ED25519 host key.\n256 SHA256:3UFoFyfWdwOD2SAXf1eumyqYT4vmgKR6AdrFOKemtbU root@cora-1 (ED25519)\nPerforming sanity check on sshd configuration.\nStarting sshd.\nStarting cron.\n\nWed Dec 2 01:51:00 UTC 2020", | |||||
"devfsrule": "100", | |||||
"sshhostkeys": "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBPb6VZJBJJ98/TPW95w2SODbkjrg/6ilRdY5TdR1PZW2kB7QAvp/NpY97wXVZQ5yIgXmk4z1gEpQOPt3MREhZy0= root@cora-1\nssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAICLL2Zm5BzMd+Y6Lt2xI+z6BndD2PCS+/zQxrNjdSe30 root@cora-1\nssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCqo9Rn2R9Dl97jXEHSgx6Sz0r+mD40m7nVcQPcX2F+uDeJB3KXvF+ixNBMMpiXes4NX2+MvlOu9g9vehNGmnnztNno8w44p4eHOwteEiV2G0cvsfSS340CiN+H3/lN0Gt4bekle7Yn8dsgGsDKSpA3ur9lkZJUlwwYBpzzVX+SASXueG3b/R8F5gxvDtBkMuydbwfjYxVc4sErRghQUfNnZpdm6pu9D8xJ5PcfnHTJaCkLD4ebMsI/eag/HRM6EE9Mq8By68QF8UWizK5TWYuTpOL0LjxoS6v/y3CAk72A1oPuRATyLZ+CrlQsU5lIyxNPwuaiB9+QuFOhfr5TIuVN root@cora-1" | |||||
} |
@@ -0,0 +1,2 @@ | |||||
sh /ztank/prog/board_script reserve cora-1 jmg "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC7idUEks/3mCWne1iEzLN8URpnbiXqas3fz2T4NwDj2eNtofzzwDdP3SWiPghtmqB840jUl47Nsujuwz6stpUUpNtKVDF2V9ziMS/rlTTXAxvQxUdPtiCtdHW+niXedksf/yDq0CQTxATSj4aNnfq34JHlPc0fkaMDaYqSPERJ9JKlt5NxBpw2xQ0S5itX9SHn6zMWUw1VxyZxU8dxi1g0FuLAhMgkXyWpcBTBx7nuuKI1FjlB7TKAhQeoxRZGTDsGrFDxpIf8MbYi8Bg8ljLZFi2mUrf8+HVV7z6qQdOFu1BmfuJQI63ZidrZdh3Y7zoBdJrXEMLsAdoVe8k/xHBf" > test.json | |||||
cat test.json |
@@ -0,0 +1,18 @@ | |||||
#!/bin/sh - | |||||
set -x | |||||
if [ ! -f "test.json" ]; then | |||||
echo no test jail is running | |||||
exit 1 | |||||
fi | |||||
json="$(cat test.json)" | |||||
keys=$(echo "$json" | jq --raw-output 'keys[]') | |||||
for i in $keys; do | |||||
eval export $i='$(echo "$json" | jq --raw-output .[\"$i\"])' | |||||
done | |||||
sh -x ./board_script release cora-1 jmg |
@@ -0,0 +1,46 @@ | |||||
#!/bin/sh - | |||||
. ./settings.conf | |||||
makeauthkeys() | |||||
{ | |||||
local inp out i | |||||
inp="$1" | |||||
out="$2" | |||||
while read user keytype key; do | |||||
echo 'restrict,command="'"$keygencmd $user"'"'" $keytype $key" | |||||
done < "$inp" > "$out" | |||||
} | |||||
if [ x"$1" = x"test" ]; then | |||||
set -e | |||||
tmpdir=$(mktemp -d -t testfoobar) | |||||
trap "rm -rf $tmpdir" EXIT | |||||
labkeys="$tmpdir/lab_keys" | |||||
echo 'someuser ssh-rsa auserkey' > "$labkeys" | |||||
makeauthkeys "$labkeys" "$tmpdir/auth_out" | |||||
cat "$tmpdir/auth_out" | |||||
exit 0 | |||||
fi | |||||
if ! id $labuser > /dev/null 2>&1; then | |||||
echo "ERROR: The user \"$labuser\" does not exist." | |||||
exit 1 | |||||
fi | |||||
set -e | |||||
mkdir "${labauthfile}.lock" | |||||
trap "rmdir ${labauthfile}.lock" EXIT | |||||
tmpfile="${labauthfile}.tmp" | |||||
makeauthkeys "$labkeys" "$tmpfile" | |||||
chown "$labuser:$labuser" "$tmpfile" | |||||
mv "$tmpfile" "$labauthfile" |