From decce463785bd4b1f61cb6554b70e2fd203e280f Mon Sep 17 00:00:00 2001 From: gru Date: Thu, 14 May 2026 08:40:44 +0200 Subject: [PATCH] Update install_rtorrent.py --- install_rtorrent.py | 68 ++++++++++++++++++++++++++++++--------------- 1 file changed, 45 insertions(+), 23 deletions(-) diff --git a/install_rtorrent.py b/install_rtorrent.py index 1f31edd..3246422 100644 --- a/install_rtorrent.py +++ b/install_rtorrent.py @@ -15,8 +15,8 @@ DEFAULT_USER = "rtorrent" DEFAULT_GROUP = "rtorrent" DEFAULT_HOME = "/home/rtorrent" DEFAULT_BASE_DIR = "/opt/rtorrent_build" -DEFAULT_LIBTORRENT_REF = "v0.15.7" -DEFAULT_RTORRENT_REF = "v0.15.7" +DEFAULT_LIBTORRENT_REF = "v0.16.11" +DEFAULT_RTORRENT_REF = "v0.16.11" DEFAULT_XMLRPC_REF = "latest-stable" DEFAULT_CARES_REF = "1.34.6" DEFAULT_CURL_REF = "8.19.0" @@ -507,22 +507,23 @@ WantedBy=multi-user.target run(["systemctl", "daemon-reload"]) -def write_rtorrent_config(user_home, username): - config_path = Path(user_home) / ".rtorrent.rc" - config_content = f""" -## https://git.linuxiarz.pl/gru/tools_scripts/_edit/master/install_rtorrent.py -directory = /home/{username}/downloads -session = /home/{username}/.session -port_random = yes -encoding_list = UTF-8 +def build_rtorrent_config_content(username, scgi_port, torrent_port): + return f""" +## https://git.linuxiarz.pl/gru/tools_scripts/_edit/master/install_rtorrent.py +# Generated by install_rtorrent.py -execute.nothrow = chmod,777,/home/rtorrent/downloads -network.scgi.open_port = 127.0.0.1:5000 -network.port_range.set = 51300-51310 +directory.default.set = /home/{username}/downloads +session.path.set = /home/{username}/.session +encoding.add = UTF-8 + +network.scgi.open_port = 127.0.0.1:{scgi_port} +network.port_range.set = {torrent_port}-{torrent_port} network.port_random.set = no -network.bind_address.set = 0.0.0.0 -system.file.allocate.set = 1 +network.bind_address.ipv4.set = 0.0.0.0 + +system.file.allocate.set = 0 system.umask.set = 0022 + dht.mode.set = disable protocol.pex.set = no trackers.use_udp.set = no @@ -530,19 +531,36 @@ protocol.encryption.set = allow_incoming,enable_retry,prefer_plaintext schedule2 = tied_directory,6,5,start_tied= schedule2 = untied_directory,7,5,stop_untied= -schedule2 = session_save,600,1800,((session.save)) -ratio.max.set=-1 +schedule2 = session_save,300,300,((session.save)) +schedule2 = watch_directory,60,60,load.normal=/home/{username}/watch/*.torrent + +ratio.max.set = -1 network.xmlrpc.size_limit.set = 33554432 -network.http.max_open.set = 32 -network.max_open_sockets.set = 2048 -network.max_open_files.set = 4096 -network.http.dns_cache_timeout.set = 3600 +network.http.max_open.set = 64 +network.max_open_sockets.set = 8192 +network.max_open_files.set = 32768 +network.http.dns_cache_timeout.set = 0 +pieces.memory.max.set = 1800M +""".lstrip() -""" +def write_rtorrent_config(user_home, username, scgi_port, torrent_port, *, force_config=False): + config_path = Path(user_home) / ".rtorrent.rc" + config_content = build_rtorrent_config_content(username, scgi_port, torrent_port) + + if config_path.exists() and not force_config: + print(f"Config already exists: {config_path}") + print("Not overwriting existing config. Proposed generated config would be:") + print("--- BEGIN PROPOSED .rtorrent.rc ---") + print(config_content, end="") + print("--- END PROPOSED .rtorrent.rc ---") + print("Use --force-config to overwrite the existing config.") + return False + config_path.write_text(config_content) shutil.chown(config_path, user=username, group=username) print(f"Wrote config: {config_path}") + return True def prepare_user_dirs(user_home, username): @@ -650,6 +668,9 @@ def build_parser(): parser.add_argument("--user", default=DEFAULT_USER, help=f"System user for the service (default: {DEFAULT_USER})") parser.add_argument("--group", default=DEFAULT_GROUP, help=f"System group for the service (default: {DEFAULT_GROUP})") parser.add_argument("--home", default=DEFAULT_HOME, help=f"Home directory for the service user (default: {DEFAULT_HOME})") + parser.add_argument("--scgi-port", type=int, default=DEFAULT_SCGI_PORT, help=f"SCGI listen port for rTorrent XMLRPC/SCGI (default: {DEFAULT_SCGI_PORT})") + parser.add_argument("--torrent-port", type=int, default=DEFAULT_TORRENT_PORT, help=f"Incoming BitTorrent listen port (default: {DEFAULT_TORRENT_PORT})") + parser.add_argument("--force-config", action="store_true", help="Overwrite existing ~/.rtorrent.rc. By default, existing config is left unchanged and the proposed changes are printed.") parser.add_argument("--only-build", action="store_true", help="Only build and install libtorrent/rTorrent under /opt. Skip user, config and systemd.") parser.add_argument("--yes", action="store_true", help="Assume yes for interactive prompts.") parser.add_argument("--debug", action="store_true", help="Show full command output during build steps.") @@ -685,6 +706,7 @@ def main(): print(" - skip service user, config and systemd setup") else: print(f" - configure systemd service for user '{args.user}'") + print(f" - use SCGI port {args.scgi_port} and torrent port {args.torrent_port}") if not prompt_yes_no("Continue?", default=True, assume_yes=args.yes): print("Aborted by user.") @@ -718,7 +740,7 @@ def main(): if not args.only_build: create_system_user(args.user, args.group, args.home, assume_yes=args.yes, debug=args.debug) prepare_user_dirs(args.home, args.user) - write_rtorrent_config(args.home, args.user) + write_rtorrent_config(args.home, args.user, args.scgi_port, args.torrent_port, force_config=args.force_config) runtime_lib_dirs = [f"{libtorrent_install}/lib", f"{xmlrpc_install}/lib"] if curl_install: runtime_lib_dirs.append(f"{curl_install}/lib")