added Jamie McClelland as author in src/*
[monkeysphere.git] / src / common
index d90730ff7887f8f753567f73b16ef780ae9181ae..16235a2881f7b7c2c9480abe5e93c6d17681f28b 100644 (file)
@@ -4,6 +4,8 @@
 #
 # Written by
 # Jameson Rollins <jrollins@fifthhorseman.net>
+# Jamie McClelland <jm@mayfirst.org>
+# Daniel Kahn Gillmor <dkg@fifthhorseman.net>
 #
 # Copyright 2008, released under the GPL, version 3 or later
 
@@ -26,14 +28,53 @@ failure() {
     exit ${2:-'255'}
 }
 
-# write output to stderr
+# write output to stderr based on specified LOG_LEVEL the first
+# parameter is the priority of the output, and everything else is what
+# is echoed to stderr
 log() {
-    echo -n "ms: " >&2
-    echo "$@" >&2
-}
+    local priority
+    local level
+    local output
+    # don't include SILENT in alllevels: it's handled separately
+    # list in decreasing verbosity (all caps)
+    local alllevels="DEBUG INFO ERROR"
+    local found=
+
+    # translate lowers to uppers in global log level
+    LOG_LEVEL=$(echo "$LOG_LEVEL" | tr "[:lower:]" "[:upper:]")
+
+    # just go ahead and return if the log level is silent
+    if [ "$LOG_LEVEL" = 'SILENT' ] ; then
+       return
+    fi
 
-loge() {
-    echo "$@" >&2
+    for level in $alllevels; do 
+       if [ "$LOG_LEVEL" = "$level" ] ; then
+           found=true
+       fi
+    done
+    if [ -z "$found" ] ; then
+       # default to INFO:
+       LOG_LEVEL=INFO
+    fi
+
+    # get priority from first parameter, translating all lower to
+    # uppers
+    priority=$(echo "$1" | tr "[:lower:]" "[:upper:]")
+    shift
+
+    # scan over available levels
+    for level in $alllevels ; do
+       # output if the log level matches, set output to true
+       # this will output for all subsequent loops as well.
+       if [ "$LOG_LEVEL" = "$level" ] ; then
+           output=true
+       fi
+       if [ "$priority" = "$level" -a "$output" = 'true' ] ; then
+           echo -n "ms: " >&2
+           echo "$@" >&2
+       fi
+    done
 }
 
 # cut out all comments(#) and blank lines from standard input
@@ -368,13 +409,12 @@ gpg_fetch_userid() {
 
     userID="$1"
 
-    log -n " checking keyserver $KEYSERVER... "
+    log info " checking keyserver $KEYSERVER... "
     echo 1,2,3,4,5 | \
        gpg --quiet --batch --with-colons \
        --command-fd 0 --keyserver "$KEYSERVER" \
        --search ="$userID" > /dev/null 2>&1
     returnCode="$?"
-    loge "done."
 
     # if the user is the monkeysphere user, then update the
     # monkeysphere user's trustdb
@@ -396,10 +436,13 @@ gpg_fetch_userid() {
 # (see /usr/share/doc/gnupg/DETAILS.gz)
 # output is one line for every found key, in the following format:
 #
-# flag:fingerprint
+# flag:sshKey
 #
 # "flag" is an acceptability flag, 0 = ok, 1 = bad
-# "fingerprint" is the fingerprint of the key
+# "sshKey" is the translated gpg key
+#
+# all log output must go to stderr, as stdout is used to pass the
+# flag:sshKey to the calling function.
 #
 # expects global variable: "MODE"
 process_user_id() {
@@ -438,7 +481,7 @@ process_user_id() {
 
     # if the gpg query return code is not 0, return 1
     if [ "$?" -ne 0 ] ; then
-        log " no primary keys found."
+        log error " no primary keys found."
         return 1
     fi
 
@@ -455,21 +498,21 @@ process_user_id() {
                lastKeyOK=
                fingerprint=
 
-               log " primary key found: $keyid"
+               log error " primary key found: $keyid"
 
                # if overall key is not valid, skip
                if [ "$validity" != 'u' -a "$validity" != 'f' ] ; then
-                   log "  - unacceptable primary key validity ($validity)."
+                   log error "  - unacceptable primary key validity ($validity)."
                    continue
                fi
                # if overall key is disabled, skip
                if check_capability "$usage" 'D' ; then
-                   log "  - key disabled."
+                   log error "  - key disabled."
                    continue
                fi
                # if overall key capability is not ok, skip
                if ! check_capability "$usage" $requiredPubCapability ; then
-                   log "  - unacceptable primary key capability ($usage)."
+                   log error "  - unacceptable primary key capability ($usage)."
                    continue
                fi
 
@@ -483,7 +526,7 @@ process_user_id() {
                ;;
            'uid') # user ids
                if [ "$lastKey" != pub ] ; then
-                   log " - got a user ID after a sub key?!  user IDs should only follow primary keys!"
+                   log error " - got a user ID after a sub key?!  user IDs should only follow primary keys!"
                    continue
                fi
                # if an acceptable user ID was already found, skip
@@ -504,16 +547,16 @@ process_user_id() {
                # output a line for the primary key
                # 0 = ok, 1 = bad
                if [ "$keyOK" -a "$uidOK" -a "$lastKeyOK" ] ; then
-                   log "  * acceptable primary key."
+                   log error "  * acceptable primary key."
                    if [ -z "$sshKey" ] ; then
-                       log "    ! primary key could not be translated (not RSA or DSA?)."
+                       log error "    ! primary key could not be translated (not RSA or DSA?)."
                    else
                        echo "0:${sshKey}"
                    fi
                else
-                   log "  - unacceptable primary key."
+                   log error "  - unacceptable primary key."
                    if [ -z "$sshKey" ] ; then
-                       log "   ! primary key could not be translated (not RSA or DSA?)."
+                       log error "   ! primary key could not be translated (not RSA or DSA?)."
                    else
                        echo "1:${sshKey}"
                    fi
@@ -560,16 +603,16 @@ process_user_id() {
                # output a line for the sub key
                # 0 = ok, 1 = bad
                if [ "$keyOK" -a "$uidOK" -a "$lastKeyOK" ] ; then
-                   log "  * acceptable sub key."
+                   log error "  * acceptable sub key."
                    if [ -z "$sshKey" ] ; then
-                       log "    ! sub key could not be translated (not RSA or DSA?)."
+                       log error "    ! sub key could not be translated (not RSA or DSA?)."
                    else
                        echo "0:${sshKey}"
                    fi
                else
-                   log "  - unacceptable sub key."
+                   log error "  - unacceptable sub key."
                    if [ -z "$sshKey" ] ; then
-                       log "    ! sub key could not be translated (not RSA or DSA?)."
+                       log error "    ! sub key could not be translated (not RSA or DSA?)."
                    else
                        echo "1:${sshKey}"
                    fi
@@ -595,7 +638,7 @@ process_host_known_hosts() {
     host="$1"
     userID="ssh://${host}"
 
-    log "processing: $host"
+    log info "processing: $host"
 
     nKeys=0
     nKeysOK=0
@@ -696,7 +739,7 @@ update_known_hosts() {
 
     # note if the known_hosts file was updated
     if [ "$(file_hash "$KNOWN_HOSTS")" != "$fileCheck" ] ; then
-       log "known_hosts file updated."
+       log info "known_hosts file updated."
     fi
 
     # if an acceptable host was found, return 0
@@ -719,12 +762,12 @@ update_known_hosts() {
 process_known_hosts() {
     local hosts
 
-    log "processing known_hosts file..."
+    log info "processing known_hosts file..."
 
     hosts=$(meat "$KNOWN_HOSTS" | cut -d ' ' -f 1 | grep -v '^|.*$' | tr , ' ' | tr '\n' ' ')
 
     if [ -z "$hosts" ] ; then
-       log "no hosts to process."
+       log error "no hosts to process."
        return
     fi
 
@@ -744,7 +787,7 @@ process_uid_authorized_keys() {
 
     userID="$1"
 
-    log "processing: $userID"
+    log info "processing: $userID"
 
     nKeys=0
     nKeysOK=0
@@ -839,7 +882,7 @@ update_authorized_keys() {
 
     # note if the authorized_keys file was updated
     if [ "$(file_hash "$AUTHORIZED_KEYS")" != "$fileCheck" ] ; then
-       log "authorized_keys file updated."
+       log info "authorized_keys file updated."
     fi
 
     # if an acceptable id was found, return 0
@@ -866,10 +909,10 @@ process_authorized_user_ids() {
 
     authorizedUserIDs="$1"
 
-    log "processing authorized_user_ids file..."
+    log info "processing authorized_user_ids file..."
 
     if ! meat "$authorizedUserIDs" > /dev/null ; then
-       log "no user IDs to process."
+       log error "no user IDs to process."
        return
     fi