#!/bin/bash # 3proxy build and install script for Debian Linux # Release 2.0 at 29.12.2016 # (с) Evgeniy Solovyev # mail-to: eugen-soloviov@yandex.ru ScriptPath="" Src3proxyDirPath="" ScriptName="" ScriptFullName="" SourceRoot="" ResourcesData="" ProxyVersion="" LasestProxyVersion="" LasestProxyVersionLink="" UseSudo=0 PacketFiles="" NeedSourceUpdate=0 main() { local msgNewVersion local msgInsertYorN VarsInit LoadResources CheckRunConditions if [ $UseSudo == 1 ] then sudo bash "${0}" exit $? fi CheckLocation GetLasestVersionInfo SourceDownloadOrUpdate cd "${SourceRoot}" Build3Proxy BinInstall ManInstall CreateLogDir CopyConfig SetInit Pack3proxyFiles } VarsInit() { cd `dirname $0` ScriptPath="${PWD}" ScriptName=`basename $0` ScriptFullName="${ScriptPath}/${ScriptName}" } CheckLocation() { Src3proxyDirPath="${ScriptPath}" if echo ${ScriptPath} | grep -e "/scripts$" then if [ -e "../src/version.h" ] then ProxyVersion=`cat "../src/version.h" | awk '/VERSION/ { gsub("\"", "\n"); print; exit }' | grep "3proxy"` cd ../ SourceRoot="${PWD}" cd ../ Src3proxyDirPath="${PWD}" cd "${ScriptPath}" fi fi } GetLasestVersionInfo() { local Githublink local msg Githublink=`wget https://github.com/3proxy/3proxy/releases/latest -O /dev/stdout | awk '/ "${ConfigDir}/3proxy.cfg" PacketFiles=`echo -e "${PacketFiles}\n${ConfigDir}/3proxy.cfg"` } SetInit() { LoadGlobalResource "InitScript" > "/etc/init.d/3proxy" chown root:root "/etc/init.d/3proxy" chmod 755 "/etc/init.d/3proxy" PacketFiles=`echo -e "${PacketFiles}\n/etc/init.d/3proxy"` update-rc.d 3proxy defaults } Pack3proxyFiles() { local CPU_Arc CPU_Arc=`uname -m` cd ../ tar -czPpvf "${ProxyVersion}-${CPU_Arc}.tar.gz" $PacketFiles } LoadResources() { local StartRow local EndRow local LngLabel local msgResourceErr="\aError! Script could not find resources!" if env | grep -q 'LANG=ru_RU.UTF-8' then LngLabel="RU" #LngLabel="EN" else LngLabel="EN" fi StartRow=`cat "${ScriptFullName}" | awk "/^#Resources_${LngLabel}/ { print NR; exit}"` if [ -z "${StartRow}" ] then echo -e "${msgResourceErr}" exit 255 fi EndRow=`cat "${ScriptFullName}" | awk "NR > ${StartRow} && /^#Resources_${LngLabel}_end/ { print NR; exit}"` if [ -z "${EndRow}" ] then echo -e "${msgResourceErr}" exit 255 fi ResourcesData=`cat "${ScriptFullName}" | awk -v StartRow="${StartRow}" -v EndRow="${EndRow}" 'NR > StartRow && NR < EndRow { print $0 }'` } # $1 - Name of Resource GetResource() { local StartRow local EndRow local msgResourceErr="\aError! Script could not find resource \"${1}\"!" StartRow=`echo "${ResourcesData}" | awk "/^#Resource=${1}/ { print NR; exit}"` if [ -z "${StartRow}" ] then echo -e "${msgResourceErr}" > /dev/stderr exit 255 fi EndRow=`echo "${ResourcesData}" | awk "NR > ${StartRow} && /^#endResource=${1}/ { print NR; exit}"` if [ -z "${EndRow}" ] then echo -e "${msgResourceErr}" > /dev/stderr exit 255 fi echo "${ResourcesData}" | awk -v StartRow="${StartRow}" -v EndRow="${EndRow}" 'NR > StartRow && NR < EndRow { print $0 }' } # $1 - Name of Resource LoadGlobalResource() { local StartRow local EndRow local LngLabel local msgResourceErr="\aError! Script could not find resource \"${1}\"!" StartRow=`cat "${ScriptFullName}" | awk "/^#Resource=${1}/ { print NR; exit}"` if [ -z "${StartRow}" ] then echo -e "${msgResourceErr}" > /dev/stderr exit 255 fi EndRow=`cat "${ScriptFullName}" | awk "NR > ${StartRow} && /^#endResource=${1}/ { print NR; exit}"` if [ -z "${EndRow}" ] then echo -e "${msgResourceErr}" > /dev/stderr exit 255 fi cat "${ScriptFullName}" | awk -v StartRow="${StartRow}" -v EndRow="${EndRow}" 'NR > StartRow && NR < EndRow { print $0 }' } CheckPacketInstall() { if [ `dpkg -l ${1} 2>&1 | wc -l` -le 1 ] then echo 0 return fi if [ `dpkg -l ${1} | grep -e ^un | wc -l` == 1 ] then echo 0 return fi echo 1 } main exit 0 #Resources_EN #Resource=msgSudoNotInstalled \aThe script is running under the account a non-privileged user. "Sudo" package is not installed in the system. The script can not continue, as the execution of operations, requiring rights "root" - is not possible! Please run the script under the account "root", or install and configure "sudo" package! #endResource=msgSudoNotInstalled #Resource=msgUserNotMemberOfSudoGroup \aThe script is running under account a non-privileged user. The account of the current user is not included in the "sudo" group! The script can not continue, as the execution of operations, requiring rights "root" - is not possible! Please run the script under the account "root", or configure "sudo" package! #endResource=msgUserNotMemberOfSudoGroup #Resource=msgSystemUseProxy \aAttention! The operating system uses proxy-server. For correctly work of package manager "apt" in the file "/etc/sudoers" should be present line: Defaults env_keep = "http_proxy https_proxy" #endResource=msgSystemUseProxy #Resource=msgDoYouWishContinue Do you wish to the script continued executing? (y/n): #endResource=msgDoYouWishContinue #Resource=msgPleaseInsertYorN \a\nPlease insert "y" or "n"! #endResource=msgPleaseInsertYorN #Resource=msgInternetConnectionError \aError downloading "https://github.com/z3APA3A/3proxy/releases/latest"! Please check the settings of the Internet connection. #endResource=msgInternetConnectionError #Resource=msgNewVersion The new version of "3proxy" detected, do you want download it? #endResource=msgNewVersion #Resource=msgBuildEssentialNotInstalled \aPackage "build-essential" was not installed. The installation can not be continued! #endResource=msgBuildEssentialNotInstalled #Resources_EN_end #Resources_RU #Resource=msgSudoNotInstalled \aСкрипт запущен под учётной записью обычного пользователя. В системе не установлен пакет "sudo". Скрипт не может продолжить работу, так как выполнение операций, требующих прав "root" - не представляется возможным! Пожалуйста, запустите скрипт под учётной записью "root", либо установите и настройте пакет "sudo"! #endResource=msgSudoNotInstalled #Resource=msgUserNotMemberOfSudoGroup \aСкрипт запущен под учётной записью обычного пользователя. Учётная запись текущего пользователя не включена в группу "sudo"! Скрипт не может продолжить работу, так как выполнение операций, требующих прав "root" - не представляется возможным! Пожалуйста, запустите скрипт под учётной записью "root", либо настройте пакет "sudo"! #endResource=msgUserNotMemberOfSudoGroup #Resource=msgSystemUseProxy \aВнимание! В системе используется прокси-сервер. Чтобы менеджер пакетов "apt" работал корректно, в файле "/etc/sudoers" должна присутствовать строка: Defaults env_keep = "http_proxy https_proxy" #endResource=msgSystemUseProxy #Resource=msgDoYouWishContinue Хотите чтобы скрипт дальше продолжил работу? (y/n): #endResource=msgDoYouWishContinue #Resource=msgPleaseInsertYorN \a\nПожалуйста введите "y" или "n"! #endResource=msgPleaseInsertYorN #Resource=msgInternetConnectionError \aОшибка закачки "https://github.com/z3APA3A/3proxy/releases/latest"! Пожалуйста, проверьте настройки интернет соединения. #endResource=msgInternetConnectionError #Resource=msgNewVersion Обнаружена новая версия "3proxy", скачать её (y/n)? #endResource=msgNewVersion #Resource=msgBuildEssentialNotInstalled \aПакет "build-essential" не был установлен. Дальнейшая установка не может быть продолжена! #endResource=msgBuildEssentialNotInstalled #Resources_RU_end #Resource=ConfigFile noconfig # If in this file have line "noconfig", then 3proxy not to be runned! # For usung this configuration file 3proxy you must to delete # or comment out the line with "noconfig". daemon # Parameter "daemon" - means run 3proxy as daemon pidfile /tmp/3proxy.pid # PID file location # This parameter must have the same value as # the variable "PidFile" in the script "/etc/init.d/3proxy" # Configuration file location config /etc/3proxy/3proxy.cfg internal 127.0.0.1 # Internal is address of interface proxy will listen for incoming requests # 127.0.0.1 means only localhost will be able to use this proxy. This is # address you should specify for clients as proxy IP. # You MAY use 0.0.0.0 but you shouldn't, because it's a chance for you to # have open proxy in your network in this case. external 192.168.0.1 # External is address 3proxy uses for outgoing connections. 0.0.0.0 means any # interface. Using 0.0.0.0 is not good because it allows to connect to 127.0.0.1 # DNS IP addresses nserver 8.8.8.8 nserver 8.8.4.4 # DNS cache size nscache 65536 # Timeouts settings timeouts 1 5 30 60 180 1800 15 60 # log file location log /var/log/3proxy/3proxy.log D # log file format logformat "L%C - %U [%d-%o-%Y %H:%M:%S %z] ""%T"" %E %I %O %N/%R:%r" archiver gz /usr/bin/gzip %F # If archiver specified log file will be compressed after closing. # you should specify extension, path to archiver and command line, %A will be # substituted with archive file name, %f - with original file name. # Original file will not be removed, so archiver should care about it. rotate 30 # We will keep last 30 log files proxy -p3128 # Run http/https proxy on port 3128 auth none # No authentication is requires setgid 65534 setuid 65534 # Run 3proxy under account "nobody" with group "nobody" #endResource=ConfigFile #Resource=InitScript #!/bin/sh # # 3proxy daemon control script # ### BEGIN INIT INFO # Provides: 3proxy # Required-Start: $network $remote_fs $syslog # Required-Stop: $network $remote_fs $syslog # Should-Start: $named # Should-Stop: $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: 3proxy HTTP Proxy ### END INIT INFO ScriptName="3proxy" ScriptFullName="/etc/init.d/3proxy" ConfigFile="/etc/3proxy/3proxy.cfg" LogDir="/var/log/3proxy" PidFile="/tmp/3proxy.pid" ResourcesData="" main() { LoadResources if [ ! -d "${LogDir}" ] then mkdir -p "${LogDir}"; fi case "$1" in start) Start ;; stop) Stop ;; restart) Stop; Start ;; status) Status ;; *) ShowHelp;; esac } Start() { local msg local ProxyPID if [ ! -f "${ConfigFile}" ] then msg=`GetResource "msgConfigFileNotFound"` printf "${msg}" "${ConfigFile}" return fi if cat "${ConfigFile}" | grep -qe "^noconfig" then msg=`GetResource "msgNoconfigDetected"` printf "${msg}" "${ConfigFile}" return fi ProxyPID=`Get3proxyPID` if [ ! -z "${ProxyPID}" ] then msg=`GetResource "msg3proxyAlreadyRunning"` printf "${msg}" "${ProxyPID}" return fi 3proxy "${ConfigFile}" sleep 1 ProxyPID=`Get3proxyPID` if [ ! -f "${PidFile}" ] then msg=`GetResource "msg3proxyStartProblems"` printf "${msg}" return fi if [ `cat "${PidFile}"` != "${ProxyPID}" ] then msg=`GetResource "msg3proxyStartProblems"` printf "${msg}" return fi msg=`GetResource "msg3proxyStartedSuccessfully"` printf "${msg}" `date +%d-%m-%Y" "%H:%M:%S` "${ProxyPID}" } Stop() { local msg local ProxyPID ProxyPID=`Get3proxyPID` if [ -f "${PidFile}" ] then if [ `cat "${PidFile}"` = "${ProxyPID}" ] then kill -9 "${ProxyPID}" rm -f "${PidFile}" msg=`GetResource "msg3proxyStoppedSuccessfully"` printf "${msg}" `date +%d-%m-%Y" "%H:%M:%S` return fi fi if [ -z "${ProxyPID}" ] then msg=`GetResource "msg3proxyProxyNotDetected"` printf "${msg}" return fi pkill -o 3proxy msg=`GetResource "msg3proxyStoppedByKillall"` printf "${msg}" `date +%d-%m-%Y" "%H:%M:%S` "${PidFile}" } Status() { local msg local ProxyPID if [ -f "${PidFile}" ] then msg=`GetResource "msgPidFileExists"` printf "${msg}" "${PidFile}" `cat "${PidFile}"` else msg=`GetResource "msgPidFileNotExists"` printf "${msg}" "${PidFile}" fi ProxyPID=`Get3proxyPID` if [ ! -z "${ProxyPID}" ] then msg=`GetResource "msg3proxyProcessDetected"` printf "${msg}" ps -ef | awk '$8 ~ /^3proxy/ { print "User: " $1 "\tPID: " $2 }' else msg=`GetResource "msg3proxyProcessNotDetected"` printf "${msg}" fi } ShowHelp() { local msg msg=`GetResource "msg3proxyHelp"` printf "${msg}" "${ScriptFullName}" "${ScriptName}" } Get3proxyPID() { ps -ef | awk '$8 ~ /^3proxy/ { print $2; exit }' } LoadResources() { local StartRow local EndRow local LngLabel local msgResourceErr="\aError! Script could not find resources!" if env | grep -q 'LANG=ru_RU.UTF-8' then LngLabel="RU" else LngLabel="EN" fi StartRow=`cat "${ScriptFullName}" | awk "/^#Resources_${LngLabel}/ { print NR; exit}"` if [ -z "${StartRow}" ] then echo -e "${msgResourceErr}" exit 255 fi EndRow=`cat "${ScriptFullName}" | awk "NR > ${StartRow} && /^#Resources_${LngLabel}_end/ { print NR; exit}"` if [ -z "${EndRow}" ] then echo -e "${msgResourceErr}" exit 255 fi ResourcesData=`cat "${ScriptFullName}" | awk -v StartRow="${StartRow}" -v EndRow="${EndRow}" 'NR > StartRow && NR < EndRow { print $0 }'` } # $1 - Name of Resource GetResource() { local StartRow local EndRow local msgResourceErr="\aError! Script could not find resource \"${1}\"!" StartRow=`echo "${ResourcesData}" | awk "/^#Resource=${1}/ { print NR; exit}"` if [ -z "${StartRow}" ] then echo -e "${msgResourceErr}" > /dev/stderr exit 255 fi EndRow=`echo "${ResourcesData}" | awk "NR > ${StartRow} && /^#endResource=${1}/ { print NR; exit}"` if [ -z "${EndRow}" ] then echo -e "${msgResourceErr}" > /dev/stderr exit 255 fi echo "${ResourcesData}" | awk -v StartRow="${StartRow}" -v EndRow="${EndRow}" 'NR > StartRow && NR < EndRow { print $0 }' } main $@ exit 0; #Resources_EN #Resource=msg3proxyHelp Usage: \t%s {start|stop|restart} or \tservice %s {start|stop|restart|status}\\n #endResource=msg3proxyHelp #Resource=msgConfigFileNotFound \a3proxy configuration file - "%s" is not found!\\n #endResource=msgConfigFileNotFound #Resource=msgNoconfigDetected Parameter "noconfig" found in 3proxy configuration file - "% s" ! To run 3proxy this parameter should be disabled.\\n #endResource=msgNoconfigDetected #Resource=msg3proxyAlreadyRunning \a3proxy already running PID: %s\\n #endResource=msg3proxyAlreadyRunning #Resource=msg3proxyStartProblems With the start of 3proxy, something is wrong! Use: service 3proxy status\\n #endResource=msg3proxyStartProblems #Resource=msg3proxyStartedSuccessfully [ %s %s ] 3proxy started successfully! PID: %s\\n #endResource=msg3proxyStartedSuccessfully #Resource=msg3proxyStoppedSuccessfully [ %s %s ] 3proxy stopped successfully!\\n #endResource=msg3proxyStoppedSuccessfully #Resource=msg3proxyProxyNotDetected Process "3proxy" is not detected!\\n #endResource=msg3proxyProxyNotDetected #Resource=msg3proxyStoppedByKillall [ %s %s ] Command "pkill -o 3proxy" was executed, because process number was not stored in "%s", but in fact 3proxy was runned!\\n #endResource=msg3proxyStoppedByKillall #Resource=msgPidFileExists File "%s" exists. It contains the PID: %s\\n #endResource=msgPidFileExists #Resource=msgPidFileNotExists File "%s" not found, that is, PID 3proxy was not stored!\\n #endResource=msgPidFileNotExists #Resource=msg3proxyProcessDetected Process 3proxy detected:\\n #endResource=msg3proxyProcessDetected #Resource=msg3proxyProcessNotDetected Processes of 3proxy is not found!\\n #endResource=msg3proxyProcessNotDetected #Resources_EN_end #Resources_RU #Resource=msg3proxyHelp Используйте: \t%s {start|stop|restart} или \tservice %s {start|stop|restart|status}\\n #endResource=msg3proxyHelp #Resource=msgConfigFileNotFound \aФайл конфигурации 3proxy - "%s", не найден!\\n #endResource=msgConfigFileNotFound #Resource=msgNoconfigDetected \aОбнаружен параметр "noconfig" в файле конфигурации 3proxy - "%s" ! Для запуска 3proxy этот параметр нужно отключить.\\n #endResource=msgNoconfigDetected #Resource=msg3proxyAlreadyRunning \a3proxy уже запущен PID: %s\\n #endResource=msg3proxyAlreadyRunning #Resource=msg3proxyStartProblems \aСо стартом 3proxy, что-то не так! Используйте: service 3proxy status\\n #endResource=msg3proxyStartProblems #Resource=msg3proxyStartedSuccessfully [ %s %s ] 3proxy успешно стартовал! PID: %s\\n #endResource=msg3proxyStartedSuccessfully #Resource=msg3proxyStoppedSuccessfully [ %s %s ] 3proxy успешно остановлен!\\n #endResource=msg3proxyStoppedSuccessfully #Resource=msg3proxyProxyNotDetected Процесс "3proxy" не обнаружен!\\n #endResource=msg3proxyProxyNotDetected #Resource=msg3proxyStoppedByKillall [ %s %s ] Выполнена команда "pkill -o 3proxy", т.к. номер процесса не записан в "%s", но по факту 3proxy рабатал!\\n #endResource=msg3proxyStoppedByKillall #Resource=msgPidFileExists Файл "%s" есть. Он содержит PID: %s\\n #endResource=msgPidFileExists #Resource=msgPidFileNotExists Файл "%s" не найден, т.е. PID 3proxy не был сохранён!\\n #endResource=msgPidFileNotExists #Resource=msg3proxyProcessDetected Обнаружен процесс 3proxy:\\n #endResource=msg3proxyProcessDetected #Resource=msg3proxyProcessNotDetected Процессов 3proxy не обнаружено!\\n #endResource=msg3proxyProcessNotDetected #Resources_RU_end #endResource=InitScript