293 lines
7.9 KiB
Bash
Executable File
293 lines
7.9 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
CONFIG="/home/filebrowser/config"
|
||
source "$CONFIG"
|
||
|
||
# ==================== SHOW ====================
|
||
|
||
show_system() {
|
||
echo "=== Системные пользователи ==="
|
||
getent passwd | awk -F: '$3 >= 1000 && $3 < 65534 {print $1}'
|
||
}
|
||
|
||
show_samba() {
|
||
echo "=== Samba ==="
|
||
pdbedit -L | cut -d: -f1
|
||
}
|
||
|
||
show_filebrowser() {
|
||
echo "=== Filebrowser ==="
|
||
systemctl stop filebrowser.service
|
||
filebrowser users ls -d "$FB_DB" 2>/dev/null | tail -n +3 | awk '{print $2}'
|
||
systemctl start filebrowser.service
|
||
}
|
||
|
||
show_jellyfin() {
|
||
echo "=== Jellyfin ==="
|
||
curl -s "$JF_URL/Users" \
|
||
-H "X-Emby-Token: $JF_API_KEY" | \
|
||
python3 -c "import sys,json; [print(u['Name']) for u in json.load(sys.stdin)]"
|
||
}
|
||
|
||
show_all() {
|
||
show_system
|
||
echo ""
|
||
show_samba
|
||
echo ""
|
||
show_filebrowser
|
||
echo ""
|
||
show_jellyfin
|
||
}
|
||
|
||
# ==================== PASSWORD ====================
|
||
|
||
get_password() {
|
||
local pass1 pass2
|
||
while true; do
|
||
read -s -p "Новый пароль: " pass1 >&2
|
||
echo "" >&2
|
||
read -s -p "Повтори пароль: " pass2 >&2
|
||
echo "" >&2
|
||
if [ "$pass1" = "$pass2" ]; then
|
||
printf '%s' "$pass1"
|
||
return
|
||
fi
|
||
echo "Пароли не совпадают, попробуй ещё раз" >&2
|
||
done
|
||
}
|
||
|
||
passwd_samba() {
|
||
local username="$1"
|
||
local password="$2"
|
||
echo "$password" | smbpasswd -s -a "$username"
|
||
smbpasswd -e "$username"
|
||
}
|
||
|
||
passwd_filebrowser() {
|
||
local username="$1"
|
||
local password="$2"
|
||
systemctl stop filebrowser.service
|
||
filebrowser users update "$username" --password "$password" -d "$FB_DB"
|
||
systemctl start filebrowser.service
|
||
}
|
||
|
||
passwd_jellyfin() {
|
||
local username="$1"
|
||
local password="$2"
|
||
local user_id
|
||
user_id=$(curl -s "$JF_URL/Users" \
|
||
-H "X-Emby-Token: $JF_API_KEY" | \
|
||
python3 -c "import sys,json; users=json.load(sys.stdin); [print(u['Id']) for u in users if u['Name']=='$username']")
|
||
if [ -z "$user_id" ]; then
|
||
echo "Пользователь $username не найден в Jellyfin"
|
||
return 1
|
||
fi
|
||
curl -s -X POST "$JF_URL/Users/$user_id/Password" \
|
||
-H "X-Emby-Token: $JF_API_KEY" \
|
||
-H "Content-Type: application/json" \
|
||
-d "{\"NewPw\": \"$password\"}"
|
||
echo "Пароль в Jellyfin обновлён"
|
||
}
|
||
|
||
edit_user() {
|
||
local service="$1"
|
||
local username="$2"
|
||
local password
|
||
password=$(get_password)
|
||
case "$service" in
|
||
smb) passwd_samba "$username" "$password" ;;
|
||
fb) passwd_filebrowser "$username" "$password" ;;
|
||
jf) passwd_jellyfin "$username" "$password" ;;
|
||
*)
|
||
echo "Неизвестный сервис: $service"
|
||
exit 1
|
||
;;
|
||
esac
|
||
}
|
||
|
||
# ==================== ADD USER ====================
|
||
|
||
get_jf_libraries() {
|
||
curl -s "$JF_URL/Library/VirtualFolders" \
|
||
-H "X-Emby-Token: $JF_API_KEY" | \
|
||
python3 -c "import sys,json; [print(f['ItemId']) for f in json.load(sys.stdin)]"
|
||
}
|
||
|
||
add_to_system() {
|
||
local username="$1"
|
||
if id "$username" &>/dev/null; then
|
||
echo ">>> Системный пользователь $username уже существует, пропускаем"
|
||
else
|
||
useradd -M -s /sbin/nologin "$username"
|
||
usermod -aG nasusers "$username"
|
||
echo ">>> Системный пользователь $username создан"
|
||
fi
|
||
}
|
||
|
||
add_to_samba() {
|
||
# local username="$1"
|
||
# local password="$2"
|
||
# if pdbedit -L | grep -q "^$username:"; then
|
||
# echo ">>> Пользователь $username уже есть в Samba, пропускаем"
|
||
# else
|
||
# echo "$password" | smbpasswd -s -a "$username"
|
||
# smbpasswd -e "$username"
|
||
# echo ">>> Пользователь $username добавлен в Samba"
|
||
# fi
|
||
local username="$1"
|
||
local password="$2"
|
||
if pdbedit -L | grep -q "^$username:"; then
|
||
echo ">>> Пользователь $username уже есть в Samba, пропускаем"
|
||
else
|
||
# Сначала создаём системную запись в passdb
|
||
pdbedit -a -u "$username" -t << EOF > /dev/null 2>&1
|
||
$password
|
||
$password
|
||
EOF
|
||
smbpasswd -e "$username"
|
||
echo ">>> Пользователь $username добавлен в Samba"
|
||
fi
|
||
}
|
||
|
||
add_to_filebrowser() {
|
||
local username="$1"
|
||
local password="$2"
|
||
systemctl stop filebrowser.service
|
||
if filebrowser users ls -d "$FB_DB" 2>/dev/null | grep -q "$username"; then
|
||
echo ">>> Пользователь $username уже есть в Filebrowser, пропускаем"
|
||
else
|
||
filebrowser users add "$username" "$password" \
|
||
--scope "$username" \
|
||
--perm.create \
|
||
--perm.modify \
|
||
--perm.delete \
|
||
--perm.rename \
|
||
--perm.download \
|
||
--perm.share \
|
||
-d "$FB_DB"
|
||
echo ">>> Пользователь $username добавлен в Filebrowser"
|
||
fi
|
||
systemctl start filebrowser.service
|
||
}
|
||
|
||
add_to_jellyfin() {
|
||
local username="$1"
|
||
local password="$2"
|
||
|
||
local exists
|
||
exists=$(curl -s "$JF_URL/Users" \
|
||
-H "X-Emby-Token: $JF_API_KEY" | \
|
||
python3 -c "import sys,json; users=json.load(sys.stdin); print(any(u['Name']=='$username' for u in users))")
|
||
|
||
if [ "$exists" = "True" ]; then
|
||
echo ">>> Пользователь $username уже есть в Jellyfin, пропускаем"
|
||
return
|
||
fi
|
||
|
||
local result
|
||
result=$(curl -s -X POST "$JF_URL/Users/New" \
|
||
-H "X-Emby-Token: $JF_API_KEY" \
|
||
-H "Content-Type: application/json" \
|
||
-d "{\"Name\": \"$username\", \"Password\": \"$password\"}")
|
||
|
||
local user_id
|
||
user_id=$(echo "$result" | python3 -c "import sys,json; print(json.load(sys.stdin)['Id'])")
|
||
|
||
if [ -z "$user_id" ]; then
|
||
echo ">>> Ошибка создания пользователя $username в Jellyfin"
|
||
return 1
|
||
fi
|
||
|
||
echo ">>> Пользователь $username добавлен в Jellyfin (id: $user_id)"
|
||
}
|
||
|
||
create_homedir() {
|
||
local username="$1"
|
||
local user_dir="$BASE_DIR/$username"
|
||
|
||
if [ -d "$user_dir" ]; then
|
||
echo ">>> Каталог $user_dir уже существует, пропускаем"
|
||
else
|
||
mkdir -p "$user_dir"
|
||
chown root:nasusers "$user_dir"
|
||
chmod 2770 "$user_dir"
|
||
setfacl -d -m g:nasusers:rwx "$user_dir"
|
||
setfacl -d -m o::0 "$user_dir"
|
||
echo ">>> Каталог $user_dir создан с ACL"
|
||
fi
|
||
}
|
||
|
||
add_user() {
|
||
local username="$1"
|
||
local password
|
||
password=$(get_password)
|
||
|
||
echo ""
|
||
echo ">>> Добавляем пользователя $username..."
|
||
echo ""
|
||
|
||
add_to_system "$username"
|
||
create_homedir "$username"
|
||
add_to_samba "$username" "$password"
|
||
add_to_filebrowser "$username" "$password"
|
||
add_to_jellyfin "$username" "$password"
|
||
|
||
echo ""
|
||
echo ">>> Готово! Пользователь $username создан во всех системах"
|
||
}
|
||
|
||
# ==================== USAGE ====================
|
||
|
||
usage() {
|
||
echo "Использование: $0 <команда> [аргументы]"
|
||
echo ""
|
||
echo "Команды:"
|
||
echo " list [сервис] показать пользователей (system|smb|fb|jf|all)"
|
||
echo " passwd <сервис> <user> сменить пароль пользователя"
|
||
echo " add <username> добавить пользователя во все системы"
|
||
echo ""
|
||
echo "Примеры:"
|
||
echo " $0 list"
|
||
echo " $0 list jf"
|
||
echo " $0 passwd smb xalex"
|
||
echo " $0 passwd fb mammy"
|
||
echo " $0 add newuser"
|
||
}
|
||
|
||
# ==================== MAIN ====================
|
||
|
||
case "${1}" in
|
||
list)
|
||
case "${2:-all}" in
|
||
system) show_system ;;
|
||
smb) show_samba ;;
|
||
fb) show_filebrowser ;;
|
||
jf) show_jellyfin ;;
|
||
all) show_all ;;
|
||
*) echo "Неизвестный сервис: $2"; usage; exit 1 ;;
|
||
esac
|
||
;;
|
||
passwd)
|
||
if [ -z "$2" ] || [ -z "$3" ]; then
|
||
echo "Использование: $0 passwd <сервис> <username>"
|
||
exit 1
|
||
fi
|
||
edit_user "$2" "$3"
|
||
;;
|
||
add)
|
||
if [ -z "$2" ]; then
|
||
echo "Использование: $0 add <username>"
|
||
exit 1
|
||
fi
|
||
add_user "$2"
|
||
;;
|
||
-h|--help)
|
||
usage
|
||
;;
|
||
*)
|
||
echo "Неизвестная команда: $1"
|
||
usage
|
||
exit 1
|
||
;;
|
||
esac
|