install 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020
  1. #!/bin/bash
  2. #################################################################
  3. # auto-elearning #
  4. # Instala automáticamente una Wiki (MediaWiki) y un Campus #
  5. # Virtual (Moodle). #
  6. # Para ello instala un entorno LEMP (GNU/Linux+Nginx+MySQL/ #
  7. # MariaDB+PHP) o LAMP (GNU/Linux+Apache+MySQL/MariaDB+PHP). #
  8. # Además instala certificados SSL/TLS válidos de Let's Encrypt #
  9. # (o auto-firmados) y genera copias de seguridad diariamente. #
  10. # #
  11. # Guzman Castanedo Villalba (guzman@castanedo.es) Junio 2018 #
  12. # GPLv3 (https://www.gnu.org/licenses/gpl.html) #
  13. #################################################################
  14. comprobarError() {
  15. # Permite comprobar si se ha producido un error y de serlo devuelve un código de error
  16. # comprobarError exitNum codeNum extraInfo
  17. # 1xx: Servidor Web
  18. # 2xx: Base de Datos
  19. # 3xx: PHP
  20. # 4xx: SSL/TLS
  21. # 5xx: MediaWiki
  22. # 6xx: Moodle
  23. # 7xx: Backup automático
  24. # 8xx: Dependencias
  25. # 9xx: Servicios & Firewall
  26. type="ERROR"
  27. exitNum=$1
  28. shift
  29. codeNum=$1
  30. shift
  31. extraInfo=$@
  32. case $codeNum in
  33. 1)
  34. error="$type $codeNum:\tInstalación interrumpida por el usuario.\n"
  35. ;;
  36. 2)
  37. error="$type $codeNum:\tError interno (selección express).\n"
  38. ;;
  39. 3)
  40. error="$type $codeNum:\tError interno (selección avanzada).\n"
  41. ;;
  42. 4)
  43. error="\n$type $codeNum:\tEl archivo '"$(realpath $extraInfo)"' no existe.\n"
  44. ;;
  45. 5)
  46. error="\n$type $codeNum:\tEl directorio '"$(realpath $extraInfo)"' no existe.\n"
  47. ;;
  48. 6)
  49. error="$type $codeNum:\tError interno (selección SSL/TLS).\n"
  50. ;;
  51. 100)
  52. error="$type $codeNum:\tError interno (selección del servidor web).\n"
  53. ;;
  54. 101)
  55. error="\n$type $codeNum:\tError al instalar Apache2.\nDetalles:\n$extraInfo\n"
  56. ;;
  57. 102)
  58. error="\n$type $codeNum:\tError al instalar Nginx.\nDetalles:\n$extraInfo\n"
  59. ;;
  60. 103)
  61. error="\n$type $codeNum:\tError al nstalar repositorio 'epel-release'.\nDetalles:\n$extraInfo\n"
  62. ;;
  63. 104)
  64. error="\n$type $codeNum:\tError interno (instalación Apache2).\n"
  65. ;;
  66. 105)
  67. error="\n$type $codeNum:\tError interno (instalación Nginx).\n"
  68. ;;
  69. 106)
  70. type="WARNING"
  71. error="\n$type $codeNum:\tImposible instalar 'info.php'.\n"
  72. ;;
  73. 107)
  74. error="\n$type $codeNum:\tError al configurar Nginx.\n"
  75. ;;
  76. 108)
  77. error="\n$type $codeNum:\tError al configurar Apache2.\n"
  78. ;;
  79. 200)
  80. error="$type $codeNum:\tError interno (selección de base de datos).\n"
  81. ;;
  82. 201)
  83. error="\n$type $codeNum:\tError al instalar MySQL.\nDetalles:\n$extraInfo\n"
  84. ;;
  85. 202)
  86. error="\n$type $codeNum:\tError al instalar MariaDB.\nDetalles:\n$extraInfo\n"
  87. ;;
  88. 203)
  89. error="\n$type $codeNum:\tError interno (instalación MySQL).\n"
  90. ;;
  91. 204)
  92. error="\n$type $codeNum:\tError interno (instalación MariaDB).\n"
  93. ;;
  94. 205)
  95. error="\n$type $codeNum:\t$DIST no incluye MySQL en sus repositorios.\n"
  96. ;;
  97. 206)
  98. type="WARNING"
  99. error="\n$type $codeNum:\tUsuario 'root' ya dispone de contraseña."
  100. ;;
  101. 207)
  102. error="\n$type $codeNum:\tImposible cambiar la contraseña de 'root'."
  103. ;;
  104. 208)
  105. error="\n$type $codeNum:\tImposible desactivar acceso 'root' desde el exterior."
  106. ;;
  107. 209)
  108. error="\n$type $codeNum:\tImposible eliminar usuarios anónimos."
  109. ;;
  110. 210)
  111. type="WARNING"
  112. error="\n$type $codeNum:\tImposible eliminar bases de datos de pruebas."
  113. ;;
  114. 211)
  115. type="WARNING"
  116. error="\n$type $codeNum:\tImposible eliminar los permisos de las bases de datos de pruebas."
  117. ;;
  118. 212)
  119. error="\n$type $codeNum:\tImposible recargar base de datos."
  120. ;;
  121. 213)
  122. error="\n$type $codeNum:\tImposible configurar SQL.\n"
  123. ;;
  124. 214)
  125. type="WARNING"
  126. error="\n$type $codeNum:\tSQL ya está configurado."
  127. ;;
  128. 300)
  129. error="\n$type $codeNum:\tError interno (instalación PHP-7).\n"
  130. ;;
  131. 301)
  132. error="\n$type $codeNum:\tError interno (Web Server no seleccionado).\n"
  133. ;;
  134. 302)
  135. error="\n$type $codeNum:\tError al instalar PHP-7.\nDetalles:\n$extraInfo\n"
  136. ;;
  137. 303)
  138. error="\n$type $codeNum:\tError al instalar Repositorio Remi.\nDetalles:\n$extraInfo\n"
  139. ;;
  140. 304)
  141. error="\n$type $codeNum:\tSistema Operativo no compatible con PHP-7 ($OS $DIST $REV).\n"
  142. ;;
  143. 305)
  144. error="\n$type $codeNum:\tImposible configurar PHP-7.\n"
  145. ;;
  146. 401)
  147. error="\n$type $codeNum:\tError al instalar 'certbot' (Let's Encrypt).\n"
  148. ;;
  149. 402)
  150. error="\n$type $codeNum:\tImposible generar Certificados Autofirmados.\n"
  151. ;;
  152. 403)
  153. error="\n$type $codeNum:\tImposible generar claves de intercambio Diffie-Hellman.\n"
  154. ;;
  155. 404)
  156. error="\n$type $codeNum:\tImposible generar Certificados Let's Encrypt.\n"
  157. ;;
  158. 501)
  159. error="\n$type $codeNum:\tImposible descargar MediaWiki-1.31.0.\n"
  160. ;;
  161. 502)
  162. error="\n$type $codeNum:\tImposible configurar MediaWiki-1.31.0.\n"
  163. ;;
  164. 503)
  165. type="WARNING"
  166. error="\n$type $codeNum:\tYa existe una copia configurada de MediaWiki en el dominio: '$extraInfo'."
  167. ;;
  168. 601)
  169. error="\n$type $codeNum:\tImposible descargar Moodle-3.5.1.\n"
  170. ;;
  171. 602)
  172. error="\n$type $codeNum:\tImposible configurar Moodle-3.5.1.\n"
  173. ;;
  174. 603)
  175. type="WARNING"
  176. error="\n$type $codeNum:\tYa existe una copia configurada de Moodle en el dominio: '$extraInfo'."
  177. ;;
  178. 604)
  179. error="\n$type $codeNum:\tImposible configurar SELinux.\n"
  180. ;;
  181. 605)
  182. error="\n$type $codeNum:\tImposible instalar 'policycoreutils-python'.Detalles:\n$extraInfo\n"
  183. ;;
  184. 701)
  185. type="WARNING"
  186. error="\n$tupe $codeNum:\tImposible configurar actualizaciones automáticas.\n"
  187. ;;
  188. 800)
  189. error="$type $codeNum:\tEs necesario ser root ('sudo $0').\n"
  190. ;;
  191. 801)
  192. error="$type $codeNum:\t'whiptail' no instalado.\n"
  193. ;;
  194. 802)
  195. error="$type $codeNum:\t'hostnamectl' no instalado.\n"
  196. ;;
  197. 803)
  198. error="$type $codeNum:\t'apt-get' no instalado.\n"
  199. ;;
  200. 804)
  201. error="$type $codeNum:\t'yum' no instalado.\n"
  202. ;;
  203. 805)
  204. error="\n$type $codeNum:\tImposible actualizar repositorio\nDetalles:\n$extraInfo.\n"
  205. ;;
  206. 806)
  207. error="$type $codeNum:\t'ufw' no instalado.\n"
  208. ;;
  209. 807)
  210. error="$type $codeNum:\t'firewall-cmd' no instalado.\n"
  211. ;;
  212. 808)
  213. error="$type $codeNum:\t'tput' no instalado.\nDetalles:\n$extraInfo\n"
  214. ;;
  215. 809)
  216. error="$type $codeNum:\t'sed' no instalado.\nDetalles:\n$extraInfo\n"
  217. ;;
  218. 810)
  219. error="$type $codeNum:\t'curl' no instalado.\nDetalles:\n$extraInfo\n"
  220. ;;
  221. 811)
  222. error="$type $codeNum:\t'tar' no instalado.\nDetalles:\n$extraInfo\n"
  223. ;;
  224. 812)
  225. error="$type $codeNum:\t'gzip' no instalado.\nDetalles:\n$extraInfo\n"
  226. ;;
  227. 813)
  228. error="$type $codeNum:\t'bzip2' no instalado.\nDetalles:\n$extraInfo\n"
  229. ;;
  230. 814)
  231. error="$type $codeNum:\t'xz' no instalado.\nDetalles:\n$extraInfo\n"
  232. ;;
  233. 815)
  234. error="$type $codeNum:\t'openssl' no instalado.\nDetalles:\n$extraInfo\n"
  235. ;;
  236. 816)
  237. error="$type $codeNum:\t'find' no instalado.\n"
  238. ;;
  239. 817)
  240. error="$type $codeNum:\tLa Distribución '$OS $DIST $REV' no está soportada.\nSoportadas: Ubuntu 16.04, 18.04, Debian 9 y CentOS 7.\n"
  241. ;;
  242. 900)
  243. error="$type $codeNum:\tError interno (habilitar servicio).\n"
  244. ;;
  245. 901)
  246. error="$type $codeNum:\tImposible encender servicio '$extraInfo'.\n"
  247. ;;
  248. 902)
  249. error="$type $codeNum:\tImposible habilitar servicio '$extraInfo' durante el arranque.\n"
  250. ;;
  251. 903)
  252. error="$type $codeNum:\tError interno (deshabilitar servicio).\n"
  253. ;;
  254. 904)
  255. error="$type $codeNum:\tImposible parar servicio '$extraInfo'.\n"
  256. ;;
  257. 905)
  258. error="$type $codeNum:\tImposible deshabilitar servicio '$extraInfo' durante el arranque.\n"
  259. ;;
  260. 906)
  261. type="WARNING"
  262. error="\n$type $codeNum:\tImposible añadir regla al cortafuegos ('$extraInfo').\n"
  263. ;;
  264. 907)
  265. type="WARNING"
  266. error="\n$type $codeNum:\tImposible encender cortafuegos.\n"
  267. ;;
  268. 908)
  269. error="\n$type $codeNum:\tError interno (instalar Virtual Host).\n"
  270. ;;
  271. 909)
  272. error="\n$type $codeNum:\tVirtual Host '$extraInfo' no existe.\n"
  273. ;;
  274. 910)
  275. error="\n$type $codeNum:\tImposible copiar Virtual Host '$extraInfo'.\n"
  276. ;;
  277. 911)
  278. error="\n$type $codeNum:\tImposible activar Virtual Host '$extraInfo'.\n"
  279. ;;
  280. 912)
  281. error="\n$type $codeNum:\tError interno (recargar servicio).\n"
  282. ;;
  283. 913)
  284. error="\n$type $codeNum:\tImposible recargar servicio '$extraInfo'.\n"
  285. ;;
  286. *)
  287. error="ERROR 13:\tError interno (comprobación de errores)\n"
  288. exitNum=1
  289. codeNum=13
  290. ;;
  291. esac
  292. if [ $exitNum -ne 0 ];then
  293. echo -en "$error" | tee -a $logFile
  294. if [ $type = "ERROR" ];then
  295. exit $codeNum
  296. fi
  297. fi
  298. unset error exitNum codeNum type
  299. }
  300. OSInfo() {
  301. # Detecta el OS en el que se está ejecutando el programa, así como su versión
  302. # Sólo continuará si se trata de una distribución compatible
  303. echo -en "Detectando SO..." >> $logFile
  304. OS=$(uname -s)
  305. if [ $OS = "Linux" ]; then
  306. OS="GNU/Linux"
  307. if [ -f /etc/os-release ]; then
  308. DIST=$(grep ^NAME= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
  309. REV=$(grep ^VERSION= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
  310. ID=$(grep ^ID= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
  311. ID_LIKE=$(grep ^ID_LIKE= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
  312. VERSION=$(grep ^VERSION_ID= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
  313. for i in $ID; do
  314. case $i in
  315. debian)
  316. debianOS=true
  317. case $VERSION in
  318. 9)
  319. apacheName="apache2"
  320. nginxName="nginx"
  321. mysqlName="mysql"
  322. mariadbName="mariadb"
  323. phpFPMName="php7.0-fpm"
  324. ;;
  325. *)
  326. comprobarError 1 817
  327. ;;
  328. esac
  329. break
  330. ;;
  331. ubuntu)
  332. debianOS=true
  333. case $VERSION in
  334. 18.04)
  335. apacheName="apache2"
  336. nginxName="nginx"
  337. mysqlName="mysql"
  338. mariadbName="mariadb"
  339. phpFPMName="php7.2-fpm"
  340. ;;
  341. 16.04)
  342. apacheName="apache2"
  343. nginxName="nginx"
  344. mysqlName="mysql"
  345. mariadbName="mysql"
  346. phpFPMName="php7.0-fpm"
  347. ;;
  348. *)
  349. comprobarError 1 817
  350. ;;
  351. esac
  352. break
  353. ;;
  354. rhel|centos)
  355. rhelOS=true
  356. case $VERSION in
  357. 7)
  358. apacheName="httpd"
  359. nginxName="nginx"
  360. mysqlName=""
  361. mariadbName="mariadb"
  362. phpFPMName="php-fpm"
  363. remiRepo="http://remi.mirrors.cu.be/enterprise/remi-release-7.rpm"
  364. ;;
  365. *)
  366. comprobarError 1 817
  367. ;;
  368. esac
  369. break
  370. ;;
  371. fedora)
  372. rhelOS=true
  373. case $VERSION in
  374. 28)
  375. apacheName="httpd"
  376. nginxName="nginx"
  377. mysqlName=""
  378. mariadbName="mariadb"
  379. phpFPMName="php-fpm"
  380. remiRepo="http://remi.mirrors.cu.be/fedora/remi-release-28.rpm"
  381. ;;
  382. *)
  383. comprobarError 1 817
  384. ;;
  385. esac
  386. break
  387. ;;
  388. *)
  389. debianOS=false
  390. rhelOS=false
  391. comprobarError 1 817
  392. ;;
  393. esac
  394. done
  395. else
  396. # Other Linux (No Soportado)
  397. comprobarError 1 817
  398. fi
  399. else
  400. # UNIX, OS X, ... (No Soportado)
  401. comprobarError 1 817
  402. fi
  403. echo -en " $OS $DIST $REV\n" >> $logFile
  404. HDInfo=$(df -h | head -1)"\n"$(df -h | grep ^/dev/sd)"\n"$(df -h | grep ^/dev/mapper)
  405. echo -en "$HDInfo\n" >> $logFile
  406. }
  407. comprobarRoot() {
  408. # Comprueba si se está ejecutando con privilegios de root
  409. comprobarError $(id -u) 800
  410. }
  411. comprobarDependencias() {
  412. # Comprueba si están instalados todos los programas necesarios.
  413. # En la mayoría de los casos, trata de instalarlos.
  414. # Comprobamos whiptail
  415. which whiptail > /dev/null 2>&1
  416. comprobarError $? 801
  417. # Comprobamos hostnamectl
  418. which hostnamectl > /dev/null 2>&1
  419. comprobarError $? 802
  420. which find > /dev/null 2>&1
  421. comprobarError $? 816
  422. if [ $debianOS = true ];then
  423. # Comprobamos apt-get
  424. which apt-get > /dev/null 2>&1
  425. comprobarError $? 803
  426. # Actualizamos base de datos del repositorio
  427. echo -en "Actualizando repositorio APT..." | tee -a $logFile
  428. result=$(apt-get -q -y update 2>&1)
  429. comprobarError $? 805 $result
  430. echo -en " OK.\n" | tee -a $logFile
  431. # Comprobamos Firewall (ufw)
  432. which ufw > /dev/null 2>&1
  433. comprobarError $? 806
  434. # Comprobamos tput
  435. which tput > /dev/null 2>&1
  436. if [ $? -ne 0 ];then
  437. result=$(apt-get -q -y ncurses-bin 2>&1)
  438. comprobarError $? 808 $result
  439. fi
  440. # Comprobar sed
  441. which sed > /dev/null 2>&1
  442. if [ $? -ne 0 ];then
  443. result=$(apt-get -q -y sed 2>&1)
  444. comprobarError $? 809 $result
  445. fi
  446. # Comprobar curl
  447. which curl > /dev/null 2>&1
  448. if [ $? -ne 0 ];then
  449. result=$(apt-get -q -y curl 2>&1)
  450. comprobarError $? 810 $result
  451. fi
  452. # Comprobamos tar, gzip, bzip2 y xz
  453. which tar > /dev/null 2>&1
  454. if [ $? -ne 0 ];then
  455. result=$(apt-get -q -y install tar 2>&1)
  456. comprobarError $? 811 $result
  457. fi
  458. which gzip > /dev/null 2>&1
  459. if [ $? -ne 0 ];then
  460. result=$(apt-get -q -y install gzip 2>&1)
  461. comprobarError $? 812 $result
  462. fi
  463. which bzip2 > /dev/null 2>&1
  464. if [ $? -ne 0 ];then
  465. result=$(apt-get -q -y install bzip2 2>&1)
  466. comprobarError $? 813 $result
  467. fi
  468. which xz > /dev/null 2>&1
  469. if [ $? -ne 0 ];then
  470. result=$(apt-get -q -y install xz-utils 2>&1)
  471. comprobarError $? 814 $result
  472. fi
  473. which openssl > /dev/null 2>&1
  474. if [ $? -ne 0 ];then
  475. result=$(apt-get -q -y install openssl 2>&1)
  476. comprobarError $? 815 $result
  477. fi
  478. fi
  479. if [ $rhelOS = true ]; then
  480. # Comprobamos yum
  481. which yum > /dev/null 2>&1
  482. comprobarError $? 804
  483. # Actualizamos base de datos del repositorio
  484. echo -en "Actualizando repositorio YUM..." | tee -a $logFile
  485. result=$(yum -y makecache 2>&1)
  486. comprobarError $? 805 $result
  487. echo -en " OK.\n" | tee -a $logFile
  488. # Comprobamos Firewall (firewall-cmd)
  489. which firewall-cmd > /dev/null 2>&1
  490. comprobarError $? 807
  491. # Comprobamos tput
  492. which tput > /dev/null 2>&1
  493. if [ $? -ne 0 ];then
  494. result=$(yum -y ncurses 2>&1)
  495. comprobarError $? 808 $result
  496. fi
  497. # Comprobar sed
  498. which sed > /dev/null 2>&1
  499. if [ $? -ne 0 ];then
  500. result=$(yum -y sed 2>&1)
  501. comprobarError $? 809 $result
  502. fi
  503. # Comprobar curl
  504. which curl > /dev/null 2>&1
  505. if [ $? -ne 0 ];then
  506. result=$(yum -y curl 2>&1)
  507. comprobarError $? 810 $result
  508. fi
  509. # Comprobamos tar, gzip, bzip2 y xz
  510. which tar > /dev/null 2>&1
  511. if [ $? -ne 0 ];then
  512. result=$(yum -y install tar 2>&1)
  513. comprobarError $? 811 $result
  514. fi
  515. which gzip > /dev/null 2>&1
  516. if [ $? -ne 0 ];then
  517. result=$(yum -y install gzip 2>&1)
  518. comprobarError $? 812 $result
  519. fi
  520. which bzip2 > /dev/null 2>&1
  521. if [ $? -ne 0 ];then
  522. result=$(yum -y install bzip2 2>&1)
  523. comprobarError $? 813 $result
  524. fi
  525. which xz > /dev/null 2>&1
  526. if [ $? -ne 0 ];then
  527. result=$(yum -y install xz 2>&1)
  528. comprobarError $? 814 $result
  529. fi
  530. which openssl > /dev/null 2>&1
  531. if [ $? -ne 0 ];then
  532. result=$(yum -y install openssl 2>&1)
  533. comprobarError $? 815 $result
  534. fi
  535. fi
  536. }
  537. inicializarVariables() {
  538. # Inicializa las variables que necesitan de un estado previo
  539. debianOS=false
  540. rhelOS=false
  541. apacheOn=false
  542. nginxOn=false
  543. mySQLOn=false
  544. mariaDBOn=false
  545. phpOn=false
  546. sslOn=false
  547. letsEncryptOn=false
  548. mediaWikiOn=false
  549. moodleOn=false
  550. infoPHPOn=false
  551. backupOn=false
  552. hostname=""
  553. logFile="./."$(basename $0)".log"
  554. maxUpload="100M"
  555. apacheName=""
  556. nginxName=""
  557. mysqlName=""
  558. mariadbName=""
  559. remiRepo=""
  560. webServerName=""
  561. webServerUser=""
  562. webServerGroup=""
  563. sqlServerName=""
  564. phpFPMName=""
  565. nombreMediaWiki=""
  566. dominioMediaWiki=""
  567. passwdMediaWiki=""
  568. nombreMoodle=""
  569. nombreCortoMoodle=""
  570. dominioMoodle=""
  571. passwdMoodle=""
  572. }
  573. instalacionExpress() {
  574. # Permite una instalación rápida, haciendo el menor número de preguntas
  575. nginxOn=true
  576. mariaDBOn=true
  577. phpOn=true
  578. sslOn=true
  579. letsEncryptOn=true
  580. mediaWikiOn=true
  581. moodleOn=true
  582. backupOn=true
  583. # Preguntas mínimas
  584. establecerFQDN
  585. leerSQLPasswd
  586. mostrarMediaWiki
  587. mostrarMoodle
  588. mostrarConfirmacion
  589. }
  590. mostrarBienvenida() {
  591. # Pantalla de bienvenida y muestra SO y estado de los discos
  592. ANCHO=$(tput cols)
  593. ALTO=$(tput lines)
  594. whiptail --title "INSTALACION MEDIAWIKI" --yesno "Este script automatiza completamente la instalación de una WIKI y un CAMPUS VIRTUAL.\nPara ello instala un servidor LAMP, el software MediaWiki y configura todo lo necesario.\n\nInformación del sistema:\nOS: $OS $DIST $REV\n$HDInfo" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --yes-button "Continuar" --no-button "Salir"
  595. comprobarError $? 1
  596. }
  597. mostrarExpress() {
  598. # Pantalla de elección entre instalación express o avanzada
  599. express=$(whiptail --title "INSTALACION EXPRESS" --radiolist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nLa instalación express instala Nginx, MariaDB, PHP-7, Let's Encrypt, MediaWiki, Moodle y backups automático.\nSeleccione el tipo de instalación que desee:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 2 \
  600. "Express" "Instalación rápida" ON \
  601. "Avanzada" "Permite escoger todas las opciones disponibles" OFF \
  602. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  603. comprobarError $? 1
  604. case $express in
  605. Express)
  606. instalacionExpress
  607. # DECIDIR QUÉ OPCIONES SON LAS MÍNIMAS
  608. ;;
  609. Avanzada)
  610. mostrarAvanzada
  611. ;;
  612. *)
  613. comprobarError 1 2
  614. ;;
  615. esac
  616. unset express
  617. }
  618. mostrarAvanzada() {
  619. # Pantalla que permite instalar un servidor LAMP o LEMP
  620. webServer=$(whiptail --title "INSTALACION AVANZADA" --radiolist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nEscoge el tipo de Servidor Web que quieres instalar:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 2 \
  621. "LEMP" "GNU/Linux + (E)Nginx + MySQL/MariaDB + PHP-7" ON \
  622. "LAMP" "GNU/Linux + Apache + MySQL/MariaDB + PHP-7" OFF \
  623. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  624. comprobarError $? 1
  625. for i in $webServer; do
  626. case $i in
  627. LEMP)
  628. nginxOn=true
  629. ;;
  630. LAMP)
  631. apacheOn=true
  632. ;;
  633. *)
  634. comprobarError 1 100
  635. ;;
  636. esac
  637. done
  638. # Opciones comunes
  639. establecerFQDN
  640. mostrarDatabase
  641. phpOn=true
  642. establecerMaxUpload
  643. mostrarComponentes
  644. mostrarConfirmacion
  645. unset webServer
  646. }
  647. mostrarComponentes() {
  648. # Pantalla de elección de componentes (SSL/TLS, MediaWiki, Moodle, InfoPHP y Backup)
  649. componentes=$(whiptail --title "INSTALACION AVANZADA" --checklist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nEscoge los componentes que quieres instalar:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 5 \
  650. "SSL/TLS" "Instalar certificados para activar HTTPS" ON \
  651. "MediaWiki" "Instalar wiki con MediaWiki" ON \
  652. "Moodle" "Instalar campus virtual con Moodle" ON \
  653. "InfoPHP" "Instalar info.php (sólo para pruebas)" OFF \
  654. "Backup" "Programar backups automáticos" ON \
  655. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  656. comprobarError $? 1
  657. # Mejora: autodetección de componentes ya instalados
  658. for i in $componentes; do
  659. case $i in
  660. \"SSL/TLS\")
  661. # 2 Opciones: Let's Encrypt o Autofirmado
  662. mostrarSSL
  663. ;;
  664. \"MediaWiki\")
  665. mediaWikiOn=true
  666. mostrarMediaWiki
  667. ;;
  668. \"Moodle\")
  669. moodleOn=true
  670. mostrarMoodle
  671. ;;
  672. \"InfoPHP\")
  673. infoPHPOn=true
  674. ;;
  675. \"Backup\")
  676. backupOn=true
  677. ;;
  678. *)
  679. comprobarError 1 3
  680. ;;
  681. esac
  682. done
  683. unset componentes
  684. }
  685. mostrarSSL() {
  686. # Pantalla que permite seleccionar el tipo de certificados
  687. ssl=$(whiptail --title "INSTALACION SSL/TLS" --radiolist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nEscoge el tipo de Certificado SSL/TLS que quieres instalar:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 2 \
  688. "LetsEncrypt" "Compatible con todos los navegadores" ON \
  689. "Auto-Firmado" "Certificados auto-firmados (sólo para pruebas)" OFF \
  690. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  691. comprobarError $? 1
  692. for i in $ssl; do
  693. case $i in
  694. LetsEncrypt)
  695. sslOn=true
  696. letsEncryptOn=true
  697. ;;
  698. Auto-Firmado)
  699. sslOn=true
  700. ;;
  701. *)
  702. comprobarError 1 6
  703. ;;
  704. esac
  705. done
  706. unset ssl
  707. }
  708. mostrarMediaWiki(){
  709. # Pantalla que pregunta sobre las opciones necesarias para configurar MediaWiki
  710. # Introducir nombre wiki
  711. while [ -z "$nombreMediaWiki" ]; do
  712. nombreMediaWiki=$(whiptail --title "CONFIGURACION MEDIAWIKI" --inputbox "Introduzca el nombre de la Wiki:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  713. comprobarError $? 1
  714. done
  715. # Introducir dominio
  716. while [ -z "$dominioMediaWiki" ]; do
  717. dominioMediaWiki=$(whiptail --title "CONFIGURACION MEDIAWIKI" --inputbox "Introduzca el dominio/subdominio de la Wiki.\nTenga en cuenta que debes apuntar este dominio a la dirección IP de esta máquina mediante un registro DNS de tipo CNAME.\nSi quiere introducir varios dominios sepárelos con espacios. El primero será el principal.\nPor ejemplo: 'www.$hostname $hostname wiki.$hostname'" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) wiki.$hostname --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  718. comprobarError $? 1
  719. done
  720. cont=1
  721. serverName=""
  722. aliasMediaWiki=""
  723. for dominio in $dominioMediaWiki;do
  724. if [ $cont -eq 1 ];then
  725. # Dominio Principal (ServerName)
  726. serverName=$dominio
  727. else
  728. # Dominios Secundarios (ServerAlias)
  729. aliasMediaWiki=$aliasMediaWiki" "$dominio
  730. fi
  731. cont=$((cont + 1))
  732. done
  733. dominioMediaWiki=$serverName
  734. # Introducir contraseña
  735. control=false
  736. error=""
  737. while [ $control = false ]; do
  738. passwdMediaWiki=$(whiptail --title "CONFIGURACION MEDIAWIKI" --passwordbox "$error""Introduzca la contraseña para el usuario administrador 'admin':" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
  739. comprobarError $? 1
  740. passwdMediaWiki2=$(whiptail --title "CONFIGURACION MEDIAWIKI" --passwordbox "Confirme la contraseña:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
  741. comprobarError $? 1
  742. if [ -z "$passwdMediaWiki" ] || [ -z "$passwdMediaWiki2" ]; then
  743. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  744. elif [ $passwdMediaWiki != $passwdMediaWiki2 ];then
  745. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  746. else
  747. control=true
  748. fi
  749. done
  750. unset control error passwdMediaWiki2 dominio cont serverName
  751. }
  752. mostrarMoodle() {
  753. # Pantalla que pregunta sobre las opciones necesarias para configurar Moodle
  754. # Introducir Nombre Moodle
  755. while [ -z "$nombreMoodle" ]; do
  756. nombreMoodle=$(whiptail --title "CONFIGURACION MOODLE" --inputbox "Introduzca el NOMBRE COMPLETO del campus virtual.\nPor ejemplo: 'Campus Virtual Ejemplo'." $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  757. comprobarError $? 1
  758. done
  759. # Introducir Nombre Corto Moodle
  760. while [ -z "$nombreCortoMoodle" ]; do
  761. nombreCortoMoodle=$(whiptail --title "CONFIGURACION MOODLE" --inputbox "Introduzca el NOMBRE CORTO del campus virtual.\nPor ejemplo: 'Ejemplo'." $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  762. comprobarError $? 1
  763. done
  764. nombreCortoMoodle=$(echo $nombreCortoMoodle | cut -d ' ' -f 1)
  765. # Introducir dominio
  766. while [ -z "$dominioMoodle" ]; do
  767. dominioMoodle=$(whiptail --title "CONFIGURACION MOODLE" --inputbox "Introduzca el dominio/subdominio del campus virtual.\nMoodle SÓLO permite un ÚNICO DOMINIO." $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) moodle.$hostname --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  768. comprobarError $? 1
  769. done
  770. cont=1
  771. serverName=""
  772. aliasMoodle=""
  773. for dominio in $dominioMoodle;do
  774. if [ $cont -eq 1 ];then
  775. # Dominio Principal (ServerName)
  776. serverName=$dominio
  777. else
  778. # Dominios Secundarios (ServerAlias)
  779. aliasMeoodle=$aliasMoodle" "$dominio
  780. fi
  781. cont=$((cont + 1))
  782. done
  783. dominioMoodle=$serverName
  784. # Introducir contraseña
  785. control=false
  786. error=""
  787. while [ $control = false ]; do
  788. passwdMoodle=$(whiptail --title "CONFIGURACION MOODLE" --passwordbox "$error""Introduzca la contraseña para el usuario administrador 'admin':" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
  789. comprobarError $? 1
  790. passwdMoodle2=$(whiptail --title "CONFIGURACION MOODLE" --passwordbox "Confirme la contraseña:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
  791. comprobarError $? 1
  792. if [ -z "$passwdMoodle" ] || [ -z "$passwdMoodle2" ]; then
  793. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  794. elif [ $passwdMoodle != $passwdMoodle2 ];then
  795. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  796. else
  797. control=true
  798. fi
  799. done
  800. unset control error passwdMoodle2 dominio cont serverName aliasMoodle
  801. }
  802. mostrarConfirmacion() {
  803. # Pantalla que presenta una confirmación antes de realizar la instalación
  804. whiptail --title "INSTALACION" --yesno "ESTA TODO LISTO PARA LA INSTALACION.\nNO SE OLVIDE DE GUARDAR LAS CONFIGURACIONES EN UN LUGAR SEGURO, YA QUE SERÁN IMPORTANTES POR SI DESEA HACER ALGÚN CAMBIO EN EL FUTURO.\n¿DESEA CONTINUAR?" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --yes-button "Instalar" --no-button "Salir"
  805. comprobarError $? 1
  806. }
  807. establecerFQDN() {
  808. # Configura el FQDN (dominio principal del servidor)
  809. while [ -z "$hostname" ]; do
  810. hostname=$(whiptail --title "FQDN" --inputbox "El nombre de dominio principal (FQDN) de este servidor es:\n"$(hostname)"\n\n¿Quieres cambiarlo por otro?" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Cambiar" --cancel-button "No Cambiar" 3>&1 1>&2 2>&3)
  811. if [ $? -eq 0 ] && [ ! -z "$hostname" ]; then
  812. hostnamectl set-hostname $hostname
  813. else
  814. hostname=$(hostname)
  815. fi
  816. done
  817. echo -en "Hostname: $hostname\n" >> $logFile
  818. }
  819. instalarApache() {
  820. # Instala Apache2
  821. webServerName=$apacheName
  822. if [ $debianOS = true ];then
  823. result=$(apt-get -q -y install apache2 2>&1)
  824. comprobarError $? 101 $result
  825. elif [ $rhelOS = true ]; then
  826. result=$(yum -y install httpd 2>&1)
  827. comprobarError $? 101 $result
  828. if [ $sslOn = true ];then
  829. # Instalamos módulo mod_ssl (no se instala por defecto)
  830. result=$(yum -y install mod_ssl 2>&1)
  831. comprobarError $? 101 $result
  832. fi
  833. else
  834. comprobarError 1 104
  835. fi
  836. deshabilitarServicio $webServerName
  837. }
  838. configurarApache() {
  839. # Configura Apache2
  840. if [ $debianOS = true ];then
  841. apacheConfFile="./etc/apache2/apache2.conf"
  842. if [ ! -f $apacheConfFile ];then
  843. comprobarError 1 4 $apacheConfFile
  844. fi
  845. cp -f $apacheConfFile /etc/$webServerName/apache2.conf 2>/dev/null
  846. comprobarError $? 108
  847. webServerUser=$(grep ^User /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
  848. webServerGroup=$(grep ^Group /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
  849. if [ ! -L /etc/$webServerName/logs ];then
  850. ln -s /var/log/apache2 /etc/$webServerName/logs 2>/dev/null
  851. comprobarError $? 108
  852. fi
  853. # Activamos mod_rewrite (no viene activado por defecto)
  854. a2enmod rewrite >/dev/null 2>&1
  855. comprobarError $? 108
  856. # Activamos mod_ssl y mod_headers (no viene activado por defecto)
  857. if [ $sslOn = true ];then
  858. a2enmod ssl >/dev/null 2>&1
  859. comprobarError $? 108
  860. a2enmod headers >/dev/null 2>&1
  861. comprobarError $? 108
  862. fi
  863. unset apacheConfFile
  864. elif [ $rhelOS = true ];then
  865. apacheConfFile="./etc/apache2/conf/httpd.conf"
  866. sslConfFile="./etc/apache2/conf.d/ssl.conf"
  867. welcomeConfFile="/etc/apache2/conf.d/welcome.conf"
  868. if [ ! -f $apacheConfFile ];then
  869. comprobarError 1 4 $apacheConfFile
  870. fi
  871. cp -f $apacheConfFile /etc/$webServerName/conf/httpd.conf 2>/dev/null
  872. comprobarError $? 108
  873. # Desactivamos Mensaje de Bienvenida
  874. if [ -f $welcomeConfFile ];then
  875. sed -i -e 's/^/#/' $welcomeConfFile
  876. comprobarError $? 108
  877. fi
  878. # Configuramos mod_ssl
  879. if [ $sslOn = true ];then
  880. if [ ! -f $sslConfFile ];then
  881. comprobarError 1 4 $sslConfFile
  882. fi
  883. cp -f $sslConfFile /etc/$webServerName/conf.d/ssl.conf 2>/dev/null
  884. comprobarError $? 108
  885. fi
  886. webServerUser=$(grep ^User /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
  887. webServerGroup=$(grep ^Group /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
  888. unset apacheConfFile sslConfFile welcomeConfFile
  889. fi
  890. if [ ! -d "/etc/$webServerName/sites-available" ];then
  891. mkdir "/etc/$webServerName/sites-available" 2>/dev/null
  892. comprobarError $? 5 "/etc/$webServerName/sites-available"
  893. fi
  894. if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
  895. mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
  896. comprobarError $? 5 "/etc/$webServerName/sites-enabled"
  897. else
  898. # Eliminar Virtual Host por defecto
  899. if [ -f /etc/$webServerName/sites-enabled/000-default.conf ];then
  900. rm -f /etc/$webServerName/sites-enabled/000-default.conf 2>/dev/null
  901. fi
  902. fi
  903. }
  904. instalarNginx() {
  905. # Instala Nginx
  906. webServerName=$nginxName
  907. if [ $debianOS = true ];then
  908. result=$(apt-get -q -y install nginx 2>&1)
  909. comprobarError $? 102 $result
  910. elif [ $rhelOS = true ]; then
  911. # Hay que instalar primero otro repositorio
  912. result=$(yum -y install epel-release)
  913. comprobarError $? 103 $result
  914. result=$(yum -y install nginx 2>&1)
  915. comprobarError $? 102 $result
  916. else
  917. comprobarError 1 105
  918. fi
  919. deshabilitarServicio $webServerName
  920. }
  921. configurarNginx() {
  922. # Configura Nginx
  923. rm -Rf "/etc/$webServerName/!(sites-available|sites-enabled)" 2>/dev/null
  924. comprobarError $? 107
  925. nginxConfFile="./etc/$webServerName"
  926. if [ -d "$nginxConfFile" ];then
  927. cp -Rf $nginxConfFile/* /etc/$webServerName/ 2>/dev/null
  928. comprobarError $? 107
  929. else
  930. comprobarError 1 5 "$nginxConfFile"
  931. fi
  932. if [ ! -d "/etc/$webServerName/sites-available" ];then
  933. mkdir "/etc/$webServerName/sites-available" 2>/dev/null
  934. comprobarError $? 5 "/etc/$webServerName/sites-available"
  935. fi
  936. if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
  937. mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
  938. comprobarError $? 5 "/etc/$webServerName/sites-enabled"
  939. else
  940. # Eliminar Virtual Host por defecto
  941. if [ -f /etc/$webServerName/sites-enabled/default ];then
  942. rm -f /etc/$webServerName/sites-enabled/default 2>/dev/null
  943. fi
  944. fi
  945. # Configuramos Usuario y Grupo
  946. if [ $debianOS = true ];then
  947. webServerUser="www-data"
  948. webServerGroup=$webServerUser
  949. elif [ $rhelOS = true ];then
  950. webServerUser="nginx"
  951. webServerGroup=$webServerUser
  952. fi
  953. sed -i '/user /c\user '$webServerUser';' /etc/$webServerName/nginx.conf
  954. comprobarError $? 107
  955. unset nginxConfFile
  956. }
  957. instalarVirtualHost() {
  958. # Configuramos un Virtual Host para Apache o Nginx
  959. # Uso: instalarVirtualHost $root $virtualHost $dominio $alias
  960. if [ $# -ge 3 ];then
  961. rootVirtualHost=$(realpath $1)
  962. shift
  963. virtualHostFile=$(realpath $1)
  964. shift
  965. dominioVirtualHost=$1
  966. virtualHostName=$dominioVirtualHost".conf"
  967. shift
  968. aliasVirtualHost=$@
  969. else
  970. comprobarError 1 908
  971. fi
  972. if [ ! -f $virtualHostFile ];then
  973. comprobarError 1 909 $virtualHostName
  974. fi
  975. if [ $apacheOn = true ];then
  976. # Configuramos root, dominio y logs
  977. sed -i '/ServerName /c\\tServerName '"$dominioVirtualHost" $virtualHostFile
  978. comprobarError $? 908
  979. if [ ! -z "$aliasVirtualHost" ];then
  980. sed -i '/ServerName /a\\tServerAlias '"$aliasVirtualHost" $virtualHostFile
  981. comprobarError $? 908
  982. fi
  983. sed -i '/DocumentRoot /c\\tDocumentRoot '"$rootVirtualHost" $virtualHostFile
  984. comprobarError $? 908
  985. sed -i '/ErrorLog /c\\tErrorLog logs/'"$dominioVirtualHost"'-error.log' $virtualHostFile
  986. comprobarError $? 908
  987. sed -i '/CustomLog /c\\tCustomLog logs/'"$dominioVirtualHost"'-access.log common' $virtualHostFile
  988. comprobarError $? 908
  989. if [ $sslOn = true ];then
  990. sed -i '/SSLCertificateFile /c\\tSSLCertificateFile ssl/'"$dominioVirtualHost"'.crt' $virtualHostFile
  991. comprobarError $? 908
  992. sed -i '/SSLCertificateKeyFile /c\\tSSLCertificateKeyFile ssl/'"$dominioVirtualHost"'.key' $virtualHostFile
  993. comprobarError $? 908
  994. fi
  995. elif [ $nginxOn = true ];then
  996. # Configuramos root, dominio, logs y php-fpm.sock (NGINX)
  997. sed -i '/root /c\\troot '$rootVirtualHost';' "$virtualHostFile"
  998. comprobarError $? 908
  999. sed -i '/server_name /c\\tserver_name '"$dominioVirtualHost"' '"$aliasVirtualHost"';' $virtualHostFile
  1000. comprobarError $? 908
  1001. sed -i '/access_log /c\\taccess_log /var/log/nginx/'"$dominioVirtualHost"'-access.log;' $virtualHostFile
  1002. comprobarError $? 908
  1003. sed -i '/error_log /c\\terror_log /var/log/nginx/'"$dominioVirtualHost"'-error.log;' $virtualHostFile
  1004. comprobarError $? 908
  1005. socket=$(find /var/run/ -type s -name 'php*.sock')
  1006. sed -i '/fastcgi_pass /c\\t\tfastcgi_pass unix:'"$socket"';' $virtualHostFile
  1007. comprobarError $? 908
  1008. if [ $sslOn = true ];then
  1009. sed -i '/ssl_certificate /c\\tssl_certificate ssl/'"$dominioVirtualHost"'.crt;' $virtualHostFile
  1010. comprobarError $? 908
  1011. sed -i '/ssl_certificate_key /c\\tssl_certificate_key ssl/'"$dominioVirtualHost"'.key;' $virtualHostFile
  1012. comprobarError $? 908
  1013. fi
  1014. fi
  1015. # Copiamos ficheros de configuración
  1016. cp -f $virtualHostFile "/etc/$webServerName/sites-available/$virtualHostName" >> $logFile 2>&1
  1017. comprobarError $? 910
  1018. if [ -f "/etc/$webServerName/sites-enabled/$virtualHostName" ];then
  1019. rm -f /etc/$webServerName/sites-enabled/$virtualHostName 2>/dev/null
  1020. comprobarError 911 $virtualHostName
  1021. fi
  1022. ln -s "/etc/$webServerName/sites-available/$virtualHostName" "/etc/$webServerName/sites-enabled/$virtualHostName" >> $logFile 2>&1
  1023. comprobarError $? 911 $virtualHostName
  1024. recargarServicio $webServerName
  1025. unset rootVirtualHost dominioVirtualHost virtualHostFile virtualHostName aliasVirtualHost socket
  1026. }
  1027. mostrarDatabase() {
  1028. # Pantalla que permite escoger entre instalar MariaDB o MySQL
  1029. if [ $debianOS = true ]; then
  1030. database=$(whiptail --title "BASE DE DATOS" --radiolist "<ESPACIO>: seleccionar <TAB>: cambiar <FLECHAS>: moverse\n\nEscoge la base de datos que quieres usar:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) 2 \
  1031. "MariaDB" "Instalar la base de datos MariaDB (fork de MySQL)" ON \
  1032. "MySQL" "Instalar la base de datos MySQL (uso no comercial)" OFF \
  1033. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  1034. comprobarError $? 1
  1035. case $database in
  1036. MariaDB)
  1037. mariaDBOn=true
  1038. ;;
  1039. MySQL)
  1040. mySQLOn=true
  1041. ;;
  1042. *)
  1043. comprobarError 1 200
  1044. ;;
  1045. esac
  1046. unset database
  1047. elif [ $rhelOS = true ]; then
  1048. whiptail --title "BASE DE DATOS" --yesno "Para su distribucion $OS $DIST $REV, sólo está disponible la base de datos MariaDB." $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --yes-button "Continuar" --no-button "Salir"
  1049. comprobarError $? 1
  1050. mariaDBOn=true
  1051. else
  1052. comprobarError 1 200
  1053. fi
  1054. # Otras opciones (contraseña)
  1055. leerSQLPasswd
  1056. }
  1057. leerSQLPasswd() {
  1058. # Pantalla para leer la contraseña para el usuario root de SQL
  1059. control=false
  1060. error=""
  1061. # Leemos la contreseña (stdin) y confirmamos
  1062. while [ $control = false ]; do
  1063. sqlPasswd=$(whiptail --title "CONTRASEÑA SQL" --passwordbox "$error""Introduzca la contraseña para el usuario 'root' de la base de datos:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
  1064. comprobarError $? 1
  1065. sqlPasswd2=$(whiptail --title "CONTRASEÑA SQL" --passwordbox "Confirme la contraseña:" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) --ok-button "Continuar" --nocancel 3>&1 1>&2 2>&3)
  1066. comprobarError $? 1
  1067. #echo -en "SQL Password 1: $sqlPasswd\n"
  1068. #echo -en "SQL Password 2: $sqlPasswd2\n"
  1069. if [ -z "$sqlPasswd" ] || [ -z "$sqlPasswd2" ]; then
  1070. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  1071. elif [ $sqlPasswd != $sqlPasswd2 ];then
  1072. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  1073. else
  1074. control=true
  1075. fi
  1076. done
  1077. #echo -en "SQL Password: $sqlPasswd\n"
  1078. unset control error sqlPasswd2
  1079. }
  1080. establecerSQLPasswd() {
  1081. # Establecemos SQL root passwd y securizamos BD (mysql_secure_installation)
  1082. # Comprobamos si ya tiene una contraseña asignada
  1083. mysql -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1084. if [ $? -eq 0 ];then
  1085. # Establecemos contraseña del usuario root (y desactivamos posibles plugins para forzar login por contraseña)
  1086. mysql -e "UPDATE mysql.user SET plugin = '', Password = PASSWORD('$sqlPasswd') WHERE User = 'root'" >> $logFile 2>&1
  1087. if [ $? -ne 0 ];then
  1088. # Lo intentamos de otra forma (para versiones modernas de mysql)
  1089. mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$sqlPasswd'" >> $logFile 2>&1
  1090. comprobarError $? 207
  1091. fi
  1092. # Aplicamos el cambio de contraseña
  1093. mysql -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1094. # Desactivamos acceso root desde el exterior (solo localhost)
  1095. mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1')" >> $logFile 2>&1
  1096. comprobarError $? 208
  1097. # Eliminamos todos los usuarios anónimos
  1098. mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.user WHERE User=''" >> $logFile 2>&1
  1099. comprobarError $? 209
  1100. # Eliminamos bases de datos 'test'
  1101. mysql -u root --password=$sqlPasswd -e "DROP DATABASE IF EXISTS test" >> $logFile 2>&1
  1102. comprobarError $? 210
  1103. # Eliminamos privilegios de la base de datos 'test'
  1104. mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'" >> $logFile 2>&1
  1105. comprobarError $? 211
  1106. # Aplicamos los cambios
  1107. mysql -u root --password=$sqlPasswd -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1108. comprobarError $? 212
  1109. else
  1110. comprobarError 1 206
  1111. fi
  1112. }
  1113. instalarMySQL() {
  1114. # Instala MySQL (sólo para Debian)
  1115. sqlServerName=$mysqlName
  1116. if [ $debianOS = true ];then
  1117. result=$(apt-get -q -y install mysql-server mysql-client 2>&1)
  1118. comprobarError $? 201 $result
  1119. elif [ $rhelOS = true ];then
  1120. # MySQL no disponible en RHEL. 2 opciones:
  1121. # 1) Instalar un repositorio adicional
  1122. # 2) No instalar MySQL en distribuciones RHEL
  1123. comprobarError 1 205
  1124. else
  1125. comprobarError 1 203
  1126. fi
  1127. deshabilitarServicio $sqlServerName
  1128. }
  1129. instalarMariaDB() {
  1130. # Instala MariaDB
  1131. sqlServerName=$mariadbName
  1132. if [ $debianOS = true ];then
  1133. result=$(apt-get -q -y install mariadb-server mariadb-client 2>&1)
  1134. comprobarError $? 202 $result
  1135. elif [ $rhelOS = true ];then
  1136. result=$(yum -y install mariadb-server mariadb 2>&1)
  1137. comprobarError $? 202 $result
  1138. else
  1139. comprobarError 1 204
  1140. fi
  1141. deshabilitarServicio $sqlServerName
  1142. }
  1143. configurarSQL() {
  1144. # Configura BarracudaFS en mysql (necesario para Moodle)
  1145. # Configura MariaDB o MySQL
  1146. if [ $mariaDBOn = true ] && [ $debianOS = true ];then
  1147. sqlConfFile="/etc/mysql/my.cnf"
  1148. elif [ $mariaDBOn = true ] && [ $rhelOS = true ];then
  1149. sqlConfFile="/etc/my.cnf"
  1150. elif [ $mySQLOn = true ] && [ $debianOS = true ];then
  1151. sqlConfFile="/etc/mysql/my.cnf"
  1152. else
  1153. comprobarError 1 213
  1154. fi
  1155. if [ ! -f $sqlConfFile ];then
  1156. comprobarError 1 213
  1157. fi
  1158. grep "# Configuration for Moodle" $sqlConfFile >/dev/null 2>&1
  1159. if [ $? -ne 0 ];then
  1160. # Establecemos UTF8 (codificación de caracteres) y Barracuda (sistema de ficheros)
  1161. echo -en "\n# Configuration for Moodle\n" >> $sqlConfFile
  1162. echo -en "[client]\n" >> $sqlConfFile
  1163. echo -en "default-character-set = utf8mb4\n\n" >> $sqlConfFile
  1164. echo -en "[mysqld]\n" >> $sqlConfFile
  1165. echo -en "innodb_file_format = Barracuda\n" >> $sqlConfFile
  1166. echo -en "innodb_file_per_table = 1\n" >> $sqlConfFile
  1167. echo -en "innodb_large_prefix\n\n" >> $sqlConfFile
  1168. echo -en "character-set-server = utf8mb4\n" >> $sqlConfFile
  1169. echo -en "collation-server = utf8mb4_unicode_ci\n" >> $sqlConfFile
  1170. echo -en "skip-character-set-client-handshake\n\n" >> $sqlConfFile
  1171. echo -en "[mysql]\n" >> $sqlConfFile
  1172. echo -en "default-character-set = utf8mb4\n" >> $sqlConfFile
  1173. else
  1174. comprobarError 1 214
  1175. fi
  1176. unset sqlConfFile
  1177. }
  1178. instalarPHP() {
  1179. # Instalamos PHP-7 y los módulos PHP que necesitan MediaWiki y Moodle
  1180. if [ $debianOS = true ];then
  1181. if [ $apacheOn = true ]; then
  1182. result=$(apt-get -q -y install php libapache2-mod-php php-mysql php-intl php-mbstring php-xml php-apcu php-gd php-curl php-zip php-soap php-xmlrpc 2>&1)
  1183. comprobarError $? 302 $result
  1184. elif [ $nginxOn = true ];then
  1185. result=$(apt-get -q -y install php-fpm php-mysql php-intl php-mbstring php-xml php-apcu php-gd php-curl php-zip php-soap php-xmlrpc 2>&1)
  1186. comprobarError $? 302 $result
  1187. deshabilitarServicio $phpFPMName
  1188. else
  1189. comprobarError 1 301
  1190. fi
  1191. elif [ $rhelOS = true ];then
  1192. # Necesitamos un repositorio adicional para PHP-7 (EPEL-RELEASE)
  1193. result=$(yum -y install epel-release yum-utils 2>&1)
  1194. comprobarError $? 103 $result
  1195. # Necesitamos un repositorio adicional para PHP-7 (REMI-RELEASE)
  1196. if [ ! -f /etc/yum.repos.d/remi-php72.repo ];then
  1197. result=$(yum -y install "$remiRepo" 2>&1)
  1198. comprobarError $? 303 $result
  1199. fi
  1200. # Activamos repositorio remi-php72
  1201. result=$(yum-config-manager --enable remi-php72 2>&1)
  1202. comprobarError $? 303 $result
  1203. # Instalamos PHP-7.2
  1204. if [ $apacheOn = true ];then
  1205. result=$(yum -y install php php-mysql php-intl php-mbstring php-mcrypt php-xml php-pecl-apcu php-gd php-pear-Net-Curl php-pecl-zip php-soap php-xmlrpc 2>&1)
  1206. comprobarError $? 302 $result
  1207. elif [ $nginxOn = true ];then
  1208. result=$(yum -y install php php-fpm php-mysql php-intl php-mbstring php-mcrypt php-xml php-pecl-apcu php-gd php-pear-Net-Curl php-pecl-zip php-soap php-xmlrpc 2>&1)
  1209. comprobarError $? 302 $result
  1210. deshabilitarServicio $phpFPMName
  1211. else
  1212. comprobarError 1 301
  1213. fi
  1214. else
  1215. comprobarError 1 300
  1216. fi
  1217. }
  1218. configurarPHP() {
  1219. # Configura PHP para segurizarlo y establecer máximo de subida.
  1220. if [ $debianOS = true ];then
  1221. phpConfFile="./etc/php/php.ini.debian"
  1222. phpDest="/etc/php/7.2/cli/php.ini"
  1223. elif [ $rhelOS = true ];then
  1224. phpConfFile="./etc/php/php.ini.rhel"
  1225. phpDest="/etc/php.ini"
  1226. fi
  1227. if [ ! -f $phpConfFile ];then
  1228. comprobarError 1 4 "$phpConfFile"
  1229. fi
  1230. # Copiamos configuración
  1231. cp -f $phpConfFile $phpDest 2>/dev/null
  1232. comprobarError $? 305
  1233. # Configuramos cgi.fix_pathinfo
  1234. sed -i '/cgi.fix_pathinfo=/c\cgi.fix_pathinfo=0' $phpDest
  1235. comprobarError $? 305
  1236. # Configuramos post_max_size
  1237. sed -i '/post_max_size =/c\post_max_size = '$maxUpload $phpDest
  1238. comprobarError $? 305
  1239. # Configuramos upload_max_filesize
  1240. sed -i '/upload_max_filesize =/c\upload_max_filesize = '$maxUpload $phpDest
  1241. comprobarError $? 305
  1242. # Configurar php-fpm (sólo en RHEL con Nginx)
  1243. if [ $rhelOS = true ] && [ $nginxOn = true ];then
  1244. # Configurar Socket UNIX
  1245. phpConfFile="./etc/php/php-fpm.d/www.conf"
  1246. phpDest="/etc/php-fpm.d/www.conf"
  1247. if [ ! -f $phpConfFile ];then
  1248. comprobarError $? 4 "$phpConfFile"
  1249. fi
  1250. cp -f $phpConfFile $phpDest 2>/dev/null
  1251. comprobarError $? 305
  1252. # Configurar Permisos /var/lib/php
  1253. chown -R $webServerUser:$webServerGroup /var/lib/php/
  1254. comprobarError $? 305
  1255. fi
  1256. unset phpConfFile phpDest
  1257. }
  1258. establecerMaxUpload() {
  1259. # Pantalla para establecer el máximo de subida al servidor (vía PHP)
  1260. control=false
  1261. error=""
  1262. while [ $control = false ];do
  1263. maxUpload2=$(whiptail --title "PHP MAX UPLOAD" --inputbox "$error""Introduzca el tamaño máximo permitido de los ficheros subidos al servidor:\n(<K:Kilobyte> <M:Megabyte> <G:Gigabyte>)" $((ALTO * 9 / 10)) $((ANCHO * 9 / 10)) $maxUpload --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  1264. comprobarError $? 1
  1265. if [ -z "$maxUpload2" ];then
  1266. error="ERROR: NO PUEDES DEJAR ESTE PARÁMETRO VACIO.\n"
  1267. else
  1268. control=true
  1269. fi
  1270. done
  1271. maxUpload=$maxUpload2
  1272. unset control maxUpload2
  1273. }
  1274. instalarLetsEncrypt() {
  1275. # Instala certbot (para certificados Let's Encrypt)
  1276. # Comprobamos si cerbot está instalado
  1277. which certbot > /dev/null 2>&1
  1278. if [ $? -ne 0 ];then
  1279. # Descargar Let's Encrypt, hacer ejecutable e instalar
  1280. curl -o ./var/certbot https://dl.eff.org/certbot-auto 2>/dev/null
  1281. comprobarError $? 401
  1282. chmod 755 ./var/certbot 2>/dev/null
  1283. comprobarError $? 401
  1284. cp -f ./var/certbot /usr/bin/certbot 2>/dev/null
  1285. comprobarError $? 401
  1286. # Configurar /etc/cron.d/certbot para renovar automáticamente los certificados
  1287. echo -en "# /etc/cron.d/certbot: certbot autorenew the certificates twice a day\n" > /etc/cron.d/certbot
  1288. echo -en "SHELL=/bin/sh\n" >> /etc/cron.d/certbot
  1289. echo -en "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\n\n" >> /etc/cron.d/certbot
  1290. echo -en "# Job start twice per day (4am & 2pm) in a random minute" >> /etc/cron.d/certbot
  1291. echo -en "0 4,14 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew\n" >> /etc/cron.d/certbot
  1292. fi
  1293. }
  1294. generarCertLetsEncrypt() {
  1295. # Generar Certificados SEGUROS Let's Encrypt
  1296. dominios=""
  1297. if [ $apacheOn = true ];then
  1298. # Usamos plugin para apache
  1299. if [ $mediaWikiOn = true ];then
  1300. if [ ! -z "$aliasMediaWiki" ];then
  1301. dominios=$dominioMediaWiki$(echo "$aliasMediaWiki" | sed -e 's/ /,/g')
  1302. else
  1303. dominios=$dominioMediaWiki
  1304. fi
  1305. certbot -n --agree-tos --email "admin@$hostname" --apache --domains "$dominios" >> $logFile 2>&1
  1306. comprobarError $? 404
  1307. fi
  1308. if [ $moodleOn = true ];then
  1309. certbot -n --agree-tos --email "admin@$hostname" --apache --domains "$dominioMoodle" >> $logFile 2>&1
  1310. comprobarError $? 404
  1311. fi
  1312. elif [ $nginxOn = true ];then
  1313. # Usamos plugin para nginx
  1314. if [ $mediaWikiOn = true ];then
  1315. if [ ! -z "$aliasMediaWiki" ];then
  1316. dominios=$dominioMediaWiki$(echo "$aliasMediaWiki" | sed -e 's/ /,/g')
  1317. else
  1318. dominios=$dominioMediaWiki
  1319. fi
  1320. certbot -n --agree-tos --email "admin@$hostname" --nginx --domains "$dominios" >> $logFile 2>&1
  1321. comprobarError $? 404
  1322. fi
  1323. if [ $moodleOn = true ];then
  1324. certbot -n --agree-tos --email "admin@$hostname" --nginx --domains "$dominioMoodle" >> $logFile 2>&1
  1325. comprobarError $? 404
  1326. fi
  1327. else
  1328. comprobarError 1 404
  1329. fi
  1330. unset dominios
  1331. }
  1332. generarCertAutofirmado() {
  1333. # Genera certificados autofirmados
  1334. # Estos certificados no son seguros, pero valen para pruebas o como paso intermedio para obtener los válidos
  1335. # Uso: generarCertAutofirmado $dominio
  1336. dominio=$1
  1337. sslDir="/etc/$webServerName/ssl"
  1338. keyFile="$sslDir/$dominio.key"
  1339. reqFile="$sslDir/$dominio.csr"
  1340. certFile="$sslDir/$dominio.crt"
  1341. dhParamFile="$sslDir/dhparam.pem"
  1342. if [ ! -d "$sslDir" ];then
  1343. mkdir "$sslDir" 2>/dev/null
  1344. comprobarError $? 5 "$sslDir"
  1345. fi
  1346. # Generamos clave privada RSA de 2048 bits
  1347. openssl genrsa -out "$keyFile" 2048 >/dev/null 2>&1
  1348. comprobarError $? 402
  1349. # Generamos petición de firma
  1350. echo -en "ES\nMadrid\nMadrid\n$dominio\n$dominio\n$dominio\nadmin@$dominio\n\n\n" | openssl req -new -key "$keyFile" -out "$reqFile" >/dev/null 2>&1
  1351. comprobarError $? 402
  1352. # Autofirmados clave para 2 años (730 días)
  1353. openssl x509 -req -days 730 -in "$reqFile" -signkey "$keyFile" -out "$certFile" >/dev/null 2>&1
  1354. comprobarError $? 402
  1355. # Eliminamos petición
  1356. rm -f $reqFile
  1357. comprobarError $? 402
  1358. # Añadimos clave Diffie-Hellman al certificado
  1359. if [ -f "$dhParamFile" ];then
  1360. cat "$dhParamFile" >> $certFile
  1361. comprobarError $? 402
  1362. fi
  1363. # Cambiamos permisos
  1364. chmod 644 $certFile
  1365. comprobarError $? 402
  1366. chmod 400 $keyFile
  1367. comprobarError $? 402
  1368. unset dominio sslDir keyFile reqFile certFile dhParamFile
  1369. }
  1370. generarDHParam() {
  1371. # Genera clave de intercambio Diffie-Hellman y lo configuramos
  1372. # Esto aumenta notablemente la seguridad de SSL/TLS
  1373. sslDir="/etc/$webServerName/ssl"
  1374. dhParamFile="$sslDir/dhparam.pem"
  1375. # apacheConfFile=""
  1376. nginxConfFile="/etc/$webServerName/nginx.conf"
  1377. if [ ! -d "$sslDir" ];then
  1378. mkdir "$sslDir" 2>/dev/null
  1379. comprobarError $? 5 "$sslDir"
  1380. fi
  1381. openssl dhparam -out "$dhParamFile" 2048 >/dev/null 2>&1
  1382. comprobarError $? 403
  1383. # Configuramos Servidor Web
  1384. # if [ $apacheOn = true ];then
  1385. # if [ $debianOS = true ];then
  1386. # apacheConfFile="/etc/$webServerName/apache2.conf"
  1387. # elif [ $rhelOS = true ];then
  1388. # # La version de httpd de RHEL no acepta SSLOpenSSLConfCmd
  1389. # # Solución: añadirlo al certificado
  1390. # apacheConfFile="/etc/$webServerName/conf/httpd.conf"
  1391. # else
  1392. # comprobarError 1 403
  1393. # fi
  1394. # echo -en "\n# Set Stronger Diffie-Hellman key exchange\n" >> $apacheConfFile
  1395. # echo -en "SSLOpenSSLConfCmd DHParameters \"$dhParamFile\"\n" >> $apacheConfFile
  1396. # el
  1397. if [ $nginxOn = true ];then
  1398. sed -i '/ssl_param /c\\tssl_dhparam '$dhParamFile';' $nginxConfFile
  1399. comprobarError $? 403
  1400. fi
  1401. # unset sslDir dhParamFile apacheConfFile nginxConfFile
  1402. unset sslDir dhParamFile nginxConfFile
  1403. }
  1404. habilitarServicio() {
  1405. # Arrancamos y habilitamos el servicio (con SystemD, Upstart o SystemV)
  1406. # Intentamos con systemctl (SystemD)
  1407. #echo -en "Habilitando Servicio '$1'" | tee -a $logFile
  1408. if [ $# -le 0 ];then
  1409. comprobarError 1 900
  1410. fi
  1411. which systemctl > /dev/null 2>&1
  1412. if [ $? -eq 0 ]; then
  1413. #echo -en " (SystemD)..." | tee -a $logFile
  1414. systemctl start $1 > /dev/null 2>&1
  1415. comprobarError $? 901 $1
  1416. systemctl enable $1 > /dev/null 2>&1
  1417. comprobarError $? 902 $1
  1418. else
  1419. # Intentamos con service (Upstart)
  1420. which service > /dev/null 2>&1
  1421. if [ $? -eq 0 ]; then
  1422. #echo -en " (Upstart)..." | tee -a $logFile
  1423. service $1 start > /dev/null 2>&1
  1424. comprobarError $? 901 $1
  1425. else
  1426. # Intentamos con init.d (SystemV)
  1427. #echo -en " (SystemV)..." | tee -a $logFile
  1428. /etc/init.d/$1 start > /dev/null 2>&1
  1429. comprobarError $? 901 $1
  1430. fi
  1431. # Intentamos habilitar en el arranque (Upstart)
  1432. which update-rc.d > /dev/null 2>&1
  1433. if [ $? -eq 0 ];then
  1434. update-rc.d $1 enable
  1435. comprobarError $? 902 $1
  1436. else
  1437. # Intentamos habilitar en el arranque (SystemV)
  1438. which chkconfig > /dev/null 2>&1
  1439. if [ $? -eq 0 ];then
  1440. chkconfig $1 on
  1441. comprobarError $? 902 $1
  1442. else
  1443. # ¿Qué mas opciones nos quedan?
  1444. comprobarError 1 902 $1
  1445. fi
  1446. fi
  1447. fi
  1448. # Mejora: comprobar si el servicio está parado
  1449. #echo -en " OK.\n" | tee -a $logFile
  1450. }
  1451. deshabilitarServicio() {
  1452. # Paramos y deshabilitamos el servicio (con SystemD, Upstart o SystemV)
  1453. # Intentamos con systemctl (SystemD)
  1454. #echo -en "Deshabilitando Servicio '$1'" | tee -a $logFile
  1455. if [ $# -le 0 ];then
  1456. comprobarError 1 903
  1457. fi
  1458. which systemctl > /dev/null 2>&1
  1459. if [ $? -eq 0 ]; then
  1460. #echo -en " (SystemD)..." | tee -a $logFile
  1461. systemctl stop $1 > /dev/null 2>&1
  1462. comprobarError $? 904 $1
  1463. systemctl disable $1 > /dev/null 2>&1
  1464. comprobarError $? 905 $1
  1465. else
  1466. # Intentamos con service (Upstart)
  1467. which service > /dev/null 2>&1
  1468. if [ $? -eq 0 ]; then
  1469. #echo -en " (Upstart)..." | tee -a $logFile
  1470. service $1 stop > /dev/null 2>&1
  1471. comprobarError $? 904 $1
  1472. else
  1473. # Intentamos con init.d (SystemV)
  1474. #echo -en " (SystemV)..." | tee -a $logFile
  1475. /etc/init.d/$1 stop > /dev/null 2>&1
  1476. comprobarError $? 904 $1
  1477. fi
  1478. # Intentamos habilitar en el arranque (Upstart)
  1479. which update-rc.d > /dev/null 2>&1
  1480. if [ $? -eq 0 ];then
  1481. update-rc.d $1 disable
  1482. comprobarError $? 905 $1
  1483. else
  1484. # Intentamos habilitar en el arranque (SystemV)
  1485. which chkconfig > /dev/null 2>&1
  1486. if [ $? -eq 0 ];then
  1487. chkconfig $1 off
  1488. comprobarError $? 905 $1
  1489. else
  1490. # ¿Qué mas opciones nos quedan?
  1491. comprobarError 1 905 $1
  1492. fi
  1493. fi
  1494. fi
  1495. # Mejora: comprobar si el servicio está funcionando
  1496. #echo -en " OK.\n" | tee -a $logFile
  1497. }
  1498. recargarServicio() {
  1499. # Recargamos el servicio (con SystemD, Upstart o SystemV)
  1500. # Intentamos con systemctl (SystemD)
  1501. #echo -en "Recargando Servicio '$1'" | tee -a $logFile
  1502. if [ $# -le 0 ];then
  1503. comprobarError 1 912
  1504. fi
  1505. which systemctl > /dev/null 2>&1
  1506. if [ $? -eq 0 ]; then
  1507. #echo -en " (SystemD)..." | tee -a $logFile
  1508. systemctl reload $1 > /dev/null 2>&1
  1509. comprobarError $? 913 $1
  1510. else
  1511. # Intentamos con service (Upstart)
  1512. which service > /dev/null 2>&1
  1513. if [ $? -eq 0 ]; then
  1514. #echo -en " (Upstart)..." | tee -a $logFile
  1515. service $1 reload > /dev/null 2>&1
  1516. comprobarError $? 913 $1
  1517. else
  1518. # Intentamos con init.d (SystemV)
  1519. #echo -en " (SystemV)..." | tee -a $logFile
  1520. /etc/init.d/$1 reload > /dev/null 2>&1
  1521. comprobarError $? 913 $1
  1522. fi
  1523. fi
  1524. # Mejora: comprobar si el servicio está funcionando
  1525. #echo -en " OK.\n" | tee -a $logFile
  1526. }
  1527. configurarCortafuegos() {
  1528. # Configuramos cortafuegos (añadir reglas y encender)
  1529. # Comprobamos si estamos usando SSH
  1530. esSSH $PPID
  1531. if [ $debianOS = true ];then
  1532. ufw allow 80/tcp >> $logFile 2>&1
  1533. comprobarError $? 906 "80/tcp"
  1534. if [ $sshControl = true ];then
  1535. ufw allow 22/tcp >> $logFile 2>&1
  1536. comprobarError $? 906 "22/tcp"
  1537. fi
  1538. if [ $sslOn = true ];then
  1539. ufw allow 443/tcp >> $logFile 2>&1
  1540. comprobarError $? 906 "443/tcp"
  1541. fi
  1542. ufw --force enable >> $logFile 2>&1
  1543. comprobarError $? 907
  1544. elif [ $rhelOS = true ];then
  1545. firewall-cmd --add-port=80/tcp >> $logFile 2>&1
  1546. comprobarError $? 906 "80/tcp"
  1547. if [ $sshControl = true ];then
  1548. firewall-cmd --add-port=22/tcp >> $logFile 2>&1
  1549. comprobarError $? 906 "22/tcp"
  1550. fi
  1551. if [ $sslOn = true ];then
  1552. firewall-cmd --add-port=443/tcp >> $logFile 2>&1
  1553. comprobarError $? 906 "443/tcp"
  1554. fi
  1555. firewall-cmd --runtime-to-permanent >> $logFile 2>&1
  1556. comprobarError $? 907
  1557. habilitarServicio firewalld >> $logFile 2>&1
  1558. comprobarError $? 907
  1559. fi
  1560. unset sshControl
  1561. }
  1562. esSSH() {
  1563. # Comprobamos si nuestro terminal usa SSH
  1564. p=${1:-$PPID}
  1565. #read pid name x ppid y < <( cat /proc/$p/stat )
  1566. read pid name ppid < <( ps -o pid= -o comm= -o ppid= -p $p)
  1567. [[ "$name" =~ sshd ]] && { sshControl=true; return 0; }
  1568. [ "$ppid" -le 1 ] && { sshControl=false; return 1; }
  1569. esSSH $ppid
  1570. }
  1571. descargarMediaWiki() {
  1572. # Descargar la versión 1.31.0 de MediaWiki
  1573. if [ ! -d ./var ];then
  1574. comprobarError 1 5 "./var"
  1575. fi
  1576. curl "https://releases.wikimedia.org/mediawiki/1.31/mediawiki-1.31.0.tar.gz" 2>/dev/null | tar -xz -C "./var/"
  1577. comprobarError $? 501
  1578. }
  1579. configurarMediaWiki() {
  1580. # Configuramos MediaWiki
  1581. if [ ! -f /var/www/$dominioMediaWiki/LocalSettings.php ];then
  1582. # Copiamos archivos
  1583. cp -fR ./var/mediawiki-1.31.0/ /var/www/$dominioMediaWiki
  1584. comprobarError $? 502
  1585. # Configuramos LocalSettings.php (y crea la base de datos por nosotros)
  1586. nombreDBMW=$(echo $dominioMediaWiki | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1587. userDBMW=$(echo "mediawiki_user" | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1588. php /var/www/$dominioMediaWiki/maintenance/install.php --dbname=$nombreDBMW --dbserver="localhost" --installdbuser=root --installdbpass=$sqlPasswd --dbuser=$userDBMW --dbpass=$sqlPasswd --scriptpath="" --lang=es --pass=$passwdMediaWiki --with-extensions "$nombreMediaWiki" "admin" >> $logFile 2>&1
  1589. comprobarError $? 502
  1590. # Configuraciones adicionales
  1591. sed -i '/$wgLanguageCode =/c\$wgLanguageCode = "es";' /var/www/$dominioMediaWiki/LocalSettings.php
  1592. comprobarError $? 502
  1593. sed -i '/$wgEnableEmail =/c\$wgEnableEmail = false;' /var/www/$dominioMediaWiki/LocalSettings.php
  1594. comprobarError $? 502
  1595. sed -i '/$wgEnableUploads =/c\$wgEnableUploads = true;' /var/www/$dominioMediaWiki/LocalSettings.php
  1596. comprobarError $? 502
  1597. echo -en "\$wgArticlePath = \"/wiki/\$1\";\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1598. echo -en "\$wgUsePathInfo = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1599. echo -en "\$wgGroupPermissions['*']['createaccount'] = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1600. echo -en "\$wgGroupPermissions['*']['edit'] = false;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1601. echo -en "\$wgGroupPermissions['*']['read'] = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1602. # Actualizamos permisos
  1603. chown -R $webServerUser:$webServerGroup /var/www/$dominioMediaWiki
  1604. comprobarError $? 502
  1605. # Configuramos VirtualHost
  1606. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1607. virtualHost="./etc/apache2/sites-available/mediawiki.conf"
  1608. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1609. virtualHost="./etc/nginx/sites-available/mediawiki.conf"
  1610. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1611. virtualHost="./etc/apache2/sites-available/mediawiki-ssl.conf"
  1612. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1613. virtualHost="./etc/nginx/sites-available/mediawiki-ssl.conf"
  1614. else
  1615. comprobarError 1 502
  1616. fi
  1617. if [ ! -f $virtualHost ];then
  1618. comprobarError $? 502
  1619. fi
  1620. instalarVirtualHost "/var/www/$dominioMediaWiki" $virtualHost $dominioMediaWiki $aliasMediaWiki
  1621. unset virtualHost
  1622. else
  1623. comprobarError 1 503 $dominioMediaWiki
  1624. fi
  1625. }
  1626. descargarMoodle() {
  1627. # Descargar la versión 1.31.0 de MediaWiki
  1628. if [ ! -d ./var ];then
  1629. comprobarError 1 5 "./var"
  1630. fi
  1631. #echo -en "Descargando Moodle-3.5-1..." | tee -a $logFile
  1632. #curl -o "./var/moodle-3.5.1.tgz" "https://download.moodle.org/download.php/direct/stable35/moodle-latest-35.tgz" >> $logFile 2>&1
  1633. curl "https://download.moodle.org/download.php/direct/stable35/moodle-latest-35.tgz" 2>/dev/null | tar -xz -C "./var/"
  1634. comprobarError $? 501
  1635. #echo -en " OK.\n" | tee -a $logFile
  1636. }
  1637. configurarMoodle() {
  1638. # Configurar Moodle
  1639. if [ ! -f /var/www/$dominioMoodle/config.php ];then
  1640. # Copiamos archivos
  1641. cp -Rf ./var/moodle/ /var/www/$dominioMoodle
  1642. comprobarError $? 602
  1643. # Crear carperta de datos (no online)
  1644. if [ ! -d /var/www/moodledata ];then
  1645. mkdir /var/www/moodledata 2>/dev/null
  1646. comprobarError $? 602
  1647. fi
  1648. #Actualizamos permisos
  1649. perm=$(stat -c %a /var/www/moodledata)
  1650. if [ $perm -ne 777 ];then
  1651. chmod -R 777 /var/www/moodledata 2>/dev/null
  1652. comprobarError $? 602
  1653. fi
  1654. perm=$(stat -c %U /var/www/moodledata)
  1655. if [ $perm != "$webServerUser" ];then
  1656. chown -R $webServerUser:$webServerGroup /var/www/moodledata 2>/dev/null
  1657. comprobarError $? 602
  1658. fi
  1659. unset perm
  1660. # Creamos Base de Datos
  1661. nombreDBMo=$(echo $dominioMoodle | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1662. userDBMo=$(echo "moodle_user" | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1663. crearDBMoodle
  1664. # Configurar SE-Linux (RHEL)
  1665. if [ $rhelOS = true ];then
  1666. configurarSELinux
  1667. fi
  1668. # Configuramos e instalamos Moodle
  1669. if [ $sslOn = true ];then
  1670. wwwroot="https://$dominioMoodle"
  1671. else
  1672. wwwroot="http://$dominioMoodle"
  1673. fi
  1674. if [ $mySQLOn = true ];then
  1675. dbtype="mysqli"
  1676. elif [ $mariaDBOn = true ];then
  1677. dbtype="mariadb"
  1678. else
  1679. comprobarError 1 602
  1680. fi
  1681. php /var/www/$dominioMoodle/admin/cli/install.php --lang=es --wwwroot="$wwwroot" --dataroot="/var/www/moodledata" --dbtype="$dbtype" --dbname="$nombreDBMo" --dbuser="$userDBMo" --dbpass="$sqlPasswd" --fullname="$nombreMoodle" --shortname="$nombreCortoMoodle" --adminuser=admin --adminpass="$passwdMoodle" --adminemail="admin@$dominioMoodle" --agree-license --non-interactive >>$logFile 2>&1
  1682. comprobarError $? 602
  1683. # Actualizamos permisos
  1684. chown -R $webServerUser:$webServerGroup /var/www/$dominioMoodle /var/www/moodledata
  1685. # Configuramos VirtualHost
  1686. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1687. virtualHost="./etc/apache2/sites-available/moodle.conf"
  1688. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1689. virtualHost="./etc/nginx/sites-available/moodle.conf"
  1690. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1691. virtualHost="./etc/apache2/sites-available/moodle-ssl.conf"
  1692. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1693. virtualHost="./etc/nginx/sites-available/moodle-ssl.conf"
  1694. else
  1695. comprobarError 1 602
  1696. fi
  1697. instalarVirtualHost "/var/www/$dominioMoodle" $virtualHost $dominioMoodle
  1698. unset virtualHost wwwroot dbtype
  1699. else
  1700. comprobarError 1 603 $dominioMoodle
  1701. fi
  1702. }
  1703. crearDBMoodle() {
  1704. # Crear base de datos para Moodle
  1705. dbDir="./etc/db"
  1706. if [ ! -d $dbDir ];then
  1707. mkdir $dbDir 2>/dev/null
  1708. comprobarError $? 603
  1709. fi
  1710. dbFile=$dbDir"/moodle.sql"
  1711. echo -en "CREATE DATABASE IF NOT EXISTS $nombreDBMo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n" > $dbFile
  1712. echo -en "GRANT ALL PRIVILEGES ON $nombreDBMo.* TO '$userDBMo'@'localhost' IDENTIFIED BY '$sqlPasswd';\n" >> $dbFile
  1713. mysql -u root --password=$sqlPasswd < $dbFile > /dev/null 2>&1
  1714. control=$?
  1715. rm -f $dbFile 2>/dev/null
  1716. comprobarError $? 603
  1717. comprobarError $control 603
  1718. unset control dbFile dbDir
  1719. }
  1720. configurarSELinux() {
  1721. # Configurar SELinux (Sólo para RHEL)
  1722. which semanage >/dev/null 2>&1
  1723. if [ $? -ne 0 ];then
  1724. result=$(yum -y install policycoreutils-python 2>&1)
  1725. comprobarError $? 605 $result
  1726. fi
  1727. semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/moodledata(/.*)?" > /dev/null 2>&1
  1728. comprobarError $? 604
  1729. restorecon -R /var/www/ > /dev/null 2>&1
  1730. comprobarError $? 604
  1731. }
  1732. instalarPHPInfo() {
  1733. # Instalar fichero info.php y su VirtualHost
  1734. if [ ! -f /etc/$webServerName/sites-enabled/phpinfo.conf ];then
  1735. infoFile="./var/www/info.php"
  1736. if [ ! -f $infoFile ];then
  1737. comprobarError 1 4 "$infoFile"
  1738. fi
  1739. mkdir /var/www/localhost 2>/dev/null
  1740. comprobarError $? 106
  1741. cp -f $infoFile /var/www/localhost/ 2>/dev/null
  1742. comprobarError $? 106
  1743. chown -R $webServerUser:$webServerGroup /var/www/localhost 2>/dev/null
  1744. comprobarError $? 106
  1745. unset infoFile
  1746. # Instalar VirtualHost
  1747. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1748. virtualHost="./etc/apache2/sites-available/phpinfo.conf"
  1749. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1750. virtualHost="./etc/nginx/sites-available/phpinfo.conf"
  1751. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1752. virtualHost="./etc/apache2/sites-available/phpinfo-ssl.conf"
  1753. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1754. virtualHost="./etc/nginx/sites-available/phpinfo-ssl.conf"
  1755. else
  1756. comprobarError 1 106
  1757. fi
  1758. instalarVirtualHost "/var/www/localhost" $virtualHost "localhost"
  1759. unset virtualHost
  1760. return 0
  1761. else
  1762. return 1
  1763. fi
  1764. }
  1765. configurarBackups() {
  1766. # Instala backup-server y lo configura
  1767. letsEncryptCode=""
  1768. if [ ! -d "./var" ];then
  1769. comprobarError 1 5 "./var"
  1770. fi
  1771. which backup-server > /dev/null 2>&1
  1772. if [ $? -ne 0 ];then
  1773. # Descargamos backup-server
  1774. curl "https://code.castanedo.es/guzman/backup-server/archive/2.1.tar.gz" 2>/dev/null | tar -xz -C "./var/"
  1775. if [ $? -ne 0 ];then
  1776. comprobarError 1 701
  1777. return 1
  1778. fi
  1779. # Copiamos backup-server y logrotate
  1780. cp -f ./var/backup-server/backup-server /usr/bin/backup-server
  1781. if [ $? -ne 0 ];then
  1782. comprobarError 1 701
  1783. return 1
  1784. fi
  1785. cp -f ./var/backup-server/scripts/logrotate.d/backup-server /etc/logrotate.d/backup-server
  1786. if [ $? -ne 0 ];then
  1787. comprobarError 1 701
  1788. return 1
  1789. fi
  1790. # Creamos carpeta de backups
  1791. if [ ! -d /var/backup ];then
  1792. mkdir /var/backup 2>/dev/null
  1793. comprobarError $? 5 "/var/backup"
  1794. fi
  1795. # Configuramos cron.d
  1796. if [ $letsEncryptOn = false ];then
  1797. letsEncryptCode="--no-letsencrypt "
  1798. fi
  1799. echo -en "# /etc/cron.d/backup-server: crontab for $hostname\n\n" > /etc/cron.d/backup-server
  1800. echo -en "# Backup every day at 4:00 am\n" >> /etc/cron.d/backup-server
  1801. echo -en "0 4 * * * root [ -x /usr/bin/backup-server ] && /usr/bin/backup-server --xz -u $webServerUser -g $webServerGroup --no-encryption --sql-user root --sql-pass $sqlPasswd --nginx-dir /etc/$webServerName $letsEncryptCode--no-mail --no-gogs --no-postfix --no-dovecot --no-opendkim --no-spf --no-opendmarc --no-amavis --no-spamassassin /var/backup >> /var/log/backup-server.log 2>&1" >> /etc/cron.d/backup-server
  1802. comprobarError $? 701
  1803. fi
  1804. unset letsEncryptCode
  1805. }
  1806. # Comprobación del sistema e inicialización
  1807. horaInicial=$(date +"%s")
  1808. inicializarVariables
  1809. comprobarRoot
  1810. OSInfo
  1811. comprobarDependencias
  1812. # Bienvenida
  1813. mostrarBienvenida
  1814. # Selección de componentes (express vs avanzada)
  1815. mostrarExpress
  1816. # Instalación Servidor Web
  1817. if [ $apacheOn = true ]; then
  1818. echo -en "Instalando Servidor Web Apache..." | tee -a $logFile
  1819. instalarApache
  1820. echo -en " OK.\n" | tee -a $logFile
  1821. elif [ $nginxOn = true ]; then
  1822. echo -en "Instalando Servidor Web Nginx..." | tee -a $logFile
  1823. instalarNginx
  1824. echo -en " OK.\n" | tee -a $logFile
  1825. fi
  1826. # Instalación Base de Datos
  1827. if [ $mySQLOn = true ]; then
  1828. echo -en "Instalando Base de Datos MySQL..." | tee -a $logFile
  1829. instalarMySQL
  1830. echo -en " OK.\n" | tee -a $logFile
  1831. elif [ $mariaDBOn = true ]; then
  1832. echo -en "Instalando Base de Datos MariaDB..." | tee -a $logFile
  1833. instalarMariaDB
  1834. echo -en " OK.\n" | tee -a $logFile
  1835. fi
  1836. # Instalación PHP-7
  1837. if [ $phpOn = true ]; then
  1838. echo -en "Instalando PHP-7..." | tee -a $logFile
  1839. instalarPHP
  1840. echo -en " OK.\n" | tee -a $logFile
  1841. fi
  1842. # Instalación Let's Encrypt
  1843. if [ $letsEncryptOn = true ];then
  1844. echo -en "Instalando Let's Encrypt..." | tee -a $logfile
  1845. instalarLetsEncrypt
  1846. echo -en " OK.\n" | tee -a $logFile
  1847. fi
  1848. # Configuración Web Server
  1849. if [ $apacheOn = true ];then
  1850. echo -en "Configurando Servidor Web Apache..." | tee -a $logFile
  1851. configurarApache
  1852. echo -en " OK.\n" | tee -a $logFile
  1853. elif [ $nginxOn = true ]; then
  1854. echo -en "Configurando Servidor Web Nginx..." | tee -a $logFile
  1855. configurarNginx
  1856. echo -en " OK.\n" | tee -a $logFile
  1857. fi
  1858. # Configuración Database (Configurar Ficheros, Arrancar Base de Datos, establecer contraseña y configuración segura)
  1859. if [ $mySQLOn = true ] || [ $mariaDBOn = true ];then
  1860. echo -en "Configurando Base de Datos..." | tee -a $logFile
  1861. configurarSQL
  1862. echo -en " OK.\n" | tee -a $logFile
  1863. habilitarServicio "$sqlServerName"
  1864. echo -en "Estableciendo contraseña de la Base de Datos..." | tee -a $logFile
  1865. establecerSQLPasswd
  1866. echo -en " OK.\n" | tee -a $logFile
  1867. fi
  1868. # Configuración PHP (cgi.fix_pathinfo=0 y Configurar máximo de subida de archivos)
  1869. if [ $phpOn = true ];then
  1870. echo -en "Configurando PHP-7..." | tee -a $logFile
  1871. configurarPHP
  1872. echo -en " OK.\n" | tee -a $logFile
  1873. fi
  1874. # Configuración SSL/TLS
  1875. # Generar certificados auto-firmados
  1876. if [ $sslOn = true ];then
  1877. echo -en "Generando claves de intercambio Diffie-Hellman (puede llevar un largo tiempo)..." | tee -a $logFile
  1878. generarDHParam
  1879. echo -en " OK.\n" | tee -a $logFile
  1880. echo -en "Generando Certificados Auto-Firmados..." | tee -a $logFile
  1881. if [ $mediaWikiOn = true ];then
  1882. generarCertAutofirmado $dominioMediaWiki
  1883. fi
  1884. if [ $moodleOn = true ];then
  1885. generarCertAutofirmado $dominioMoodle
  1886. fi
  1887. if [ $infoPHPOn = true ];then
  1888. generarCertAutofirmado "localhost"
  1889. fi
  1890. echo -en " OK.\n" | tee -a $logFile
  1891. fi
  1892. # Arrancar y habilitar todos los servicios (SystemD, Service o SystemV)
  1893. echo -en "Habilitando todos los servicios..." | tee -a $logFile
  1894. if [ $apacheOn = true ] || [ $nginxOn = true ];then
  1895. habilitarServicio $webServerName
  1896. fi
  1897. if [ $nginxOn = true ] && [ $phpOn = true ];then
  1898. habilitarServicio $phpFPMName
  1899. fi
  1900. echo -en " OK.\n" | tee -a $logFile
  1901. # Instalar MediaWiki
  1902. if [ $mediaWikiOn = true ]; then
  1903. # Descargar MediaWiki
  1904. echo -en "Descargando MediaWiki-1.31.0..." | tee -a $logFile
  1905. descargarMediaWiki
  1906. echo -en " OK.\n" | tee -a $logFile
  1907. # Configurar MediWiki
  1908. echo -en "Configurando MediaWiki..." | tee -a $logFile
  1909. configurarMediaWiki
  1910. echo -en " OK.\n" | tee -a $logFile
  1911. fi
  1912. # Instalar Moodle
  1913. if [ $moodleOn = true ]; then
  1914. # Descargar Moodle
  1915. echo -en "Descargando Moodle-3.5.1..." | tee -a $logFile
  1916. descargarMoodle
  1917. echo -en " OK.\n" | tee -a $logFile
  1918. # Configuración Moodle
  1919. echo -en "Configurando Moodle (puede llevar un tiempo largo)..." | tee -a $logFile
  1920. configurarMoodle
  1921. echo -en " OK.\n" | tee -a $logFile
  1922. fi
  1923. # Instalar info.php
  1924. if [ $infoPHPOn = true ];then
  1925. echo -en "Configurando 'info.php'..." | tee -a $logFile
  1926. instalarPHPInfo
  1927. if [ $? -eq 0 ];then
  1928. echo -en " OK.\n" | tee -a $logFile
  1929. else
  1930. echo -en " Ya se encuentra configurado.\n" | tee -a $logFile
  1931. fi
  1932. fi
  1933. # Añadir reglas del cortafuegos
  1934. echo -en "Configurando Cortafuegos..." | tee -a $logFile
  1935. configurarCortafuegos
  1936. echo -en " OK.\n" | tee -a $logFile
  1937. # Generar certificados Let's Encrypt
  1938. if [ $letsEncryptOn = true ];then
  1939. echo -en "Generando Certificados Válidos Let's Encrypt..." | tee -a $logFile
  1940. generarCertLetsEncrypt
  1941. echo -en " OK.\n" | tee -a $logFile
  1942. fi
  1943. # Configurar Backup
  1944. if [ $backupOn = true ]; then
  1945. echo -en "Configurando Backup Automático..." | tee -a $logFile
  1946. configurarBackups
  1947. echo -en " OK.\n" | tee -a $logFile
  1948. fi
  1949. # Finalizamos
  1950. horaFinal=$(date +"%s")
  1951. echo -en "\n--------------------------------------------------\n" | tee -a $logFile
  1952. echo -en "\t¡INSTALACION FINALIZADA CON EXITO! \n" | tee -a $logFile
  1953. echo -en "\tDuración: "$((horaFinal-horaInicial))" seg." | tee -a $logFile
  1954. echo -en "\n--------------------------------------------------\n" | tee -a $logFile