#!/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 <сервис> сменить пароль пользователя" echo " add добавить пользователя во все системы" 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 <сервис> " exit 1 fi edit_user "$2" "$3" ;; add) if [ -z "$2" ]; then echo "Использование: $0 add " exit 1 fi add_user "$2" ;; -h|--help) usage ;; *) echo "Неизвестная команда: $1" usage exit 1 ;; esac