0b67c02d406b7f01cc460daafb83bcb52298532a
[monkeysphere.git] / src / howler / howler
1 #!/bin/sh
2
3 # howler: monkeysphere server gpg generator/publisher/maintainer
4 #
5 # Written by
6 # Jameson Rollins <jrollins@fifthhorseman.net>
7 #
8 # Copyright 2008, released under the GPL, version 3 or later
9
10 PGRM=$(basename $0)
11
12 ########################################################################
13 # FUNCTIONS
14 ########################################################################
15
16 usage() {
17 cat <<EOF
18 usage: $PGRM gen-key
19        $PGRM publish-key
20        $PGRM trust-key KEYID [KEYID...]
21        $PGRM help
22 EOF
23 }
24
25 failure() {
26     echo "$1" >&2
27     exit ${2:-'1'}
28 }
29
30 # generate server gpg key
31 gen_key() {
32     KEY_TYPE=${KEY_TYPE:-RSA}
33     KEY_LENGTH=${KEY_LENGTH:-2048}
34     KEY_USAGE=${KEY_USAGE:-encrypt,auth}
35     SERVICE=${SERVICE:-ssh}
36     HOSTNAME_FQDN=${HOSTNAME_FQDN:-$(hostname -f)}
37
38     USERID=${USERID:-"$SERVICE"://"$HOSTNAME_FQDN"}
39
40     echo "key parameters:"
41     cat <<EOF
42 Key-Type: $KEY_TYPE
43 Key-Length: $KEY_LENGTH
44 Key-Usage: $KEY_USAGE
45 Name-Real: $USERID
46 EOF
47
48     read -p "generate key? [Y|n]: " OK; OK=${OK:=Y}
49     if [ ${OK/y/Y} != 'Y' ] ; then
50         failure "aborting."
51     fi
52
53     if gpg --list-key ="$USERID" > /dev/null 2>&1 ; then
54         failure "key for '$USERID' already exists"
55     fi
56
57     echo "generating server key..."
58     gpg --batch --gen-key <<EOF
59 Key-Type: $KEY_TYPE
60 Key-Length: $KEY_LENGTH
61 Key-Usage: $KEY_USAGE
62 Name-Real: $USERID
63 %commit
64 EOF
65 }
66
67 publish_key() {
68     read -p "publish key to $KEYSERVER? [Y|n]: " OK; OK=${OK:=Y}
69     if [ ${OK/y/Y} != 'Y' ] ; then
70         failure "aborting."
71     fi
72
73     keyID=$(gpg --list-key --with-colons ="$USERID" 2> /dev/null | grep '^pub:' | cut -d: -f5)
74
75     # dummy command so as not to publish fakes keys during testing
76     # eventually:
77     #gpg --send-keys --keyserver "$KEYSERVER" "$keyID"
78     echo "gpg --send-keys --keyserver $KEYSERVER $keyID"
79 }
80
81 trust_key() {
82     for keyID ; do
83         # get the key from the key server
84         gpg --keyserver "$KEYSERVER" --recv-key "$keyID" || failure "could not retrieve key '$keyID'"
85
86         # edit the key to change trust
87         # FIXME: need to figure out how to automate this,
88         # in a batch mode or something.
89         gpg --edit-key "$keyID"
90     done
91 }
92
93 ########################################################################
94 # MAIN
95 ########################################################################
96
97 # set ms home directory
98 MS_HOME=${MS_HOME:-/etc/monkeysphere}
99
100 # load configuration file
101 MS_CONF=${MS_CONF:-"$MS_HOME"/monkeysphere.conf}
102 [ -e "$MS_CONF" ] && . "$MS_CONF"
103
104 GNUPGHOME=${GNUPGHOME:-"$MS_HOME"/gnupg}
105 export GNUPGHOME
106 KEYSERVER=${KEYSERVER:-subkeys.pgp.net}
107 export KEYSERVER
108
109 COMMAND="$1"
110 [ "$COMMAND" ] || failure "Type '$PGRM help' for usage."
111 shift 1
112
113 case $COMMAND in
114     'gen-key')
115         gen_key
116         ;;
117     'publish-key')
118         publish_key
119         ;;
120     'trust-key')
121         if [ -z "$1" ] ; then
122             failure "you must specify at least one key to trust."
123         fi
124         trust_key "$@"
125         ;;
126     'help')
127         usage
128         exit
129         ;;
130     *)
131         failure "Unknown command: '$COMMAND'
132 Type '$PGRM help' for usage."
133         ;;
134 esac