| @@ -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" | |||