#!/bin/sh # container-tools - Manage systemd-nspawn containers # Copyright (C) 2014-2017 Daniel Baumann # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . set -e SOFTWARE="container-tools" PROGRAM="container" COMMAND="$(basename ${0})" LC_ALL="C.UTF-8" if [ -n "${SSH_CONNECTION}" ] then # ip address CONTAINER_SHELL_USER="$(echo ${SSH_CONNECTION} | awk '{ print $1 }')" else # username CONTAINER_SHELL_USER="${SUDO_USER:-${USER}}" fi Usage () { echo "Usage: ${PROGRAM}-shell" >&2 exit 1 } Log () { DATE="$(date +%Y-%m-%d\ %H:%M:%S)" HOST="$(hostname -f)" MESSAGE="${@}" # logfile echo "${DATE} ${HOST} ${CONTAINER_SHELL_USER} ${MESSAGE}" >> "/var/log/${SOFTWARE}/${PROGRAM}.log" # irc if [ -e /usr/bin/irk ] && [ -e "/etc/default/${SOFTWARE}" ] then . /etc/default/${SOFTWARE} if [ -n "${IRK_TARGETS}" ] then for TARGET in ${IRK_TARGETS} do irk ${TARGET} "\x0300${USER}\x03@\x0312${HOST}:\x03 \x0303${PROGRAM}\x03 \x0307${COMMAND}\x03 ${OPTIONS}" done fi fi } Shell () { COMMAND="${1}" if [ -z "${COMMAND}" ] then return fi shift 1 OPTIONS="${@}" case "${COMMAND}" in about) man ${PROGRAM} || true return ;; logout|exit) exit 0 ;; help) case "${OPTIONS}" in "") echo echo "The following ${PROGRAM} commands are available:" echo cd "/usr/lib/${SOFTWARE}/${PROGRAM}" find . -type f -printf "%f\n" | sort cd "${OLDPWD}" echo echo "Use 'help COMMAND' for more information." return ;; *) man ${PROGRAM}-${1} || true return ;; esac ;; esac if [ ! -e "/usr/lib/${SOFTWARE}/${PROGRAM}/${COMMAND}" ] then echo "'${COMMAND}': no such ${PROGRAM} command" >&2 return fi if [ -n "${CONTAINER_COMMANDS_ENABLE}" ] then COMMAND_ALLOWED="" for CONTAINER_COMMAND in ${CONTAINER_COMMANDS_ENABLE} do case "${CONTAINER_COMMAND}" in ${COMMAND}|all|about|logout|exit|help) COMMAND_ALLOWED="true" ;; esac done case "${COMMAND_ALLOWED}" in true) ;; *) Log "'${COMMAND}' command not allowed" echo "'${COMMAND}': command not allowed for current user" >&2 return ;; esac fi if [ -n "${CONTAINER_COMMANDS_DISABLE}" ] then COMMAND_DISALLOWED="" for CONTAINER_COMMAND in ${CONTAINER_COMMANDS_DISABLE} do case "${CONTAINER_COMMAND}" in ${COMMAND}|all|about|logout|exit|help) COMMAND_DISALLOWED="true" ;; esac done case "${COMMAND_DISALLOWED}" in true) Log "'${COMMAND}' command not allowed" echo "'${COMMAND}': command not allowed for current user" >&2 return ;; esac fi echo sudo ${PROGRAM} ${COMMAND} ${OPTIONS} || true } trap 'echo' EXIT HUP INT QUIT TERM echo "${SOFTWARE} $(${PROGRAM} version)" echo "Type \"about\" or \"help\" for more information, \"logout\" to exit." while true do echo echo -n "${PROGRAM}: " read CMDLINE Shell ${CMDLINE} done