Skip to content

Instantly share code, notes, and snippets.

@PartTimeLegend
Created November 13, 2014 20:38
Show Gist options
  • Save PartTimeLegend/d71482792011133f46bb to your computer and use it in GitHub Desktop.
Save PartTimeLegend/d71482792011133f46bb to your computer and use it in GitHub Desktop.
Seedbox Config
#!/bin/sh
# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is IRC Auto Downloader
#
# The Initial Developer of the Original Code is
# David Nilsson.
# Portions created by the Initial Developer are Copyright (C) 2010, 2011
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#
# ***** END LICENSE BLOCK *****
AUTODL_IRSSI_ZIP_URL="http://update.autodl-community.com/autodl-irssi-community.zip"
GIT_PATH_RUTORRENT_PLUGIN="https://github.com/autodl-community/autodl-rutorrent.git"
WEBMIN_URL="http://www.webmin.com/download/webmin-current.tar.gz"
RUTORRENT_TRUNK_DIR="https://rutorrent.googlecode.com/svn/trunk"
# The official tarballs are tried if subversion fails.
RUTORRENT_VERSION="3.6"
RUTORRENT_CORE_NAME="rutorrent-$RUTORRENT_VERSION.tar.gz"
RUTORRENT_CORE_URL="http://dl.bintray.com/novik65/generic/$RUTORRENT_CORE_NAME"
#RUTORRENT_CORE_URL="http://rutorrent.googlecode.com/files/$RUTORRENT_CORE_NAME"
RUTORRENT_PLUGINS_NAME="plugins-$RUTORRENT_VERSION.tar.gz"
#RUTORRENT_PLUGINS_URL="http://rutorrent.googlecode.com/files/$RUTORRENT_PLUGINS_NAME"
RUTORRENT_PLUGINS_URL="http://dl.bintray.com/novik65/generic/$RUTORRENT_PLUGINS_NAME"
#RUTORRENT_CORE_URL2="http://sourceforge.net/projects/autodl-irssi/files/inst-files/$RUTORRENT_CORE_NAME/download"
#RUTORRENT_PLUGINS_URL2="http://sourceforge.net/projects/autodl-irssi/files/inst-files/$RUTORRENT_PLUGINS_NAME/download"
RUTORRENT_PLUGINS=
# These are the ruTorrent plugins that will get installed. To remove one, either
# remove the whole line or comment it (prepend a '#' to the start of the line).
# If the line starts with '#', the plugin is not installed.
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS _getdir"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS _task"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS autotools"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS chunks"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS cookies"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS cpuload"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS create"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS data"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS datadir"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS diskspace"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS edit"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS erasedata"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS extsearch"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS feeds"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS geoip"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS httprpc"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS ipad"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS loginmgr"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS logoff"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS mediainfo"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS ratio"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS retrackers"
#RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS rpc"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS rss"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS rssurlrewrite"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS scheduler"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS seedingtime"
#RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS show_peers_like_wtorrent"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS source"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS theme"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS throttle"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS tracklabels"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS trafic"
RUTORRENT_PLUGINS="$RUTORRENT_PLUGINS unpack"
# For building rtorrent
LIBCURL_NAME="curl-7.36.0"
LIBCURL_URL="http://curl.haxx.se/download/$LIBCURL_NAME.tar.gz"
SIGCPP20_NAME="libsigc++-2.3.1"
SIGCPP20_URL="http://ftp.gnome.org/pub/GNOME/sources/libsigc++/2.3/$SIGCPP20_NAME.tar.gz"
XMLRPC_SVN_DIR="https://svn.code.sf.net/p/xmlrpc-c/code/stable"
LIBTORRENT_VERSION="0.13.4"
LIBTORRENT_NAME="libtorrent-$LIBTORRENT_VERSION"
LIBTORRENT_URL="http://libtorrent.rakshasa.no/downloads/$LIBTORRENT_NAME.tar.gz"
LIBTORRENT_URL2="http://sourceforge.net/projects/autodl-irssi/files/inst-files/$LIBTORRENT_NAME.tar.gz/download"
RTORRENT_VERSION="0.9.4"
RTORRENT_NAME="rtorrent-$RTORRENT_VERSION"
RTORRENT_URL="http://libtorrent.rakshasa.no/downloads/$RTORRENT_NAME.tar.gz"
RTORRENT_URL2="http://sourceforge.net/projects/autodl-irssi/files/inst-files/$RTORRENT_NAME.tar.gz/download"
HTPASSWD_PY_SCRIPT_URL="http://trac.edgewall.org/export/10433/trunk/contrib/htpasswd.py"
HTPASSWD_PY_SCRIPT_URL2="http://sourceforge.net/projects/autodl-irssi/files/inst-files/htpasswd.py/download"
NGINX_NAME="nginx-1.7.0"
NGINX_URL="http://nginx.org/download/$NGINX_NAME.tar.gz"
LIGHTTPD_NAME="lighttpd-1.4.35"
LIGHTTPD_URL="http://download.lighttpd.net/lighttpd/releases-1.4.x/$LIGHTTPD_NAME.tar.gz"
MOD_SCGI_VERSION="1.14"
MOD_SCGI_URL="http://python.ca/scgi/releases/scgi-$MOD_SCGI_VERSION.tar.gz"
UNRAR_VERSION="4.0.7"
UNRAR_URL="http://www.rarlab.com/rar/unrarsrc-$UNRAR_VERSION.tar.gz"
# Dirs relative to user's home directory
RTORRENT_REL_DOWNLOAD_DIR="downloads"
RTORRENT_REL_WATCH_DIR="rtorrent/watch"
RTORRENT_REL_SESSION_DIR="rtorrent/session"
REQUIRED_PERL_MODULES="Time::HiRes XML::LibXML Archive::Zip Net::SSLeay HTML::Parser Digest::SHA1 JSON"
REQUIRED_PHP_MODULES="json xml sockets"
# If set to y, add 'load perl' to .irssi/startup
IRSSI_LOAD_PERL=n
IGNORE_IRSSI=n
# Start port. When we need a new port number, this port is incremented by one.
CURRENT_PORT=23875
DEFAULT_PORT_FTP=21
DEFAULT_PORT_FTPES=990
DEFAULT_UMASK=022
RPC_PREFIX=RPC
LSB_DEFAULT_START="2 3 4 5"
LSB_DEFAULT_STOP="0 1 6"
# Setting these to anything other than 80 and 443 may not work with Apache (since the
# code assumed it would always be 80 and 443).
HTTP_PORT=80
HTTPS_PORT=443
SCGI_HOST="127.0.0.1"
INTERACTIVE=n
USE_RUTORRENT_PLUGIN=n
REINSTALL_RUTORRENT_PLUGIN=n
INSTALL_AUTODL_IRSSI=n
RUTORRENT_PASSWORD_PROTECTED=n
USERS=
RUTORRENT_BASE_PATH=
INSTALL_STARTUP_SCRIPT=n
BUILD_RTORRENT=n
INSTALL_WEB_SERVER=
INSTALL_RUTORRENT=n
INSTALL_VSFTPD=n
FTP_PORT=
USE_ENCRYPTED_FTP=n
INSTALL_WEBMIN=n
USER_TIMEZONE=
RUTORRENT_SITE_REALM="My ruTorrent web site"
AUTODL_STARTUP_DESC="Start autodl-irssi and rtorrent"
PHPCGI_STARTUP_DESC="Start php-cgi"
NGINX_STARTUP_DESC="Start nginx"
LIGHTTPD_STARTUP_DESC="Start lighttpd"
PATH="$PATH:/usr/local/bin"
# Find an echo that supports -e
echo=echo
for cmd in echo /bin/echo; do
$cmd >/dev/null 2>&1 || continue
if ! $cmd -e "" | grep -qE '^-e'; then
echo=$cmd
break
fi
done
CSI=$($echo -e "\033[")
CEND="${CSI}0m"
CDGREEN="${CSI}32m"
CRED="${CSI}1;31m"
CGREEN="${CSI}1;32m"
CYELLOW="${CSI}1;33m"
CBLUE="${CSI}1;34m"
CMAGENTA="${CSI}1;35m"
CCYAN="${CSI}1;36m"
CQUESTION="$CMAGENTA"
CWARNING="$CRED"
CMSG="$CCYAN"
errorExit() {
cat << EOF
$CWARNING
***ERROR***
$*
***ERROR***
$CEND
Help channel: ${CGREEN}#[email protected]$CEND
EOF
exit 1
}
exitHelp() {
cat << EOF
autodl-irssi and ruTorrent plugin installer
sh $0 [options]
Options:
--rtorrent
Will build and install rtorrent, libtorrent and xmlrpc-c from source code.
--rtorrent-noexec-patch
Patch rtorrent to disallow remote users from executing code.
--apache
Install Apache web server.
--nginx
Install nginx web server.
--lighttpd
Install lighttpd web server.
--rutorrent
Install ruTorrent. Requires a web server, eg. --apache.
--vsftpd
Install vsftpd.
--ftpes
Use encrypted FTP (FTPES).
--ftp-port <port>
FTP server port.
--webmin
Install Webmin.
-p
--rutorrent-plugin
Use or install the autodl-irssi ruTorrent plugin. If it's already installed,
it will be updated (svn up), unless --reinstall-plugin option is used in
which case it will be re-installed.
-i
--reinstall-plugin
Re-install the autodl-irssi ruTorrent plugin if it's already installed.
-a
--install-autodl
Install autodl-irssi.
-u user:autodlPass:webUser:webPass
--user user:autodlPass:webUser:webPass
The $(uname -s) user, autodl-irssi password, ruTorrent user, ruTorrent password.
You can use more than one -u option. If autodlPassword is not set, a random
password will be used.
-w
--password-protected
Use this option if ruTorrent is password protected. It's required if you
want to use more than one ruTorrent user. Not needed if you install
ruTorrent.
-r PATH
--rutorrent-base-path PATH
Path to ruTorrent, eg. /var/www/rutorrent. Not needed if you install
ruTorrent.
-s
--install-startup-script
Install a startup script (service) which will start Irssi and rtorrent when
the computer boots.
-h
--help
Show this help text
Examples (as root user):
sh $0 --rtorrent --apache --rutorrent --vsftpd --ftpes --webmin -p -a -s -u user1::user1:pass1 -u user2::user2:pass2
Installs rtorrent, Apache, ruTorrent, vsftpd (encrypted), Webmin the
autodl-irssi plugin, autodl-irssi, installs a service (starting Irssi and
rtorrent) for both users.
sh $0 -p -a -u user::user:pass -r /var/www/rutorrent -s
Installs autodl-irssi + ruTorrent plugin for user 'user'. ruTorrent has not been
password protected. Also installs the startup script.
sh $0 -p -a -u user1::user1:pass1 -u user2::user2:pass2 -w -r /var/www/rutorrent -s
Installs autodl-irssi + ruTorrent plugin for users 'user1' and 'user2'.
ruTorrent has been password protected. Also installs the startup script.
sh $0 --rtorrent -a -u user1 -u user2 -u user3 -u user4 -s
Installs rtorrent, autodl-irssi and the startup script.
Help fchannel: #[email protected]
EOF
exit 1
}
parseCommandLine() {
while [ $# -gt 0 ]; do
local arg="$1"
shift
if [ "$arg" = "-p" ] || [ "$arg" = "--rutorrent-plugin" ]; then
USE_RUTORRENT_PLUGIN=y
elif [ "$arg" = "-i" ] || [ "$arg" = "--reinstall-plugin" ]; then
REINSTALL_RUTORRENT_PLUGIN=y
elif [ "$arg" = "-a" ] || [ "$arg" = "--install-autodl" ]; then
INSTALL_AUTODL_IRSSI=y
elif [ "$arg" = "-u" ] || [ "$arg" = "--user" ]; then
USERS="$USERS $1"
shift
elif [ "$arg" = "-w" ] || [ "$arg" = "--password-protected" ]; then
RUTORRENT_PASSWORD_PROTECTED=y
elif [ "$arg" = "-r" ] || [ "$arg" = "--rutorrent-base-path" ]; then
RUTORRENT_BASE_PATH="$1"
shift
elif [ "$arg" = "-s" ] || [ "$arg" = "--install-startup-script" ]; then
INSTALL_STARTUP_SCRIPT=y
elif [ "$arg" = "--rtorrent" ]; then
BUILD_RTORRENT=y
elif [ "$arg" = "--apache" ]; then
INSTALL_WEB_SERVER=apache
elif [ "$arg" = "--nginx" ]; then
INSTALL_WEB_SERVER=nginx
elif [ "$arg" = "--lighttpd" ]; then
INSTALL_WEB_SERVER=lighttpd
elif [ "$arg" = "--rutorrent" ]; then
INSTALL_RUTORRENT=y
elif [ "$arg" = "--vsftpd" ]; then
INSTALL_VSFTPD=y
elif [ "$arg" = "--ftpes" ]; then
USE_ENCRYPTED_FTP=y
elif [ "$arg" = "--ftp-port" ]; then
FTP_PORT="$1"
shift
elif [ "$arg" = "--webmin" ]; then
INSTALL_WEBMIN=y
else
exitHelp
fi
done
}
# Sets os and os_long to the OS type and OS name respectively
detectOs() {
local DISTRIB_ID=
local DISTRIB_DESCRIPTION=
if [ -f /etc/lsb-release ]; then
. /etc/lsb-release
fi
if [ -f /etc/fedora-release ]; then
os=fedora
os_long="$(cat /etc/fedora-release)"
# Must be before a whole bunch of other OS tests
elif [ "$DISTRIB_ID" = "Ubuntu" ]; then
os=debian
os_long="$DISTRIB_DESCRIPTION"
elif [ "$DISTRIB_ID" = "LinuxMint" ]; then
os=debian
os_long="$DISTRIB_DESCRIPTION"
# Must be before Debian
elif [ "$DISTRIB_ID" = "Peppermint" ]; then
os=debian
os_long="$DISTRIB_DESCRIPTION"
elif [ "$DISTRIB_ID" = "MEPIS" ]; then
os=debian
os_long="$DISTRIB_DESCRIPTION"
elif [ -f /etc/clearos-release ]; then
os=fedora
os_long="$(cat /etc/clearos-release)"
elif [ -f /etc/debian_version ]; then
os=debian
local prefix=
if ! uname -s | grep -q GNU; then
prefix="GNU/"
fi
os_long="Debian $prefix$(uname -s) $(cat /etc/debian_version)"
elif [ -f /etc/redhat-release ]; then
os=fedora
os_long="$(cat /etc/redhat-release)"
else
echo -e "\e[1;31mYour OS is not detected as an OS supported by this script. This script only supports \e[5;32mDebian and Fedora\e[0m \e[1;31mbased OSes.\e[0m"
exit 1
fi
os_long="${os_long:-$(uname -s)}"
}
# In-place editing like sed -i but more portable...
sed_i() {
local cmd="$1"
local file="$2"
isProgramInstalled ed || errorExit "ed is not installed!"
local addr=","
echo "$cmd" | grep -qE '^/' && addr=
ed -s "$file" > /dev/null 2>&1 << EOF
$addr$cmd
w
q
EOF
}
getFirst() {
echo $1
}
# Returns true if $1 is one of $2..$n
arrayIsPresent() {
local val="$1"
shift
for v in "$@"; do
[ "$v" = "$val" ] && return 0
done
return 1
}
canGeneratePasswords() {
[ -c /dev/urandom ]
}
generatePassword() {
newPassword=$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c17)
}
isProgramInstalled() {
which "$1" > /dev/null 2>&1 && return 0
return 1
}
isPerlModuleInstalled() {
perl -M$1 -e '' > /dev/null 2>&1 && return 0
return 1
}
# Add $1 or $2 if it exists, to PACKAGES if program $1 isn't present
addProgram() {
isProgramInstalled $1 || PACKAGES="$PACKAGES ${2:-$1}"
}
# Add $2 to PACKAGES if perl module $1 isn't present
addPerlModule() {
isPerlModuleInstalled $1 || PACKAGES="$PACKAGES $2"
}
installPackages() {
[ -z "$INSTALL" ] && return
[ -z "$PACKAGES" ] && return
$INSTALL $PACKAGES
PACKAGES=
}
installPerlModule() {
isPerlModuleInstalled $1 || $INSTALL $2
}
installProgram() {
isProgramInstalled $1 || $INSTALL ${2:-$1}
}
installBuildTools() {
[ "$BUILD_TOOLS_INSTALLED" = y ] && return
PACKAGES="$BUILD_TOOLS"
installPackages
BUILD_TOOLS_INSTALLED=y
}
# Detects missing Perl modules and stores them in MISSING_PERL_MODULES
detectMissingPerlModules() {
OLD_PERL_MODULES=
MISSING_PERL_MODULES=
for module in $REQUIRED_PERL_MODULES; do
isPerlModuleInstalled $module || MISSING_PERL_MODULES="$MISSING_PERL_MODULES $module"
done
# Make sure the JSON module is new
if isPerlModuleInstalled JSON && ! perl -MJSON -e '&decode_json("{}")' > /dev/null 2>&1; then
echo "${CWARNING}Old JSON module is installed. Need to install from CPAN.$CEND"
MISSING_PERL_MODULES="$MISSING_PERL_MODULES JSON"
OLD_PERL_MODULES="$OLD_PERL_MODULES JSON"
fi
if echo "$MISSING_PERL_MODULES" | grep -wq JSON; then
MISSING_PERL_MODULES="JSON::XS $MISSING_PERL_MODULES"
fi
if echo "$MISSING_PERL_MODULES" | grep -q 'XML::LibXML'; then
# Sometimes the cpan script doesn't install the required dependencies
MISSING_PERL_MODULES="XML::NamespaceSupport XML::SAX $MISSING_PERL_MODULES"
fi
}
# Detect where cpan is installed and place the path in the CPAN variable.
# PCLinuxOS/Mandriva append the version number...
detectCpanBin() {
for file in $(which cpan 2> /dev/null) $(ls /usr/bin/cpan-* 2> /dev/null); do
if [ -x "$file" ]; then
CPAN="$file"
return
fi
done
isPerlModuleInstalled CPAN && return
errorExit "Could not find the cpan script or the CPAN Perl module. Can't install missing Perl modules."
}
isValidTzName() {
echo "$1" | LC_ALL=C grep -qE '^[A-Z][^/ ]*(/[A-Z][^/ ]*)?$' && return 0
return 1
}
detectTimeZone() {
[ -n "$USER_TIMEZONE" ] && return
local hash=
local hasher=
local files=
local zoneinfoPath=/usr/share/zoneinfo
[ -d "$zoneinfoPath" ] || return
if hasher=md5sum; isProgramInstalled $hasher || hasher=sha1sum; isProgramInstalled $hasher; then
hash=$($hasher /etc/localtime | awk '{print $1}')
files="$(find $zoneinfoPath -type f -print | xargs $hasher | grep -E "^$hash\\>" | awk '{print $2}')"
elif hasher=md5; isProgramInstalled $hasher || hasher=sha1; isProgramInstalled $hasher; then
hash=$($hasher /etc/localtime | sed -e 's/^.* = \([a-zA-Z0-9]*\)$/\1/')
files="$(find $zoneinfoPath -type f -print | xargs $hasher | grep -E "$hash\$" | sed -e 's/^[^ ]* (\([^)]*\)).*/\1/')"
else
return
fi
# Detect all possible timezone names
local timezones=
for path in $files; do
local tz="${path#$zoneinfoPath/}"
while true; do
isValidTzName "$tz" && break
local newTz="${tz#*/}"
[ "$newTz" = "$tz" ] && tz= && break
tz="$newTz"
done
isValidTzName "$tz" && timezones="$timezones $tz"
done
# Now find the ones PHP likes...
local okRegions="(Africa|America|Antarctica|Arctic|Asia|Atlantic|Australia|Europe|Indian|Pacific)"
for tz in $timezones; do
echo "$tz" | grep -qE "^$okRegions/" && USER_TIMEZONE="$tz" && return
done
# Return the first one we found
for tz in $timezones; do
USER_TIMEZONE="$tz"
return
done
}
getNumCpus() {
[ -n "$NUMCPUS" ] && return
[ -f /proc/cpuinfo ] && NUMCPUS=$(cat /proc/cpuinfo | grep '^processor' | wc -l) && return
isProgramInstalled sysctl && sysctl -n hw.ncpu | grep -qE '^[1-9][0-9]*$' && NUMCPUS=$(sysctl -n hw.ncpu) && return
NUMCPUS=1
}
# Appends $value to $varName in $file, creating the var if it doesn't exist. The
# value is not appended if it already exists.
appendFileStringVar() {
local file="$1"
local varName="$2"
local value="$3"
[ -f "$file" ] || errorExit "File '$file' does not exist"
local varLine=$(grep -E "^$varName=" "$file" | tail -n1)
if [ -z "$varLine" ]; then
echo "$varName=\"$value\"" >> "$file"
else
echo "$varLine" | grep -qE "[='\" ]$value(\"|'| |$)" && return
local q=
echo "$varLine" | grep -qE "^$varName='" && q="'"
echo "$varLine" | grep -qE "^$varName=\"" && q='"'
sed_i "s#^\\($varName=\\)$q\\(.*\\)$q#\\1\"\\2 $value\"#" "$file"
fi
}
# Set a variable in a script file to a new value. The variable is created if it does not exist
setScriptVariable() {
local file="$1"
local name=$2
local value="$3"
[ -f "$file" ] || errorExit "File does not exist: $file"
local newLine="$name=\"$value\""
if grep -qE "^$name=" $file; then
sed_i "s!^$name=.*\$!$newLine!" "$file"
else
echo "$newLine" >> "$file"
fi
}
userExists() {
id -rg "$1" > /dev/null 2>&1 && return 0
return 1
}
setSvnOpts() {
SVN_OPTS=
isProgramInstalled svn || return
# svn sometimes gives an error message 'broken pipe'. Ignore it.
if svn help co 2>/dev/null | grep -q 'non-interactive' && svn help co 2>/dev/null | grep -q 'trust-server-cert'; then
SVN_OPTS="--non-interactive --trust-server-cert"
fi
}
downloadFile() {
local filename="$1"
shift
for url in "$@"; do
for i in 1 2 3 4 5; do
wget --no-check-certificate -O "$filename" "$url" && return 0
done
done
return 1
}
buildMakeProgram() {
local url="$1"
local name="$2"
local builddir="$3"
local srcdir="$4"
local makefile="${5:-Makefile}"
buildStart
echo "${CMSG}Downloading $name source code...$CEND"
cd "$BUILD_DIR"
local filename="${url##*/}"
downloadFile "$filename" "$url" || errorExit "Could not download $name source code."
tar xzf "$filename"
srcdir="${srcdir:-${filename%.tar.gz}}"
cd "$srcdir/$builddir"
local make=${MAKE:-make}
echo "${CMSG}Building $name...$CEND"
$make -f $makefile all || errorExit "Could not build $name."
$make -f $makefile install || errorExit "Could not install $name."
echo "${CMSG}$name is now installed$CEND"
buildEnd
}
buildProgram() {
local prog="$1"
echo "${CMSG}Building $prog...$CEND"
./configure --prefix=$PREFIX $2 || errorExit "Could not configure $prog. Try again, or try logging out and in and try again."
getNumCpus
local make=${MAKE:-make}
local makeopts="-j$NUMCPUS"
$make $makeopts || $make || errorExit "Could not build $prog"
$make install || errorExit "Could not install $prog"
local ldsoconf=/etc/ld.so.conf
touch "$ldsoconf"
grep -qE "^$PREFIX/lib$" $ldsoconf || echo "$PREFIX/lib" >> $ldsoconf
ldconfig || errorExit "ldconfig failed"
echo "${CMSG}$prog is now installed.$CEND"
}
downloadAndBuild() {
local prog="$1"
local urls="$2"
local name="$3"
local configOptions="$4"
local patchUrl="$5"
cd "$BUILD_DIR"
echo "${CMSG}Downloading $prog source code...$CEND"
downloadFile "$name.tar.gz" $urls || errorExit "Could not download $prog source code."
tar xzf $name.tar.gz
if echo "$patchUrl" | grep '^[a-z]*://'; then
echo "${CMSG}Patching $prog...$CEND"
PACKAGES="patch"
installPackages
isProgramInstalled patch || errorExit "patch is not installed!"
downloadFile the.patch "$patchUrl" || errorExit "Could not download the patch file."
patch -p1 -d $name < the.patch || errorExit "Could not patch $prog."
elif [ -n "$patchUrl" ]; then
echo "${CMSG}Patching $prog...$CEND"
cd $name
eval $patchUrl
cd ..
fi
cd $name
buildProgram "$prog" "$configOptions"
}
checkoutAndBuild() {
local prog="$1"
local url="$2"
local configOptions="$3"
cd "$BUILD_DIR"
echo "${CMSG}Downloading $prog source code...$CEND"
svn export $SVN_OPTS "$url" "$prog" || errorExit "Could not download $prog source code."
cd "$prog"
buildProgram "$prog" "$configOptions"
}
buildStart() {
PREFIX=/usr/local
OLD_PATH="$PATH"
PATH="$PATH:$PREFIX/bin"
PKG_CONFIG_PATH=$PREFIX/lib/pkgconfig
export PKG_CONFIG_PATH
BUILD_DIR="$(echo ~)/build-tmp"
rm -rf "$BUILD_DIR"
mkdir "$BUILD_DIR" || errorExit "Could not create build directory."
}
buildEnd() {
cd
rm -rf "$BUILD_DIR"
[ -n "$OLD_PATH" ] && PATH="$OLD_PATH"
unset OLD_PATH
unset PKG_CONFIG_PATH
}
buildRtorrent() {
installBuildTools
osHandler_$os installRtorrentBuildTools
isProgramInstalled pkg-config || errorExit "pkg-config is not installed."
# Minimum version is 7.15.4 but I had problems with 7.15.5 on CentOS. Set
# it to 7.18.0 (the version Ubuntu Server 8.04 is using).
if ! pkg-config --atleast-version=7.18.0 libcurl; then
downloadAndBuild "libcurl" "$LIBCURL_URL" "$LIBCURL_NAME" ""
# Prevent 'Unknown keyword 'URL' in ....' error
sed_i 's/^URL:/#URL:/' $PREFIX/lib/pkgconfig/libcurl.pc
fi
if ! pkg-config --exists sigc++-2.0; then
downloadAndBuild "sigc++-2.0" "$SIGCPP20_URL" "$SIGCPP20_NAME" ""
fi
checkoutAndBuild "xmlrpc-c" "$XMLRPC_SVN_DIR" "--disable-cplusplus"
downloadAndBuild "libtorrent" "$LIBTORRENT_URL $LIBTORRENT_URL2" "$LIBTORRENT_NAME" "" patchLibtorrent
downloadAndBuild "rtorrent" "$RTORRENT_URL $RTORRENT_URL2" "$RTORRENT_NAME" "--with-xmlrpc-c" ""
}
patchLibtorrent() {
# For gcc 4.6.0
ed -s "src/torrent/data/block_transfer.h" > /dev/null 2>&1 << EOF
/#define LIBTORRENT_BLOCK_TRANSFER_H
a
#include <stddef.h>
.
w
q
EOF
ed -s "src/data/memory_chunk.cc" > /dev/null 2>&1 << EOF
/#include "config.h"
a
#include <stddef.h>
.
w
q
EOF
}
installRtorrent() {
buildStart
buildRtorrent
buildEnd
}
installUnrar() {
isProgramInstalled unrar && return
installBuildTools
buildMakeProgram "$UNRAR_URL" "unrar" "" "unrar" "makefile.unix"
}
installModScgi() {
local modScgiFile="$1"
local modulesPath="$2"
[ -f "$modScgiFile" ] && errorExit "mod_scgi file already exists."
[ -d "$modulesPath" ] || errorExit "Apache modules path '$modulesPath' does not exist."
buildMakeProgram "$MOD_SCGI_URL" "mod_scgi" "apache2"
echo "LoadModule scgi_module $modulesPath/mod_scgi.so" > $modScgiFile
}
isPortUsed() {
local port="$1"
netstat -an | grep tcp | grep -w LISTEN | grep -qE "[.:]$port[ ]" && return 0
return 1
}
isValidIpAddress() {
# It's not 100% accurate ... ;)
echo $1 | grep -qE '^[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?\.[0-9][0-9]?[0-9]?$'
}
getIpAddress() {
isValidIpAddress "$OUR_IP_ADDRESS" && return
echo "${CMSG}Detecting your IP address...$CEND"
isValidIpAddress "$OUR_IP_ADDRESS" || OUR_IP_ADDRESS=$(wget --no-check-certificate http://www.whatismyip.com/automation/n09230945.asp -O - -o /dev/null)
isValidIpAddress "$OUR_IP_ADDRESS" || OUR_IP_ADDRESS=$(ifconfig -a | grep "inet addr" | head -n1 | awk -F: '{print $2}' | awk '{print $1}')
isValidIpAddress "$OUR_IP_ADDRESS" || OUR_IP_ADDRESS="1.2.3.4"
}
getNewPortNumber() {
while true; do
newPortNumber=$CURRENT_PORT
CURRENT_PORT=$(expr $CURRENT_PORT + 1)
isValidPortNumber $newPortNumber || errorExit "Invalid port number. Change CURRENT_PORT."
isPortUsed $newPortNumber || break
echo "${CWARNING}Port $newPortNumber is in use, trying next port...$CEND"
done
}
# Returns true if it's a valid ruTorrent base path
isValidRutorrentBasePath() {
[ -n "$1" ] && [ -d "$1/conf" ]
}
isValidPassword() {
echo "$1" | grep -qE "^ " && return 1
echo "$1" | grep -qE " \$" && return 1
echo "$1" | grep -qE '^$' && return 1
echo "$1" | grep -q ':' && return 1
echo "'$1'" | grep -q ' ' && return 1
return 0
}
isValidPortNumber() {
echo "$1" | grep -qiE '^[0-9]+$' || return 1
echo "$1" | grep -qiE '[0-9][0-9][0-9][0-9][0-9][0-9]' && return 1
[ $1 -ge 1024 ] && [ $1 -le 65535 ]
}
isValidWebUser() {
[ -z "$1" ] && return 1
echo "$1" | LC_ALL=C grep -qE '[A-Z:]' && return 1
return 0
}
initUsers() {
local users=
for packedUser in $USERS; do
extractPackedUser $packedUser
if [ -z "$autodlPort" ]; then
getNewPortNumber
autodlPort=$newPortNumber
fi
if [ -z "$scgiPort" ]; then
getNewPortNumber
scgiPort=$newPortNumber
fi
if [ -z "$rtorrentPort" ]; then
getNewPortNumber
rtorrentPort=$newPortNumber
fi
if canGeneratePasswords; then
if [ -z "$autodlPassword" ]; then
generatePassword
autodlPassword="$newPassword"
fi
fi
users="$users $osUser:$autodlPassword:$webUser:$webPass:$autodlPort:$scgiPort:$rtorrentPort"
done
USERS="$users"
}
extractPackedUser() {
local packedUser="$1"
osUser="$(echo $packedUser | cut -d: -f1)"
autodlPassword="$(echo $packedUser | cut -d: -f2)"
webUser="$(echo $packedUser | cut -d: -f3)"
webPass="$(echo $packedUser | cut -d: -f4)"
autodlPort="$(echo $packedUser | cut -d: -f5)"
scgiPort="$(echo $packedUser | cut -d: -f6)"
rtorrentPort="$(echo $packedUser | cut -d: -f7)"
}
getUserGroup() {
local user="$1"
userExists "$user" || errorExit "The user '$user' does not exist."
group=$(grep -w $(id -rg $user) /etc/group | cut -d: -f1)
[ -z "$group" ] && group="$user"
}
getUserDir() {
local user="$1"
[ -z "$user" ] && errorExit "Invalid user (blank)."
userDir="$(eval echo ~$user)"
[ -d "$userDir" ] || errorExit "User $user's home directory does not exist."
}
resetOwner() {
local user="$1"
shift
if [ "$ISROOT" = y ]; then
getUserGroup "$user"
chown -R $user:$group "$@"
fi
}
# Updates MISSING_PHP_MODULES with all missing required PHP modules
detectMissingPhpModules() {
MISSING_PHP_MODULES=
local php=${WWW_PHP_CGI:-php}
for module in $REQUIRED_PHP_MODULES; do
$php -m 2> /dev/null | grep -wq $module || MISSING_PHP_MODULES="$MISSING_PHP_MODULES $module"
done
}
installMissingPhpPackages() {
PACKAGES=
for module in $MISSING_PHP_MODULES; do
PACKAGES="$PACKAGES php-$module"
done
installPackages
}
installMissingPhp5Packages() {
PACKAGES=
for module in $MISSING_PHP_MODULES; do
PACKAGES="$PACKAGES php5-$module"
done
installPackages
}
enablePhpIniModules() {
local phpIni="$1"
shift
for module in "$@"; do
grep -qE "^extension=$module.so" "$phpIni" && continue
sed_i "s/^; *\\(extension=$module.so.*\\)/\\1/" "$phpIni"
grep -qE "^extension=$module.so" "$phpIni" && continue
echo "extension=$module.so" >> "$phpIni"
done
}
installMissingPhpModules() {
detectMissingPhpModules
[ -z "$MISSING_PHP_MODULES" ] && return
osHandler_$os installPhpModules
detectMissingPhpModules
[ -z "$MISSING_PHP_MODULES" ] && return
cat << EOF
$CWARNING
The following PHP modules appear to be missing:
$MISSING_PHP_MODULES
If the autodl-irssi ruTorrent plugin isn't working, you now know why. Install
them using your package manager or enable them in your php.ini file, and
restart your web server.$CEND
EOF
}
addLogrotateConfig() {
local serviceName="$1"
local logFiles="$2"
local postrotateScript="$3"
local logrotate_d=/etc/logrotate.d
[ -d "$logrotate_d" ] || errorExit "Missing logrotate dir: $logrotate_d"
cat > "$logrotate_d/$serviceName" << EOF
$logFiles {
missingok
daily
rotate 14
notifempty
compress
delaycompress
sharedscripts
postrotate
$postrotateScript
endscript
}
EOF
[ $? -eq 0 ] || errorExit "Could not write logrotate file $logrotate_d/$serviceName"
}
detectPhpCgi() {
WWW_PHP_CGI=${WWW_PHP_CGI:-$(which php-cgi | head -n1)}
[ -x "$WWW_PHP_CGI" ] || errorExit "Could not find php-cgi"
"$WWW_PHP_CGI" -v | grep -q 'cgi-fcgi' || errorExit "$WWW_PHP_CGI does not support FastCGI"
}
# $i is the i'th user number
getUserRpcMount() {
local i=$1
verifyWebServerVars
# Make sure /RPC10 accesses aren't going to /RPC1 by padding with zeros. This is
# easier than making sure every web server handles it correctly. Eg., lighttpd's
# scgi.server table is read in order, so if you add /RPC1 before /RPC10, then
# /RPC10 accesses will go to /RPC1. A fix would of course be to place /RPC10
# before /RPC1 but it's easy to forget. Now we use /RPC00001 .. /RPC99999
echo "/$RPC_PREFIX$(printf '%05d' $i)"
}
createSelfSignedCertFile() {
local pemfile="$1"
if [ ! -f "$OTHER_PEM_FILE" ]; then
echo "${CMSG}Creating the self-signed certificate.$CEND"
rm -f "$pemfile"
openssl req -new -newkey rsa:1024 -days 1000 -nodes -x509 -keyout "$pemfile" -out "$pemfile" -batch \
|| errorExit "Failed to create self-signed certificate."
OTHER_PEM_FILE="$pemfile"
CREATED_CERT_FILE=y
else
rm -f "$pemfile"
cp "$OTHER_PEM_FILE" "$pemfile" || errorExit "Failed to copy self-signed certificate."
fi
chmod 0600 "$pemfile"
}
detectHtpasswd() {
[ -z "$htpasswd" ] && isProgramInstalled htpasswd && htpasswd=htpasswd
[ -z "$htpasswd" ] && isProgramInstalled htpasswd2 && htpasswd=htpasswd2
if [ -z "$htpasswd" ]; then
installProgram python
if isProgramInstalled python; then
cd
downloadFile "htpasswd.py" "$HTPASSWD_PY_SCRIPT_URL" "$HTPASSWD_PY_SCRIPT_URL2" \
&& htpasswd="python $(pwd)/htpasswd.py"
fi
fi
[ -z "$htpasswd" ] && errorExit "Could not find htpasswd"
}
verifyWebServerVars() {
[ -z "$WWW_PEMFILE" ] && errorExit "You have not initialized WWW_PEMFILE"
[ -z "$WWW_PASSWORD_FILE" ] && errorExit "You have not initialized WWW_PASSWORD_FILE"
[ -z "$WWW_ROOT" ] && errorExit "You have not initialized WWW_ROOT"
[ -z "$WWW_USER" ] && errorExit "You have not initialized WWW_USER"
[ -z "$WWW_GROUP" ] && errorExit "You have not initialized WWW_GROUP"
}
initializeWwwRootVar() {
WWW_ROOT=${WWW_ROOT:-/var/rutorrent}
}
createWebServerUserGroup() {
verifyWebServerVars
if ! grep -qE "^$WWW_GROUP:" /etc/group; then
groupadd -r $WWW_GROUP 2>/dev/null || groupadd $WWW_GROUP || errorExit "Could not create web server group."
fi
if ! grep -qE "^$WWW_USER:" /etc/passwd; then
local useradd="useradd -d $WWW_ROOT -g $WWW_GROUP -s /bin/sh"
$useradd -M -r $WWW_USER 2>/dev/null || $useradd $WWW_USER || errorExit "Could not create web server user."
fi
}
resetAuthPasswordFilePermissions() {
[ -n "$WWW_USER" ] || errorExit "WWW_USER not initialized"
[ -n "$WWW_GROUP" ] || errorExit "WWW_GROUP not initialized"
chmod 0400 "$WWW_PASSWORD_FILE"*
chown $WWW_USER:$WWW_GROUP "$WWW_PASSWORD_FILE"*
}
createAuthPasswordFile() {
verifyWebServerVars
: > "$WWW_PASSWORD_FILE"
resetAuthPasswordFilePermissions
}
# Some web servers (eg. nginx) can't allow just ONE user access to a certain
# location. To fix that, create one password file per user.
createOnePasswordFilePerUser() {
for packedUser in $USERS; do
extractPackedUser $packedUser
grep "^$webUser:" "$WWW_PASSWORD_FILE" > "${WWW_PASSWORD_FILE}_$webUser"
done
resetAuthPasswordFilePermissions
}
updatePhpTimezone() {
if [ ! -f "$WWW_PHP_INI" ]; then
echo "${CWARNING}Could not find php.ini file: $WWW_PHP_INI$CEND"
return
fi
[ -z "$USER_TIMEZONE" ] && return
local zws="[ ]*"
local newLine="date.timezone = $USER_TIMEZONE"
if grep -qE "^${zws}date\\.timezone[ =]" "$WWW_PHP_INI"; then
return
elif grep -qE "^${zws}[;#]${zws}date\\.timezone[ =]" "$WWW_PHP_INI"; then
sed_i "s!^${zws}[;#]${zws}date\\.timezone[ =].*\$!$newLine!" "$WWW_PHP_INI"
else
cat >> "$WWW_PHP_INI" << EOF
[Date]
$newLine
EOF
fi
}
doDetectTimeZone() {
echo "${CMSG}Detecting timezone...$CEND"
detectTimeZone
if [ -n "$USER_TIMEZONE" ]; then
echo "${CMSG}Timezone: $USER_TIMEZONE$CEND"
updatePhpTimezone
else
echo "${CWARNING}Could not detect timezone!$CEND"
fi
}
webServerCommonInitialization() {
mkdir -p $WWW_ROOT
doDetectTimeZone
createSelfSignedCertFile "$WWW_PEMFILE"
createAuthPasswordFile
}
resetWebServerPermissions() {
verifyWebServerVars
chown -R $WWW_USER:$WWW_GROUP $WWW_ROOT || errorExit "Could not set web server as owner of $WWW_ROOT"
}
createPhpcgiSocket() {
PHPCGI_SOCKET_DIR=/etc/phpcgi
PHPCGI_SOCKET_FILE="$PHPCGI_SOCKET_DIR/php-cgi.socket"
mkdir -p "$PHPCGI_SOCKET_DIR"
chown $WWW_USER:$WWW_GROUP "$PHPCGI_SOCKET_DIR"
chmod 0770 "$PHPCGI_SOCKET_DIR"
}
verifyApacheServerVars() {
verifyWebServerVars
[ -z "$APACHE_SITE_FILE" ] && errorExit "You have not initialized APACHE_SITE_FILE"
}
apacheCreateApxs2Symlink() {
# The makefile uses apxs2, so make a symlink
if ! isProgramInstalled apxs2; then
local apxs=$(which apxs 2>/dev/null) && ln -s "$apxs" "${apxs}2"
fi
}
initializeApacheVars() {
local apacheUser="$1"
local apacheGroup="$2"
local apacheSitesDir="$3"
[ -n "$apacheUser" ] || errorExit "Invalid apache user: $apacheUser"
[ -n "$apacheGroup" ] || errorExit "Invalid apache group: $apacheGroup"
[ -d "$apacheSitesDir" ] || errorExit "Invalid apache sites dir: $apacheSitesDir"
[ -d "$APACHE_DIR" ] || errorExit "Invalid apache dir: $APACHE_DIR"
APACHE_SITE_NAME=${APACHE_SITE_NAME:-rutorrent.conf}
APACHE_SITE_FILE=$apacheSitesDir/$APACHE_SITE_NAME
initializeWwwRootVar
WWW_PASSWORD_FILE=$APACHE_DIR/rutorrent_passwd
WWW_PEMFILE=$APACHE_DIR/rutorrent.pem
WWW_USER="$apacheUser"
WWW_GROUP="$apacheGroup"
}
apacheGetRpcLocationDirectives() {
if [ "$INSTALL_RUTORRENT" = y ]; then
local i=1
for packedUser in $USERS; do
extractPackedUser $packedUser
local rpcMount="$(getUserRpcMount $i)"
cat << EOF
<Location "$rpcMount">
AuthType Basic
AuthName "$RUTORRENT_SITE_REALM"
AuthUserFile "$WWW_PASSWORD_FILE"
Require user $webUser
</Location>
EOF
i=$(expr $i + 1)
done
fi
}
apacheGetVirtualHost() {
local port=$1
local ssl=$2
cat << EOF
<VirtualHost *:$port>
$(if [ "$ssl" = y ]; then
echo " SSLEngine On"
echo " SSLCertificateFile $WWW_PEMFILE"
fi)
ServerAdmin admin@rutorrent
ServerName localhost
DocumentRoot $WWW_ROOT
<Directory />
AllowOverride None
Order deny,allow
Deny from all
</Directory>
<Location />
AuthType Basic
AuthName "$RUTORRENT_SITE_REALM"
AuthUserFile "$WWW_PASSWORD_FILE"
Require valid-user
Order allow,deny
Allow from all
</Location>
<Location ~ "^/rutorrent/(conf|share)">
Order deny,allow
Deny from all
</Location>
<Location ~ "/\\\\.svn">
Order deny,allow
Deny from all
</Location>
$(apacheGetRpcLocationDirectives)
</VirtualHost>
EOF
}
apacheWriteSiteFile() {
verifyApacheServerVars
cat > "$APACHE_SITE_FILE" << EOF
ServerName localhost
$(apacheGetVirtualHost $HTTP_PORT n)
$(apacheGetVirtualHost $HTTPS_PORT y)
EOF
if [ "$INSTALL_RUTORRENT" = y ]; then
local i=1
local lp=; isWebServerRpcModule || lp='#'
for packedUser in $USERS; do
extractPackedUser $packedUser
local rpcMount="$(getUserRpcMount $i)"
echo "${lp}SCGIMount $rpcMount $SCGI_HOST:$scgiPort" >> "$APACHE_SITE_FILE"
i=$(expr $i + 1)
done
fi
}
apacheCommonInitialization() {
local buildTools="$1"
local modulesDir="$2"
webServerCommonInitialization
apacheWriteSiteFile
if [ -n "$APACHE_SCGI_FILE" ] && [ ! -f "$APACHE_SCGI_FILE" ]; then
installBuildTools
PACKAGES="$buildTools"
installPackages
apacheCreateApxs2Symlink
# Compiling mod_scgi will fail unless we remove this warning-as-error flag
local configVarsFile="$APACHE_DIR/modules/build/config_vars.mk"
[ -f "$configVarsFile" ] && sed_i 's/-Werror=format-security//g' "$configVarsFile"
installModScgi "$APACHE_SCGI_FILE" "$modulesDir"
fi
}
installCommonWebServerStuff_mandriva() {
# Also add some extra tools for ruTorrent and some of its plugins
PACKAGES="php-cli gzip curl openssl logrotate"
installPackages
PACKAGE="unrar"
installPackages
PACKAGES="php-geoip"
installPackages
}
# Used by Mandriva, Unity Linux, and PCLinuxOS
installApache_mandriva() {
installCommonWebServerStuff_mandriva
PACKAGES="apache-mpm-prefork apache-mod_ssl apache-mod_php"
installPackages
WWW_PHP_INI=/etc/php.ini
APACHE_DIR=/etc/httpd
local APACHE_CONF_D=$APACHE_DIR/conf.d
local APACHE_SITES_DIR=$APACHE_DIR/conf/vhosts.d
APACHE_SCGI_FILE=$APACHE_CONF_D/scgi.conf
initializeApacheVars apache apache "$APACHE_SITES_DIR"
apacheCommonInitialization "libopenssl-devel apache-devel" $APACHE_DIR/modules
for file in 00_default_vhosts.conf 01_default_ssl_vhost.conf; do
[ -f "$APACHE_SITES_DIR/$file" ] && mv -f "$APACHE_SITES_DIR/$file" "$APACHE_SITES_DIR/$file-bak"
done
resetWebServerPermissions
chkconfig httpd on
service httpd restart || errorExit "Could not start $INSTALL_WEB_SERVER"
}
installCommonWebServerStuff_gentoo() {
# Also add some extra tools for ruTorrent and some of its plugins
PACKAGES="dev-lang/php logrotate"
addProgram gzip app-arch/gzip
addProgram curl net-misc/curl
addProgram openssl dev-libs/openssl
addProgram unrar app-arch/unrar
installPackages
ACCEPT_LICENSE=MaxMind
export ACCEPT_LICENSE
PACKAGES="dev-php5/pecl-geoip"
installPackages
unset ACCEPT_LICENSE
}
installApache_gentoo() {
installCommonWebServerStuff_gentoo
PACKAGES="www-servers/apache app-admin/apache-tools"
installPackages
PACKAGES="www-apache/mod_scgi"
installPackages
WWW_PHP_INI=$(ls /etc/php/apache2-php5*/php.ini | tail -n1)
[ -f "$WWW_PHP_INI" ] || errorExit "Could not find Apache php.ini file"
APACHE_DIR=/etc/apache2
local APACHE_CONF=$APACHE_DIR/httpd.conf
local APACHE_SITES_DIR=$APACHE_DIR/vhosts.d
local SERVER_ROOT=$(grep -E ^ServerRoot $APACHE_CONF | head -n1 | sed -e 's!^.*[ ][^/]*\(/[^"]*\).*!\1!')
APACHE_SCGI_FILE="$APACHE_DIR/modules.d/scgi.conf"
[ -d "$SERVER_ROOT" ] || errorExit "Apache server root dir does not exist: $SERVER_ROOT"
initializeApacheVars apache apache "$APACHE_SITES_DIR"
apacheCommonInitialization "" $SERVER_ROOT/modules
for file in 00_default_ssl_vhost.conf 00_default_vhost.conf; do
[ -f "$APACHE_SITES_DIR/$file" ] && mv -f "$APACHE_SITES_DIR/$file" "$APACHE_SITES_DIR/$file-bak"
done
appendFileStringVar /etc/conf.d/apache2 APACHE2_OPTS "-D SCGI"
appendFileStringVar /etc/conf.d/apache2 APACHE2_OPTS "-D PHP5"
appendFileStringVar /etc/conf.d/apache2 APACHE2_OPTS "-D SSL"
cat >> $APACHE_SITE_FILE << EOF
Listen $HTTP_PORT
Listen $HTTPS_PORT
EOF
resetWebServerPermissions
rc-update add apache2 default
osHandler_$os restart_$INSTALL_WEB_SERVER
}
nginxGetRpcMounts() {
if [ "$INSTALL_RUTORRENT" = y ]; then
local i=1
local lp=; isWebServerRpcModule || lp='#'
for packedUser in $USERS; do
extractPackedUser $packedUser
getUserScgiSocketPath "$osUser"
local rpcMount="$(getUserRpcMount $i)"
cat << EOF
$lp location ~ ^$rpcMount\$ {
$lp include scgi_params;
$lp scgi_pass unix:$scgiSocketPath;
$lp auth_basic "$RUTORRENT_SITE_REALM";
$lp auth_basic_user_file "${WWW_PASSWORD_FILE}_$webUser";
$lp }
EOF
i=$(expr $i + 1)
done
fi
}
nginxGetServerSection() {
local port=$1
local ssl=$2
cat << EOF
server {
listen $port;
server_name localhost;
auth_basic "$RUTORRENT_SITE_REALM";
auth_basic_user_file "$WWW_PASSWORD_FILE";
$(if [ "$ssl" = y ]; then
cat << EOF2
ssl on;
ssl_certificate $WWW_PEMFILE;
ssl_certificate_key $WWW_PEMFILE;
EOF2
fi)
location ~ ^/rutorrent/(?:share|conf) {
deny all;
}
location ~ /\.ht {
deny all;
}
location ~ /\.svn {
deny all;
}
location / {
root $WWW_ROOT;
index index.php index.html index.htm;
}
location ~ \.php$ {
root "$WWW_ROOT";
fastcgi_pass unix:$PHPCGI_SOCKET_FILE;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
include fastcgi_params;
}
$(nginxGetRpcMounts)
}
EOF
}
nginxWriteConfFile() {
getNumCpus
cat > $NGINX_CONF << EOF
worker_processes $NUMCPUS;
user $WWW_USER $WWW_GROUP;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
# I have to set min length to 0 and http version to 1.0 or it won't compress
# the XML-RPC (SCGI) responses. Those responses can be quite large if you're
# using many torrent files.
gzip on;
gzip_min_length 0;
gzip_http_version 1.0;
gzip_types text/plain text/xml application/xml application/json text/css application/x-javascript text/javascript application/javascript;
$(nginxGetServerSection $HTTP_PORT n)
$(nginxGetServerSection $HTTPS_PORT y)
}
EOF
[ $? -eq 0 ] || errorExit "Could not write to file $NGINX_CONF"
}
buildNginx() {
buildStart
PREFIX=$NGINX_DIR
NGINX_BIN=$PREFIX/sbin/nginx
NGINX_CONF=$PREFIX/conf/nginx.conf
NGINX_PID_FILE=$PREFIX/nginx.pid
NGINX_ACCESS_LOG=$PREFIX/logs/access.log
NGINX_ERROR_LOG=$PREFIX/logs/error.log
local configureFlags="\
--prefix=$PREFIX \
--sbin-path=$NGINX_BIN \
--conf-path=$NGINX_CONF \
--pid-path=$NGINX_PID_FILE \
--lock-path=$PREFIX/logs/nginx.lock \
--error-log-path=$NGINX_ERROR_LOG \
--http-log-path=$NGINX_ACCESS_LOG \
--user=$WWW_USER \
--group=$WWW_GROUP \
--with-http_ssl_module"
export CFLAGS="$NGINX_CFLAGS"
downloadAndBuild "nginx" "$NGINX_URL" "$NGINX_NAME" "$configureFlags" patchNginx
unset CFLAGS
buildEnd
}
patchNginx() {
# Get rid of the -Werror flag for gcc 4.6.0
sed_i "s!-Werror[a-zA-Z0-9=-]*!!" "auto/cc/gcc"
}
installNginx() {
SCGI_USE_UNIX_DOMAIN_SOCKET=y
CREATE_ONE_PASSWORD_FILE_PER_USER=y
installBuildTools
osHandler_$os preNginxInstall
installUnrar
NGINX_DIR=/usr/local/nginx
initializeWwwRootVar
WWW_PASSWORD_FILE=$NGINX_DIR/rutorrent_passwd
WWW_PEMFILE=$NGINX_DIR/rutorrent.pem
WWW_USER=${WWW_USER:-nginx}
WWW_GROUP=${WWW_GROUP:-nginx}
detectPhpCgi
createWebServerUserGroup
createPhpcgiSocket
buildNginx
webServerCommonInitialization
nginxWriteConfFile
addLogrotateConfig nginx \
"$NGINX_ACCESS_LOG $NGINX_ERROR_LOG" \
"[ -f \"$NGINX_PID_FILE\" ] && kill -USR1 \$(cat \"$NGINX_PID_FILE\") >/dev/null 2>&1; true"
resetWebServerPermissions
osHandler_$os installPhpCgiService
osHandler_$os installNginxService
}
preNginxInstall_gentoo() {
installCommonWebServerStuff_gentoo
PACKAGES="libpcre openssl zlib php"
installPackages
WWW_PHP_INI=$(ls /etc/php/cgi-php5*/php.ini | tail -n1)
[ -f "$WWW_PHP_INI" ] || errorExit "Could not find php-cgi php.ini file"
}
preLighttpdInstall_gentoo() {
preNginxInstall_gentoo
}
lighttpdGetRpcRequire() {
if [ "$INSTALL_RUTORRENT" = y ]; then
local i=1
for packedUser in $USERS; do
extractPackedUser $packedUser
local rpcMount="$(getUserRpcMount $i)"
cat << EOF
"$rpcMount" => (
"method" => "basic",
"realm" => "$RUTORRENT_SITE_REALM",
"require" => "user=$webUser",
),
EOF
i=$(expr $i + 1)
done
fi
}
lighttpdGetScgiServerTable() {
echo 'scgi.server = ('
if [ "$INSTALL_RUTORRENT" = y ]; then
local i=1
local lp=; isWebServerRpcModule || lp='#'
for packedUser in $USERS; do
extractPackedUser $packedUser
getUserScgiSocketPath "$osUser"
local rpcMount="$(getUserRpcMount $i)"
cat << EOF
$lp "$rpcMount" => (
$lp (
$lp "socket" => "$scgiSocketPath",
$lp "check-local" => "disable",
$lp "disable-time" => 0,
$lp ),
$lp ),
EOF
i=$(expr $i + 1)
done
fi
echo ')'
}
lighttpdWriteConfFile() {
cat > $LIGHTTPD_CONF << EOF
server.follow-symlink = "disable"
server.max-connections = 512
server.max-fds = 1024
server.max-keep-alive-idle = 15
dir-listing.activate = "disable"
server.pid-file = "$LIGHTTPD_PID_FILE"
server.errorlog = "$LIGHTTPD_ERROR_LOG"
accesslog.filename = "$LIGHTTPD_ACCESS_LOG"
$(if [ $(uname -s) = Linux ]; then
echo 'server.event-handler = "linux-sysepoll"'
echo 'server.network-backend = "linux-sendfile"'
fi)
server.username = "$WWW_USER"
server.groupname = "$WWW_GROUP"
server.modules = (
# "mod_rewrite",
# "mod_redirect",
# "mod_alias",
"mod_access",
"mod_auth",
# "mod_status",
# "mod_simple_vhost",
# "mod_evhost",
# "mod_userdir",
# "mod_secdownload",
"mod_fastcgi",
# "mod_proxy",
# "mod_cgi",
"mod_scgi",
# "mod_ssi",
# "mod_compress",
# "mod_usertrack",
# "mod_expire",
# "mod_rrdtool",
"mod_accesslog",
)
fastcgi.server = (
".php" => (
(
"socket" => "$PHPCGI_SOCKET_FILE",
),
),
)
index-file.names = ( "index.php", "index.html", "index.htm" )
static-file.exclude-extensions = ( ".fcgi", ".php", ".rb", "~", ".inc" )
mimetype.assign = (
".html" => "text/html",
".htm" => "text/html",
".txt" => "text/plain",
".csv" => "text/plain",
".ini" => "text/plain",
".jpg" => "image/jpeg",
".jpeg" => "image/jpeg",
".gif" => "image/gif",
".png" => "image/png",
".bmp" => "image/bmp",
".css" => "text/css",
".js" => "application/javascript",
".ico" => "image/x-icon",
".json" => "application/json",
".torrent" => "application/x-bittorrent",
".pdf" => "application/pdf",
".bz2" => "application/x-bzip2",
".gz" => "application/x-gzip",
".tar.gz" => "application/x-tgz",
".tar" => "application/x-tar",
".tar.bz2" => "application/x-bzip-compressed-tar",
".tbz" => "application/x-bzip-compressed-tar",
".tgz" => "application/x-tgz",
".zip" => "application/zip",
".mp3" => "audio/mpeg",
".flac" => "audio/x-flac",
".m3u" => "audio/x-mpegurl",
".wma" => "audio/x-ms-wma",
".wax" => "audio/x-ms-wax",
".ogg" => "audio/ogg",
".wav" => "audio/x-wav",
".dtd" => "text/xml",
".xml" => "text/xml",
".mpeg" => "video/mpeg",
".mpg" => "video/mpeg",
".mp4" => "video/mp4",
".wmv" => "video/x-ms-wmv",
".avi" => "video/x-msvideo",
)
server.document-root = "$WWW_ROOT"
server.port = $HTTP_PORT
\$SERVER["socket"] == ":$HTTPS_PORT" {
ssl.engine = "enable"
ssl.pemfile = "$WWW_PEMFILE"
}
url.access-deny = (".htaccess")
\$HTTP["url"] =~ "^/rutorrent/(?:share|conf)" {
url.access-deny = ("")
}
\$HTTP["url"] =~ "/\\.svn" {
url.access-deny = ("")
}
auth.backend = "htpasswd"
auth.backend.htpasswd.userfile = "$WWW_PASSWORD_FILE"
auth.require = (
$(lighttpdGetRpcRequire)
"/" => (
"method" => "basic",
"realm" => "$RUTORRENT_SITE_REALM",
"require" => "valid-user",
),
)
$(lighttpdGetScgiServerTable)
EOF
[ $? -eq 0 ] || errorExit "Could not write to file $LIGHTTPD_CONF"
}
buildLighttpd() {
buildStart
PREFIX=$LIGHTTPD_DIR
LIGHTTPD_BIN=$PREFIX/sbin/lighttpd
LIGHTTPD_CONF=$PREFIX/lighttpd.conf
# The log dir will be set to owner lighttpd since it's started as non-root.
# Put the pid file there so it can write to it.
LIGHTTPD_LOG_DIR=$PREFIX/logs
LIGHTTPD_PID_FILE=$LIGHTTPD_LOG_DIR/lighttpd.pid
LIGHTTPD_ERROR_LOG=$LIGHTTPD_LOG_DIR/error.log
LIGHTTPD_ACCESS_LOG=$LIGHTTPD_LOG_DIR/access.log
local configureFlags="\
--prefix=$PREFIX \
--with-openssl \
--with-pcre \
--with-zlib \
--without-bzip2"
downloadAndBuild "lighttpd" "$LIGHTTPD_URL" "$LIGHTTPD_NAME" "$configureFlags"
buildEnd
}
installLighttpd() {
SCGI_USE_UNIX_DOMAIN_SOCKET=y
installBuildTools
osHandler_$os preLighttpdInstall
installUnrar
LIGHTTPD_DIR=/usr/local/lighttpd
initializeWwwRootVar
WWW_PASSWORD_FILE=$LIGHTTPD_DIR/rutorrent_passwd
WWW_PEMFILE=$LIGHTTPD_DIR/rutorrent.pem
WWW_USER=${WWW_USER:-lighttpd}
WWW_GROUP=${WWW_GROUP:-lighttpd}
detectPhpCgi
createWebServerUserGroup
createPhpcgiSocket
buildLighttpd
webServerCommonInitialization
lighttpdWriteConfFile
addLogrotateConfig lighttpd \
"$LIGHTTPD_ACCESS_LOG $LIGHTTPD_ERROR_LOG" \
"[ -f \"$LIGHTTPD_PID_FILE\" ] && kill -HUP \$(cat \"$LIGHTTPD_PID_FILE\") >/dev/null 2>&1; true"
mkdir -p "$LIGHTTPD_LOG_DIR"
chown -R $WWW_USER:$WWW_GROUP "$LIGHTTPD_LOG_DIR"
resetWebServerPermissions
osHandler_$os installPhpCgiService
osHandler_$os installLighttpdService
}
# Add $name=$value to the file, or modify an existing line if present in the file
setVsftpdValue() {
local confFile="$1"
local name="$2"
local value="$3"
local newLine="$name=$value"
sed_i "s!^[ ]*$name[ =:].*\$!$newLine!" "$confFile"
grep -qE "^$newLine$" "$confFile" || echo "$newLine" >> "$confFile"
}
# Same as setVsftpdValue but makes sure the option exists
setVsftpdValue2() {
local confFile="$1"
local name="$2"
local value="$3"
[ -z "$VSFTPD_PATH" ] && return
grep -q "$name" "$VSFTPD_PATH" && setVsftpdValue "$confFile" "$name" "$value"
}
updateVsftpdConf() {
local confFile="$1"
touch "$confFile"
VSFTPD_PATH=$(which vsftpd 2>/dev/null)
setVsftpdValue "$confFile" anonymous_enable NO
setVsftpdValue "$confFile" dirlist_enable YES
setVsftpdValue "$confFile" download_enable YES
setVsftpdValue "$confFile" guest_enable NO
setVsftpdValue "$confFile" listen YES
setVsftpdValue "$confFile" listen_ipv6 NO
setVsftpdValue "$confFile" local_enable YES
setVsftpdValue "$confFile" local_umask $DEFAULT_UMASK
setVsftpdValue "$confFile" max_per_ip 0
setVsftpdValue "$confFile" pasv_enable YES
setVsftpdValue "$confFile" port_enable YES
setVsftpdValue "$confFile" pasv_promiscuous NO
setVsftpdValue "$confFile" port_promiscuous NO
setVsftpdValue "$confFile" pasv_min_port 0
setVsftpdValue "$confFile" pasv_max_port 0
setVsftpdValue "$confFile" write_enable YES
if [ "$USE_ENCRYPTED_FTP" = y ]; then
local pemfile=/etc/vsftpd.pem
createSelfSignedCertFile "$pemfile"
FTP_SERVER_TYPE="FTPES - Encrypted (FTP over explicit TLS/SSL)"
FTP_PORT=${FTP_PORT:-$DEFAULT_PORT_FTPES}
setVsftpdValue "$confFile" listen_port $FTP_PORT
setVsftpdValue "$confFile" ssl_enable YES
setVsftpdValue "$confFile" allow_anon_ssl NO
setVsftpdValue "$confFile" force_local_data_ssl YES
setVsftpdValue "$confFile" force_local_logins_ssl YES
setVsftpdValue "$confFile" ssl_sslv2 NO
setVsftpdValue "$confFile" ssl_sslv3 NO
setVsftpdValue "$confFile" ssl_tlsv1 YES
setVsftpdValue "$confFile" rsa_cert_file "$pemfile"
setVsftpdValue2 "$confFile" implicit_ssl NO
setVsftpdValue2 "$confFile" require_cert NO
setVsftpdValue2 "$confFile" require_ssl_reuse NO
setVsftpdValue2 "$confFile" ssl_request_cert YES
setVsftpdValue2 "$confFile" strict_ssl_read_eof NO
setVsftpdValue2 "$confFile" strict_ssl_write_shutdown NO
setVsftpdValue2 "$confFile" validate_cert NO
else
FTP_SERVER_TYPE="FTP - Non-encrypted"
FTP_PORT=${FTP_PORT:-$DEFAULT_PORT_FTP}
setVsftpdValue "$confFile" listen_port $FTP_PORT
setVsftpdValue "$confFile" ssl_enable NO
fi
# The private key is in rsa_cert_file
sed_i 'g/rsa_private_key_file/d' "$confFile"
}
installVsftpd_chkconfig() {
local vsftpdConf="$1"
installProgram vsftpd
[ -f "$vsftpdConf" ] || errorExit "Invalid vsftpd.conf file: $vsftpdConf"
updateVsftpdConf "$vsftpdConf"
chkconfig vsftpd on
if ! service vsftpd restart; then
if [ "$SELINUX_ENABLED" = y ]; then
errorExit "Could not restart vsftpd. SELinux could be the reason."
else
errorExit "Could not restart vsftpd"
fi
fi
}
installVsftpd_gentoo() {
installProgram net-ftp/vsftpd
local vsftpdConf=/etc/vsftpd/vsftpd.conf
if ! [ -f $vsftpdConf ]; then
touch $vsftpdConf
[ -f $vsftpdConf.example ] && cp $vsftpdConf.example $vsftpdConf
fi
updateVsftpdConf $vsftpdConf
rc-update add vsftpd default
/etc/init.d/vsftpd restart
}
installService_chkconfig1() {
CHKCONFIG_SERVICE_NAME=$1
CHKCONFIG_SERVICE_FILE=/etc/init.d/$CHKCONFIG_SERVICE_NAME
CHKCONFIG_LOCK_FILE=/var/lock/subsys/$CHKCONFIG_SERVICE_NAME
}
installService_chkconfig2() {
chmod +x "$CHKCONFIG_SERVICE_FILE" || errorExit "Could not set +x bit, file $CHKCONFIG_SERVICE_FILE."
chkconfig --add $CHKCONFIG_SERVICE_NAME || errorExit "Could not install service $CHKCONFIG_SERVICE_FILE. Run this script as root."
service $CHKCONFIG_SERVICE_NAME restart
}
getChkconfigScriptContents() {
local desc="$1"
cat << EOF
# chkconfig: 2345 85 15
# description: $desc
EOF
}
getLsbStartupScriptContents() {
local startupName="$1"
local desc="$2"
cat << EOF
### BEGIN INIT INFO
# Provides: $startupName
# Required-Start: \$local_fs \$network \$syslog
# Required-Stop: \$local_fs \$syslog
# Default-Start: $LSB_DEFAULT_START
# Default-Stop: $LSB_DEFAULT_STOP
# Short-Description: $desc
# Description: $desc
### END INIT INFO
EOF
}
# You must define v_{startIt,stopIt,restartIt,showStatus} and isStarted funcs
getLsbStartupFooter() {
cat << EOF
resetPath # Some include files may have reset it
LOCKFILE=$1
updateLock() {
[ -z "\$LOCKFILE" ] && return
if isStarted; then
touch \$LOCKFILE
else
rm -f \$LOCKFILE
fi
}
RETVAL=0
case \$1 in
start)
v_startIt
;;
stop)
v_stopIt
;;
force-reload|restart)
v_restartIt
;;
try-restart)
isStarted && v_restartIt
;;
status)
v_showStatus
;;
*)
echo "Usage: \$0 {start|stop|restart|try-restart|force-reload|status}"
RETVAL=1
;;
esac
updateLock
exit \$RETVAL
EOF
}
getCommonStartupScriptContents_autodl() {
local USER="$1"
local STARTUPNAME="$2"
cat << EOF
NAME=$STARTUPNAME
USER=$USER
SESSIONNAME=autodl
resetPath() {
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:\$PATH"
}
resetPath
# Make sure the path is correct, and make sure we're in the home dir.
USER_INIT="umask $DEFAULT_UMASK; cd; PATH=\\\$PATH:\$PATH"
# Run user command, ignoring any messages sent to stdout (eg. 'No mail.')
runUserCmd() {
su - \$USER -c "\$USER_INIT; \$1" >/dev/null && return 0
return 1
}
isStarted() {
su - \$USER -c "\$USER_INIT; screen -ls | grep -qE \\"[ ][0-9]+\\\\.\$SESSIONNAME[ ]\\"" >/dev/null && return 0
return 1
}
startIt() {
isStarted && return 0
local START_IRSSI=n
local START_RTORRENT=n
which irssi > /dev/null 2>&1 && START_IRSSI=y
which rtorrent > /dev/null 2>&1 && START_RTORRENT=y
case \$START_IRSSI\$START_RTORRENT in
yy)
runUserCmd "screen -S \$SESSIONNAME -d -t rtorrent -m rtorrent"
runUserCmd "screen -d -r \$SESSIONNAME -X screen -t irssi irssi"
;;
yn)
runUserCmd "screen -S \$SESSIONNAME -d -t irssi -m irssi"
;;
ny)
runUserCmd "screen -S \$SESSIONNAME -d -t rtorrent -m rtorrent"
;;
nn)
;;
esac
return 0
}
stopIt() {
isStarted || return 0
runUserCmd "screen -d -r \$SESSIONNAME -p irssi -X stuff \\"/quit
/quit
\\""
runUserCmd "screen -d -r \$SESSIONNAME -p rtorrent -X xon"
for i in 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4; do
isStarted || break
sleep 1
done
# If it's still not stopped, kill the whole screen session
if isStarted; then
echo -n "Couldn't stop it. Killing screen session..."
runUserCmd "screen -d -r \$SESSIONNAME -p rtorrent -X xon"
sleep 2
runUserCmd "screen -d -r \$SESSIONNAME -X quit"
echo "Done."
fi
return 0
}
v_restartIt() {
v_stopIt
v_startIt
}
v_showStatus() {
if isStarted; then
echo "\$NAME is running."
else
echo "\$NAME is stopped."
fi
}
EOF
}
getChkconfigScriptContents_autodl() {
getChkconfigScriptContents "$AUTODL_STARTUP_DESC"
}
# LSB style script, also supports chkconfig
# $1 = user name
# $2 = service name
getLsbStartupHeader_autodl() {
local USER="$1"
local STARTUPNAME="$2"
cat << EOF
$(getChkconfigScriptContents_autodl)
$(getLsbStartupScriptContents "$STARTUPNAME" "$AUTODL_STARTUP_DESC")
$(getCommonStartupScriptContents_autodl "$USER" "$STARTUPNAME")
EOF
}
installService_mandriva() {
local serviceName="$1"
local headerCommand="$2"
installService_chkconfig1 $serviceName
cat > "$CHKCONFIG_SERVICE_FILE" << EOF
#!/bin/bash
$(eval $headerCommand)
. /etc/rc.d/init.d/functions
v_startIt() {
gprintf "Starting %s:" "\$NAME"
startIt && success "startup" || failure "startup"
echo
}
v_stopIt() {
gprintf "Stopping %s:" "\$NAME"
stopIt && success "stop" || failure "stop"
echo
}
$(getLsbStartupFooter "$CHKCONFIG_LOCK_FILE")
EOF
[ $? -eq 0 ] || errorExit "Could not write to file $CHKCONFIG_SERVICE_FILE. Run this script as root."
installService_chkconfig2
}
installService_mandriva_autodl() {
local user=$1
installService_mandriva autodl_$user "getLsbStartupHeader_autodl \"$user\" \"\$CHKCONFIG_SERVICE_NAME\""
}
installService_mandriva_phpcgi() {
installService_mandriva phpcgi getLsbStartupHeader_phpcgi
}
installService_mandriva_nginx() {
installService_mandriva nginx getLsbStartupHeader_nginx
}
installService_mandriva_lighttpd() {
installService_mandriva lighttpd getLsbStartupHeader_lighttpd
}
installService_gentoo() {
local scriptName="$1"
local desc="$2"
local headerCommand="$3"
local serviceFile="/etc/init.d/$scriptName"
cat > "$serviceFile" << EOF
#!/sbin/runscript
name=$scriptName
description="$desc"
depend() {
need localmount
need net
}
$(eval $headerCommand)
start() {
ebegin "Starting \$name"
startIt
eend \$?
}
stop() {
ebegin "Stopping \$name"
stopIt
eend \$?
}
status() {
if isStarted; then
einfo "status: started"
return 0
else
einfo "status: stopped"
return 1
fi
}
EOF
[ $? -eq 0 ] || errorExit "Could not write to file $serviceFile. Run this script as root."
chmod +x "$serviceFile"
rc-update add $scriptName default || errorExit "Could not add service $scriptName"
$serviceFile restart
}
installService_gentoo_autodl() {
local user="$1"
installService_gentoo autodl_$user "$AUTODL_STARTUP_DESC" "getCommonStartupScriptContents_autodl \"$user\" \"\$scriptName\""
}
installService_gentoo_phpcgi() {
installService_gentoo phpcgi "$PHPCGI_STARTUP_DESC" "getCommonStartupScriptContents_phpcgi \"$WWW_USER\" \"$WWW_PHP_CGI\""
}
installService_gentoo_nginx() {
installService_gentoo nginx "$NGINX_STARTUP_DESC" "getCommonStartupScriptContents_nginx \"$NGINX_BIN\""
}
installService_gentoo_lighttpd() {
installService_gentoo lighttpd "$LIGHTTPD_STARTUP_DESC" "getCommonStartupScriptContents_lighttpd \"$LIGHTTPD_BIN\""
}
installService_bsd_autodl() {
local user="$1"
local scriptName="$2"
local file="$3"
cat > "$file" << EOF
#!/bin/sh
# PROVIDE: autodl_$user
# REQUIRE: FILESYSTEMS NETWORKING
# KEYWORD: shutdown
. /etc/rc.subr
name=$scriptName
desc="$AUTODL_STARTUP_DESC"
start_cmd=v_startIt
stop_cmd=v_stopIt
restart_cmd=v_restartIt
reload_cmd=v_restartIt
status_cmd=v_showStatus
extra_commands="status"
v_startIt() {
echo -n "Starting \$NAME"
startIt && echo "." || echo ". ERROR."
}
v_stopIt() {
echo -n "Stopping \$NAME..."
stopIt && echo "done." || echo "ERROR."
}
$(getCommonStartupScriptContents_autodl "$user" "$scriptName")
load_rc_config \$name
run_rc_command "\$1"
EOF
[ $? -eq 0 ] || errorExit "Could not write to file $file. Run this script as root."
chmod +x "$file"
}
getCommonStartupScriptContents_simpleService() {
local USER="$1"
local BINPATH="$2"
local START_CMD="$3"
local PID_FILE="$4"
cat << EOF
USER=$USER
BINPATH="$BINPATH"
NAME=\${BINPATH##*/}
PID_FILE="$PID_FILE"
resetPath() {
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:\$PATH"
}
resetPath
getPids() {
if [ -n "\$PID_FILE" ]; then
pids=
[ -f "\$PID_FILE" ] || return
local the_pids="\$(cat "\$PID_FILE" 2>/dev/null)"
for pid in \$the_pids; do
PS_FORMAT= LINES= COLUMNS= ps ax | grep -qE "^[ ]*\$pid[ ]" && pids="\$pids \$pid"
done
[ -z "\$pids" ] && rm -f "\$PID_FILE"
else
# ps uses the COLUMNS variable... Make sure it's off so we get the full path.
pids=\$(PS_FORMAT= LINES= COLUMNS= ps aux | grep -v grep | grep \$BINPATH | awk '{print \$2}')
fi
}
isStarted() {
getPids
[ -n "\$pids" ] && return 0
return 1
}
startIt() {
isStarted && return 0
if [ \$USER = root ]; then
$START_CMD
else
su - \$USER "-c $START_CMD"
fi
[ -n "\$PID_FILE" ] && sleep 2 # Allow it some time to create the pid file
if ! isStarted; then
for i in 1 2 3 4 5; do
sleep 1
isStarted && break
done
isStarted || return 1
fi
return 0
}
stopIt() {
isStarted || return 0
kill \$pids 2>/dev/null
for i in 0 1 2 3 4 5 6 7 8 9; do
isStarted || break
sleep 1
done
isStarted && kill -KILL \$pids 2>/dev/null
return 0
}
v_startIt() {
startIt
}
v_stopIt() {
stopIt
}
v_restartIt() {
v_stopIt
v_startIt
}
v_showStatus() {
if isStarted; then
echo "\$NAME is running."
else
echo "\$NAME is stopped."
fi
}
EOF
}
getCommonStartupScriptContents_phpcgi() {
[ -n "$PHPCGI_SOCKET_FILE" ] || errorExit "PHPCGI_SOCKET_FILE is not initialized"
getCommonStartupScriptContents_simpleService "$1" "$2" \
"PHP_FCGI_CHILDREN=5 PHP_FCGI_MAX_REQUESTS=125 \$BINPATH -q -b \"$PHPCGI_SOCKET_FILE\" &"
}
getLsbStartupHeader_phpcgi() {
getChkconfigScriptContents "$PHPCGI_STARTUP_DESC"
getLsbStartupScriptContents phpcgi "$PHPCGI_STARTUP_DESC"
getCommonStartupScriptContents_phpcgi "$WWW_USER" "$WWW_PHP_CGI"
}
getCommonStartupScriptContents_nginx() {
getCommonStartupScriptContents_simpleService "root" "$1" "\$BINPATH" "$NGINX_PID_FILE"
}
getLsbStartupHeader_nginx() {
getChkconfigScriptContents "$NGINX_STARTUP_DESC"
getLsbStartupScriptContents nginx "$NGINX_STARTUP_DESC"
getCommonStartupScriptContents_nginx "$NGINX_BIN"
}
getCommonStartupScriptContents_lighttpd() {
getCommonStartupScriptContents_simpleService "root" "$1" "\$BINPATH -f $LIGHTTPD_CONF 2>/dev/null" "$LIGHTTPD_PID_FILE"
}
getLsbStartupHeader_lighttpd() {
getChkconfigScriptContents "$LIGHTTPD_STARTUP_DESC"
getLsbStartupScriptContents lighttpd "$LIGHTTPD_STARTUP_DESC"
getCommonStartupScriptContents_lighttpd "$LIGHTTPD_BIN"
}
addLsbHeaderToStartupScript() {
local scriptPath="$1"
local provides="${2:-$scriptPath}"
local desc="${3:-$provides}"
[ -x "$scriptPath" ] || return
grep -qE '^### BEGIN INIT INFO' "$scriptPath" && return
ed -s "$scriptPath" > /dev/null 2>&1 << EOF
1a
$(getLsbStartupScriptContents "$provides" "$desc")
.
w
q
EOF
}
installMissingPerlModules() {
detectMissingPerlModules
[ -z "$MISSING_PERL_MODULES" ] && return
cat << EOF
$CWARNING
The following Perl modules are still missing:
$MISSING_PERL_MODULES
I'll try to use the cpan script to install them.$CEND
EOF
# Some Perl modules will fail to build unless Test::More is installed
MISSING_PERL_MODULES="Test::More $MISSING_PERL_MODULES"
echo "${CMSG}Installing cpan and required build tools...$CEND"
installBuildTools
osHandler_$os installCpanTools
detectCpanBin
if [ -n "$CPAN" ]; then
$CPAN $MISSING_PERL_MODULES
else
local mods=
for mod in $MISSING_PERL_MODULES; do
[ -n "$mods" ] && mods="$mods,"
mods="$mods \"$mod\""
done
perl -MCPAN -e "CPAN::Shell->install($mods)"
fi
detectMissingPerlModules
[ -z "$MISSING_PERL_MODULES" ] && return
errorExit "CPAN somehow failed to install the missing Perl modules. Missing: $MISSING_PERL_MODULES"
}
osHandler_debian() {
case $1 in
init)
INSTALL="apt-get -y install"
FEATURES="service rtorrent apache nginx lighttpd vsftpd webmin"
BUILD_TOOLS="build-essential make file pkg-config libtool m4"
;;
init2)
apt-get update
installProgram ed
# Make sure Debian 6 doesn't fail when adding new services. We need ed for this
# so run it after installing ed...
addLsbHeaderToStartupScript /etc/init.d/webmin "webmin" "webmin"
;;
installTools)
PACKAGES=
addProgram irssi
addProgram mediainfo
addProgram git-core
addProgram svn subversion
addProgram wget
addProgram unzip
addProgram screen
installPackages
# Make sure subversion won't complain about invalid certs
$INSTALL ca-certificates
;;
installAutodlTools)
PACKAGES=
addProgram perl
addPerlModule Archive::Zip libarchive-zip-perl
addPerlModule HTML::Parser libhtml-parser-perl
addPerlModule Digest::SHA1 libdigest-sha-perl
installPackages
installPerlModule Net::SSLeay libnet-ssleay-perl
installPerlModule XML::LibXML libxml-libxml-perl
installPerlModule JSON::XS libjson-xs-perl
installPerlModule JSON libjson-perl
;;
installCpanTools)
# Need to remove the old JSON or cpan may fail to build the modules
if echo "$OLD_PERL_MODULES" | grep -qE '(^| )JSON( |$)'; then
apt-get -y remove libjson-perl
fi
PACKAGES=
if echo "$MISSING_PERL_MODULES" | grep -q 'XML::LibXML'; then
PACKAGES="$PACKAGES libxml2 libxml2-dev zlib1g zlib1g-dev"
fi
if echo "$MISSING_PERL_MODULES" | grep -q 'Net::SSLeay'; then
# There's no libssl package
PACKAGES="$PACKAGES openssl libssl-dev zlib1g zlib1g-dev"
fi
installPackages
;;
installRtorrentBuildTools)
PACKAGES="libsigc++-2.0-dev libssl-dev libncurses-dev"
if apt-cache search libcurl4-openssl-dev 2> /dev/null | grep -q 'libcurl4-openssl-dev'; then
PACKAGES="$PACKAGES libcurl4-openssl-dev"
else
PACKAGES="$PACKAGES libcurl3-openssl-dev"
fi
installPackages
;;
installPhpModules)
installMissingPhp5Packages
;;
_installService)
local serviceName="$2"
local headerCommand="$3"
local serviceFile=/etc/init.d/$serviceName
local lockFile=
cat > "$serviceFile" << EOF
#!/bin/sh
$(eval $headerCommand)
. /lib/lsb/init-functions
v_startIt() {
log_begin_msg "Starting \$NAME..."
startIt
log_end_msg \$?
}
v_stopIt() {
log_begin_msg "Stopping \$NAME..."
stopIt
log_end_msg \$?
}
$(getLsbStartupFooter "$lockFile")
EOF
[ $? -eq 0 ] || errorExit "Could not write to file $serviceFile. Run this script as root."
chmod +x "$serviceFile" || errorExit "Could not set +x bit, file $serviceFile."
update-rc.d $serviceName defaults || errorExit "Could not install service $serviceFile. Run this script as root."
invoke-rc.d $serviceName restart
;;
installAutodlService)
local user=$2
osHandler_$os _installService autodl_$user "getLsbStartupHeader_autodl \"$user\" \"\$serviceName\""
;;
_installCommonWebServerStuff)
# Also add some extra tools for ruTorrent and some of its plugins
PACKAGES="php5-cli gzip curl openssl logrotate"
installPackages
# Ubuntu 8 doesn't have php5-geoip
PACKAGES="php5-geoip"
installPackages
PACKAGES="unrar"
installPackages
;;
installApache)
osHandler_$os _installCommonWebServerStuff
PACKAGES="apache2-mpm-prefork libapache2-mod-php5 php5 "
installPackages
PACKAGES="libapache2-mod-scgi"; installPackages
WWW_PHP_INI=/etc/php5/apache2/php.ini
APACHE_DIR=/etc/apache2
APACHE_SITE_NAME=rutorrent.conf
APACHE_SCGI_FILE=$APACHE_DIR/mods-available/scgi.load
initializeApacheVars www-data www-data "$APACHE_DIR/sites-available"
apacheCommonInitialization "apache2-prefork-dev" /usr/lib/apache2/modules
a2enmod ssl || errorExit "Could not enable mod_ssl"
a2enmod scgi || errorExit "Could not enable mod_scgi"
# Ubuntu Server 6 doesn't come with this module
a2enmod auth_basic
a2dissite default
a2dissite default-ssl
a2ensite $APACHE_SITE_NAME || errorExit "Could not enable site"
if ! grep -qE "^[ ]*Listen.*[: ]$HTTPS_PORT\\>" "$APACHE_DIR/ports.conf"; then
echo "Listen $HTTPS_PORT" >> "$APACHE_DIR/ports.conf"
fi
resetWebServerPermissions
invoke-rc.d apache2 restart || errorExit "Could not start $INSTALL_WEB_SERVER"
;;
restart_apache)
invoke-rc.d apache2 restart || errorExit "Could not start $INSTALL_WEB_SERVER"
;;
installVsftpd)
installProgram vsftpd
updateVsftpdConf /etc/vsftpd.conf
invoke-rc.d vsftpd restart || errorExit "Could not restart vsftpd"
;;
preNginxInstall)
WWW_PHP_INI=/etc/php5/cgi/php.ini
osHandler_$os _installCommonWebServerStuff
PACKAGES="libpcre3-dev libssl-dev zlib1g-dev php5-cgi"
installPackages
# Make sure it builds on Debian GNU/kFreeBSD 6.0.
if [ "$(uname -s)" != Linux ]; then
NGINX_CFLAGS="-D_GNU_SOURCE -D_FILE_OFFSET_BITS=64"
fi
;;
installPhpCgiService)
osHandler_$os _installService phpcgi getLsbStartupHeader_phpcgi
;;
installNginxService)
osHandler_$os _installService nginx getLsbStartupHeader_nginx
;;
restart_nginx)
invoke-rc.d phpcgi restart || errorExit "Could not start php-cgi"
invoke-rc.d nginx restart || errorExit "Could not start $INSTALL_WEB_SERVER"
;;
preLighttpdInstall)
WWW_PHP_INI=/etc/php5/cgi/php.ini
osHandler_$os _installCommonWebServerStuff
PACKAGES="libpcre3-dev libssl-dev zlib1g-dev php5-cgi"
installPackages
;;
installLighttpdService)
osHandler_$os _installService lighttpd getLsbStartupHeader_lighttpd
;;
restart_lighttpd)
invoke-rc.d phpcgi restart || errorExit "Could not start php-cgi"
invoke-rc.d lighttpd restart || errorExit "Could not start $INSTALL_WEB_SERVER"
;;
postWebminInstall)
addLsbHeaderToStartupScript /etc/init.d/webmin "webmin" "webmin"
;;
*)
;;
esac
}
osHandler_fedora() {
case $1 in
init)
INSTALL="yum -y install"
FEATURES="service rtorrent apache nginx lighttpd vsftpd webmin"
BUILD_TOOLS="gcc gcc-c++ make kernel-headers pkgconfig file libtool m4"
;;
init2)
installProgram which
installProgram ed
;;
installTools)
PACKAGES=
addProgram svn subversion
addProgram wget
addProgram unzip
addProgram screen
addProgram git
installPackages
;;
installAutodlTools)
if grep -q "release 4[. ]" /etc/redhat-release; then
IRSSI_LOAD_PERL=y
fi
PACKAGES=
addProgram perl
addProgram irssi
addPerlModule Time::HiRes perl-Time-HiRes
addPerlModule Archive::Zip perl-Archive-Zip
addPerlModule Net::SSLeay perl-Net-SSLeay
addPerlModule HTML::Parser perl-HTML-Parser
addPerlModule XML::LibXML perl-XML-LibXML
addPerlModule Digest::SHA1 perl-Digest-SHA1
addPerlModule JSON::XS perl-JSON-XS
addPerlModule JSON perl-JSON
installPackages
;;
installCpanTools)
# Need to remove the old JSON or cpan may fail to build the modules
if echo "$OLD_PERL_MODULES" | grep -qE '(^| )JSON( |$)'; then
yum -y remove perl-JSON
fi
# CentOS doesn't have 'perl-CPAN'. It's in the 'perl' package though.
PACKAGES="perl-CPAN"
if echo "$MISSING_PERL_MODULES" | grep -q 'XML::LibXML'; then
PACKAGES="$PACKAGES libxml2 libxml2-devel zlib zlib-devel"
fi
if echo "$MISSING_PERL_MODULES" | grep -q 'Net::SSLeay'; then
PACKAGES="$PACKAGES openssl openssl-devel zlib zlib-devel"
fi
installPackages
;;
installRtorrentBuildTools)
# CentOS 5: curl-devel, no libsigc++20
# Fedora 14: libcurl-devel
PACKAGES="libsigc++20-devel ncurses-devel openssl-devel libcurl-devel curl-devel"
installPackages
;;
installPhpModules)
;;
_installService)
local serviceName="$2"
local headerCommand="$3"
installService_chkconfig1 $serviceName
cat > "$CHKCONFIG_SERVICE_FILE" << EOF
#!/bin/bash
$(eval $headerCommand)
. /etc/rc.d/init.d/functions
v_startIt() {
echo -n "Starting \$NAME: "
startIt && success || failure
echo
}
v_stopIt() {
echo -n "Stopping \$NAME: "
stopIt && success || failure
echo
}
$(getLsbStartupFooter "$CHKCONFIG_LOCK_FILE")
EOF
[ $? -eq 0 ] || errorExit "Could not write to file $CHKCONFIG_SERVICE_FILE. Run this script as root."
installService_chkconfig2
;;
installAutodlService)
local user=$2
osHandler_$os _installService autodl_$user "getLsbStartupHeader_autodl \"$user\" \"\$CHKCONFIG_SERVICE_NAME\""
;;
_installCommonWebServerStuff)
PACKAGE="php-cli gzip curl openssl unrar logrotate"
installPackages
# CentOS 4: will get an error about a php v4 dependency, so can't put it in above PACKAGE var
PACKAGES="php-pecl-geoip"
installPackages
;;
installApache)
osHandler_$os _installCommonWebServerStuff
# Also add some extra tools for ruTorrent and some of its plugins
PACKAGES="httpd httpd-tools mod_ssl mod_scgi php"
installPackages
WWW_PHP_INI=/etc/php.ini
APACHE_DIR=/etc/httpd
local APACHE_CONF_D=$APACHE_DIR/conf.d
APACHE_SCGI_FILE=$APACHE_CONF_D/scgi.conf
initializeApacheVars apache apache "$APACHE_CONF_D"
apacheCommonInitialization "httpd-devel" $APACHE_DIR/modules
[ -f "$APACHE_CONF_D/welcome.conf" ] && mv -f "$APACHE_CONF_D/welcome.conf" "$APACHE_CONF_D/welcome.conf-bak"
# Remove an Apache warning by commenting out the default SSL VirtualHost
sed_i '/^<VirtualHost _default_:443>/,/^<\/VirtualHost>/s/^/#/' $APACHE_CONF_D/ssl.conf
resetWebServerPermissions
chkconfig httpd on
service httpd restart || errorExit "Could not start $INSTALL_WEB_SERVER"
;;
restart_apache)
service httpd restart || errorExit "Could not start $INSTALL_WEB_SERVER"
;;
installVsftpd)
installVsftpd_chkconfig /etc/vsftpd/vsftpd.conf
;;
preNginxInstall)
WWW_PHP_INI=/etc/php.ini
osHandler_$os _installCommonWebServerStuff
PACKAGES="pcre-devel openssl-devel zlib-devel php-cgi"
installPackages
;;
installPhpCgiService)
osHandler_$os _installService phpcgi getLsbStartupHeader_phpcgi
;;
installNginxService)
osHandler_$os _installService nginx getLsbStartupHeader_nginx
;;
restart_nginx)
service phpcgi restart || errorExit "Could not start php-cgi"
service nginx restart || errorExit "Could not start $INSTALL_WEB_SERVER"
;;
preLighttpdInstall)
WWW_PHP_INI=/etc/php.ini
osHandler_$os _installCommonWebServerStuff
PACKAGES="pcre-devel openssl-devel zlib-devel php-cgi"
installPackages
;;
installLighttpdService)
osHandler_$os _installService lighttpd getLsbStartupHeader_lighttpd
;;
restart_lighttpd)
service phpcgi restart || errorExit "Could not start php-cgi"
service lighttpd restart || errorExit "Could not start $INSTALL_WEB_SERVER"
;;
*)
;;
esac
}
isWebServerRpcModule() {
! arrayIsPresent rpc $RUTORRENT_PLUGINS && ! arrayIsPresent httprpc $RUTORRENT_PLUGINS && return 0
return 1
}
canInstallService() {
return $(arrayIsPresent service $FEATURES)
}
canInstallRtorrent() {
return $(arrayIsPresent rtorrent $FEATURES)
}
canInstallApache() {
return $(arrayIsPresent apache $FEATURES)
}
canInstallNginx() {
return $(arrayIsPresent nginx $FEATURES)
}
canInstallLighttpd() {
return $(arrayIsPresent lighttpd $FEATURES)
}
canInstallVsftpd() {
return $(arrayIsPresent vsftpd $FEATURES)
}
canInstallWebmin() {
return $(arrayIsPresent webmin $FEATURES)
}
getRequiredPrograms() {
REQUIRED_PROGRAMS="which svn wget unzip ed sed grep tar expr ps awk kill printf"
if [ "$INSTALL_AUTODL_IRSSI" = y ]; then
REQUIRED_PROGRAMS="$REQUIRED_PROGRAMS perl"
# NetBSD and DragonFly BSD don't compile Irssi with Perl support by default
[ "$IGNORE_IRSSI" != y ] && REQUIRED_PROGRAMS="$REQUIRED_PROGRAMS irssi"
fi
}
verifyInstalledPrograms() {
getRequiredPrograms
local MISSING_PROGRAMS=
for prog in $REQUIRED_PROGRAMS; do
local name=$prog
[ "$prog" = svn ] && name=subversion
isProgramInstalled "$prog" || MISSING_PROGRAMS="$MISSING_PROGRAMS $name"
done
[ -n "$MISSING_PROGRAMS" ] && errorExit "Can't continue. The following programs are not installed: $MISSING_PROGRAMS"
}
initPluginDirVar() {
AUTODL_IRSSI_PLUGIN_DIR="$RUTORRENT_BASE_PATH/plugins/autodl-irssi"
}
getRtorrentDirs() {
local user="$1"
getUserDir "$user"
RTORRENT_DOWNLOAD_DIR="$userDir/$RTORRENT_REL_DOWNLOAD_DIR"
RTORRENT_WATCH_DIR="$userDir/$RTORRENT_REL_WATCH_DIR"
RTORRENT_SESSION_DIR="$userDir/$RTORRENT_REL_SESSION_DIR"
}
getUserScgiSocketPath() {
local user="$1"
getRtorrentDirs "$user"
scgiSocketPath="$RTORRENT_SESSION_DIR/rpc.socket"
}
waitenter() {
local msg="${1-Press ENTER to continue...}"
echo -n "$CCYAN$msg$CEND"
read dummy
}
askQuestion() {
local question="$1"
local default="$2"
if [ -z "$default" ]; then
echo -n "$CQUESTION$question$CEND "
read answer
else
echo -n "$CQUESTION$question$CEND [$CGREEN$default$CEND] "
read answer
fi
if [ -z "$answer" ]; then
answer="$default"
fi
}
# Asks the user a question, and sets answer to y or n depending on the user's answer
askYesNo() {
local question="$1"
local default="$2"
while true; do
askQuestion "$question" "$default"
if echo "$answer" | grep -qiE '^y(es)?$'; then
answer=y
return 1
elif echo "$answer" | grep -qiE '^no?$'; then
answer=n
return 0
fi
done
}
askOsUser() {
local stopIfEmpty=${1:-n}
local user=
while true; do
askQuestion "Enter name of user:" ""
user="$answer"
[ -z "$user" ] && [ "$stopIfEmpty" = y ] && break
userExists "$user" && break
echo "${CWARNING}User $user does not exist.$CEND"
askYesNo "Do you want to create user $user?" "No"
[ "$answer" = n ] && continue
echo "${CMSG}Creating user $user.$CEND"
if ! useradd -m -s /bin/sh "$user"; then
echo "${CWARNING}Could not create user $user.$CEND"
continue
fi
echo "${CMSG}Enter the user's password:$CEND"
if ! passwd "$user"; then
echo "${CWARNING}Failed to set password.$CEND"
continue
fi
userExists "$user" && break
done
answer="$user"
}
# Adds another user to USERS
addUser() {
local osUser="$1"
local webUser="$2"
local autodlPassword=
local webpass=
if [ "$INSTALL_RUTORRENT" = y ] || [ "$USE_RUTORRENT_PLUGIN" = y ]; then
if ! canGeneratePasswords; then
cat << EOF
$CQUESTION
The password makes sure only you can change your autodl-irssi settings. This is
NOT your login password. Use any password, but each user should use a unique
password. The password is used by the PHP code to access autodl-irssi settings.
You don't need to remember this password. It can't contain any spaces or a
colon ':'.$CEND
EOF
while true; do
askQuestion "Enter the autodl-irssi password (this is not your login password):" ""
autodlPassword="$answer"
isValidPassword "$autodlPassword" && break
echo "${CWARNING}Invalid password. Try again.$CEND"
done
fi
if [ "$RUTORRENT_PASSWORD_PROTECTED" = y ]; then
while true; do
askQuestion "Enter your ruTorrent password:" ""
webpass="$answer"
isValidPassword "$webpass" && break
echo "${CWARNING}Invalid password. Try again.$CEND"
done
fi
USERS="$USERS $osUser:$autodlPassword:$webUser:$webpass"
else
USERS="$USERS $osUser"
fi
}
installUser() {
local userPluginDir="$1"
local osUser="$2"
local webUser="${3:-$osUser}"
local port="$4"
local autodlPassword="$5"
getUserGroup "$osUser"
getUserDir "$osUser"
cat << EOF
========================= ${CGREEN}Installing autodl-irssi$CEND =========================
Use the ruTorrent plugin: $CGREEN$USE_RUTORRENT_PLUGIN$CEND
OS user: $CGREEN$osUser$CEND
EOF
if [ "$USE_RUTORRENT_PLUGIN" = y ]; then
[ "$RUTORRENT_PASSWORD_PROTECTED" = y ] && echo "ruTorrent user: $CGREEN$webUser$CEND"
echo "port: $CGREEN$port$CEND"
echo "password: $CGREEN$autodlPassword$CEND"
fi
cat << EOF
group: $CGREEN$group$CEND
home: $CGREEN$userDir$CEND
EOF
if [ "$USE_RUTORRENT_PLUGIN" = y ]; then
isValidPortNumber "$port" || errorExit "Invalid port number: $port"
isValidPassword "$autodlPassword" || errorExit "Invalid password: $autodlPassword"
isValidWebUser "$webUser" || errorExit "Invalid web user: $webUser"
fi
mkdir -p "$userDir/.irssi/scripts/autorun"
cd "$userDir/.irssi/scripts" || errorExit "Could not CD into user dir. Run the script as root."
echo "${CMSG}Downloading autodl-irssi.zip...$CEND"
if ! downloadFile autodl-irssi.zip "$AUTODL_IRSSI_ZIP_URL"; then
errorExit "Could not download autodl-irssi zip file"
fi
echo "${CMSG}Unpacking autodl-irssi...$CEND"
unzip -o autodl-irssi.zip > /dev/null || errorExit "Could not unpack autodl-irssi zip file"
rm -f autodl-irssi.zip
cp autodl-irssi.pl autorun/ || errorExit "Could not copy autodl-irssi.pl to Irssi autorun dir."
mkdir -p "$userDir/.autodl"
touch "$userDir/.autodl/autodl.cfg"
if ! [ -s "$userDir/.autodl/autodl.cfg" ]; then
[ "$INSTALL_RUTORRENT" = y ] && cat > "$userDir/.autodl/autodl.cfg" << EOF
[options]
upload-type = rtorrent
EOF
fi
if [ "$USE_RUTORRENT_PLUGIN" = y ]; then
if [ ! -d "$AUTODL_IRSSI_PLUGIN_DIR" ]; then
errorExit "The autodl-irssi ruTorrent plugin has not been installed. Install it."
fi
cat > "$userDir/.autodl/autodl2.cfg" << EOF
[options]
gui-server-port = $port
gui-server-password = $autodlPassword
EOF
rm -f "$AUTODL_IRSSI_PLUGIN_DIR/conf.php"
mkdir -p "$userPluginDir"
cat > "$userPluginDir/conf.php" << EOF
<?php
\$autodlPort = $port;
\$autodlPassword = "$autodlPassword";
?>
EOF
[ $? -eq 0 ] || errorExit "Could not write to $userPluginDir/conf.php. Run this script as root."
# Only set perms to 0400 if the code knows the owner (web server owner) and will reset it
[ "$ISROOT" = y ] && [ "$INSTALL_RUTORRENT" = y ] && chmod 0400 "$userPluginDir/conf.php"
else
# Don't use the autodl-irssi ruTorrent plugin
: > "$userDir/.autodl/autodl2.cfg"
fi
# The Perl module isn't loaded by default
if [ "$IRSSI_LOAD_PERL" = y ]; then
if [ ! -f "$userDir/.irssi/startup" ] || ! grep -q 'load perl' "$userDir/.irssi/startup"; then
echo "load perl" >> "$userDir/.irssi/startup"
fi
fi
# Make sure we redownload the tracker files since the ones in the zip file are possibly
# old versions.
local autodlStateFile="$userDir/.autodl/AutodlState.xml"
[ -f "$autodlStateFile" ] && sed_i 'g/<trackers-version>/d' "$autodlStateFile"
resetOwner "$osUser" "$userDir/.autodl" "$userDir/.irssi"
chmod 0700 "$userDir/.autodl" "$userDir/.irssi"
}
getRutorrentUserConfDir() {
userConfDir="$RUTORRENT_BASE_PATH/conf/users/$webUser"
}
getRutorrentUserShareDir() {
userShareDir="$RUTORRENT_BASE_PATH/share/users/$webUser"
}
resetRutorrentUserPermissions() {
for packedUser in $USERS; do
extractPackedUser $packedUser
getRutorrentUserConfDir
getRutorrentUserShareDir
# Make sure only the web server and the user itself can access its share/conf dirs
chown $osUser:$WWW_GROUP "$userShareDir" "$userConfDir"
chmod 0770 "$userShareDir" "$userConfDir"
done
}
############################################################################
#
# This is where we start
#
############################################################################
SELINUX_ENABLED=n
isProgramInstalled selinuxenabled && selinuxenabled && SELINUX_ENABLED=y
echo "SELinux enabled: $SELINUX_ENABLED"
ISROOT=n
[ $(id -u) -eq 0 ] && ISROOT=y
echo "Is root user: $ISROOT"
if [ $# -gt 0 ]; then
parseCommandLine "$@"
INTERACTIVE=n
else
INTERACTIVE=y
fi
detectOs
cat << EOF
Detected OS: $CGREEN$os_long$CEND
Type: $CGREEN$os$CEND
Type sh $0 --help for all command line options.
EOF
osHandler_$os init
if [ "$INTERACTIVE" = y ]; then
if [ "$ISROOT" = n ]; then
cat << EOF
$CRED
You're not the root user! This install script may fail if you're not the root
user. To start it as the root user do one of the following:
Ubuntu and Ubuntu clones:
${CGREEN}sudo sh $0$CRED
Any other OS:
${CGREEN}su
sh $0$CRED
$CEND
EOF
waitenter "Press Ctrl+C to exit or ENTER to continue..."
fi
cat << EOF
$CMSG
Press ENTER to use the default answer in [brackets].$CEND
EOF
webServers=
canInstallLighttpd && webServers="$webServers lighttpd"
canInstallNginx && webServers="$webServers nginx"
canInstallApache && webServers="$webServers apache"
if [ -n "$webServers" ]; then
cat << EOF
$CQUESTION
If you want to install ruTorrent you must install a web server, eg. Apache.
If you've already installed another web server, you must first uninstall it or
disable it. List of supported web servers:$CEND
EOF
canInstallLighttpd && echo " ${CGREEN}lighttpd$CEND ${CQUESTION}lighttpd web server (lightweight)$CEND"
canInstallNginx && echo " ${CGREEN}nginx$CEND ${CQUESTION}nginx web server (lightweight)$CEND"
canInstallApache && echo " ${CGREEN}apache$CEND ${CQUESTION}Apache web server$CEND"
echo " ${CGREEN}none$CEND ${CQUESTION}Don't install a web server$CEND"
while true; do
INSTALL_WEB_SERVER=
echo "${CQUESTION}Select one of:$CGREEN$webServers none$CEND"
askQuestion "Enter name of web server" "$(getFirst $webServers)"
[ "$answer" = none ] && break
INSTALL_WEB_SERVER="$answer"
arrayIsPresent $INSTALL_WEB_SERVER $webServers && break
done
if [ -n "$INSTALL_WEB_SERVER" ]; then
askYesNo "Do you want to install ruTorrent?" "Yes"
INSTALL_RUTORRENT="$answer"
else
INSTALL_RUTORRENT=n
fi
fi
if canInstallRtorrent; then
cat << EOF
$CQUESTION
ruTorrent requires a working rtorrent built with XML-RPC support.$CEND
EOF
askYesNo "Do you want to build rtorrent?" "Yes"
BUILD_RTORRENT="$answer"
fi
askYesNo "Do you want to install the autodl-irssi ruTorrent plugin?" "Yes"
USE_RUTORRENT_PLUGIN="$answer"
if [ "$INSTALL_RUTORRENT" = y ]; then
REINSTALL_RUTORRENT_PLUGIN=n
RUTORRENT_PASSWORD_PROTECTED=y
elif [ "$USE_RUTORRENT_PLUGIN" = y ]; then
echo ""
while true; do
echo "${CQUESTION}The ruTorrent www base path is where you installed ruTorrent.$CEND"
askQuestion "What is the ruTorrent www base path, eg. /var/www/rutorrent:" ""
RUTORRENT_BASE_PATH="$answer"
isValidRutorrentBasePath "$RUTORRENT_BASE_PATH" && break
echo "$CWARNING$RUTORRENT_BASE_PATH is not the ruTorrent base path.$CEND"
done
initPluginDirVar
if [ -d "$AUTODL_IRSSI_PLUGIN_DIR" ]; then
echo ""
askYesNo "The autodl-irssi ruTorrent plugin seems to be installed. Do you want to re-install it?" "No"
REINSTALL_RUTORRENT_PLUGIN="$answer"
else
REINSTALL_RUTORRENT_PLUGIN=n
fi
cat << EOF
$CQUESTION
To use more than one ruTorrent user, you must password protect ruTorrent.$CEND
EOF
askYesNo "Is ruTorrent password protected?" "No"
RUTORRENT_PASSWORD_PROTECTED="$answer"
else
RUTORRENT_PASSWORD_PROTECTED=n
fi
if [ "$USE_RUTORRENT_PLUGIN" = y ]; then
INSTALL_AUTODL_IRSSI=y
else
askYesNo "Do you want to install autodl-irssi?" "Yes"
INSTALL_AUTODL_IRSSI="$answer"
fi
if canInstallService && ([ "$INSTALL_AUTODL_IRSSI" = y ] || [ "$INSTALL_RUTORRENT" = y ]); then
cat << EOF
$CQUESTION
If you want to automatically start Irssi and rtorrent when the computer boots,
install the startup script.$CEND
EOF
askYesNo "Do you want to install the startup script?" "Yes"
INSTALL_STARTUP_SCRIPT="$answer"
fi
askUser=n
if [ "$USE_RUTORRENT_PLUGIN" = y ] || [ "$INSTALL_AUTODL_IRSSI" = y ] || \
[ "$INSTALL_STARTUP_SCRIPT" = y ] || [ "$INSTALL_RUTORRENT" = y ]; then
askUser=y
fi
if [ "$askUser" = y ]; then
if [ "$RUTORRENT_PASSWORD_PROTECTED" = n ]; then
cat << EOF
$CQUESTION
This is the user running rtorrent and/or Irssi.$CEND
${CWARNING}Don't use the root user. Use a normal user!$CEND
EOF
askOsUser
addUser "$answer" ""
else
while true; do
cat << EOF
$CQUESTION
===================== USER =====================
This is the user running rtorrent and/or Irssi.
${CWARNING}Don't use the root user. Use a normal user!$CEND
${CCYAN}Press ENTER to stop adding users.$CEND
EOF
askOsUser y
osUser="$answer"
[ -z "$osUser" ] && break
while true; do
cat << EOF
$CQUESTION
The ruTorrent user is the name you use to log in to ruTorrent.$CEND
EOF
askQuestion "Enter ruTorrent user:" "$osUser"
webUser="$answer"
isValidWebUser "$webUser" && break
echo "${CWARNING}Invalid web user name '$webUser'. Use only lower case letters."
done
addUser "$osUser" "$webUser"
done
fi
fi
if canInstallVsftpd; then
cat << EOF
$CQUESTION
vsftpd is a very secure FTP daemon.$CEND
EOF
askYesNo "Do you want to install vsftpd?" "Yes"
INSTALL_VSFTPD="$answer"
if [ "$INSTALL_VSFTPD" = y ]; then
askYesNo "Do you want to use encrypted FTP (FTPES)" "Yes"
USE_ENCRYPTED_FTP="$answer"
port=$DEFAULT_PORT_FTP
[ "$USE_ENCRYPTED_FTP" = y ] && port=$DEFAULT_PORT_FTPES
askQuestion "Enter FTP port number" "$port"
FTP_PORT="$answer"
fi
fi
if canInstallWebmin; then
cat << EOF
$CQUESTION
Webmin is a web-based administration tool for your OS.$CEND
EOF
askYesNo "Do you want to install Webmin?" "Yes"
INSTALL_WEBMIN="$answer"
fi
fi
cmdline="sh $0"
[ "$USE_RUTORRENT_PLUGIN" = y ] && cmdline="$cmdline -p"
[ "$REINSTALL_RUTORRENT_PLUGIN" = y ] && cmdline="$cmdline -i"
[ "$INSTALL_AUTODL_IRSSI" = y ] && cmdline="$cmdline -a"
for user in $USERS; do cmdline="$cmdline -u $user"; done
[ "$RUTORRENT_PASSWORD_PROTECTED" = y ] && cmdline="$cmdline -w"
[ -n "$RUTORRENT_BASE_PATH" ] && cmdline="$cmdline -r '$RUTORRENT_BASE_PATH'"
[ "$INSTALL_STARTUP_SCRIPT" = y ] && cmdline="$cmdline -s"
if [ -z "$INSTALL_WEB_SERVER" ]; then
:
elif [ "$INSTALL_WEB_SERVER" = apache ]; then
cmdline="$cmdline --apache"
elif [ "$INSTALL_WEB_SERVER" = nginx ]; then
cmdline="$cmdline --nginx"
elif [ "$INSTALL_WEB_SERVER" = lighttpd ]; then
cmdline="$cmdline --lighttpd"
else
errorExit "Invalid web server: $INSTALL_WEB_SERVER"
fi
[ "$BUILD_RTORRENT" = y ] && cmdline="$cmdline --rtorrent"
[ "$INSTALL_RUTORRENT" = y ] && cmdline="$cmdline --rutorrent"
[ "$INSTALL_VSFTPD" = y ] && cmdline="$cmdline --vsftpd"
[ -n "$FTP_PORT" ] && cmdline="$cmdline --ftp-port $FTP_PORT"
[ "$USE_ENCRYPTED_FTP" = y ] && cmdline="$cmdline --ftpes"
[ "$INSTALL_WEBMIN" = y ] && cmdline="$cmdline --webmin"
cat << EOF
You can execute this command as the root user (Ubuntu: use ${CRED}sudo$CEND):
$CGREEN$cmdline$CEND
Use the autodl-irssi ruTorrent plugin: $USE_RUTORRENT_PLUGIN
Re-install the autodl-irssi ruTorrent plugin: $REINSTALL_RUTORRENT_PLUGIN
Install autodl-irssi: $INSTALL_AUTODL_IRSSI
Users: $USERS
ruTorrent is password protected: $RUTORRENT_PASSWORD_PROTECTED
ruTorrent base path: $RUTORRENT_BASE_PATH
Install startup script: $INSTALL_STARTUP_SCRIPT
Install web server: $INSTALL_WEB_SERVER
Build rtorrent: $BUILD_RTORRENT
Install ruTorrent: $INSTALL_RUTORRENT
Install vsftpd: $INSTALL_VSFTPD
FTP port: $FTP_PORT
Use FTPES: $USE_ENCRYPTED_FTP
Install Webmin: $INSTALL_WEBMIN
EOF
if [ -n "$INSTALL_WEB_SERVER" ]; then
for port in $HTTP_PORT $HTTPS_PORT; do
isPortUsed $port || continue
cat << EOF
$CWARNING
Port $port is in use. If it's not used by $INSTALL_WEB_SERVER, you may need to disable or
uninstall that other web server before continuing.$CEND
EOF
done
fi
if [ "$INTERACTIVE" = y ]; then
echo ""
waitenter "Press Ctrl+C to cancel or ENTER to install."
fi
osHandler_$os init2
initUsers
initPluginDirVar
[ -n "$INSTALL_WEB_SERVER" ] || [ "$INSTALL_RUTORRENT" = y ] && RUTORRENT_PASSWORD_PROTECTED=y
[ "$INSTALL_RUTORRENT" = y ] && [ -z "$INSTALL_WEB_SERVER" ] && errorExit "You must install a web server if you want to install ruTorrent, eg. use --apache --rutorrent"
[ "$INSTALL_RUTORRENT" = y ] && REINSTALL_RUTORRENT_PLUGIN=n
[ "$BUILD_RTORRENT" = y ] && ! canInstallRtorrent && errorExit "Can't build rtorrent."
[ "$INSTALL_STARTUP_SCRIPT" = y ] && ! canInstallService && errorExit "Can't install startup script."
[ "$INSTALL_VSFTPD" = y ] && ! canInstallVsftpd && errorExit "Can't install vsftpd."
[ "$INSTALL_WEBMIN" = y ] && ! canInstallWebmin && errorExit "Can't install webmin."
if [ -z "$INSTALL_WEB_SERVER" ]; then
:
elif [ "$INSTALL_WEB_SERVER" = apache ]; then
canInstallApache || errorExit "Can't install Apache."
elif [ "$INSTALL_WEB_SERVER" = nginx ]; then
canInstallNginx || errorExit "Can't install nginx."
elif [ "$INSTALL_WEB_SERVER" = lighttpd ]; then
canInstallLighttpd || errorExit "Can't install lighttpd."
else
errorExit "Invalid web server: $INSTALL_WEB_SERVER"
fi
[ -n "$FTP_PORT" ] && [ "$FTP_PORT" -lt 1 -o "$FTP_PORT" -gt 65535 ] && errorExit "Invalid FTP port: $FTP_PORT"
if [ "$USE_RUTORRENT_PLUGIN" = y ]; then
if [ -z "$INSTALL_WEB_SERVER" ] && ! isValidRutorrentBasePath "$RUTORRENT_BASE_PATH"; then
errorExit "$RUTORRENT_BASE_PATH is not a valid ruTorrent base path."
fi
fi
if [ "$INSTALL_AUTODL_IRSSI" = y ]; then
cat << EOF
${CMSG}Installing required tools and Perl modules...
Some Perl modules may not be present, but will be installed from CPAN.$CEND
EOF
else
echo "${CMSG}Installing required tools...$CEND"
fi
osHandler_$os installTools
setSvnOpts
[ "$INSTALL_AUTODL_IRSSI" = y ] && osHandler_$os installAutodlTools
verifyInstalledPrograms
[ "$INSTALL_AUTODL_IRSSI" = y ] && installMissingPerlModules
cat << EOF
$CMSG
All required programs and Perl modules are now installed. Ignore any errors you
saw.$CEND
EOF
INSTALLED_RTORRENT=n
if [ "$BUILD_RTORRENT" = y ]; then
cat << EOF
$CMSG
Building rtorrent and dependencies...$CEND
EOF
installRtorrent
INSTALLED_RTORRENT=y
fi
if [ -z "$INSTALL_WEB_SERVER" ]; then
:
elif [ "$INSTALL_WEB_SERVER" = apache ]; then
echo ""
echo "${CMSG}Installing Apache$CEND"
osHandler_$os installApache
installUnrar
elif [ "$INSTALL_WEB_SERVER" = nginx ]; then
echo ""
echo "${CMSG}Installing nginx$CEND"
installNginx
elif [ "$INSTALL_WEB_SERVER" = lighttpd ]; then
echo ""
echo "${CMSG}Installing lighttpd$CEND"
installLighttpd
else
errorExit "Invalid web server: $INSTALL_WEB_SERVER"
fi
if [ "$USE_RUTORRENT_PLUGIN" = y ]; then
if isProgramInstalled php; then
installMissingPhpModules
else
cat << EOF
$CWARNING
Could not find the php executable. PHP is not installed or the PHP CLI version
is not installed. The autodl-irssi ruTorrent plugin requires the following PHP
modules:
$CGREEN$REQUIRED_PHP_MODULES$CWARNING
They're normally installed and enabled by default. If not you will need to
install them (if needed) and then enable each one in php.ini, eg.
extension=MODULE.so and then restart your web server.$CEND
EOF
fi
fi
if [ "$INSTALL_RUTORRENT" = y ]; then
isProgramInstalled php || errorExit "php is not installed!"
verifyWebServerVars
echo ""
echo "${CMSG}Installing ruTorrent$CEND"
[ -d "$WWW_ROOT" ] || errorExit "Invalid web root: '$WWW_ROOT' (does not exist)"
RUTORRENT_DIRNAME=rutorrent
[ -f "$WWW_ROOT/index.html" ] || cat > "$WWW_ROOT/index.html" << EOF
<html><head><title>Root page</title></head><body>
<a href="$RUTORRENT_DIRNAME/">ruTorrent</a>
</body></html>
EOF
cd "$WWW_ROOT"
rm -rf "$RUTORRENT_DIRNAME"
tmpName=rutorrent-tmp
rm -rf $tmpName
if ! svn co $SVN_OPTS "$RUTORRENT_TRUNK_DIR" $tmpName >/dev/null; then
# Subversion failed. Try the official tar balls
mkdir -p $tmpName
cd $tmpName
downloadFile "$RUTORRENT_CORE_NAME" "$RUTORRENT_CORE_URL" "$RUTORRENT_CORE_URL2" || errorExit "Could not download ruTorrent."
downloadFile "$RUTORRENT_PLUGINS_NAME" "$RUTORRENT_PLUGINS_URL" "$RUTORRENT_PLUGINS_URL2" || errorExit "Could not download ruTorrent plugins."
for name in "$RUTORRENT_CORE_NAME" "$RUTORRENT_PLUGINS_NAME"; do
tar xzf "$name" || errorExit "Could not unpack $name"
rm -f "$name"
done
cd ..
fi
cd $tmpName
RUTORRENT_BASE_PATH="$WWW_ROOT/$RUTORRENT_DIRNAME"
initPluginDirVar
mv rutorrent/ "$RUTORRENT_BASE_PATH"
mkdir -p "$RUTORRENT_BASE_PATH/plugins"
for plugin in $RUTORRENT_PLUGINS; do
if [ -d "plugins/$plugin/" ]; then
echo "${CMSG}Installing ruTorrent plugin: $plugin$CEND..."
mv plugins/$plugin/ "$RUTORRENT_BASE_PATH/plugins/" || errorExit "Could not install plugin '$plugin'."
else
echo "${CWARNING}Can't install missing plugin $plugin!$CEND"
fi
done
cd ..
rm -rf $tmpName
cp "$RUTORRENT_BASE_PATH/favicon.ico" "$WWW_ROOT"
i=1
touch "$WWW_PASSWORD_FILE"
resetAuthPasswordFilePermissions
detectHtpasswd
for packedUser in $USERS; do
extractPackedUser $packedUser
getRutorrentUserConfDir
getRutorrentUserShareDir
getUserScgiSocketPath "$osUser"
getRtorrentDirs "$osUser"
# Create user's ruTorrent config.php
rpcMount="$(getUserRpcMount $i)"
mkdir -p "$userConfDir"
rutConfigFile="$userConfDir/config.php"
if [ "$SCGI_USE_UNIX_DOMAIN_SOCKET" = y ]; then
cat > "$rutConfigFile" << EOF
<?php
\$scgi_port = 0;
\$scgi_host = "unix://$scgiSocketPath";
\$XMLRPCMountPoint = "$rpcMount";
?>
EOF
exitCode=$?
else
cat > "$rutConfigFile" << EOF
<?php
\$scgi_port = $scgiPort;
\$scgi_host = "$SCGI_HOST";
\$XMLRPCMountPoint = "$rpcMount";
?>
EOF
exitCode=$?
fi
[ $exitCode -eq 0 ] || errorExit "Could not write to file $rutConfigFile"
# Create user's directory to prevent certain errors the first time ruTorrent is started
mkdir -p "$userShareDir/settings"
mkdir -p "$userShareDir/torrents"
chmod 0777 "$userShareDir/settings" "$userShareDir/torrents"
# Setup rtorrent
mkdir -p "$RTORRENT_DOWNLOAD_DIR"
mkdir -p "$RTORRENT_WATCH_DIR"
mkdir -p "$RTORRENT_SESSION_DIR"
rtorrentRc="$userDir/.rtorrent.rc"
[ -f "$rtorrentRc" ] && mv -f "$rtorrentRc" "$rtorrentRc-backup"
cat > "$rtorrentRc" << EOF
$(if [ "$SCGI_USE_UNIX_DOMAIN_SOCKET" = y ]; then
cat << EOF2
execute = {sh,-c,rm -f $scgiSocketPath}
scgi_local = $scgiSocketPath
execute = {sh,-c,chmod 0666 $scgiSocketPath}
EOF2
else
echo "scgi_port = $SCGI_HOST:$scgiPort"
fi)
encoding_list = UTF-8
system.umask.set = $DEFAULT_UMASK
port_range = $rtorrentPort-$rtorrentPort
port_random = no
check_hash = no
directory = $RTORRENT_DOWNLOAD_DIR
session = $RTORRENT_SESSION_DIR
encryption = allow_incoming, try_outgoing, enable_retry
schedule = watch_directory,1,1,"load_start=$RTORRENT_WATCH_DIR/*.torrent"
#schedule = untied_directory,5,5,"stop_untied=$RTORRENT_WATCH_DIR/*.torrent"
trackers.enable = 1
#min_peers = 40
#max_peers = 100
#min_peers_seed = 10
#max_peers_seed = 50
#max_uploads = 15
#download_rate = 0
#upload_rate = 0
use_udp_trackers = yes
dht = auto
dht_port = 6881
peer_exchange = yes
#hash_read_ahead = 10
#hash_interval = 100
#hash_max_tries = 10
EOF
PHP_BIN_PATH=$(which php 2> /dev/null)
COMMENT=
[ -x "$PHP_BIN_PATH" ] || COMMENT="#" PHP_BIN_PATH=/path/to/php
cat >> "$rtorrentRc" << EOF
${COMMENT}execute = {sh,-c,$PHP_BIN_PATH $RUTORRENT_BASE_PATH/php/initplugins.php $webUser &}
EOF
# Add user to web server's password file
sed_i "g/^$webUser:/d" "$WWW_PASSWORD_FILE"
$htpasswd -b "$WWW_PASSWORD_FILE" "$webUser" "$webPass" || errorExit "Could not add user to password file"
resetAuthPasswordFilePermissions
resetOwner "$osUser" "$rtorrentRc" "$userDir" "$RTORRENT_DOWNLOAD_DIR" "$RTORRENT_WATCH_DIR" "$RTORRENT_SESSION_DIR"
# Required so some ruTorrent plugins work, eg. _getdir
chmod 0755 "$userDir"
# Protect some dirs and files, giving only the user and the web server
# access. We need to do this since we set perms to 0755 above, or if
# the perms already were 0755 to begin with.
if [ -n "$WWW_GROUP" ]; then
chmod 0600 "$rtorrentRc"
for dir in $RTORRENT_REL_DOWNLOAD_DIR $RTORRENT_REL_WATCH_DIR $RTORRENT_REL_SESSION_DIR; do
chown $osUser:$WWW_GROUP "$userDir/$dir"
chmod 0770 "$userDir/$dir"
done
fi
i=$(expr $i + 1)
done
[ "$CREATE_ONE_PASSWORD_FILE_PER_USER" = y ] && createOnePasswordFilePerUser
fi
if [ "$USE_RUTORRENT_PLUGIN" = y ]; then
[ -z "$RUTORRENT_BASE_PATH" ] && errorExit "Invalid ruTorrent base path."
[ "$REINSTALL_RUTORRENT_PLUGIN" = y ] && rm -rf "$AUTODL_IRSSI_PLUGIN_DIR"
mkdir -p "$RUTORRENT_BASE_PATH/plugins"
cd "$RUTORRENT_BASE_PATH/plugins"
if [ -d "$AUTODL_IRSSI_PLUGIN_DIR" ]; then
echo "${CMSG}The autodl-irssi ruTorrent plugin dir already exists. Updating it...$CEND"
cd "$AUTODL_IRSSI_PLUGIN_DIR"
if ! svn up $SVN_OPTS > /dev/null; then
errorExit "Could not update the autodl-irssi ruTorrent plugin. Run the script as root."
fi
else
echo "${CMSG}Downloading the autodl-irssi ruTorrent plugin...$CEND"
if ! git clone "$GIT_PATH_RUTORRENT_PLUGIN" autodl-irssi > /dev/null; then
errorExit "Could not check out the autodl-irssi ruTorrent plugin"
fi
fi
fi
if [ "$INSTALL_AUTODL_IRSSI" = y ]; then
if [ "$RUTORRENT_PASSWORD_PROTECTED" = y ]; then
for packedUser in $USERS; do
extractPackedUser $packedUser
installUser "$RUTORRENT_BASE_PATH/conf/users/$webUser/plugins/autodl-irssi" "$osUser" "$webUser" "$autodlPort" "$autodlPassword"
done
else
for packedUser in $USERS; do
extractPackedUser $packedUser
installUser "$AUTODL_IRSSI_PLUGIN_DIR" "$osUser" "$webUser" "$autodlPort" "$autodlPassword"
[ "$USE_RUTORRENT_PLUGIN" = y ] && break
done
fi
fi
if [ "$INSTALL_RUTORRENT" = y ]; then
verifyWebServerVars
resetWebServerPermissions
resetRutorrentUserPermissions
# Restart it just in case we enabled/installed PHP modules.
osHandler_$os restart_$INSTALL_WEB_SERVER
fi
if [ "$INSTALL_VSFTPD" = y ]; then
echo "${CMSG}Installing vsftpd...$CEND"
osHandler_$os installVsftpd
fi
if [ "$INSTALL_WEBMIN" = y ]; then
cd
rm -rf webmin-*/ webmin*.tar.gz
if ! downloadFile webmin.tar.gz "$WEBMIN_URL"; then
errorExit "Could not download Webmin."
fi
tar xzf webmin.tar.gz
rm -f webmin.tar.gz
cd webmin-*/ || errorExit "Could not CD to webmin dir"
osHandler_$os preWebminInstall
[ -x "setup.sh" ] || errorExit "Missing Webmin setup.sh file or not executable."
cat << EOF
$CMSG
Starting Webmin installer. Use another port than 10000, enable SSL, start webmin
at boot, and use a strong admin password.$CEND
$CWARNING
When it asks you if it should use SSL and whether it should start at boot,
type y.$CEND
EOF
./setup.sh /usr/local/webmin
osHandler_$os postWebminInstall
cd
rm -rf webmin-*/
fi
if [ "$INSTALL_RUTORRENT" = y ]; then
# Some plugins will fail unless they can write to the /tmp directory
# We MUST do this AFTER installing Webmin since it will reset the perms!
chmod 1777 /tmp
fi
if [ "$INSTALL_STARTUP_SCRIPT" = y ]; then
for packedUser in $USERS; do
extractPackedUser $packedUser
echo "${CMSG}Installing service for user $osUser.$CEND"
osHandler_$os installAutodlService $osUser
done
fi
echo ""
echo "${CGREEN}================================= DONE =================================$CEND"
[ "$INSTALLED_RTORRENT" = y ] && echo "${CDGREEN}[+]$CEND ${CGREEN}Built and installed rtorrent with XML-RPC support$CEND"
[ -n "$INSTALL_WEB_SERVER" ] && echo "${CDGREEN}[+]$CEND ${CGREEN}Installed and configured web server ($INSTALL_WEB_SERVER)$CEND"
[ "$INSTALL_VSFTPD" = y ] && echo "${CDGREEN}[+]$CEND ${CGREEN}Installed and configured FTP server (vsftpd)$CEND"
[ "$INSTALL_RUTORRENT" = y ] && echo "${CDGREEN}[+]$CEND ${CGREEN}Installed ruTorrent$CEND"
[ "$USE_RUTORRENT_PLUGIN" = y ] && echo "${CDGREEN}[+]$CEND ${CGREEN}Installed/updated the autodl-irssi ruTorrent plugin$CEND"
[ "$INSTALL_AUTODL_IRSSI" = y ] && echo "${CDGREEN}[+]$CEND ${CGREEN}Installed autodl-irssi$CEND"
[ "$INSTALL_STARTUP_SCRIPT" = y ] && echo "${CDGREEN}[+]$CEND ${CGREEN}Installed and started Irssi and rtorrent service$CEND"
[ "$INSTALL_WEBMIN" = y ] && echo "${CDGREEN}[+]$CEND ${CGREEN}Installed Webmin$CEND"
if [ "$INSTALL_RUTORRENT" = y ]; then
getIpAddress
cat << EOF
${CMSG}ruTorrent URLs.$CEND ${CWARNING}Verify that the IP address below is correct!$CEND
${CMAGENTA}http://$OUR_IP_ADDRESS/$RUTORRENT_DIRNAME/$CEND
${CMAGENTA}https://$OUR_IP_ADDRESS/$RUTORRENT_DIRNAME/$CEND
EOF
fi
if [ "$INSTALL_RUTORRENT" = y ]; then
cat << EOF
${CMSG}rtorrent directories$CEND:
EOF
for packedUser in $USERS; do
extractPackedUser $packedUser
getRtorrentDirs "$osUser"
cat << EOF
${CMSG}User $CGREEN$osUser$CEND:
${CGREEN}Downloads$CEND : $CMAGENTA$RTORRENT_DOWNLOAD_DIR$CEND
${CGREEN}Watch dir$CEND : $CMAGENTA$RTORRENT_WATCH_DIR$CEND
${CGREEN}Session dir$CEND : $CMAGENTA$RTORRENT_SESSION_DIR$CEND
${CGREEN}rtorrent port$CEND: $CMAGENTA$rtorrentPort$CEND
EOF
done
fi
if [ -n "$INSTALL_WEB_SERVER" ]; then
cat << EOF
${CMSG}Web server info$CEND:
${CGREEN}Web server root$CEND: ${CMAGENTA}$WWW_ROOT$CEND
${CGREEN}ruTorrent dir$CEND : ${CMAGENTA}$RUTORRENT_BASE_PATH$CEND
EOF
fi
if [ "$INSTALL_VSFTPD" = y ]; then
getIpAddress
cat << EOF
$CMSG
To log in to the FTP server, use your $(uname -s) login name and password. I
guessed the IP address below. Make sure it's correct.$CEND
${CGREEN}FTP IP address$CEND: ${CMAGENTA}$OUR_IP_ADDRESS$CEND
${CGREEN}FTP port$CEND: ${CMAGENTA}$FTP_PORT$CEND
${CGREEN}FTP server type$CEND: $CMAGENTA$FTP_SERVER_TYPE$CEND
EOF
fi
if [ "$INSTALL_WEBMIN" = y ]; then
getIpAddress
WEBMIN_PORT=
WEBMIN_SSL=
WEBMIN_NAME=
WEBMIN_CONFIG=/etc/webmin/miniserv.conf
WEBMIN_USERS=/etc/webmin/miniserv.users
if [ -f $WEBMIN_CONFIG ]; then
WEBMIN_PORT=$(grep '^port=' $WEBMIN_CONFIG | tail -n1 | sed -e 's/^port=\([0-9]*\).*/\1/')
WEBMIN_SSL=$(grep '^ssl=' $WEBMIN_CONFIG | tail -n1 | sed -e 's/^ssl=\([0-9]*\).*/\1/')
WEBMIN_NAME=$(head -n1 $WEBMIN_USERS | cut -d: -f1)
fi
WEBMIN_PORT=${WEBMIN_PORT:-UNKNOWN}
WEBMIN_NAME=${WEBMIN_NAME:-UNKNOWN}
cat << EOF
$CMSG
Webmin was installed. Port is $WEBMIN_PORT and the user is $WEBMIN_NAME.
${CRED}Verify the IP address below.$CEND
EOF
if [ -z "$WEBMIN_SSL" ]; then
echo " ${CMAGENTA}http://$OUR_IP_ADDRESS:$WEBMIN_PORT/$CEND"
echo "${CMSG}or:$CEND"
echo " ${CMAGENTA}https://$OUR_IP_ADDRESS:$WEBMIN_PORT/$CEND"
elif [ "$WEBMIN_SSL" = 0 ]; then
echo " ${CMAGENTA}http://$OUR_IP_ADDRESS:$WEBMIN_PORT/$CEND"
else
echo " ${CMAGENTA}https://$OUR_IP_ADDRESS:$WEBMIN_PORT/$CEND"
fi
fi
if [ -n "$INSTALL_WEB_SERVER" ] || [ "$INSTALL_VSFTPD" = y ] || \
[ "$INSTALL_RUTORRENT" = y ] || [ "$USE_RUTORRENT_PLUGIN" = y ]; then
if [ "$SELINUX_ENABLED" = y ]; then
cat << EOF
$CWARNING
SELinux is enabled. It could cause some problems with the web server, vsftpd or
ruTorrent.
EOF
fi
fi
if [ "$CREATED_CERT_FILE" = y ]; then
cat << EOF
$CWARNING
A self-signed certificate was created. Your browser or FTP client will most
likely warn you about a non-trusted certificate.$CEND
EOF
fi
if [ "$USE_RUTORRENT_PLUGIN" = y ]; then
if isProgramInstalled php; then
detectMissingPhpModules
if [ -n "$MISSING_PHP_MODULES" ]; then
cat << EOF
$CWARNING
The following PHP modules seem to be missing. It's possible that the
autodl-irssi ruTorrent plugin won't work. Missing PHP modules:
$MISSING_PHP_MODULES$CEND
EOF
fi
else
cat << EOF
$CWARNING
Could not find the php executable. Make sure the following PHP modules are
enabled or the autodl-irssi ruTorrent plugin won't work:
$REQUIRED_PHP_MODULES$CEND
EOF
fi
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment