freedombone-utils-web 27KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680
  1. #!/bin/bash
  2. #
  3. # .---. . .
  4. # | | |
  5. # |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
  6. # | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
  7. # ' ' --' --' -' - -' ' ' -' -' -' ' - --'
  8. #
  9. # Freedom in the Cloud
  10. #
  11. # Web related functions
  12. #
  13. # License
  14. # =======
  15. #
  16. # Copyright (C) 2014-2016 Bob Mottram <bob@robotics.uk.to>
  17. #
  18. # This program is free software: you can redistribute it and/or modify
  19. # it under the terms of the GNU Affero General Public License as published by
  20. # the Free Software Foundation, either version 3 of the License, or
  21. # (at your option) any later version.
  22. #
  23. # This program is distributed in the hope that it will be useful,
  24. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  25. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  26. # GNU Affero General Public License for more details.
  27. #
  28. # You should have received a copy of the GNU Affero General Public License
  29. # along with this program. If not, see <http://www.gnu.org/licenses/>.
  30. # default search engine for command line browser
  31. DEFAULT_SEARCH='https://searx.laquadrature.net'
  32. # Whether Let's Encrypt is enabled for all sites
  33. LETSENCRYPT_ENABLED="no"
  34. LETSENCRYPT_SERVER='https://acme-v01.api.letsencrypt.org/directory'
  35. # list of encryption protocols
  36. SSL_PROTOCOLS="TLSv1 TLSv1.1 TLSv1.2"
  37. # list of ciphers to use. See bettercrypto.org recommendations
  38. SSL_CIPHERS="EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA256:EECDH:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!IDEA:!ECDSA:kEDH:CAMELLIA128-SHA:AES128-SHA"
  39. NGINX_ENSITE_REPO="https://github.com/perusio/nginx_ensite"
  40. NGINX_ENSITE_COMMIT='fa4d72ce1c0a490442c8474e9c8dc21ed52c93d0'
  41. # memory limit for php in MB
  42. MAX_PHP_MEMORY=64
  43. # logging level for Nginx
  44. WEBSERVER_LOG_LEVEL='warn'
  45. # test a domain name to see if it's valid
  46. function validate_domain_name {
  47. # count the number of dots in the domain name
  48. dots=${TEST_DOMAIN_NAME//[^.]}
  49. no_of_dots=${#dots}
  50. if (( $no_of_dots > 3 )); then
  51. TEST_DOMAIN_NAME=$"The domain $TEST_DOMAIN_NAME has too many subdomains. It should be of the type w.x.y.z, x.y.z or y.z"
  52. fi
  53. if (( $no_of_dots == 0 )); then
  54. TEST_DOMAIN_NAME=$"The domain $TEST_DOMAIN_NAME has no top level domain. It should be of the type w.x.y.z, x.y.z or y.z"
  55. fi
  56. }
  57. function nginx_disable_sniffing {
  58. domain_name=$1
  59. filename=/etc/nginx/sites-available/$domain_name
  60. echo ' add_header X-Frame-Options DENY;' >> $filename
  61. echo ' add_header X-Content-Type-Options nosniff;' >> $filename
  62. echo '' >> $filename
  63. }
  64. function nginx_limits {
  65. domain_name=$1
  66. max_body='20m'
  67. if [ $2 ]; then
  68. max_body=$2
  69. fi
  70. filename=/etc/nginx/sites-available/$domain_name
  71. echo " client_max_body_size ${max_body};" >> $filename
  72. echo ' client_body_buffer_size 128k;' >> $filename
  73. echo '' >> $filename
  74. echo ' limit_conn conn_limit_per_ip 10;' >> $filename
  75. echo ' limit_req zone=req_limit_per_ip burst=10 nodelay;' >> $filename
  76. echo '' >> $filename
  77. }
  78. function nginx_stapling {
  79. domain_name=$1
  80. filename=/etc/nginx/sites-available/$domain_name
  81. echo " ssl_stapling on;" >> $filename
  82. echo ' ssl_stapling_verify on;' >> $filename
  83. echo ' ssl_trusted_certificate /etc/ssl/certs/${domain_name}.pem;' >> $filename
  84. echo '' >> $filename
  85. }
  86. function nginx_http_redirect {
  87. # redirect port 80 to https
  88. domain_name=$1
  89. filename=/etc/nginx/sites-available/$domain_name
  90. echo 'server {' > $filename
  91. echo ' listen 80;' >> $filename
  92. echo ' listen [::]:80;' >> $filename
  93. echo " server_name ${domain_name};" >> $filename
  94. echo " root /var/www/${domain_name}/htdocs;" >> $filename
  95. echo ' access_log off;' >> $filename
  96. echo " error_log /var/log/nginx/${domain_name}_error.log $WEBSERVER_LOG_LEVEL;" >> $filename
  97. function_check nginx_limits
  98. nginx_limits $domain_name
  99. echo ' rewrite ^ https://$server_name$request_uri? permanent;' >> $filename
  100. echo '}' >> $filename
  101. echo '' >> $filename
  102. }
  103. function nginx_ssl {
  104. # creates the SSL/TLS section for a website
  105. domain_name=$1
  106. filename=/etc/nginx/sites-available/$domain_name
  107. echo ' ssl_stapling off;' >> $filename
  108. echo ' ssl_stapling_verify off;' >> $filename
  109. echo ' ssl on;' >> $filename
  110. echo " ssl_certificate /etc/ssl/certs/${domain_name}.crt;" >> $filename
  111. echo " ssl_certificate_key /etc/ssl/private/${domain_name}.key;" >> $filename
  112. echo " ssl_dhparam /etc/ssl/certs/${domain_name}.dhparam;" >> $filename
  113. echo '' >> $filename
  114. echo ' ssl_session_cache builtin:1000 shared:SSL:10m;' >> $filename
  115. echo ' ssl_session_timeout 60m;' >> $filename
  116. echo ' ssl_prefer_server_ciphers on;' >> $filename
  117. echo " ssl_protocols $SSL_PROTOCOLS;" >> $filename
  118. echo " ssl_ciphers '$SSL_CIPHERS';" >> $filename
  119. #nginx_stapling $1
  120. }
  121. # check an individual domain name
  122. function test_domain_name {
  123. if [ $1 ]; then
  124. TEST_DOMAIN_NAME=$1
  125. function_check validate_domain_name
  126. validate_domain_name
  127. if [[ $TEST_DOMAIN_NAME != $1 ]]; then
  128. echo $TEST_DOMAIN_NAME
  129. exit 8528
  130. fi
  131. fi
  132. }
  133. # Checks whether certificates were generated for the given hostname
  134. function check_certificates {
  135. if [ ! $1 ]; then
  136. return
  137. fi
  138. USE_LETSENCRYPT='no'
  139. if [ $2 ]; then
  140. USE_LETSENCRYPT=$2
  141. fi
  142. if [[ $USE_LETSENCRYPT == 'no' ]]; then
  143. if [ ! -f /etc/ssl/private/${1}.key ]; then
  144. echo $"Private certificate for ${CHECK_HOSTNAME} was not created"
  145. exit 63959
  146. fi
  147. if [ ! -f /etc/ssl/certs/${1}.crt ]; then
  148. echo $"Public certificate for ${CHECK_HOSTNAME} was not created"
  149. exit 7679
  150. fi
  151. if grep -q "${1}.pem" /etc/nginx/sites-available/${1}; then
  152. sed -i "s|${1}.pem|${1}.crt|g" /etc/nginx/sites-available/${1}
  153. fi
  154. else
  155. if [ ! -f /etc/letsencrypt/live/${1}/privkey.pem ]; then
  156. echo $"Private certificate for ${CHECK_HOSTNAME} was not created"
  157. exit 6282
  158. fi
  159. if [ ! -f /etc/letsencrypt/live/${1}/fullchain.pem ]; then
  160. echo $"Public certificate for ${CHECK_HOSTNAME} was not created"
  161. exit 5328
  162. fi
  163. if grep -q "${1}.crt" /etc/nginx/sites-available/${1}; then
  164. sed -i "s|${1}.crt|${1}.pem|g" /etc/nginx/sites-available/${1}
  165. fi
  166. fi
  167. if [ ! -f /etc/ssl/certs/${1}.dhparam ]; then
  168. echo $"Diffie–Hellman parameters for ${CHECK_HOSTNAME} were not created"
  169. exit 5989
  170. fi
  171. }
  172. function cert_exists {
  173. cert_type='dhparam'
  174. if [ $2 ]; then
  175. cert_type="$2"
  176. fi
  177. if [ -f /etc/ssl/certs/${1}.${cert_type} ]; then
  178. echo "1"
  179. else
  180. echo "0"
  181. fi
  182. }
  183. function create_self_signed_cert {
  184. ${PROJECT_NAME}-addcert -h ${SITE_DOMAIN_NAME} --dhkey ${DH_KEYLENGTH}
  185. function_check check_certificates
  186. check_certificates ${SITE_DOMAIN_NAME}
  187. }
  188. function create_letsencrypt_cert {
  189. ${PROJECT_NAME}-addcert -e ${SITE_DOMAIN_NAME} -s ${LETSENCRYPT_SERVER} --dhkey ${DH_KEYLENGTH} --email ${MY_EMAIL_ADDRESS}
  190. if [ ! "$?" = "0" ]; then
  191. if [[ ${NO_SELF_SIGNED} == 'no' ]]; then
  192. echo $"Lets Encrypt failed for ${SITE_DOMAIN_NAME}, so try making a self-signed cert"
  193. ${PROJECT_NAME}-addcert -h ${SITE_DOMAIN_NAME} --dhkey ${DH_KEYLENGTH}
  194. function_check check_certificates
  195. check_certificates ${SITE_DOMAIN_NAME}
  196. else
  197. echo $"Lets Encrypt failed for $SITE_DOMAIN_NAME"
  198. exit 682529
  199. fi
  200. return
  201. fi
  202. function_check check_certificates
  203. check_certificates ${SITE_DOMAIN_NAME} 'yes'
  204. }
  205. function create_site_certificate {
  206. SITE_DOMAIN_NAME="$1"
  207. # if yes then only "valid" certs are allowed, not self-signed
  208. NO_SELF_SIGNED='no'
  209. if [ $2 ]; then
  210. NO_SELF_SIGNED="$2"
  211. fi
  212. if [[ $ONION_ONLY == "no" ]]; then
  213. if [[ $(cert_exists $SITE_DOMAIN_NAME) == "0" ]]; then
  214. if [[ $LETSENCRYPT_ENABLED != "yes" ]]; then
  215. create_self_signed_cert
  216. else
  217. create_letsencrypt_cert
  218. fi
  219. else
  220. if [[ $LETSENCRYPT_ENABLED == "yes" ]]; then
  221. if [[ $(cert_exists $SITE_DOMAIN_NAME pem) == "0" ]]; then
  222. create_letsencrypt_cert
  223. fi
  224. fi
  225. fi
  226. fi
  227. }
  228. # script to automatically renew any Let's Encrypt certificates
  229. function letsencrypt_renewals {
  230. if [[ $ONION_ONLY != "no" ]]; then
  231. return
  232. fi
  233. renewals_script=/etc/cron.monthly/letsencrypt
  234. renewals_retry_script=/etc/cron.daily/letsencrypt
  235. renewal_failure_msg=$'The certificate for $LETSENCRYPT_DOMAIN could not be renewed'
  236. renewal_email_title=$'${PROJECT_NAME} Lets Encrypt certificate renewal'
  237. # the main script tries to renew once per month
  238. echo '#!/bin/bash' > $renewals_script
  239. echo '' >> $renewals_script
  240. echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_script
  241. echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_script
  242. echo '' >> $renewals_script
  243. echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_script
  244. echo ' if [ -f ~/letsencrypt_failed ]; then' >> $renewals_script
  245. echo ' rm ~/letsencrypt_failed' >> $renewals_script
  246. echo ' fi' >> $renewals_script
  247. echo -n ' ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_script
  248. echo -n "awk -F ':' '{print " >> $renewals_script
  249. echo -n '$2' >> $renewals_script
  250. echo "}')" >> $renewals_script
  251. echo ' ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_script
  252. echo ' for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_script
  253. echo -n ' LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_script
  254. echo -n "awk -F '/' '{print " >> $renewals_script
  255. echo -n '$5' >> $renewals_script
  256. echo "}')" >> $renewals_script
  257. echo ' if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_script
  258. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_script
  259. echo ' if [ ! "$?" = "0" ]; then' >> $renewals_script
  260. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_script
  261. echo ' echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_script
  262. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_script
  263. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_script
  264. echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_script
  265. echo ' rm ~/temp_renewletsencrypt.txt' >> $renewals_script
  266. echo ' if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_script
  267. echo ' touch ~/letsencrypt_failed' >> $renewals_script
  268. echo ' fi' >> $renewals_script
  269. echo ' fi' >> $renewals_script
  270. echo ' fi' >> $renewals_script
  271. echo ' done' >> $renewals_script
  272. echo 'fi' >> $renewals_script
  273. chmod +x $renewals_script
  274. # a secondary script keeps trying to renew after a failure
  275. echo '#!/bin/bash' > $renewals_retry_script
  276. echo '' >> $renewals_retry_script
  277. echo "PROJECT_NAME='${PROJECT_NAME}'" >> $renewals_retry_script
  278. echo 'COMPLETION_FILE=$HOME/${PROJECT_NAME}-completed.txt' >> $renewals_retry_script
  279. echo '' >> $renewals_retry_script
  280. echo 'if [ -d /etc/letsencrypt ]; then' >> $renewals_retry_script
  281. echo ' if [ -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
  282. echo ' rm ~/letsencrypt_failed' >> $renewals_retry_script
  283. echo -n ' ADMIN_USERNAME=$(cat $COMPLETION_FILE | grep "Admin user" | ' >> $renewals_retry_script
  284. echo -n "awk -F ':' '{print " >> $renewals_retry_script
  285. echo -n '$2' >> $renewals_retry_script
  286. echo "}')" >> $renewals_retry_script
  287. echo ' ADMIN_EMAIL_ADDRESS=$ADMIN_USERNAME@$HOSTNAME' >> $renewals_retry_script
  288. echo ' for d in /etc/letsencrypt/live/*/ ; do' >> $renewals_retry_script
  289. echo -n ' LETSENCRYPT_DOMAIN=$(echo "$d" | ' >> $renewals_retry_script
  290. echo -n "awk -F '/' '{print " >> $renewals_retry_script
  291. echo -n '$5' >> $renewals_retry_script
  292. echo "}')" >> $renewals_retry_script
  293. echo ' if [ -f /etc/nginx/sites-available/$LETSENCRYPT_DOMAIN ]; then' >> $renewals_retry_script
  294. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt' >> $renewals_retry_script
  295. echo ' if [ ! "$?" = "0" ]; then' >> $renewals_retry_script
  296. echo " echo \"${renewal_failure_msg}\" > ~/temp_renewletsencrypt.txt" >> $renewals_retry_script
  297. echo ' echo "" >> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  298. echo ' ${PROJECT_NAME}-renew-cert -h $LETSENCRYPT_DOMAIN -p letsencrypt 2>> ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  299. echo -n " cat ~/temp_renewletsencrypt.txt | mail -s \"${renewal_email_title}\" " >> $renewals_retry_script
  300. echo '$ADMIN_EMAIL_ADDRESS' >> $renewals_retry_script
  301. echo ' rm ~/temp_renewletsencrypt.txt' >> $renewals_retry_script
  302. echo ' if [ ! -f ~/letsencrypt_failed ]; then' >> $renewals_retry_script
  303. echo ' touch ~/letsencrypt_failed' >> $renewals_retry_script
  304. echo ' fi' >> $renewals_retry_script
  305. echo ' fi' >> $renewals_retry_script
  306. echo ' fi' >> $renewals_retry_script
  307. echo ' done' >> $renewals_retry_script
  308. echo ' fi' >> $renewals_retry_script
  309. echo 'fi' >> $renewals_retry_script
  310. chmod +x $renewals_retry_script
  311. }
  312. function configure_php {
  313. sed -i "s/memory_limit = 128M/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/fpm/php.ini
  314. sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/g' /etc/php5/fpm/php.ini
  315. sed -i "s/memory_limit = -1/memory_limit = ${MAX_PHP_MEMORY}M/g" /etc/php5/cli/php.ini
  316. sed -i "s/upload_max_filesize = 2M/upload_max_filesize = 50M/g" /etc/php5/fpm/php.ini
  317. sed -i "s/post_max_size = 8M/post_max_size = 50M/g" /etc/php5/fpm/php.ini
  318. }
  319. function install_web_server_access_control {
  320. if [ ! -f /etc/pam.d/nginx ]; then
  321. echo '#%PAM-1.0' > /etc/pam.d/nginx
  322. echo '@include common-auth' >> /etc/pam.d/nginx
  323. echo '@include common-account' >> /etc/pam.d/nginx
  324. echo '@include common-session' >> /etc/pam.d/nginx
  325. fi
  326. }
  327. function install_dynamicdns {
  328. if [[ $SYSTEM_TYPE == "mesh"* ]]; then
  329. return
  330. fi
  331. if [[ $ONION_ONLY != "no" ]]; then
  332. return
  333. fi
  334. # update to the next commit
  335. function_check set_repo_commit
  336. set_repo_commit $INSTALL_DIR/inadyn "inadyn commit" "$INADYN_COMMIT" $INADYN_REPO
  337. if [[ $(is_completed $FUNCNAME) == "1" ]]; then
  338. return
  339. fi
  340. # Here we compile from source because the current package
  341. # doesn't support https, which could result in passwords
  342. # being leaked
  343. # Debian version 1.99.4-1
  344. # https version 1.99.8
  345. apt-get -yq install build-essential curl libgnutls28-dev automake1.11
  346. if [ ! -d $INSTALL_DIR/inadyn ]; then
  347. git_clone $INADYN_REPO $INSTALL_DIR/inadyn
  348. fi
  349. if [ ! -d $INSTALL_DIR/inadyn ]; then
  350. echo 'inadyn repo not cloned'
  351. echo -n | openssl s_client -showcerts -connect github.com:443 -CApath /etc/ssl/certs
  352. exit 6785
  353. fi
  354. cd $INSTALL_DIR/inadyn
  355. git checkout $INADYN_COMMIT -b $INADYN_COMMIT
  356. set_completion_param "inadyn commit" "$INADYN_COMMIT"
  357. ./configure
  358. if [ ! "$?" = "0" ]; then
  359. exit 74890
  360. fi
  361. USE_OPENSSL=1 make
  362. if [ ! "$?" = "0" ]; then
  363. exit 74858
  364. fi
  365. make install
  366. if [ ! "$?" = "0" ]; then
  367. exit 3785
  368. fi
  369. # create an unprivileged user
  370. #useradd -r -s /bin/false debian-inadyn
  371. # create a configuration file
  372. echo 'background' > /etc/inadyn.conf
  373. echo 'verbose 1' >> /etc/inadyn.conf
  374. echo 'period 300' >> /etc/inadyn.conf
  375. echo 'startup-delay 60' >> /etc/inadyn.conf
  376. echo 'cache-dir /run/inadyn' >> /etc/inadyn.conf
  377. echo 'logfile /dev/null' >> /etc/inadyn.conf
  378. chmod 600 /etc/inadyn.conf
  379. echo '[Unit]' > /etc/systemd/system/inadyn.service
  380. echo 'Description=inadyn (DynDNS updater)' >> /etc/systemd/system/inadyn.service
  381. echo 'After=network.target' >> /etc/systemd/system/inadyn.service
  382. echo '' >> /etc/systemd/system/inadyn.service
  383. echo '[Service]' >> /etc/systemd/system/inadyn.service
  384. echo 'ExecStart=/usr/local/sbin/inadyn --config /etc/inadyn.conf' >> /etc/systemd/system/inadyn.service
  385. echo 'Restart=always' >> /etc/systemd/system/inadyn.service
  386. echo 'Type=forking' >> /etc/systemd/system/inadyn.service
  387. echo '' >> /etc/systemd/system/inadyn.service
  388. echo '[Install]' >> /etc/systemd/system/inadyn.service
  389. echo 'WantedBy=multi-user.target' >> /etc/systemd/system/inadyn.service
  390. systemctl enable inadyn
  391. systemctl start inadyn
  392. systemctl daemon-reload
  393. mark_completed $FUNCNAME
  394. }
  395. function install_command_line_browser {
  396. if [[ $(is_completed $FUNCNAME) == "1" ]]; then
  397. return
  398. fi
  399. apt-get -yq install elinks
  400. # set the home page
  401. if ! grep -q "WWW_HOME" /home/$MY_USERNAME/.bashrc; then
  402. if ! grep -q 'control' /home/$MY_USERNAME/.bashrc; then
  403. echo "export WWW_HOME=$DEFAULT_SEARCH" >> /home/$MY_USERNAME/.bashrc
  404. else
  405. sed -i "/control/i export WWW_HOME=$DEFAULT_SEARCH" /home/$MY_USERNAME/.bashrc
  406. fi
  407. fi
  408. mark_completed $FUNCNAME
  409. }
  410. function mesh_web_server {
  411. if [ -d /etc/apache2 ]; then
  412. chroot "$rootdir" apt-get -yq remove --purge apache2
  413. chroot "$rootdir" rm -rf /etc/apache2
  414. fi
  415. chroot "$rootdir" apt-get -yq install nginx
  416. if [ ! -d $rootdir/etc/nginx ]; then
  417. echo $'Unable to install web server'
  418. exit 346825
  419. fi
  420. }
  421. function install_web_server {
  422. if [ $INSTALLING_MESH ]; then
  423. mesh_web_server
  424. return
  425. fi
  426. # update to the next commit
  427. function_check set_repo_commit
  428. set_repo_commit $INSTALL_DIR/nginx_ensite "nginx-ensite commit" "$NGINX_ENSITE_COMMIT" $NGINX_ENSITE_REPO
  429. if [[ $(is_completed $FUNCNAME) == "1" ]]; then
  430. return
  431. fi
  432. # remove apache
  433. apt-get -yq remove --purge apache2
  434. if [ -d /etc/apache2 ]; then
  435. rm -rf /etc/apache2
  436. fi
  437. # install nginx
  438. apt-get -yq install nginx php5-fpm git
  439. # limit the number of php processes
  440. sed -i 's/; process.max =.*/process.max = 32/g' /etc/php5/fpm/php-fpm.conf
  441. #sed -i 's/;process_control_timeout =.*/process_control_timeout = 300/g' /etc/php5/fpm/php-fpm.conf
  442. if ! grep -q "pm.max_children" /etc/php5/fpm/php-fpm.conf; then
  443. echo 'pm.max_children = 10' >> /etc/php5/fpm/php-fpm.conf
  444. echo 'pm.start_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  445. echo 'pm.min_spare_servers = 2' >> /etc/php5/fpm/php-fpm.conf
  446. echo 'pm.max_spare_servers = 5' >> /etc/php5/fpm/php-fpm.conf
  447. echo 'pm.max_requests = 50' >> /etc/php5/fpm/php-fpm.conf
  448. fi
  449. if [ ! -d /etc/nginx ]; then
  450. echo $"ERROR: nginx does not appear to have installed. $CHECK_MESSAGE"
  451. exit 51
  452. fi
  453. # Nginx settings
  454. echo 'user www-data;' > /etc/nginx/nginx.conf
  455. #echo "worker_processes; $CPU_CORES" >> /etc/nginx/nginx.conf
  456. echo 'pid /run/nginx.pid;' >> /etc/nginx/nginx.conf
  457. echo '' >> /etc/nginx/nginx.conf
  458. echo 'events {' >> /etc/nginx/nginx.conf
  459. echo ' worker_connections 50;' >> /etc/nginx/nginx.conf
  460. echo ' # multi_accept on;' >> /etc/nginx/nginx.conf
  461. echo '}' >> /etc/nginx/nginx.conf
  462. echo '' >> /etc/nginx/nginx.conf
  463. echo 'http {' >> /etc/nginx/nginx.conf
  464. echo ' # limit the number of connections per single IP' >> /etc/nginx/nginx.conf
  465. echo ' limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;' >> /etc/nginx/nginx.conf
  466. echo '' >> /etc/nginx/nginx.conf
  467. echo ' # limit the number of requests for a given session' >> /etc/nginx/nginx.conf
  468. echo ' limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=140r/s;' >> /etc/nginx/nginx.conf
  469. echo '' >> /etc/nginx/nginx.conf
  470. echo ' # if the request body size is more than the buffer size, then the entire (or partial) request body is written into a temporary file' >> /etc/nginx/nginx.conf
  471. echo ' client_body_buffer_size 128k;' >> /etc/nginx/nginx.conf
  472. echo '' >> /etc/nginx/nginx.conf
  473. echo ' # headerbuffer size for the request header from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  474. echo ' client_header_buffer_size 3m;' >> /etc/nginx/nginx.conf
  475. echo '' >> /etc/nginx/nginx.conf
  476. echo ' # maximum number and size of buffers for large headers to read from client request' >> /etc/nginx/nginx.conf
  477. echo ' large_client_header_buffers 4 256k;' >> /etc/nginx/nginx.conf
  478. echo '' >> /etc/nginx/nginx.conf
  479. echo ' # read timeout for the request body from client, its set for testing purpose' >> /etc/nginx/nginx.conf
  480. echo ' client_body_timeout 3m;' >> /etc/nginx/nginx.conf
  481. echo '' >> /etc/nginx/nginx.conf
  482. echo ' # how long to wait for the client to send a request header, its set for testing purpose' >> /etc/nginx/nginx.conf
  483. echo ' client_header_timeout 3m;' >> /etc/nginx/nginx.conf
  484. echo '' >> /etc/nginx/nginx.conf
  485. echo ' ##' >> /etc/nginx/nginx.conf
  486. echo ' # Basic Settings' >> /etc/nginx/nginx.conf
  487. echo ' ##' >> /etc/nginx/nginx.conf
  488. echo '' >> /etc/nginx/nginx.conf
  489. echo ' sendfile on;' >> /etc/nginx/nginx.conf
  490. echo ' tcp_nopush on;' >> /etc/nginx/nginx.conf
  491. echo ' tcp_nodelay on;' >> /etc/nginx/nginx.conf
  492. echo ' keepalive_timeout 65;' >> /etc/nginx/nginx.conf
  493. echo ' types_hash_max_size 2048;' >> /etc/nginx/nginx.conf
  494. echo ' server_tokens off;' >> /etc/nginx/nginx.conf
  495. echo '' >> /etc/nginx/nginx.conf
  496. echo ' # server_names_hash_bucket_size 64;' >> /etc/nginx/nginx.conf
  497. echo ' # server_name_in_redirect off;' >> /etc/nginx/nginx.conf
  498. echo '' >> /etc/nginx/nginx.conf
  499. echo ' include /etc/nginx/mime.types;' >> /etc/nginx/nginx.conf
  500. echo ' default_type application/octet-stream;' >> /etc/nginx/nginx.conf
  501. echo '' >> /etc/nginx/nginx.conf
  502. echo ' ##' >> /etc/nginx/nginx.conf
  503. echo ' # Logging Settings' >> /etc/nginx/nginx.conf
  504. echo ' ##' >> /etc/nginx/nginx.conf
  505. echo '' >> /etc/nginx/nginx.conf
  506. echo ' access_log /var/log/nginx/access.log;' >> /etc/nginx/nginx.conf
  507. echo ' error_log /var/log/nginx/error.log;' >> /etc/nginx/nginx.conf
  508. echo '' >> /etc/nginx/nginx.conf
  509. echo ' ###' >> /etc/nginx/nginx.conf
  510. echo ' # Gzip Settings' >> /etc/nginx/nginx.conf
  511. echo ' ##' >> /etc/nginx/nginx.conf
  512. echo ' gzip on;' >> /etc/nginx/nginx.conf
  513. echo ' gzip_disable "msie6";' >> /etc/nginx/nginx.conf
  514. echo '' >> /etc/nginx/nginx.conf
  515. echo ' # gzip_vary on;' >> /etc/nginx/nginx.conf
  516. echo ' # gzip_proxied any;' >> /etc/nginx/nginx.conf
  517. echo ' # gzip_comp_level 6;' >> /etc/nginx/nginx.conf
  518. echo ' # gzip_buffers 16 8k;' >> /etc/nginx/nginx.conf
  519. echo ' # gzip_http_version 1.1;' >> /etc/nginx/nginx.conf
  520. echo ' # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;' >> /etc/nginx/nginx.conf
  521. echo '' >> /etc/nginx/nginx.conf
  522. echo ' ##' >> /etc/nginx/nginx.conf
  523. echo ' # Virtual Host Configs' >> /etc/nginx/nginx.conf
  524. echo ' ##' >> /etc/nginx/nginx.conf
  525. echo '' >> /etc/nginx/nginx.conf
  526. echo ' include /etc/nginx/conf.d/*.conf;' >> /etc/nginx/nginx.conf
  527. echo ' include /etc/nginx/sites-enabled/*;' >> /etc/nginx/nginx.conf
  528. echo '}' >> /etc/nginx/nginx.conf
  529. # install a script to easily enable and disable nginx virtual hosts
  530. if [ ! -d $INSTALL_DIR ]; then
  531. mkdir $INSTALL_DIR
  532. fi
  533. cd $INSTALL_DIR
  534. function_check git_clone
  535. git_clone $NGINX_ENSITE_REPO $INSTALL_DIR/nginx_ensite
  536. cd $INSTALL_DIR/nginx_ensite
  537. git checkout $NGINX_ENSITE_COMMIT -b $NGINX_ENSITE_COMMIT
  538. set_completion_param "nginx-ensite commit" "$NGINX_ENSITE_COMMIT"
  539. make install
  540. nginx_dissite default
  541. function_check configure_firewall_for_web_access
  542. configure_firewall_for_web_access
  543. mark_completed $FUNCNAME
  544. }
  545. function remove_certs {
  546. domain_name=$1
  547. if [ ! $domain_name ]; then
  548. return
  549. fi
  550. if [ -f /etc/ssl/certs/${domain_name}.dhparam ]; then
  551. rm /etc/ssl/certs/${domain_name}.dhparam
  552. fi
  553. if [ -f /etc/ssl/certs/${domain_name}.pem ]; then
  554. rm /etc/ssl/certs/${domain_name}.pem
  555. fi
  556. if [ -f /etc/ssl/certs/${domain_name}.crt ]; then
  557. rm /etc/ssl/certs/${domain_name}.crt
  558. fi
  559. if [ -f /etc/ssl/private/${domain_name}.key ]; then
  560. rm /etc/ssl/private/${domain_name}.key
  561. fi
  562. }
  563. function configure_firewall_for_web_access {
  564. if [[ $(is_completed $FUNCNAME) == "1" ]]; then
  565. return
  566. fi
  567. if [[ $INSTALLED_WITHIN_DOCKER == "yes" ]]; then
  568. # docker does its own firewalling
  569. return
  570. fi
  571. if [[ $ONION_ONLY != "no" ]]; then
  572. return
  573. fi
  574. firewall_add HTTP 80 tcp
  575. firewall_add HTTPS 443 tcp
  576. mark_completed $FUNCNAME
  577. }
  578. function update_default_domain {
  579. if [ -d /etc/prosody ]; then
  580. if [ ! -d /etc/prosody/certs ]; then
  581. mkdir /etc/prosody/certs
  582. fi
  583. if [[ $(cert_exists chat.${DEFAULT_DOMAIN_NAME} pem) == "1" ]]; then
  584. sed -i 's|--Component "conference.|Component "chat.|g' /etc/prosody/prosody.cfg.lua
  585. fi
  586. if [[ $(cert_exists xmpp.${DEFAULT_DOMAIN_NAME} pem) == "1" ]]; then
  587. sed -i 's|--Component "conference.|Component "xmpp.|g' /etc/prosody/prosody.cfg.lua
  588. fi
  589. if [[ $(cert_exists conference.${DEFAULT_DOMAIN_NAME} pem) == "1" ]]; then
  590. sed -i 's|--Component "conference.|Component "conference.|g' /etc/prosody/prosody.cfg.lua
  591. fi
  592. cp /etc/ssl/private/xmpp* /etc/prosody/certs
  593. cp /etc/ssl/private/${DEFAULT_DOMAIN_NAME}* /etc/prosody/certs
  594. cp /etc/ssl/certs/xmpp* /etc/prosody/certs
  595. cp /etc/ssl/certs/${DEFAULT_DOMAIN_NAME}* /etc/prosody/certs
  596. if [ ! /etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.pem ]; then
  597. if [ ! /etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.crt ]; then
  598. mv /etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.crt /etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.pem
  599. fi
  600. else
  601. sed -i "s|/etc/prosody/certs/xmpp.key|/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.key|g" /etc/prosody/conf.avail/xmpp.cfg.lua
  602. sed -i "s|/etc/prosody/certs/xmpp.crt|/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.pem|g" /etc/prosody/conf.avail/xmpp.cfg.lua
  603. sed -i "s|/etc/prosody/certs/xmpp.key|/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.key|g" /etc/prosody/prosody.cfg.lua
  604. sed -i "s|/etc/prosody/certs/xmpp.crt|/etc/prosody/certs/${DEFAULT_DOMAIN_NAME}.pem|g" /etc/prosody/prosody.cfg.lua
  605. fi
  606. chown -R prosody:prosody /etc/prosody
  607. systemctl restart prosody
  608. fi
  609. }
  610. # NOTE: deliberately no exit 0