Files
homelab-repo/nas/scripts/hlab
T
2026-07-07 21:06:36 +05:00

293 lines
7.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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