Merge commit 'dkg/master'
[monkeysphere.git] / src / monkeysphere
1 #!/usr/bin/env bash
2
3 # monkeysphere: Monkeysphere client tool
4 #
5 # The monkeysphere scripts are written by:
6 # Jameson Rollins <jrollins@fifthhorseman.net>
7 # Jamie McClelland <jm@mayfirst.org>
8 # Daniel Kahn Gillmor <dkg@fifthhorseman.net>
9 # Micah Anderson <micah@riseup.net>
10 #
11 # They are Copyright 2008-2009, and are all released under the GPL, version 3
12 # or later.
13
14 ########################################################################
15 PGRM=$(basename $0)
16
17 SYSSHAREDIR=${MONKEYSPHERE_SYSSHAREDIR:-"/usr/share/monkeysphere"}
18 export SYSSHAREDIR
19 . "${SYSSHAREDIR}/common" || exit 1
20
21 # sharedir for host functions
22 MSHAREDIR="${SYSSHAREDIR}/m"
23
24 # UTC date in ISO 8601 format if needed
25 DATE=$(date -u '+%FT%T')
26
27 # unset some environment variables that could screw things up
28 unset GREP_OPTIONS
29
30 # default return code
31 RETURN=0
32
33 # set the file creation mask to be only owner rw
34 umask 077
35
36 ########################################################################
37 # FUNCTIONS
38 ########################################################################
39
40 usage() {
41     cat <<EOF >&2
42 usage: $PGRM <subcommand> [options] [args]
43 Monkeysphere client tool.
44
45 subcommands:
46  update-known_hosts (k) [HOST]...    update known_hosts file
47  update-authorized_keys (a)          update authorized_keys file
48  import-subkey (i)                   import existing ssh key as gpg subkey
49    --keyfile (-f) FILE                 key file to import
50    --expire (-e) EXPIRE                date to expire
51  gen-subkey (g) [KEYID]              generate an authentication subkey
52    --length (-l) BITS                  key length in bits (2048)
53    --expire (-e) EXPIRE                date to expire
54  ssh-proxycommand                    monkeysphere ssh ProxyCommand
55  subkey-to-ssh-agent (s)             store authentication subkey in ssh-agent
56  version (v)                         show version number
57  help (h,?)                          this help
58
59 EOF
60 }
61
62 ########################################################################
63 # MAIN
64 ########################################################################
65
66 # set unset default variables
67 GNUPGHOME=${GNUPGHOME:="${HOME}/.gnupg"}
68 KNOWN_HOSTS="${HOME}/.ssh/known_hosts"
69 HASH_KNOWN_HOSTS="true"
70 AUTHORIZED_KEYS="${HOME}/.ssh/authorized_keys"
71
72 # load global config
73 [ -r "${SYSCONFIGDIR}/monkeysphere.conf" ] \
74     && . "${SYSCONFIGDIR}/monkeysphere.conf"
75
76 # set monkeysphere home directory
77 MONKEYSPHERE_HOME=${MONKEYSPHERE_HOME:="${HOME}/.monkeysphere"}
78 mkdir -p -m 0700 "$MONKEYSPHERE_HOME"
79
80 # load local config
81 [ -e ${MONKEYSPHERE_CONFIG:="${MONKEYSPHERE_HOME}/monkeysphere.conf"} ] \
82     && . "$MONKEYSPHERE_CONFIG"
83
84 # set empty config variables with ones from the environment
85 GNUPGHOME=${MONKEYSPHERE_GNUPGHOME:=$GNUPGHOME}
86 LOG_LEVEL=${MONKEYSPHERE_LOG_LEVEL:=$LOG_LEVEL}
87 KEYSERVER=${MONKEYSPHERE_KEYSERVER:=$KEYSERVER}
88 # if keyserver not specified in env or conf, then look in gpg.conf
89 if [ -z "$KEYSERVER" ] ; then
90     if [ -f "${GNUPGHOME}/gpg.conf" ] ; then
91         KEYSERVER=$(grep -e "^[[:space:]]*keyserver " "${GNUPGHOME}/gpg.conf" | tail -1 | awk '{ print $2 }')
92     fi
93 fi
94 PROMPT=${MONKEYSPHERE_PROMPT:=$PROMPT}
95 KNOWN_HOSTS=${MONKEYSPHERE_KNOWN_HOSTS:=$KNOWN_HOSTS}
96 HASH_KNOWN_HOSTS=${MONKEYSPHERE_HASH_KNOWN_HOSTS:=$HASH_KNOWN_HOSTS}
97 AUTHORIZED_KEYS=${MONKEYSPHERE_AUTHORIZED_KEYS:=$AUTHORIZED_KEYS}
98
99 # other variables not in config file
100 AUTHORIZED_USER_IDS=${MONKEYSPHERE_AUTHORIZED_USER_IDS:="${MONKEYSPHERE_HOME}/authorized_user_ids"}
101 REQUIRED_HOST_KEY_CAPABILITY=${MONKEYSPHERE_REQUIRED_HOST_KEY_CAPABILITY:="a"}
102 REQUIRED_USER_KEY_CAPABILITY=${MONKEYSPHERE_REQUIRED_USER_KEY_CAPABILITY:="a"}
103
104 # export GNUPGHOME and make sure gpg home exists with proper
105 # permissions
106 export GNUPGHOME
107 mkdir -p -m 0700 "$GNUPGHOME"
108 export LOG_LEVEL
109
110 # get subcommand
111 COMMAND="$1"
112 [ "$COMMAND" ] || failure "Type '$PGRM help' for usage."
113 shift
114
115 case $COMMAND in
116     'update-known_hosts'|'update-known-hosts'|'k')
117         # whether or not to check keyservers
118         CHECK_KEYSERVER=${MONKEYSPHERE_CHECK_KEYSERVER:=$CHECK_KEYSERVER}
119
120         # if hosts are specified on the command line, process just
121         # those hosts
122         if [ "$1" ] ; then
123             update_known_hosts "$@"
124             RETURN="$?"
125
126         # otherwise, if no hosts are specified, process every host
127         # in the user's known_hosts file
128         else
129             process_known_hosts
130             RETURN="$?"
131         fi
132         ;;
133
134     'update-authorized_keys'|'update-authorized-keys'|'a')
135         # whether or not to check keyservers
136         CHECK_KEYSERVER=${MONKEYSPHERE_CHECK_KEYSERVER:=$CHECK_KEYSERVER}
137
138         # process authorized_user_ids file
139         process_authorized_user_ids "$AUTHORIZED_USER_IDS"
140         RETURN="$?"
141         ;;
142
143     'import-subkey'|'i')
144         source "${MSHAREDIR}/import_subkey"
145         import_subkey "$@"
146         ;;
147
148     'gen-subkey'|'g')
149         source "${MSHAREDIR}/gen_subkey"
150         gen_subkey "$@"
151         ;;
152
153     'ssh-proxycommand'|'p')
154         source "${MSHAREDIR}/ssh_proxycommand"
155         ssh_proxycommand "$@"
156         ;;
157
158     'subkey-to-ssh-agent'|'s')
159         source "${MSHAREDIR}/subkey_to_ssh_agent"
160         subkey_to_ssh_agent "$@"
161         ;;
162
163     'version'|'v')
164         echo "$VERSION"
165         ;;
166
167     '--help'|'help'|'-h'|'h'|'?')
168         usage
169         ;;
170
171     *)
172         failure "Unknown command: '$COMMAND'
173 Type '$PGRM help' for usage."
174         ;;
175 esac
176
177 exit "$RETURN"