diff options
| author | Aaron LI <aly@aaronly.me> | 2018-07-23 14:38:20 +0800 | 
|---|---|---|
| committer | Aaron LI <aly@aaronly.me> | 2018-07-23 14:40:36 +0800 | 
| commit | 24a9e4eb1b716be9bf20fd540fae2208f47473b6 (patch) | |
| tree | 73dfe58d009707150c61d492726825fb0ecbebc1 | |
| parent | 41b290bc0c75f199724a69eebba193b5dc99c24c (diff) | |
| download | atoolbox-24a9e4eb1b716be9bf20fd540fae2208f47473b6.tar.bz2 | |
Add linux/lightdigest.sh: manage lighttpd passwd file
Credit: https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModAuth
| -rw-r--r-- | linux/lightdigest.sh | 130 | 
1 files changed, 130 insertions, 0 deletions
diff --git a/linux/lightdigest.sh b/linux/lightdigest.sh new file mode 100644 index 0000000..10e1c62 --- /dev/null +++ b/linux/lightdigest.sh @@ -0,0 +1,130 @@ +#!/bin/sh +# +# https://redmine.lighttpd.net/projects/lighttpd/wiki/Docs_ModAuth +# + +export PATH="/bin:/usr/bin:/usr/sbin:$PATH" + +# when input ctrl-c, remove lockfile and exit +trap '[ $lockstart -eq 1 ] && unlock $pfile && exit 0 || exit 0' INT + +pfile="/etc/lighttpd/conf.d/lighttpd.user" +lockstart=0 +remove=0 + +errmsg() { +    echo "$1" > /dev/stderr +} + +user_check() { +    local check_user=$1 +    grep "^${check_user}:" ${pfile} >& /dev/null +    return $? +} + +lock() { +    local lockfile="$1.lock" + +    [ -f "${lockfile}" ] && { +        errmsg "WARNING: lock file ${lockfile} is already exists" +        errmsg "         Wait minites for end of previous working ..." +    } + +    while [ -f "${lockfile}" ]; do echo >& /dev/null; done +    touch "${lockfile}" +    lockstart=1 +} + +unlock() { +    local lockfile="$1.lock" + +    [ -f "${lockfile}" ] && rm -f "${lockfile}" && lockstart=0 +} + +usage() { +    errmsg +    errmsg "lightdigest: lighttpd htdigest password generation program" +    errmsg "Scripted by JoungKyun.Kim <http://oops.org>" +    errmsg +    errmsg "Usage: $0 -[hd] -u user -p pass -r realm [-f password_file]" +    errmsg "Options:" +    errmsg "    -h          print this help messages" +    errmsg "    -u user     username" +    errmsg "    -p pass     password" +    errmsg "    -r realm    realm name" +    errmsg "    -f filename password file [default: /etc/lighttpd/conf.d/lighttpd.user" +    errmsg "    -d          remove user" +    errmsg + +    local lockfile="${pfile}.lock" +    [ $lockstart -eq 1 ] && rm -f ${lockfile} + +    exit 1 +} + +opts=$(getopt df:hp:r:u: $*) +[ $? != 0 ] && usage + +set -- ${opts} +for i +do +    case "$i" in +        -d) remove=1; shift;; +        -f) pfile="$2"; shift; shift;; +        -p) pass="$2"; shift; shift;; +        -r) realm="$2"; shift; shift;; +        -u) user="$2"; shift; shift;; +        --) shift; break; +    esac +done + +#echo $user +#echo $realm +#echo $pass +#echo $pfile +#echo $remove + +[ -z "$user" ] && errmsg "ERROR: User is none!!" && usage +[ ${remove} -eq 0 -a -z "${realm}" ] && errmsg "ERROR: Realm is none!!" && usage + +if [ -z "${pass}" -a ${remove} -eq 0 ]; then +    echo -n "Input new password : " +    read newpass +    echo -n "Reinput password for confirm : " +    read renewpass + +    if [ "${newpass}" != "${renewpass}" ]; then +        errmsg "ERROR: Password is not match" +        exit 1 +    fi + +    pass=${newpass} +fi + +lock ${pfile} + +if [ ${remove} -eq 0 ]; then +    # User Add Mode +    hash=$(echo -n "${user}:${realm}:${pass}" | md5sum | cut -b -32) +    user_check ${user} +    already=$? + +    [ -f "${pfile}" ] && cp -af ${pfile} ${pfile}.bak +    if [ ${already} -eq 0 ]; then +        # already exists +        perl -pi -e "s/^${user}:.*$/${user}:${realm}:${hash}/g" ${pfile} +    else +        # add new user +        echo "${user}:${realm}:${hash}" >> ${pfile} +    fi +else +    # User Remove Mode +    tmp_htdigest=$(mktemp) +    cp -af ${pfile} ${pfile}.bak +    grep -v "^${user}:" ${pfile} > ${tmp_htdigest} +    mv -f ${tmp_htdigest} ${pfile} +fi + +unlock ${pfile} + +exit 0  | 
