#!/bin/bash ###################################################################### # # Copyright (c) 2015 arakasi72 (https://github.com/arakasi72) # # --> Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php # ###################################################################### PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/bin:/sbin passfile='/etc/nginx/.htpasswd' scgi_port_start=5000 rpc_start=2 rtport_start=51001 sshport=$(grep 'Port ' /etc/ssh/sshd_config | sed 's/[^0-9]*//g') ftpport=$(grep 'listen_port=' /etc/vsftpd.conf | sed 's/[^0-9]*//g') cronline1="@reboot sleep 10; /usr/local/bin/rtcheck irssi rtorrent" cronline2="*/10 * * * * /usr/local/bin/rtcheck irssi rtorrent" SERVERIP=$(ip a s eth0 | awk '/inet / {print$2}' | cut -d/ -f1) #get user list cd /var/www/rutorrent/conf/users user_list=* genpasswd() { local genln=$1 [ -z "$genln" ] && genln=8 tr -dc A-Za-z0-9 < /dev/urandom | head -c ${genln} | xargs } random() { local min=$1 local max=$2 local RAND=`od -t uI -N 4 /dev/urandom | awk '{print $2}'` RAND=$((RAND%((($max-$min)+1))+$min)) echo $RAND } find_port() { local port_count=$1 local port_type=$2 local no_match=1 while ! [ $no_match = 0 ] do if [ "$port_type" = "adl" ]; then port_count=$(random 34000 39000) else port_count=$(( $port_count + 1 )) fi for i in $user_list do current_user=$i current_port=$(grep $port_type /var/www/rutorrent/conf/users/$current_user/config.php | sed 's/[^0-9]*//g') if [ "$current_port" = "$port_count" ]; then no_match=1 break else no_match=0 fi done done echo $port_count } find_range() { local low_count=$1 local high_count=$(( $low_count +249 )) local no_match=1 local higher=0 while ! [ $no_match = 0 ] do low_count=$(( $low_count + 250 )) high_count=$(( $high_count + 250 )) for i in $user_list do base_user=$i base_low=$(grep "port_range =" /home/$base_user/.rtorrent.rc | sed 's/[^0-9-]*//g' | cut -d- -f1) base_high=$(grep "port_range =" /home/$base_user/.rtorrent.rc | sed 's/[^0-9-]*//g' | cut -d- -f2) if [ $low_count -gt $base_high ]; then no_match=0 higher=0 elif [ $high_count -lt $base_low ]; then no_match=0 higher=1 else no_match=1 break fi for n in $user_list do compare_user=$n if [ $no_match=1 ]; then break fi if ! [ $base_user = $compare_user ]; then compare_low=$(grep "port_range =" /home/$compare_user/.rtorrent.rc | sed 's/[^0-9-]*//g' | cut -d- -f1) compare_high=$(grep "port_range =" /home/$compare_user/.rtorrent.rc | sed 's/[^0-9-]*//g' | cut -d- -f2) if [ $higher = 0 ]; then if [ $base_low -gt $compare_high ]; then no_match=0 elif [ $high_count -lt $compare_low ]; then no_match=0 elif [ $compare_low -gt $base_high ] && [ $compare_high -lt $count_low ]; then no_match=0 else no_match=1 break fi fi if [ $higher = 1 ]; then if [ $base_high -lt $compare_low ]; then no_match=0 elif [ $low_count -gt $compare_high ]; then no_match=0 elif [ $compare_high -lt $base_low -a $compare_low -gt $count_high ]; then no_match=0 else no_match=1 break fi fi fi done done done echo "$low_count-$high_count" } # set and prepare user if [ -z "$SUDO_USER" -a "$LOGNAME" != "root" ]; then echo "Must be run from root or using sudo" && exit 1 fi echo "Enter the name of the user to add" echo "It can be an existing user or a new user" echo confirm_name=1 while [ $confirm_name = 1 ] do read -p "Enter user name: " answer addname=$answer check_name=1 if [ "$addname" = "root" ]; then echo "Cannot create root" exit fi while [ $check_name = 1 ] do read -p "Is $addname correct? " answer case $answer in [Yy]* ) confirm_name=0 && check_name=0 ;; [Nn]* ) confirm_name=1 && check_name=0 ;; * ) echo "Enter y or n";; esac done done user=$addname home="/home/$user" if id -u $user >/dev/null 2>&1; then echo "$user already exists" else echo "adding $user" adduser --gecos "" $user fi if [ -d "/var/www/rutorrent/conf/users/$user" ]; then echo "Will reset $user config, filters and torrents will not be deleted" fi check_ssh=1 if groups $user | grep -q -E ' sshuser(\s|$)' || groups $user | grep -q -E ' sudo(\s|$)'; then echo "ssh already granted" check_ssh=0 fi while [ $check_ssh = 1 ] do read -p "Grant $user ssh access? " answer case $answer in [Yy]* ) sshaccess=0 check_ssh=0 ;; [Nn]* ) sshaccess=1 check_ssh=0 ;; * ) echo "Enter y or n";; esac done if [ "$sshaccess" = "0" ]; then groupadd sshuser allowlist=$(grep AllowUsers /etc/ssh/sshd_config) if ! [ -z "$allowlist" ]; then for ssh_user in $allowlist do if ! [ "$ssh_user" = "AllowUsers" ]; then adduser $ssh_user sshuser fi done perl -pi -e "s/$allowlist//g" /etc/ssh/sshd_config service ssh restart fi groupslist=$(grep AllowGroups /etc/ssh/sshd_config) echo $groupslist if [ -z "$groupslist" ]; then echo "AllowGroups sudo sshuser" | tee -a /etc/ssh/sshd_config > /dev/null service ssh restart fi if [ -z "$(groups $user | grep "sshuser")" ]; then adduser $user sshuser fi fi rtgetscripts if [ "$user" = "$SUDO_USER" ]; then echo "Will reset $user config, autodl filters and torrents will not be deleted" rtgetscripts /var/www/rutorrent/conf/config.php ru.config fi #remove existing directory if there if [ -d "/var/www/rutorrent/conf/users/$user" ]; then rm -r /var/www/rutorrent/conf/users/$user fi #assign ports newscgi=$(find_port $scgi_port_start scgi) newrpc=$(find_port $rpc_start RPC) adlport=$(find_port $(random 34000 39000) adl) adlpass=$(genpasswd $(random 12 16)) newrange=$(find_range $rtport_start) #add directories and config files mkdir /var/www/rutorrent/conf/users/$user mkdir /var/www/rutorrent/conf/users/$user/plugins if ! [ -d "$home/rtorrent" ]; then mkdir $home/rtorrent fi if ! [ -d "$home/rtorrent/.session" ]; then mkdir $home/rtorrent/.session fi if ! [ -d "$home/rtorrent/downloads" ]; then mkdir $home/rtorrent/downloads fi if ! [ -d "$home/rtorrent/watch" ]; then mkdir $home/rtorrent/watch fi WEBPASS=$(genpasswd) htpasswd -b $passfile $user $WEBPASS rtgetscripts $home/.rtorrent.rc sed -i "s//$user/g" $home/.rtorrent.rc sed -i "s/port_range = 51001-51250/port_range = $newrange/g" $home/.rtorrent.rc sed -i "s/network\.scgi\.open_port = 127\.0\.0\.1:5000/network\.scgi\.open_port = 127\.0\.0\.1:$newscgi/g" $home/.rtorrent.rc echo " /var/www/rutorrent/conf/users/$user/config.php echo >> /var/www/rutorrent/conf/users/$user/config.php echo "\$topDirectory = '$home';" >> /var/www/rutorrent/conf/users/$user/config.php echo "\$scgi_port = $newscgi;" >> /var/www/rutorrent/conf/users/$user/config.php echo "\$XMLRPCMountPoint = \"/RPC$newrpc\";" >> /var/www/rutorrent/conf/users/$user/config.php echo >> /var/www/rutorrent/conf/users/$user/config.php echo "?>" >> /var/www/rutorrent/conf/users/$user/config.php #add auto-dl mkdir /var/www/rutorrent/conf/users/$user/plugins/autodl-irssi mkdir -p $home/.irssi/scripts/autorun cd $home/.irssi/scripts curl -sL http://git.io/vlcND | grep -Po '(?<="browser_download_url": ")(.*-v[\d.]+.zip)' | xargs wget --quiet -O autodl-irssi.zip unzip -o autodl-irssi.zip >> /dev/null 2>&1 rm autodl-irssi.zip cp autodl-irssi.pl autorun/ mkdir -p $home/.autodl touch $home/.autodl/autodl.cfg && touch $home/.autodl/autodl2.cfg echo " /var/www/rutorrent/conf/users/$user/plugins/autodl-irssi/conf.php echo >> /var/www/rutorrent/conf/users/$user/plugins/autodl-irssi/conf.php echo "\$autodlPort = $adlport;" >> /var/www/rutorrent/conf/users/$user/plugins/autodl-irssi/conf.php echo "\$autodlPassword = \"$adlpass\";" >> /var/www/rutorrent/conf/users/$user/plugins/autodl-irssi/conf.php echo >> /var/www/rutorrent/conf/users/$user/plugins/autodl-irssi/conf.php echo "?>" >> /var/www/rutorrent/conf/users/$user/plugins/autodl-irssi/conf.php cd $home/.autodl echo "[options]" > autodl2.cfg echo "gui-server-port = $adlport" >> autodl2.cfg echo "gui-server-password = $adlpass" >> autodl2.cfg chown -R $user:$user $home chown -R www-data:www-data /var/www/rutorrent chmod -R 755 /var/www/rutorrent if [ -z "$(crontab -u $user -l | grep "$cronline1")" ]; then (crontab -u $user -l; echo "$cronline1" ) | crontab -u $user - fi if [ -z "$(crontab -u $user -l | grep "\*/10 \* \* \* \* /usr/local/bin/rtcheck irssi rtorrent")" ]; then (crontab -u $user -l; echo "$cronline2" ) | crontab -u $user - fi su $user -c '/usr/local/bin/rt restart' su $user -c '/usr/local/bin/rt -i restart' dload_line=$(grep "include /etc/nginx/conf.d/rtdload;" /etc/nginx/sites-available/default) dload_hash=$(echo $dload_line | sed 's/[^#]*//g') if [ ! -z "$dload_line" -a -z "$dload_hash" ]; then dload_flag=0 else dload_flag=1 fi echo "$user setup complete" echo "SCGI Port: $newscgi" echo "RPC Mount: $newrpc" echo "rtorrent port range $newrange" echo "autodl port: $adlport" echo "autodl pass: $adlpass" echo "crontab entries made, rtorrent and irssi will start on boot" echo if groups $user | grep -q -E ' sshuser(\s|$)' || groups $user | grep -q -E ' sudo(\s|$)'; then echo "$user has SSH access on port $sshport" | tee -a $home/rtinst.info echo fi echo "ftp client should be set to explicit ftp over tls using port $ftpport" | tee -a $home/rtinst.info echo if [ $dload_flag = 0 ]; then echo "https downloads can be accessed at https://$SERVERIP/download/$user" | tee -a $home/rtinst.info echo fi echo "rutorrent can be accessed at https://$SERVERIP/rutorrent" | tee -a $home/rtinst.info echo "rutorrent password set to $WEBPASS" | tee -a $home/rtinst.info echo "to change rutorrent password enter: rtpass" | tee -a $home/rtinst.info echo echo "The above info is stored at $home/rtinst.info" chown $user:$user $home/rtinst.info