Use syslog for non-chroot configuration, support MacOS launchd

This commit is contained in:
Vladimir Dubrovin 2026-04-05 12:46:57 +03:00
parent 44c86236cd
commit d8d3d8cc1b
11 changed files with 376 additions and 11 deletions

View file

@ -1,2 +1,4 @@
#!/usr/local/bin/3proxy
#path to plugins:
#use standard syslog logging
log @3proxy

View file

@ -4,6 +4,9 @@ Documentation=man:3proxy(1)
After=network.target
[Service]
Type=simple
User=proxy
Group=proxy
Environment=CONFIGFILE=/etc/3proxy/3proxy.cfg
ExecStart=@CMAKE_INSTALL_FULL_BINDIR@/3proxy ${CONFIGFILE}
ExecReload=/bin/kill -SIGUSR1 $MAINPID
@ -13,6 +16,7 @@ RestartSec=60s
LimitNOFILE=65536
LimitNPROC=32768
RuntimeDirectory=3proxy
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target

View file

@ -1,3 +1,3 @@
# tmpfiles.d configuration for 3proxy
# This creates the runtime directory for 3proxy
d /run/3proxy 0755 root root -
d /run/3proxy 0755 proxy proxy -

109
scripts/init.d/3proxy.in Normal file
View file

@ -0,0 +1,109 @@
#!/bin/sh
### BEGIN INIT INFO
# Provides: 3proxy
# Required-Start: $network $local_fs
# Required-Stop: $network $local_fs
# Should-Start:
# Should-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start/stop 3proxy
# Description: Start/stop 3proxy, tiny proxy server
### END INIT INFO
# chkconfig: 2345 20 80
# description: 3proxy tiny proxy server
DAEMON=@CMAKE_INSTALL_FULL_BINDIR@/3proxy
CONFIGFILE=/etc/3proxy/3proxy.cfg
PIDFILE=/var/run/3proxy/3proxy.pid
USER=proxy
GROUP=proxy
# Source function library if available
if [ -f /etc/init.d/functions ]; then
. /etc/init.d/functions
fi
case "$1" in
start)
echo -n "Starting 3Proxy: "
if [ ! -d /var/run/3proxy ]; then
mkdir -p /var/run/3proxy
chown $USER:$GROUP /var/run/3proxy 2>/dev/null || true
fi
if command -v start-stop-daemon >/dev/null 2>&1; then
# Debian/Ubuntu style
start-stop-daemon --start --quiet --pidfile $PIDFILE \
--chuid $USER:$GROUP --exec $DAEMON -- $CONFIGFILE
elif [ -f /etc/init.d/functions ]; then
# RedHat/CentOS style
daemon --user=$USER $DAEMON $CONFIGFILE
else
# Fallback
su -s /bin/sh $USER -c "$DAEMON $CONFIGFILE"
fi
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch /var/lock/subsys/3proxy
;;
stop)
echo -n "Stopping 3Proxy: "
if command -v start-stop-daemon >/dev/null 2>&1; then
# Debian/Ubuntu style
start-stop-daemon --stop --quiet --pidfile $PIDFILE
elif [ -f /etc/init.d/functions ]; then
# RedHat/CentOS style
killproc -p $PIDFILE $DAEMON
else
# Fallback
if [ -f $PIDFILE ]; then
kill `cat $PIDFILE` 2>/dev/null
else
killall 3proxy 2>/dev/null
fi
fi
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/3proxy
;;
restart|reload)
echo -n "Reloading 3Proxy: "
if [ -f $PIDFILE ]; then
kill -s USR1 `cat $PIDFILE` 2>/dev/null
RETVAL=$?
else
echo "PID file not found, cannot reload"
RETVAL=1
fi
echo
;;
status)
if command -v status >/dev/null 2>&1; then
status -p $PIDFILE $DAEMON
elif [ -f $PIDFILE ]; then
if kill -0 `cat $PIDFILE` 2>/dev/null; then
echo "3proxy is running (pid `cat $PIDFILE`)"
RETVAL=0
else
echo "3proxy is dead but pid file exists"
RETVAL=1
fi
else
echo "3proxy is not running"
RETVAL=3
fi
;;
*)
echo "Usage: $0 {start|stop|restart|reload|status}"
exit 1
esac
exit ${RETVAL:-0}

View file

@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>org.3proxy.3proxy</string>
<key>ProgramArguments</key>
<array>
<string>@CMAKE_INSTALL_FULL_BINDIR@/3proxy</string>
<string>/etc/3proxy/3proxy.cfg</string>
</array>
<key>UserName</key>
<string>proxy</string>
<key>GroupName</key>
<string>proxy</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/var/log/3proxy.log</string>
<key>StandardErrorPath</key>
<string>/var/log/3proxy.log</string>
<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>65536</integer>
</dict>
<key>HardResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>65536</integer>
</dict>
</dict>
</plist>

45
scripts/postinstall.sh Normal file
View file

@ -0,0 +1,45 @@
#!/bin/sh
# Post-install script for 3proxy
# Creates proxy user and group if they don't exist
set -e
# Check if user already exists
if id proxy >/dev/null 2>&1; then
echo "User 'proxy' already exists"
exit 0
fi
echo "Creating proxy user and group..."
# Determine which commands are available
if command -v groupadd >/dev/null 2>&1; then
# Linux (shadow-utils)
groupadd -r proxy 2>/dev/null || true
useradd -r -g proxy -d /var/run/3proxy -s /usr/sbin/nologin proxy 2>/dev/null || true
elif command -v addgroup >/dev/null 2>&1; then
# Alpine Linux / BusyBox
addgroup -S proxy 2>/dev/null || true
adduser -S -D -H -G proxy -s /sbin/nologin proxy 2>/dev/null || true
elif command -v pw >/dev/null 2>&1; then
# FreeBSD
pw groupadd proxy 2>/dev/null || true
pw useradd proxy -g proxy -d /var/run/3proxy -s /usr/sbin/nologin 2>/dev/null || true
elif command -v dscl >/dev/null 2>&1; then
# macOS
dscl . create /Groups/proxy 2>/dev/null || true
dscl . create /Users/proxy 2>/dev/null || true
dscl . create /Users/proxy UserShell /usr/bin/false 2>/dev/null || true
dscl . create /Users/proxy NFSHomeDirectory /var/run/3proxy 2>/dev/null || true
else
echo "Warning: Could not create proxy user - no suitable user management tool found"
exit 0
fi
if id proxy >/dev/null 2>&1; then
echo "User 'proxy' created successfully"
else
echo "Warning: Failed to create user 'proxy'"
fi
exit 0

View file

@ -13,6 +13,7 @@ command="@CMAKE_INSTALL_FULL_BINDIR@/3proxy"
pidfile="/var/run/3proxy/${name}.pid"
command_args="${3proxy_config:-/etc/3proxy/3proxy.cfg}"
required_files="${3proxy_config:-/etc/3proxy/3proxy.cfg}"
command_user="proxy:proxy"
start_precmd="3proxy_precmd"
@ -20,6 +21,7 @@ start_precmd="3proxy_precmd"
{
if [ ! -d /var/run/3proxy ]; then
mkdir -p /var/run/3proxy
chown proxy:proxy /var/run/3proxy
fi
}