Newer
Older
ldap / src / ldap-adduser.sh
#!/bin/bash
########################################################################
## Script    : ldap-adduser:.sh
## Name      : LDAP にユーザーを追加します。
## Version   : 0.0.1
## Copyright : 2019  Nomura Kei
## License   : BSD-2-Clause
## Usage:
## |使用法) ldap-adduser.sh [オプション] uid
## |
## | LDAPにユーザーを追加します。
## | /etc/passwd, /etc/shadow に uid にマッチする情報があればデフォルト値として使用されます。
## | デフォルト値を使用しない場合は、--nodefault を指定してください。
## |
## |uid
## |  ユーザーIDを指定します。
## |
## |[オプション]
## |  --password arg         管理者パスワードを指定します。
## |  --nodefault            デフォルト値
## |  --sn arg               姓を指定します。
## |  --cn arg               名前(Full Name)を指定します。
## |  --uidNumber arg        UID番号を指定します。
## |  --gidNumber arg        GID番号を指定します。
## |  --homeDirectory arg    ホームディレクトリを指定します。
## |  --loginShell arg       ログインシェルを指定します。
## |  --userPassword arg     ユーザーパスワードを指定します。
## |  --shadowLastChange arg 最終パスワード変更日時を指定します。
## |  --shadowMin arg        パスワード変更不能日数を指定します。
## |  --shadowMax arg        パスワード変更要求までの日数を指定します。
## |  --shadowWarning arg    パスワード期限満了警告日数を指定します。
## |  --shadowInactive arg   アカウント無効までの日数を指定します。
## |  --shadowExpire arg     アカウント期限満了の日付
## |  --shadowFlag arg       予約
## |  --mail arg             メールアドレスを指定します。
## |  -h,--help      使用法を表示します。
## |  -v,--version   バージョンを表示します。
## |
## |[詳細]
## | 次のようなエントリを生成します。
## |
## | dn: uid=<ユーザーID>,ou=User,<ドメインのDN>
## | objectClass: inetOrgPerson
## | objectClass: posixAccount
## | objectClass: shadowAccount
## | sn: <姓>
## | cn: <名>
## | uid: <ユーザーID>
## | uidNumber: <UID>
## | gidNumber: <GID>
## | gecos: <その他情報>
## | homeDirectory: <ホームディレクトリ>
## | loginShell: <ログインシェル>
## | userPassword: <(ハッシュ化された)ユーザーパスワード>
## | shadowLastChange: <パスワードの最終更新日>
## | shadowMin: <変更可能最短期間>
## | shadowMax: <未変更可能最長期間>
## | shadowWarning: <警告日>
## | shadowInactive: <インアクティブ>
## | shadowExpire: <失効日>
## | shadowFlag: <フラグ>
## | mail: <メールアドレス>
## |
##
########################################################################
SCRIPT_FILE=${0}
SCRIPT_DIR=`dirname ${SCRIPT_FILE}`
LIB_DIR=${SCRIPT_DIR}/../lib



########################################################################
##
## ライブラリのロード
##
[ -f "${LIB_DIR}/functions.sh" ] && . ${LIB_DIR}/bash-utils.sh
[ -f "${SCRIPT_DIR}/ldap-util.sh" ] && . ${SCRIPT_DIR}/ldap-util.sh



########################################################################
##
## デフォルト値
##
DOMAIN_DN=`getDomainDN`
ROOT_DN=`getRootDN`
ROOT_PW=
NODEFAULT=0
P_SN=
P_CN=
P_UID=
P_UID_NUMBER=
P_GID_NUMBER=
P_GECOS=
P_HOME_DIRECTORY=
P_LOGIN_SHELL=
P_USER_PASSWORD=
P_SHADOW_LAST_CHANGE=
P_SHADOW_MIN=
P_SHADOW_MAX=
P_SHADOW_WARNING=
P_SHADOW_INACTIVE=
P_SHADOW_EXPIRE=
P_SHADOW_FLAG=
P_MAIL=




########################################################################
##
## 関数群
##

# ======================================================================
#  指定された UID に関する情報を /etc/passwd, /etc/shadow より抽出し、
#  各変数にセットします。
#  ※既に値が設定されている変数にはセットしません。
#
#  @param $1 uid
# ======================================================================
function load_default_info()
{
    P_UID=$1
    ETC_PASSWD=/etc/passwd
    ETC_SHADOW=/etc/shadow

	[ "$P_UID_NUMBER"         = "" ] && P_UID_NUMBER=`        grep -e "^${P_UID}:" ${ETC_PASSWD} | awk -F ':' {'print $3'}`
	[ "$P_GID_NUMBER"         = "" ] && P_GID_NUMBER=`        grep -e "^${P_UID}:" ${ETC_PASSWD} | awk -F ':' {'print $4'}`
	[ "$P_GECOS"              = "" ] && P_GECOS=`             grep -e "^${P_UID}:" ${ETC_PASSWD} | awk -F ':' {'print $5'}`
	[ "$P_HOME_DIRECTORY"     = "" ] && P_HOME_DIRECTORY=`    grep -e "^${P_UID}:" ${ETC_PASSWD} | awk -F ':' {'print $6'}`
	[ "$P_LOGIN_SHELL"        = "" ] && P_LOGIN_SHELL=`       grep -e "^${P_UID}:" ${ETC_PASSWD} | awk -F ':' {'print $7'}`

	[ "$P_USER_PASSWORD"      = "" ] && P_USER_PASSWORD=`     grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print "{CRYPT}" $2'}`
	[ "$P_SHADOW_LAST_CHANGE" = "" ] && P_SHADOW_LAST_CHANGE=`grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $3'}`
	[ "$P_SHADOW_MIN"         = "" ] && P_SHADOW_MIN=`        grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $4'}`
	[ "$P_SHADOW_MAX"         = "" ] && P_SHADOW_MAX=`        grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $5'}`
	[ "$P_SHADOW_WARNING"     = "" ] && P_SHADOW_WARNING=`    grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $6'}`
	[ "$P_SHADOW_INACTIVE"    = "" ] && P_SHADOW_INACTIVE=`   grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $7'}`
	[ "$P_SHADOW_EXPIRE"      = "" ] && P_SHADOW_EXPIRE=`     grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $8'}`
	[ "$P_SHADOW_FLAG"        = "" ] && P_SHADOW_FLAG=`       grep -e "^${P_UID}:" ${ETC_SHADOW} | awk -F ':' {'print $9'}`

}



# ======================================================================
#  指定された属性を出力します。
#  属性値が空文字の場合は、何も出力しません。
#
#  @param $1 属性
#  @param $2 属性値
# ======================================================================
print_attr()
{
        if [ "$2" != "" ]; then
                echo "$1: $2"
        fi
}



# ======================================================================
#  ユーザーを登録するための ldif 形式のデータを標準出力します。
#
#  @param $1 ドメイン(DN形式)
# ======================================================================
mkldif_for_add_user()
{
	DOMAIN_DN=$1

	print_attr dn                   "uid=${P_UID},ou=User,${DOMAIN_DN}"
	print_attr objectClass          "inetOrgPerson"
	print_attr objectClass          "posixAccount"
	print_attr objectClass          "shadowAccount"
	print_attr sn                   "${P_SN}"
	print_attr cn                   "${P_CN}"
	print_attr uid                  "${P_UID}"
	print_attr uidNumber            "${P_UID_NUMBER}"
	print_attr gidNumber            "${P_GID_NUMBER}"
	print_attr gecos                "${P_GECOS}"
	print_attr homeDirectory        "${P_HOME_DIRECTORY}"
	print_attr loginShell           "${P_LOGIN_SHELL}"
	print_attr userPassword         "${P_USER_PASSWORD}"
	print_attr shadowLastChange     "${P_SHADOW_LAST_CHANGE}"
	print_attr shadowMin            "${P_SHADOW_MIN}"
	print_attr shadowMax            "${P_SHADOW_MAX}"
	print_attr shadowWarning        "${P_SHADOW_WARNING}"
	print_attr shadowInactive       "${P_SHADOW_INACTIVE}"
	print_attr shadowExpire         "${P_SHADOW_EXPIRE}"
	print_attr shadowFlag           "${P_SHADOW_FLAG}"
	print_attr mail                 "${P_MAIL}"
	echo ""

}




########################################################################
##
## メイン処理
##


for OPT in "$@"; do
	case "${OPT}" in
		'--passwd')             ROOT_PW="$2";				shift 2 ;;
		'--nodefault')          NODEFAULT=1;				shift 1 ;;
		'--sn')                 P_SN="$2";					shift 2 ;;
		'--cn')                 P_CN="$2";					shift 2 ;;
		'--uidNumber')          P_UID_NUMBER="$2";			shift 2 ;;
		'--gidNumber')          P_GID_NUMBER="$2";			shift 2 ;;
		'--homeDirectory')      P_HOME_DIRECTORY="$2";		shift 2 ;;
		'--loginShell')         P_LOGIN_SHELL="$2";			shift 2 ;;
		'--userPassword')       P_USER_PASSWORD="$2";		shift 2 ;;
		'--shadowLastChange')   P_SHADOW_LAST_CHANGE="$2";	shift 2 ;;
		'--shadowMin')          P_SHADOW_MIN="$2";			shift 2 ;;
		'--shadowMax')          P_SHADOW_MAX="$2";			shift 2 ;;
		'--shadowWarning')      P_SHADOW_WARNING="$2";		shift 2 ;;
		'--shadowInactive')     P_SHADOW_INACTIVE="$2";		shift 2 ;;
		'--shadowExpire')       P_SHADOW_EXPIRE="$2";		shift 2 ;;
		'--shadowFlag')         P_SHADOW_FLAG="$2";			shift 2 ;;
		'--mail')               P_LDAP_MAIL="$2";			shift 2 ;;
		'-h'|'--help')          usage;						exit 1  ;;
		'-v'|'--version')       version;					exit 1  ;;
		-*)						usage						exit 1	;;
		*)
			if [[ ! -z "$1" ]] && [[ ! "$1" =~ ^-+ ]]; then
				P_UID=("$1")
				shift 1
			fi
			;;
	esac
done


# デフォルト値ロード
if [ ${NODEFAULT} -eq 0 ]; then
	load_default_info ${P_UID}
fi



# ----------------------------------------------------------------------
#  引数整理
# ----------------------------------------------------------------------
[ "${ROOT_PW}"          = "" ] && read -s -p "Root Password    > " ROOT_PW; echo ""
[ "${P_SN}"             = "" ] && read    -p "SN (Surname)     > " P_SN
[ "${P_CN}"             = "" ] && read    -p "CN (Common Name) > " P_CN
[ "${P_UID_NUMBER}"     = "" ] && read    -p "UID Number       > " P_UID_NUMBER
[ "${P_GID_NUMBER}"     = "" ] && read    -p "GID Number       > " P_GID_NUMBER
[ "${P_HOME_DIRECTORY}" = "" ] && read    -p "HOME Directory   > " P_HOME_DIRECTORY
[ "${P_MAIL}"           = "" ] && read    -p "Mail             > " P_MAIL
if [ "${P_USER_PASSWORD}"  = "" ]; then
	confirm_password "User Password    > " "Re-type Password > "
	if [ $? -ne 0 ]; then
		echo "password verification error"
		exit 1
	fi
	P_USER_PASSWORD=`slappasswd -h '{CRYPT}' -c '$6$' -s ${CONFIRM_PASSWORD}`
fi

# ----------------------------------------------------------------------
#  一時ファイルの生成
# ----------------------------------------------------------------------
TMP_LDIF=$(mktemp /tmp/ldap-adduser.XXXXXXXXXXXX.ldif)
trap 'rm -f /tmp/ldap-adduser.*.ldif; exit 1' 1 2 3 15

# ----------------------------------------------------------------------
#  ユーザー登録
# ----------------------------------------------------------------------
echo "### --- Add User (uid=${P_UID}) ---"
mkldif_for_add_user ${DOMAIN_DN} > ${TMP_LDIF}
ldapadd -D ${ROOT_DN} -f ${TMP_LDIF} -w ${ROOT_PW}


# ----------------------------------------------------------------------
#  結果出力
# ----------------------------------------------------------------------
USER_DN="ou=User,${DOMAIN_DN}"
ldapsearch -D ${ROOT_DN} -b ${USER_DN} -w ${ROOT_PW} "(uid=${P_UID})"

rm -f /tmp/ldap-*.*.ldif