blob: 8b7bfee49f5860e18269699fbec1325bb55824e6 (
plain)
- #!/usr/bin/env bash
- # monkeysphere: Monkeysphere client tool
- #
- # The monkeysphere scripts are written by:
- # Jameson Rollins <jrollins@fifthhorseman.net>
- # Jamie McClelland <jm@mayfirst.org>
- # Daniel Kahn Gillmor <dkg@fifthhorseman.net>
- # Micah Anderson <micah@riseup.net>
- #
- # They are Copyright 2008-2009, and are all released under the GPL, version 3
- # or later.
- ########################################################################
- PGRM=$(basename $0)
- SYSSHAREDIR=${MONKEYSPHERE_SYSSHAREDIR:-"/usr/share/monkeysphere"}
- export SYSSHAREDIR
- . "${SYSSHAREDIR}/common" || exit 1
- # sharedir for host functions
- MSHAREDIR="${SYSSHAREDIR}/m"
- # UTC date in ISO 8601 format if needed
- DATE=$(date -u '+%FT%T')
- # unset some environment variables that could screw things up
- unset GREP_OPTIONS
- # default return code
- RETURN=0
- # set the file creation mask to be only owner rw
- umask 077
- ########################################################################
- # FUNCTIONS
- ########################################################################
- usage() {
- cat <<EOF >&2
- usage: $PGRM <subcommand> [options] [args]
- Monkeysphere client tool.
- subcommands:
- update-known_hosts (k) [HOST]... update known_hosts file
- update-authorized_keys (a) update authorized_keys file
- import-subkey (i) import existing ssh key as gpg subkey
- --keyfile (-f) FILE key file to import
- --expire (-e) EXPIRE date to expire
- gen-subkey (g) [KEYID] generate an authentication subkey
- --length (-l) BITS key length in bits (2048)
- --expire (-e) EXPIRE date to expire
- ssh-proxycommand ssh proxycommand
- subkey-to-ssh-agent (s) store authentication subkey in ssh-agent
- version (v) show version number
- help (h,?) this help
- EOF
- }
- ########################################################################
- # MAIN
- ########################################################################
- # unset variables that should be defined only in config file
- unset KEYSERVER
- unset CHECK_KEYSERVER
- unset KNOWN_HOSTS
- unset HASH_KNOWN_HOSTS
- unset AUTHORIZED_KEYS
- # load global config
- [ -r "${SYSCONFIGDIR}/monkeysphere.conf" ] && . "${SYSCONFIGDIR}/monkeysphere.conf"
- # set monkeysphere home directory
- MONKEYSPHERE_HOME=${MONKEYSPHERE_HOME:="${HOME}/.monkeysphere"}
- mkdir -p -m 0700 "$MONKEYSPHERE_HOME"
- # load local config
- [ -e ${MONKEYSPHERE_CONFIG:="${MONKEYSPHERE_HOME}/monkeysphere.conf"} ] && . "$MONKEYSPHERE_CONFIG"
- # set empty config variables with ones from the environment, or from
- # config file, or with defaults
- LOG_LEVEL=${MONKEYSPHERE_LOG_LEVEL:=${LOG_LEVEL:="INFO"}}
- GNUPGHOME=${MONKEYSPHERE_GNUPGHOME:=${GNUPGHOME:="${HOME}/.gnupg"}}
- KEYSERVER=${MONKEYSPHERE_KEYSERVER:="$KEYSERVER"}
- # if keyserver not specified in env or monkeysphere.conf,
- # look in gpg.conf
- if [ -z "$KEYSERVER" ] ; then
- if [ -f "${GNUPGHOME}/gpg.conf" ] ; then
- KEYSERVER=$(grep -e "^[[:space:]]*keyserver " "${GNUPGHOME}/gpg.conf" | tail -1 | awk '{ print $2 }')
- fi
- fi
- # if it's still not specified, use the default
- KEYSERVER=${KEYSERVER:="subkeys.pgp.net"}
- CHECK_KEYSERVER=${MONKEYSPHERE_CHECK_KEYSERVER:=${CHECK_KEYSERVER:="true"}}
- KNOWN_HOSTS=${MONKEYSPHERE_KNOWN_HOSTS:=${KNOWN_HOSTS:="${HOME}/.ssh/known_hosts"}}
- HASH_KNOWN_HOSTS=${MONKEYSPHERE_HASH_KNOWN_HOSTS:=${HASH_KNOWN_HOSTS:="true"}}
- AUTHORIZED_KEYS=${MONKEYSPHERE_AUTHORIZED_KEYS:=${AUTHORIZED_KEYS:="${HOME}/.ssh/authorized_keys"}}
- # other variables not in config file
- AUTHORIZED_USER_IDS=${MONKEYSPHERE_AUTHORIZED_USER_IDS:="${MONKEYSPHERE_HOME}/authorized_user_ids"}
- REQUIRED_HOST_KEY_CAPABILITY=${MONKEYSPHERE_REQUIRED_HOST_KEY_CAPABILITY:="a"}
- REQUIRED_USER_KEY_CAPABILITY=${MONKEYSPHERE_REQUIRED_USER_KEY_CAPABILITY:="a"}
- # export GNUPGHOME and make sure gpg home exists with proper
- # permissions
- export GNUPGHOME
- mkdir -p -m 0700 "$GNUPGHOME"
- export LOG_LEVEL
- # get subcommand
- COMMAND="$1"
- [ "$COMMAND" ] || failure "Type '$PGRM help' for usage."
- shift
- case $COMMAND in
- 'update-known_hosts'|'update-known-hosts'|'k')
- MODE='known_hosts'
- # touch the known_hosts file so that the file permission check
- # below won't fail upon not finding the file
- (umask 0022 && touch "$KNOWN_HOSTS")
- # check permissions on the known_hosts file path
- check_key_file_permissions "$USER" "$KNOWN_HOSTS" || failure
- # if hosts are specified on the command line, process just
- # those hosts
- if [ "$1" ] ; then
- update_known_hosts "$@"
- RETURN="$?"
- # otherwise, if no hosts are specified, process every host
- # in the user's known_hosts file
- else
- # exit if the known_hosts file does not exist
- if [ ! -e "$KNOWN_HOSTS" ] ; then
- log error "known_hosts file '$KNOWN_HOSTS' does not exist."
- exit
- fi
- process_known_hosts
- RETURN="$?"
- fi
- ;;
- 'update-authorized_keys'|'update-authorized-keys'|'a')
- MODE='authorized_keys'
- # check permissions on the authorized_user_ids file path
- check_key_file_permissions "$USER" "$AUTHORIZED_USER_IDS" || failure
- # check permissions on the authorized_keys file path
- check_key_file_permissions "$USER" "$AUTHORIZED_KEYS" || failure
- # exit if the authorized_user_ids file is empty
- if [ ! -e "$AUTHORIZED_USER_IDS" ] ; then
- log error "authorized_user_ids file '$AUTHORIZED_USER_IDS' does not exist."
- exit
- fi
- # process authorized_user_ids file
- process_authorized_user_ids "$AUTHORIZED_USER_IDS"
- RETURN="$?"
- ;;
- 'import-subkey'|'i')
- source "${MSHAREDIR}/import_subkey"
- import_subkey "$@"
- ;;
- 'gen-subkey'|'g')
- source "${MSHAREDIR}/gen_subkey"
- gen_subkey "$@"
- ;;
- 'ssh-proxycommand'|'p')
- source "${MSHAREDIR}/ssh_proxycommand"
- ssh_proxycommand "$@"
- ;;
- 'subkey-to-ssh-agent'|'s')
- source "${MSHAREDIR}/subkey_to_ssh_agent"
- subkey_to_ssh_agent "$@"
- ;;
- 'version'|'v')
- echo "$VERSION"
- ;;
- '--help'|'help'|'-h'|'h'|'?')
- usage
- ;;
- *)
- failure "Unknown command: '$COMMAND'
- Type '$PGRM help' for usage."
- ;;
- esac
- exit "$RETURN"
|