#!/bin/bash
. bean_func.fnc

_adduser()
{
	grp=$(groups | sed -e "s|^$USER ||" -e "s| $USER | |" -e "s| |,|igm")
	usrlst=$(cat /etc/passwd | grep /home/ | grep -v "^syslog:" | grep -v "^usbmux:" | cut -d: -f1)
	exusrlst=$(cat /etc/passwd | cut -d: -f1)
	
	while true ; do

		echo
		echo "既に使われている名前: $(echo ${exusrlst})"
		echo
		echo "編集可能なユーザー: $(echo ${usrlst})"
		echo
		echo "追加または編集するユーザー名を入力してください。"
		read -p "空欄の場合は終了します。: " id
		
		if [ "a${id}" == "a" ] ; then
			break
		fi
		
		if [ $(cat /etc/passwd | grep "^${id}:" | wc -l) -gt 0 ] ; then
			
			if [ $(cat /etc/passwd | grep /home/ | \
			       grep -v "^syslog:" | grep -v "^usbmux:" | \
			       grep "^${id}:" | wc -l) -eq 0 ] ; then
				
				_echo_red "そのユーザーは編集できません。"
				continue
			else
				sudo chfn ${id}
				continue
			fi
		fi
		
		if [ $(echo "${id}" | grep -o "[^_a-zA-Z0-9]" | wc -l) -gt 0 ] ; then
			_echo_red "ユーザー名に不正な文字が含まれています。"
			continue
		fi
		
		if [ $(echo "${id}" | grep -o "^[0-9]" | wc -l) -gt 0 ] ; then
			_echo_red "ユーザー名の先頭に数字は使えません。"
			continue
		fi
		
		read -p "${id} を作成しますか？ [y/N]: " yn
		
		if [ "a${yn}" != "ay" ] && [ "a${yn}" != "aY" ] ; then
			_echo_red "ユーザーの作成を中止しました。"
			continue
		fi
		
		if ! sudo adduser ${id} ; then
			_echo_red "ユーザーの作成に失敗しました。"
			continue
		else
			_echo_green "ユーザー ${id} の作成に成功しました。"
		fi
		
		echo
		echo "新しいユーザーに管理者権限（sudo/root）を与えますか？"
		read -p "システムに変更を加えさせたくない場合はnを選んでください。[Y/n]: " yn
	
		if [ "a${yn}" != "an" ] && [ "a${yn}" != "aN" ] ; then
			echo "ユーザーを管理者としてグループに参加させています..."
		else
			grp=$(echo ${grp} | sed -e "s|,sudo,|,|")
			echo "一般ユーザーとしてグループに参加させています..."
		fi
		
		if ! sudo usermod -a -G ${grp} ${id} ; then
			_echo_red "グループへの参加に失敗しました。"
			continue
		else
			_echo_green "グループへの参加に成功しました。"
			continue
		fi
	done
}

_userdel()
{
	while true ; do
		
		usrlst=$(cat /etc/passwd | grep /home/ | grep -v "^syslog:" | grep -v "^usbmux:" | cut -d: -f1)
		
		echo
		echo "削除可能なユーザー: $(echo ${usrlst})"
		echo
		read -p "削除したいユーザーを入力してください。空欄の場合は終了します。: " id
		
		if [ "a${id}" == "a" ] ; then
			break
		fi
		
		if [ "$(whoami)" == "${id}" ] ; then
			_echo_red "自分のアカウントを削除する事は出来ません。"
			continue
		fi
		
		if [ $(echo "${usrlst}" | grep "^${id}$" | wc -l) -eq 0 ] ; then
			_echo_red "削除可能なユーザーの中に、その名前の項目は存在しません。"
			continue
		fi
		
		echo "ユーザー ${id} を削除しますか？"
		read -p "${id} が所有していたデータはホームフォルダごと削除されます。[y/N]: " yn
		
		if [ "a${yn}" != "ay" ] && [ "a${yn}" != "aY" ] ; then
			_echo_red "ユーザーの削除を中止しました。"
			continue
		fi
		
		read -p "本当にユーザー ${id} を削除するのですか？ [y/N]: " yn
		
		if [ "a${yn}" != "ay" ] && [ "a${yn}" != "aY" ] ; then
			_echo_red "ユーザーの削除を中止しました。"
			continue
		fi
		
		read -p "後悔しませんね？ [y/N]: " yn
		
		if [ "a${yn}" != "ay" ] && [ "a${yn}" != "aY" ] ; then
			_echo_red "ユーザーの削除を中止しました。"
			continue
		fi
		
		if ! sudo userdel -r ${id} ; then
			_echo_red "ユーザーの削除に失敗しました。"
			continue
		else
			_echo_green "ユーザー ${id} の削除に成功しました。"
			continue
		fi
	done
}

_usermod()
{
	usrlst=$(cat /etc/passwd | grep /home/ | grep -v "^syslog:" | grep -v "^usbmux:" | cut -d: -f1)
	grplst=$(cat /etc/group  | cut -d: -f1)
	
	while true ; do
		
		while true ; do
			
			echo
			echo "編集可能なユーザー: $(echo ${usrlst})"
			echo
			echo "グループに参加または脱退させたいユーザーを入力してください。"
			read -p "空欄の場合は終了します。: " id
			
			if [ "a${id}" == "a" ] ; then
				break 2
			fi
			
			if [ $(echo "${usrlst}" | grep "^${id}$" | wc -l) -eq 0 ] ; then
				_echo_red "編集可能なユーザーの中に、その名前の項目は存在しません。"
				continue
			fi
			
			break
		done
		
		while true ; do
			
			mygrp=$(groups $USER | cut -d: -f2 | grep -o "\w*")
			
			echo
			echo "編集中のユーザー: ${id}"
			echo "所属グループ:$(groups ${id} | cut -d: -f2)"
			echo
			echo "存在するグループ: $(echo ${grplst})"
			echo
			echo "参加または脱退させたいグループを入力してください。"
			read -p "空欄の場合はユーザーの選択に戻ります。: " grp
			echo
			
			if [ "a${grp}" == "a" ] ; then
				break
			fi
			
			# 既に参加しているグループ → 脱退
			if [ $(echo "${mygrp}" | grep "^${grp}$" | wc -l) -gt 0 ] ; then
				
				# プライマリーグループから脱退しようとして失敗
				prim=$(id ${id} | grep -o "gid=[0-9]*(\S*" | grep -o "[^0-9]*)$" | grep -o "[^()]*")
				if [ "a${grp}" == "a${prim}" ] ; then
					_echo_red "プライマリーグループからは脱退できません。"
					continue
				fi
				
				# 管理者権限を失う操作
				if [ "a${grp}" == "asudo" ] ; then
					if [ "a$(cat /etc/group | grep '^sudo:' | cut -d: -f4 | sed -e 's|,| |igm')" == "a${id}" ] ; then
						_echo_red "最低一人はsudoが利用できるようにしてください。"
						continue
					fi
				fi
				
				read -p "${grp} から脱退させますか？ [y/N]: " yn
				if [ "a${yn}" != "ay" ] && [ "a${yn}" != "aY" ] ; then
					echo "脱退を中止しました。"
				else
					if sudo gpasswd -d ${id} ${grp} ; then
						_echo_green "${grp} からの脱退に成功しました"。
						continue
					else
						_echo_red "脱退に失敗しました"。
						continue
					fi
				fi
				
			# 参加していないグループ
			else
				# 存在しているグループ → 参加
				if [ $(echo "${grplst}" | grep "^${grp}$" | wc -l) -gt 0 ] ; then
					
					read -p "${grp} に参加させますか？ [y/N]: " yn
					if [ "a${yn}" != "ay" ] && [ "a${yn}" != "aY" ] ; then
						_echo_red "参加を中止しました。"
						continue
					else
						if sudo gpasswd -a ${id} ${grp} ; then
							_echo_green "${grp} への参加に成功しました"。
							continue
						else
							_echo_red "参加に失敗しました"。
							continue
						fi
					fi
					
				# そもそも存在しないグループ → 作成・参加
				else
					echo "グループ ${grp} は存在しません。作成しますか [y/N]: " yn
					if [ "a${yn}" != "ay" ] && [ "a${yn}" != "aY" ] ; then
						_echo_red "作成を中止しました。"
						continue
					else
						if sudo groupadd ${grp} ; then
							_echo_green "${grp} の作成に成功しました"。
						else
							_echo_red "作成に失敗しました"。
							continue
						fi
						if sudo gpasswd -a ${id} ${grp} ; then
							_echo_green "${grp} への参加に成功しました"。
							continue
						else
							_echo_red "参加に失敗しました"。
							continue
						fi
					fi
				fi
			fi
		done
	done
}

_groupdel()
{
	while true ; do
		
		grplst=$(cat /etc/group  | cut -d: -f1)
		
		echo
		echo "存在するグループ: $(echo ${grplst})"
		echo
		
		read -p "削除したいグループを入力してください。空欄の場合は終了します。: " grp
		
		if [ "a${grp}" == "a" ] ; then
			break
		fi
		
		if [ $(echo "${grplst}" | grep "^${grp}$" | wc -l) -eq 0 ] ; then
			_echo_red "その名前のグループは存在しません。"
			continue
		fi
		
		gid=$(cat /etc/group | grep "^${grp}:" | cut -d: -f3)
		
		if [ $(cat /etc/passwd | grep "^[^:]\+:x:[0-9]\+:${gid}:" | wc -l) -gt 0 ] ; then
			prim=$(cat /etc/passwd | grep "^[^:]\+:x:[0-9]\+:${gid}:" | cut -d: -f1)
			echo
			_echo_red "以下のユーザーがプライマリーユーザーとして所属しています。"
			_echo_red ${prim}
			echo
			_echo_red "削除を中止しました。"
			continue
		fi
		
		echo
		echo "所属ユーザー: $(cat /etc/group | grep "^${grp}:" | cut -d: -f4 | sed -e 's|,| |igm')"
		echo
		echo "所属ユーザーの所有するファイルにアクセスできなくなる可能性があります。"
		read -p "それでもグループ ${grp} を削除しますか？ [y/N]: " yn
		
		if [ "a${yn}" != "ay" ] && [ "a${yn}" != "aY" ] ; then
			_echo_red "削除を中止しました。"
			continue
		fi
		
		read -p "本当にグループ ${grp} を削除するのですか？ [y/N]: " yn
		
		if [ "a${yn}" != "ay" ] && [ "a${yn}" != "aY" ] ; then
			_echo_red "削除を中止しました。"
			continue
		fi
		
		read -p "後悔しませんね？ [y/N]: " yn
		
		if [ "a${yn}" != "ay" ] && [ "a${yn}" != "aY" ] ; then
			_echo_red "削除を中止しました。"
			continue
		fi
		
		if ! sudo groupdel ${grp} ; then
			_echo_red "削除に失敗しました。"
			continue
		else
			_echo_green "${grp} の削除に成功しました。"
			continue
		fi
	done
}

while true ; do
	echo
	echo "a:ユーザーの追加・編集   d:ユーザーの削除"
	echo "j:グループに参加・脱退   b:グループの削除   q:終了"
	echo
	read -p "実行したい処理をを選択してください [a/d/j/b/q]: " ad
	
	while [ "a${ad}" != "aa" ] && [ "a${ad}" != "aA" ] && \
	      [ "a${ad}" != "ad" ] && [ "a${ad}" != "aD" ] && \
	      [ "a${ad}" != "aj" ] && [ "a${ad}" != "aJ" ] && \
	      [ "a${ad}" != "ab" ] && [ "a${ad}" != "aB" ] && \
	      [ "a${ad}" != "aq" ] && [ "a${ad}" != "aQ" ] ; do
		echo
		echo "a:ユーザーの追加・編集   d:ユーザーの削除"
		echo "j:グループに参加・脱退   b:グループの削除   q:終了"
		echo
		read -p "実行したい処理をを選択してください [a/d/j/b/q]: " ad
	done
	
	if [ "a${ad}" == "aq" ] || [ "a${ad}" == "aQ" ] ; then
		exit 0
	fi
	
	echo "パスワードを入力してください。"
	echo "（画面には何も表示されませんが、セキュリティ上の仕様ですので問題ありません。）"
	if ! sudo true ; then
		_echo_red "認証に失敗しました。Enterで終了します。"
		read ans
		exit 1
	fi
	
	if   [ "a${ad}" == "aa" ] || [ "a${ad}" == "aA" ] ; then
		_adduser
		
	elif [ "a${ad}" == "ad" ] || [ "a${ad}" == "aD" ] ; then
		_userdel
		
	elif [ "a${ad}" == "aj" ] || [ "a${ad}" == "aJ" ] ; then
		_usermod
		
	elif [ "a${ad}" == "ab" ] || [ "a${ad}" == "aB" ] ; then
		_groupdel
		
	fi
done
