#!/bin/bash ######################################################################## ## Script : ldap-addgroup:.sh ## Name : LDAP にグループを追加します。 ## Version : 0.0.1 ## Copyright : 2019 Nomura Kei ## License : BSD-2-Clause ## Usage: ## |使用法) ldap-addgroup.sh [オプション] cn(GroupNamme) ## | ## | LDAPにグループを追加します。 ## | --uid <ユーザーID> が指定された場合、当該グループにユーザーを追加します。 ## | /etc/group に gid にマッチする情報があればデフォルト値として使用されます。 ## | デフォルト値を使用しない場合は、--nodefault を指定してください。 ## | ## |cn(GroupName) ## | グループIDを指定します。 ## | ## |[オプション] ## | --password arg 管理者パスワードを指定します。 ## | --nodefault デフォルト値 ## | --uid uid 当該グループに追加するユーザーを指定します。 ## | --gidNumber arg GID番号を指定します。 ## | -h,--help 使用法を表示します。 ## | -v,--version バージョンを表示します。 ## | ## |[詳細] ## | 次のようなエントリを生成します。 ## | ## | dn: cn=<グループ名>,ou=Group,<ドメインのDN> ## | objectClass: posixGroup ## | cn: <グループ名> ## | gidNumber: <GID> ## | memberUid: <ユーザーID> ## | ## ## <備考> ## グループ管理として、次のクラスも利用可能であるが、 ## 共存できないため poixGroup のみを利用する。 ## objectClass: groupOfNames ## member: uid=<ユーザーID>,ou=User,<ドメインDN> ## ## ######################################################################## 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_CN= P_GID_NUMBER= P_UID= ######################################################################## ## ## 関数群 ## # ====================================================================== # 指定されたグループに関する情報を /etc/group より抽出し、各変数にセットします。 # ※現状自動抽出する値は、グループ番号のみです。 # # @param $1 cn (GroupName) # ====================================================================== function load_default_info() { P_CN=$1 ETC_GROUP=/etc/group [ "${P_GID_NUMBER}" = "" ] && P_GID_NUMBER=`grep -e "${P_CN}:" ${ETC_GROUP} | awk -F ':' {'print $3'}` } # ====================================================================== # 指定された属性を出力します。 # 属性値が空文字の場合は、何も出力しません。 # # @param $1 属性 # @param $2 属性値 # ====================================================================== print_attr() { if [ "$2" != "" ]; then echo "$1: $2" fi } # ====================================================================== # グループを登録するための ldif 形式データを標準出力します。 # ldif 形式のデータを標準出力します。 # # @param $1 ドメイン(DN形式) # ====================================================================== mkldif_for_add_group() { DOMAIN_DN=$1 print_attr dn "cn=${P_CN},ou=Group,${DOMAIN_DN}" print_attr objectClass "posixGroup" print_attr cn "${P_CN}" print_attr gidNumber "${P_GID_NUMBER}" } # ====================================================================== # グループにユーザーを登録するための ldif 形式データを標準出力します。 # ldif 形式のデータを標準出力します。 # # @param $1 ドメイン(DN形式) # ====================================================================== mkldif_for_add_user_to_group() { DOMAIN_DN=$1 cat << EOF dn: cn=${P_CN},ou=Group,${DOMAIN_DN} changetype: modify add: memberUid memberUid: ${P_UID} EOF } ######################################################################## ## ## メイン処理 ## for OPT in "$@"; do case "${OPT}" in '--passwd') ROOT_PW="$2"; shift 2 ;; '--nodefault') NODEFAULT=1; shift 1 ;; '--uid') P_UID="$2"; shift 2 ;; '--gidNumber') P_GID_NUMBER="$2"; shift 2 ;; '-h'|'--help') usage; exit 1 ;; '-v'|'--version') version; exit 1 ;; -*) usage exit 1 ;; *) if [[ ! -z "$1" ]] && [[ ! "$1" =~ ^-+ ]]; then P_CN=("$1") shift 1 fi ;; esac done # ---------------------------------------------------------------------- # 引数チェック # ---------------------------------------------------------------------- if [ "${P_CN}" = "" ]; then usage exit 1 fi # デフォルト値ロード if [ ${NODEFAULT} -eq 0 ]; then load_default_info ${P_CN} fi # ---------------------------------------------------------------------- # 引数整理 # ---------------------------------------------------------------------- [ "${P_ROOTPW}" = "" ] && read -s -p "Root Password > " ROOT_PW; echo "" # ---------------------------------------------------------------------- # 一時ファイルの生成 # ---------------------------------------------------------------------- TMP_LDIF=$(mktemp /tmp/ldap-addgroup.XXXXXXXXXXXX.ldif) trap 'rm -f /tmp/ldap-addgroup.*.ldif; exit 1' 1 2 3 15 # ---------------------------------------------------------------------- # グループ登録 # ---------------------------------------------------------------------- ldapsearch -D ${ROOT_DN} -b ou=Group,${DOMAIN_DN} -w ${ROOT_PW} "(cn=${P_CN})" | grep "^dn: cn=${P_CN},ou=Group,${DOMAIN_DN}" > /dev/null 2>&1 if [ $? -ne 0 ]; then echo "### --- Add Group (cn=${P_CN}) ---" [ "${P_GID_NUMBER}" = "" ] && read -p "GID Number > " P_GID_NUMBER mkldif_for_add_group ${DOMAIN_DN} > ${TMP_LDIF} ldapadd -D ${ROOT_DN} -f ${TMP_LDIF} -w ${ROOT_PW} fi # ---------------------------------------------------------------------- # ユーザー登録 # ---------------------------------------------------------------------- if [ "${P_UID}" != "" ]; then echo "### --- Add User (uid=${P_UID}) ---" mkldif_for_add_user_to_group ${DOMAIN_DN} > ${TMP_LDIF} ldapmodify -D ${ROOT_DN} -f ${TMP_LDIF} -w ${ROOT_PW} fi # ---------------------------------------------------------------------- # 結果出力 # ---------------------------------------------------------------------- ldapsearch -D ${ROOT_DN} -b cn=${P_CN},ou=Group,${DOMAIN_DN} -w ${ROOT_PW} rm -f /tmp/ldap-*.*.ldif