Newer
Older
ldap / src / ldap-addgroup.sh
#!/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