OpenWrt на D-Link DNS-325: установка Transmission, настройка каталогов, скрипт

OpenWrt на DNS-325: софт — каталоги, Transmission, watch

Предпосылка: OpenWrt уже стоит, диск смонтирован на /mnt/data, swap на HDD и при необходимости Samba для /mnt/data — как в основной заметке про прошивку и в гайде установки. Пакеты ставлю через apk (на старых сборках вместо него — opkg, имена пакетов проверь через поиск). Устройство: D-Link DNS-325, RAM порядка 256 MiB.


1. Перед началом

Выполни на NAS и убедись, что данные не на overlay, а на большом томе:

df -h /mnt/data

Ожидаемо: отдельный раздел (у меня /dev/sda1 на /mnt/data, размер порядка терабайт). Если /mnt/data не смонтирован — сначала доведи монтирование и swap по основному гайду.


2. Каталоги на /mnt/data

Зачем: заранее развести данные по папкам: корень для торрентов (/mnt/data/torrents), Syncthing, общие файлы и фото. Отдельный каталог /mnt/data/video здесь не создаём: готовое видео с торрентов по схеме ниже кладётся в /mnt/data/torrents/video (создаётся в п. 3.9 внутри download_dir, из‑за ujail так и нужно).

2.1. Каталоги одной командой:

mkdir -p /mnt/data/torrents /mnt/data/syncthing /mnt/data/files /mnt/data/photos

2.2. Права на все четыре каталога:

chmod 775 /mnt/data/torrents /mnt/data/syncthing /mnt/data/files /mnt/data/photos

2.3. Владельцы каталогов под отдельных пользователей Samba и демона: каталоги для обычных данных и Syncthing — под пользователя с паролем Samba (sambouser, см. п. 3.6); торренты позже, в п. 3.2, отдаются пользователю transmission. На этом шаге задай владельца только для syncthing, files, photos (имя пользователя подставь своё):

chown -R sambouser:sambouser /mnt/data/syncthing /mnt/data/files /mnt/data/photos

Заметка: /mnt/data/torrents пока не трогаем или оставь как есть до п. 3.2, где выполняется chown -R transmission:transmission /mnt/data/torrents. Шары Samba настраиваются в п. 3.6: вход по логину и паролю (sambouser, при необходимости отдельно transmission на шару watch).

2.4. Проверка после шага — выполни и сохрани вывод (пригодится для отладки):

date
uptime
free -m
df -h / /overlay /mnt/data
cat /proc/swaps

Диск ~1.8 T, свободно ~1.7 T; overlay ~81.6 M свободно из 106 M; swap-файл /mnt/data/.system/swapfile ~4 G, использование 0; load 0.00. Полный лог с консоли:

root@OpenWrt:~# df -h /mnt/data
Filesystem                Size      Used Available Use% Mounted on
/dev/sda1                 1.8T      4.0G      1.7T   0% /mnt/data

root@OpenWrt:~# mkdir -p /mnt/data/torrents /mnt/data/syncthing /mnt/data/files /mnt/data/photos

root@OpenWrt:~# chmod 775 /mnt/data/torrents /mnt/data/syncthing /mnt/data/files /mnt/data/photos

root@OpenWrt:~# chown -R sambouser:sambouser /mnt/data/syncthing /mnt/data/files /mnt/data/photos

root@OpenWrt:~# date
Sun Mar 22 06:41:09 GMT 2026

root@OpenWrt:~# uptime
 06:41:14 up  9:02,  load average: 0.00, 0.00, 0.00

root@OpenWrt:~# free -m
              total        used        free      shared  buff/cache   available
Mem:         249464       23656       21880        3656      203928      173864
Swap:       4194300           0     4194300

root@OpenWrt:~# df -h / /overlay /mnt/data
Filesystem                Size      Used Available Use% Mounted on
overlayfs:/overlay      106.0M     19.7M     81.6M  19% /
/dev/ubi0_2             106.0M     19.7M     81.6M  19% /overlay
/dev/sda1                 1.8T      4.0G      1.7T   0% /mnt/data

root@OpenWrt:~# cat /proc/swaps
Filename                                Type            Size            Used            Priority
/mnt/data/.system/swapfile              file            4194300         0               -2

Заметка: на BusyBox/OpenWrt колонки free -m могут вводить в заблуждение; при сомнениях смотри df и /proc/meminfo.


3.Transmission

3.1. Установка пакетов

apk update
apk add transmission-daemon transmission-web luci-app-transmission

Опционально русский LuCI: apk add luci-i18n-transmission-ru.

3.2. Каталог торрентов и владелец

mkdir -p /mnt/data/torrents
chown -R transmission:transmission /mnt/data/torrents
chmod 775 /mnt/data/torrents
/etc/init.d/transmission enable

3.3. Включение в UCI (по умолчанию enabled='0', без этого init не стартует демон):

/etc/init.d/transmission start

Если видишь: Transmission not enabled. Please enable in /etc/config/transmission — выполни:

uci set transmission.@transmission[0].enabled='1'
uci commit transmission
/etc/init.d/transmission start
/etc/init.d/transmission status

Ожидаемо: running. Проверка процесса:

ps w | grep -E '[t]ransmission-daemon'

У меня демон шёл через ujail, строка вида /usr/bin/transmission-daemon -f -g /tmp/transmission.

3.4. Перенос загрузок с /tmp на диск (иначе большие файлы забивают RAM/tmp):

mkdir -p /mnt/data/torrents/incomplete
chown -R transmission:transmission /mnt/data/torrents
uci set transmission.@transmission[0].download_dir='/mnt/data/torrents'
uci set transmission.@transmission[0].incomplete_dir='/mnt/data/torrents/incomplete'
uci set transmission.@transmission[0].incomplete_dir_enabled='1'
uci commit transmission
/etc/init.d/transmission restart
uci show transmission | grep -E 'download_dir|incomplete'
/etc/init.d/transmission status

Ожидаемо: в выводе uci show пути на /mnt/data/torrents и incomplete, статус running. Лог с моей консоли:

root@OpenWrt:~# /etc/init.d/transmission start
Transmission not enabled. Please enable in /etc/config/transmission

root@OpenWrt:~# uci set transmission.@transmission[0].enabled='1'
root@OpenWrt:~# uci commit transmission
root@OpenWrt:~# /etc/init.d/transmission start
root@OpenWrt:~# /etc/init.d/transmission status
running
root@OpenWrt:~# ps w | grep -E '[t]ransmission-daemon'
 4394 root      2172 SN   {transmission} /sbin/ujail -t 5 -n transmission -S /etc/seccomp/transmission-daemon.json -U transmission
 4419 transmis  8088 SN   /usr/bin/transmission-daemon -f -g /tmp/transmission

root@OpenWrt:~# mkdir -p /mnt/data/torrents/incomplete
root@OpenWrt:~# chown -R transmission:transmission /mnt/data/torrents
root@OpenWrt:~# uci set transmission.@transmission[0].download_dir='/mnt/data/torrents'
root@OpenWrt:~# uci set transmission.@transmission[0].incomplete_dir='/mnt/data/torrents/incomplete'
root@OpenWrt:~# uci set transmission.@transmission[0].incomplete_dir_enabled='1'
root@OpenWrt:~# uci commit transmission
root@OpenWrt:~# /etc/init.d/transmission restart
root@OpenWrt:~# uci show transmission | grep -E 'download_dir|incomplete'
transmission.@transmission[0].download_dir='/mnt/data/torrents'
transmission.@transmission[0].incomplete_dir='/mnt/data/torrents/incomplete'
transmission.@transmission[0].incomplete_dir_enabled='1'
root@OpenWrt:~# /etc/init.d/transmission status
running

3.5. Watch-каталог (подкинул .torrent — пошла закачка):

mkdir -p /mnt/data/torrents/watch
chown -R transmission:transmission /mnt/data/torrents
chmod 775 /mnt/data/torrents/watch
uci set transmission.@transmission[0].watch_dir='/mnt/data/torrents/watch'
uci set transmission.@transmission[0].watch_dir_enabled='1'
uci commit transmission
/etc/init.d/transmission restart

3.6. Samba: пользователи и доступ к папкам (watch и не только)

У меня отдельная шара torr_download/mnt/data/torrents/watch, шара nas на /mnt/data. В luci-app-samba4 нет штатного поля «Force user = transmission» (есть Force Root → в конфиг уходит force user = root). Поле Allowed users задаёт valid users — кто может подключиться к шаре. В этой статье везде вход по логину и паролю, без гостевого режима (подробнее и проверки — в OPENWRT_DNS325_SOFTWARE_SETTINGS.md, DNS325-SW-01).

Основная схема: пользователь sambouser + членство в группе transmission (один логин на шары с файлами и запись в торренты при необходимости):

Логин латиницей (пример — sambouser). Нужны: запись в /etc/passwd, в /etc/group строка группы transmission с членами transmission,sambouser (имена через запятую в одном поле; не путать с двоеточием между именами). Проверка: id sambouser — в списке групп должна быть transmission.

Права на каталоги (подстрой под свои пути шар):

chown -R sambouser:sambouser /mnt/data/syncthing /mnt/data/files /mnt/data/photos
find /mnt/data/syncthing /mnt/data/files /mnt/data/photos -type d -exec chmod 775 {} \;
find /mnt/data/syncthing /mnt/data/files /mnt/data/photos -type f -exec chmod 664 {} \;
chown -R transmission:transmission /mnt/data/torrents
find /mnt/data/torrents -type d -exec chmod 775 {} \;
find /mnt/data/torrents -type f -exec chmod 664 {} \;

Если используешь incoming → watch по cron, при отказе записи с Windows: chown sambouser:transmission /mnt/data/torrents/incoming и chmod 775 на этот каталог.

smbpasswd -a sambouser
uci set samba4.@sambashare[N].guest_ok='no'
uci set samba4.@sambashare[N].users='sambouser'
uci commit samba4
/etc/init.d/samba4 restart

Подставь вместо [N] индексы своих шар (uci show samba4). Проверка: grep -A20 '^\[имя_шары\]' /var/etc/smb.conf — должны быть valid users = sambouser и guest ok = no.

Windows: несколько букв дисков к одному хосту иногда дают ошибку 1219 — используй один диск (например Z:) и пути вроде Z:\torrents\watch, либо сними все net use к этому NAS и подключи заново.

Альтернатива: шару на watch можно открыть только для системного пользователя transmission (smbpasswd -a transmission, в LuCI Allowed users = transmission, гостям запретить), а остальные шары оставить на sambouser — тогда на watch заходишь под OPENWRT\transmission, на остальное — под sambouser. Учётку в Windows лучше сохранить в диспетчере учётных данных или через net use … /persistent:yes.

3.7. Проверка watch: положи тестовый .torrent в /mnt/data/torrents/watch (или скинь по SMB в torr_download) — задание должно появиться в веб-морде Transmission. Веб обычно: http://IP_NAS:9091/transmission/web/ (порт уточни: uci show transmission).

3.8. Скрипты

3.8.1. transmission-done-move-video.sh — вызывается Transmission как script-torrent-done (в окружении есть TR_*). Если запустить тот же файл из cron без этих переменных, скрипт работает в режиме периодического сканирования по RPC (завершённые на 100% торренты с видео → --move в DEST_VIDEO). Порт и логин/пароль RPC при необходимости подставляются из UCI. Сохрани на NAS в /mnt/data/torrents/transmission-done-move-video.sh:

#!/bin/sh
# transmission-done-move-video.sh — скрипт для Transmission «по завершении торрента» (script-torrent-done).
# Переносит данные торрента в каталог с видео ТОЛЬКО если среди файлов есть «видео-расширения».
# Перенос через transmission-remote --move (не через mv!), чтобы не ломать пути и сидирование.
#
# Официальные переменные окружения (см. transmission/docs/Scripts.md):
#   TR_APP_VERSION
#   TR_TIME_LOCALTIME
#   TR_TORRENT_BYTES_DOWNLOADED
#   TR_TORRENT_DIR       — каталог загрузок (родитель для данных торрента)
#   TR_TORRENT_HASH
#   TR_TORRENT_ID        — ID для transmission-remote -t
#   TR_TORRENT_LABELS    — метки через запятую
#   TR_TORRENT_NAME      — имя торрента (папка или имя файла внутри TR_TORRENT_DIR)
#   TR_TORRENT_PRIORITY
#   TR_TORRENT_TRACKERS
#
# Зависимости на NAS: transmission-daemon; отдельно пакет transmission-remote (в OpenWrt apk пакет transmission-cli его НЕ содержит).
#
# Установка на OpenWrt (пример):
#   — Положи скрипт ВНУТРИ download_dir (например /mnt/data/torrents/…), иначе ujail не даст его выполнить.
#   — UCI: script_torrent_done_filename и script_torrent_done_enabled (НЕ опция script_torrent_done).
#   cp transmission-done-move-video.sh /mnt/data/torrents/transmission-done-move-video.sh
#   chmod 750 /mnt/data/torrents/transmission-done-move-video.sh
#   chown transmission:transmission /mnt/data/torrents/transmission-done-move-video.sh
#   uci set transmission.@transmission[0].script_torrent_done_filename='/mnt/data/torrents/transmission-done-move-video.sh'
#   uci set transmission.@transmission[0].script_torrent_done_enabled='1'
#   uci commit transmission && /etc/init.d/transmission restart
#   grep script-torrent-done /tmp/transmission/settings.json
#
# При RPC с паролем: задай RPC_USER / RPC_PASS ниже ИЛИ включи загрузку из UCI (блок ниже).
# Вызов из демона идёт с пустым PATH и без твоих переменных окружения — без UCI/полного PATH
# «вручную сработало, по завершении торрента — нет» часто из‑за RPC или отсутствия find/uci в PATH.

# ============ настройки ============
# Для ujail / procd: busybox find, uci, head должны находиться без опоры на интерактивный PATH.
export PATH="/usr/sbin:/usr/bin:/sbin:/bin:${PATH:-}"
# Куда переносить «видео-торренты» (каталог должен существовать и быть доступен пользователю transmission).
# По умолчанию — ВНУТРИ download_dir (/mnt/data/torrents/...): иначе на OpenWrt ujail не монтирует /mnt/data/video,
# и transmission-remote --move в «соседнюю» папку не сработает (Permission denied / файл не переезжает).
DEST_VIDEO="${DEST_VIDEO:-/mnt/data/torrents/video}"

# Лог на диске (не путать с UCI: /etc/config/transmission). Нужны права у пользователя transmission; внутри download_dir надёжнее для ujail.
LOG_FILE="${LOG_FILE:-/mnt/data/torrents/transmission-done.log}"

# transmission-remote: адрес демона (на том же NAS — localhost).
RPC_HOST="${RPC_HOST:-127.0.0.1}"
RPC_PORT="${RPC_PORT:-9091}"

# Если в LuCI включена аутентификация RPC — задай вручную ИЛИ оставь пустым (подставится из UCI).
RPC_USER="${RPC_USER:-}"
RPC_PASS="${RPC_PASS:-}"

# Порт и логин/пароль RPC из UCI — иначе при rpc_authentication_required transmission-remote из скрипта падает.
UCI_BIN="/sbin/uci"
[ -x "$UCI_BIN" ] || UCI_BIN="uci"
if _rp="$("$UCI_BIN" -q get transmission.@transmission[0].rpc_port 2>/dev/null)" && [ -n "$_rp" ]; then
  RPC_PORT="$_rp"
fi
_rpc_auth_required="$("$UCI_BIN" -q get transmission.@transmission[0].rpc_authentication_required 2>/dev/null)"
case "$_rpc_auth_required" in
  1|true|yes|on)
    [ -z "$RPC_USER" ] && RPC_USER="$("$UCI_BIN" -q get transmission.@transmission[0].rpc_username 2>/dev/null)"
    [ -z "$RPC_PASS" ] && RPC_PASS="$("$UCI_BIN" -q get transmission.@transmission[0].rpc_password 2>/dev/null)"
    ;;
esac

# ============ конец настроек ============

log_msg() {
  _ts="$(date '+%Y-%m-%d %H:%M:%S' 2>/dev/null || date)"
  _line="$_ts $*"
  logger -t transmission-done "$_line"
  [ -n "$LOG_FILE" ] && echo "$_line" >>"$LOG_FILE" 2>/dev/null
}

TR_BIN="transmission-remote"
[ -x /usr/bin/transmission-remote ] && TR_BIN="/usr/bin/transmission-remote"

TR_REMOTE_CMD() {
  if [ -n "$RPC_USER" ] && [ -n "$RPC_PASS" ]; then
    "$TR_BIN" "$RPC_HOST:$RPC_PORT" -n "$RPC_USER:$RPC_PASS" "$@"
  else
    "$TR_BIN" "$RPC_HOST:$RPC_PORT" "$@"
  fi
}

extract_field() {
  _key="$1"
  sed -n "s/^ *${_key}: //p" | head -n 1
}

has_video_files() {
  _path="$1"
  find "$_path" -type f \( \
    -iname '*.mkv' -o -iname '*.mp4' -o -iname '*.m4v' -o -iname '*.avi' -o -iname '*.mov' \
    -o -iname '*.wmv' -o -iname '*.mpeg' -o -iname '*.mpg' -o -iname '*.m2ts' -o -iname '*.ts' \
    -o -iname '*.webm' -o -iname '*.flv' -o -iname '*.vob' -o -iname '*.asf' -o -iname '*.3gp' \
    -o -iname '*.ogv' -o -iname '*.divx' -o -iname '*.xvid' \
  \) 2>/dev/null | head -n 1
}

move_if_video() {
  _id="$1"
  _target="$2"
  _name="$3"

  case "$_target" in
    "$DEST_VIDEO"|"$DEST_VIDEO"/*)
      #log_msg "SKIP: already under $DEST_VIDEO (id=$_id name=$_name)"
      return 0
      ;;
  esac

  if [ ! -e "$_target" ]; then
    log_msg "ERROR: path does not exist: $_target (id=$_id)"
    return 0
  fi

  _has_video="$(has_video_files "$_target")"
  if [ -z "$_has_video" ]; then
    #log_msg "SKIP: no video-like files in torrent id=$_id name=$_name path=$_target"
    return 0
  fi

  log_msg "MOVE: video detected, id=$_id name=$_name -> $DEST_VIDEO"
  if TR_REMOTE_CMD -t "$_id" --move "$DEST_VIDEO"; then
    log_msg "OK: transmission-remote --move id=$_id -> $DEST_VIDEO"
  else
    log_msg "ERROR: transmission-remote --move failed id=$_id (check RPC auth, ujail, paths)"
  fi
}

scan_mode() {
  _ids="$(TR_REMOTE_CMD -l 2>/dev/null | awk 'NR>1 && $1 ~ /^[0-9]+$/ {print $1}')"
  [ -n "$_ids" ] || { log_msg "SCAN: no torrents returned by RPC"; exit 0; }

  for _id in $_ids; do
    _info="$(TR_REMOTE_CMD -t "$_id" -i 2>/dev/null)"
    [ -n "$_info" ] || continue

    _name="$(echo "$_info" | extract_field "Name")"
    _done="$(echo "$_info" | extract_field "Percent Done")"
    _location="$(echo "$_info" | extract_field "Location")"

    [ -n "$_name" ] || continue
    [ -n "$_location" ] || continue
    case "$_done" in
      100%*) ;;
      *) continue ;;
    esac

    _target="${_location}/${_name}"
    move_if_video "$_id" "$_target" "$_name"
  done
  exit 0
}

# Проверка наличия transmission-remote (обязателен для --move). В ujail может быть пустой PATH — смотрим /usr/bin.
if ! command -v transmission-remote >/dev/null 2>&1 && [ ! -x /usr/bin/transmission-remote ]; then
  log_msg "ERROR: transmission-remote not found. Install: apk add transmission-remote. Skipping."
  exit 0
fi

if [ ! -d "$DEST_VIDEO" ]; then
  log_msg "ERROR: DEST_VIDEO is not a directory: $DEST_VIDEO"
  exit 0
fi

# Если скрипт запущен не как script-torrent-done (нет TR_*), работаем как периодический сканер.
if [ -z "$TR_TORRENT_ID" ] || [ -z "$TR_TORRENT_DIR" ] || [ -z "$TR_TORRENT_NAME" ]; then
  #log_msg "SCAN: TR_* not set, running periodic scan mode"
  scan_mode
fi

TARGET="${TR_TORRENT_DIR}/${TR_TORRENT_NAME}"
move_if_video "$TR_TORRENT_ID" "$TARGET" "$TR_TORRENT_NAME"

exit 0

3.8.2. transmission-inbox-to-watch.sh (опционально): кидаешь .torrent в incoming по SMB; cron раз в минуту переносит файл в watch (удобно, когда прямой SMB в watch не подходит). Лог по умолчанию тот же файл, что и у done-скрипта. Сохрани в /mnt/data/torrents/transmission-inbox-to-watch.sh:

#!/bin/sh
# Перенос .torrent из «входящей» папки в watch — локально на NAS (не через Samba в watch).
# Идея: кидать торренты в incoming по SMB; cron вызывает скрипт → mv в watch → inotify видит локальную операцию.
#
# Установка (пример):
#   mkdir -p /mnt/data/torrents/incoming && chmod 775 /mnt/data/torrents/incoming
#   chown transmission:transmission /mnt/data/torrents/incoming
#   cp transmission-inbox-to-watch.sh /mnt/data/torrents/transmission-inbox-to-watch.sh && chmod 750 /mnt/data/torrents/transmission-inbox-to-watch.sh
#   echo '* * * * * /mnt/data/torrents/transmission-inbox-to-watch.sh' >> /etc/crontabs/root
#   /etc/init.d/cron enable && /etc/init.d/cron restart
# Шара Samba только на incoming; в watch класть не нужно — скрипт сам переносит.
#
# Настройки:
DROP_DIR="${DROP_DIR:-/mnt/data/torrents/incoming}"
WATCH_DIR="${WATCH_DIR:-/mnt/data/torrents/watch}"
RUN_AS="${RUN_AS:-transmission}"
# Пауза перед сравнением размера (сек), чтобы не схватить недокачанный по SMB файл
SETTLE_SEC="${SETTLE_SEC:-2}"
# Файл лога (общий с done-скриптом по умолчанию); оставь пустым для отключения записи в файл.
LOG_FILE="${LOG_FILE:-/mnt/data/torrents/transmission-done.log}"

log() {
  _ts="$(date '+%Y-%m-%d %H:%M:%S' 2>/dev/null || date)"
  _line="$_ts $*"
  logger -t transmission-inbox "$_line"
  [ -n "$LOG_FILE" ] && echo "$_line" >>"$LOG_FILE" 2>/dev/null
}

[ -d "$DROP_DIR" ] || { log "ERROR: DROP_DIR not a directory: $DROP_DIR"; exit 1; }
[ -d "$WATCH_DIR" ] || { log "ERROR: WATCH_DIR not a directory: $WATCH_DIR"; exit 1; }

for f in "$DROP_DIR"/*.torrent; do
  [ -f "$f" ] || continue
  base=$(basename "$f")

  s1=$(wc -c <"$f" 2>/dev/null) || continue
  sleep "$SETTLE_SEC"
  s2=$(wc -c <"$f" 2>/dev/null) || continue
  [ "$s1" = "$s2" ] || { log "SKIP (still growing?): $base"; continue; }

  dest="$WATCH_DIR/$base"
  if [ -e "$dest" ]; then
    log "SKIP (exists in watch): $base"
    rm -f "$f" 2>/dev/null
    continue
  fi

  if mv "$f" "$dest" 2>/dev/null; then
    chown "$RUN_AS:$RUN_AS" "$dest" 2>/dev/null
    log "MOVED: $base -> $WATCH_DIR"
  else
    log "ERROR: mv failed: $f -> $dest"
  fi
done

exit 0

Пример cron (выполняется от root; подстрой пути):

* * * * * /mnt/data/torrents/transmission-inbox-to-watch.sh
*/5 * * * * /mnt/data/torrents/transmission-done-move-video.sh

3.9. Пакет transmission-remote, каталог видео и подключение скрипта в Transmission

Пакет transmission-cli не содержит transmission-remote — нужен отдельный пакет:

apk search transmission
apk add transmission-remote

Создай каталог назначения внутри download_dir (из-за ujail перенос в /mnt/data/video у меня не сработал — ошибка прав / не переезжало; рабочая цель — /mnt/data/torrents/video):

mkdir -p /mnt/data/torrents/video
chown -R transmission:transmission /mnt/data/torrents/video

Создай файлы на NAS по содержимому из п. 3.8 (или скопируй из репозитория scripts/). Оба скрипта должны лежать внутри /mnt/data/torrents/ — иначе демон из песочницы не выполнит done-скрипт. Права:

chmod 750 /mnt/data/torrents/transmission-done-move-video.sh /mnt/data/torrents/transmission-inbox-to-watch.sh
chown transmission:transmission /mnt/data/torrents/transmission-done-move-video.sh /mnt/data/torrents/transmission-inbox-to-watch.sh

В OpenWrt опция пути к done-скрипту — script_torrent_done_filename:

uci set transmission.@transmission[0].script_torrent_done_filename='/mnt/data/torrents/transmission-done-move-video.sh'
uci set transmission.@transmission[0].script_torrent_done_enabled='1'
uci delete transmission.@transmission[0].script_torrent_done 2>/dev/null
uci commit transmission
/etc/init.d/transmission restart
grep -E 'script-torrent-done' /tmp/transmission/settings.json

При rpc_authentication_required='1' скрипт сам подставляет логин/пароль из UCI (если не заданы RPC_USER / RPC_PASS в начале файла). При отключённой аутентификации RPC ничего дополнительно задавать не нужно. Ручная проверка переноса (подставь свой ID торрента вместо 1; при включённом RPC добавь -n user:pass):

transmission-remote -t 1 --stop
transmission-remote -t 1 --move /mnt/data/torrents/video
transmission-remote -t 1 --start

У меня перенос сработал, события скрипта — в logread и в /mnt/data/torrents/transmission-done.log (если задан LOG_FILE). Обновить скрипты с ПК: scp …/transmission-done-move-video.sh root@NAS:/mnt/data/torrents/ и то же для transmission-inbox-to-watch.sh, затем chmod 750, chown transmission:transmission, при необходимости sed -i 's/\r$//' ….


4. Контроль ресурсов

date
uptime
free -m
df -h / /overlay /mnt/data
cat /proc/swaps

5. Ссылки

Комментарии

Популярные сообщения