install 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023
  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.\nDetalles:\n$extraInfo\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. if [ $? -ne 0 ];then
  434. result=$(apt-get -q -y install ufw 2>&1)
  435. comprobarError $? 806 $result
  436. fi
  437. # Comprobamos tput
  438. which tput > /dev/null 2>&1
  439. if [ $? -ne 0 ];then
  440. result=$(apt-get -q -y install ncurses-bin 2>&1)
  441. comprobarError $? 808 $result
  442. fi
  443. # Comprobar sed
  444. which sed > /dev/null 2>&1
  445. if [ $? -ne 0 ];then
  446. result=$(apt-get -q -y install sed 2>&1)
  447. comprobarError $? 809 $result
  448. fi
  449. # Comprobar curl
  450. which curl > /dev/null 2>&1
  451. if [ $? -ne 0 ];then
  452. result=$(apt-get -q -y install curl 2>&1)
  453. comprobarError $? 810 $result
  454. fi
  455. # Comprobamos tar, gzip, bzip2 y xz
  456. which tar > /dev/null 2>&1
  457. if [ $? -ne 0 ];then
  458. result=$(apt-get -q -y install tar 2>&1)
  459. comprobarError $? 811 $result
  460. fi
  461. which gzip > /dev/null 2>&1
  462. if [ $? -ne 0 ];then
  463. result=$(apt-get -q -y install gzip 2>&1)
  464. comprobarError $? 812 $result
  465. fi
  466. which bzip2 > /dev/null 2>&1
  467. if [ $? -ne 0 ];then
  468. result=$(apt-get -q -y install bzip2 2>&1)
  469. comprobarError $? 813 $result
  470. fi
  471. which xz > /dev/null 2>&1
  472. if [ $? -ne 0 ];then
  473. result=$(apt-get -q -y install xz-utils 2>&1)
  474. comprobarError $? 814 $result
  475. fi
  476. which openssl > /dev/null 2>&1
  477. if [ $? -ne 0 ];then
  478. result=$(apt-get -q -y install openssl 2>&1)
  479. comprobarError $? 815 $result
  480. fi
  481. fi
  482. if [ $rhelOS = true ]; then
  483. # Comprobamos yum
  484. which yum > /dev/null 2>&1
  485. comprobarError $? 804
  486. # Actualizamos base de datos del repositorio
  487. echo -en "Actualizando repositorio YUM..." | tee -a $logFile
  488. result=$(yum -y makecache 2>&1)
  489. comprobarError $? 805 $result
  490. echo -en " OK.\n" | tee -a $logFile
  491. # Comprobamos Firewall (firewall-cmd)
  492. which firewall-cmd > /dev/null 2>&1
  493. comprobarError $? 807
  494. # Comprobamos tput
  495. which tput > /dev/null 2>&1
  496. if [ $? -ne 0 ];then
  497. result=$(yum -y install ncurses 2>&1)
  498. comprobarError $? 808 $result
  499. fi
  500. # Comprobar sed
  501. which sed > /dev/null 2>&1
  502. if [ $? -ne 0 ];then
  503. result=$(yum -y install sed 2>&1)
  504. comprobarError $? 809 $result
  505. fi
  506. # Comprobar curl
  507. which curl > /dev/null 2>&1
  508. if [ $? -ne 0 ];then
  509. result=$(yum -y install curl 2>&1)
  510. comprobarError $? 810 $result
  511. fi
  512. # Comprobamos tar, gzip, bzip2 y xz
  513. which tar > /dev/null 2>&1
  514. if [ $? -ne 0 ];then
  515. result=$(yum -y install tar 2>&1)
  516. comprobarError $? 811 $result
  517. fi
  518. which gzip > /dev/null 2>&1
  519. if [ $? -ne 0 ];then
  520. result=$(yum -y install gzip 2>&1)
  521. comprobarError $? 812 $result
  522. fi
  523. which bzip2 > /dev/null 2>&1
  524. if [ $? -ne 0 ];then
  525. result=$(yum -y install bzip2 2>&1)
  526. comprobarError $? 813 $result
  527. fi
  528. which xz > /dev/null 2>&1
  529. if [ $? -ne 0 ];then
  530. result=$(yum -y install xz 2>&1)
  531. comprobarError $? 814 $result
  532. fi
  533. which openssl > /dev/null 2>&1
  534. if [ $? -ne 0 ];then
  535. result=$(yum -y install openssl 2>&1)
  536. comprobarError $? 815 $result
  537. fi
  538. fi
  539. }
  540. inicializarVariables() {
  541. # Inicializa las variables que necesitan de un estado previo
  542. debianOS=false
  543. rhelOS=false
  544. apacheOn=false
  545. nginxOn=false
  546. mySQLOn=false
  547. mariaDBOn=false
  548. phpOn=false
  549. sslOn=false
  550. letsEncryptOn=false
  551. mediaWikiOn=false
  552. moodleOn=false
  553. infoPHPOn=false
  554. backupOn=false
  555. hostname=""
  556. logFile="./."$(basename $0)".log"
  557. maxUpload="100M"
  558. apacheName=""
  559. nginxName=""
  560. mysqlName=""
  561. mariadbName=""
  562. remiRepo=""
  563. webServerName=""
  564. webServerUser=""
  565. webServerGroup=""
  566. sqlServerName=""
  567. phpFPMName=""
  568. nombreMediaWiki=""
  569. dominioMediaWiki=""
  570. passwdMediaWiki=""
  571. nombreMoodle=""
  572. nombreCortoMoodle=""
  573. dominioMoodle=""
  574. passwdMoodle=""
  575. }
  576. instalacionExpress() {
  577. # Permite una instalación rápida, haciendo el menor número de preguntas
  578. nginxOn=true
  579. mariaDBOn=true
  580. phpOn=true
  581. sslOn=true
  582. letsEncryptOn=true
  583. mediaWikiOn=true
  584. moodleOn=true
  585. backupOn=true
  586. # Preguntas mínimas
  587. establecerFQDN
  588. leerSQLPasswd
  589. mostrarMediaWiki
  590. mostrarMoodle
  591. mostrarConfirmacion
  592. }
  593. mostrarBienvenida() {
  594. # Pantalla de bienvenida y muestra SO y estado de los discos
  595. ANCHO=$(tput cols)
  596. ALTO=$(tput lines)
  597. 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"
  598. comprobarError $? 1
  599. }
  600. mostrarExpress() {
  601. # Pantalla de elección entre instalación express o avanzada
  602. 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 \
  603. "Express" "Instalación rápida" ON \
  604. "Avanzada" "Permite escoger todas las opciones disponibles" OFF \
  605. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  606. comprobarError $? 1
  607. case $express in
  608. Express)
  609. instalacionExpress
  610. # DECIDIR QUÉ OPCIONES SON LAS MÍNIMAS
  611. ;;
  612. Avanzada)
  613. mostrarAvanzada
  614. ;;
  615. *)
  616. comprobarError 1 2
  617. ;;
  618. esac
  619. unset express
  620. }
  621. mostrarAvanzada() {
  622. # Pantalla que permite instalar un servidor LAMP o LEMP
  623. 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 \
  624. "LEMP" "GNU/Linux + (E)Nginx + MySQL/MariaDB + PHP-7" ON \
  625. "LAMP" "GNU/Linux + Apache + MySQL/MariaDB + PHP-7" OFF \
  626. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  627. comprobarError $? 1
  628. for i in $webServer; do
  629. case $i in
  630. LEMP)
  631. nginxOn=true
  632. ;;
  633. LAMP)
  634. apacheOn=true
  635. ;;
  636. *)
  637. comprobarError 1 100
  638. ;;
  639. esac
  640. done
  641. # Opciones comunes
  642. establecerFQDN
  643. mostrarDatabase
  644. phpOn=true
  645. establecerMaxUpload
  646. mostrarComponentes
  647. mostrarConfirmacion
  648. unset webServer
  649. }
  650. mostrarComponentes() {
  651. # Pantalla de elección de componentes (SSL/TLS, MediaWiki, Moodle, InfoPHP y Backup)
  652. 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 \
  653. "SSL/TLS" "Instalar certificados para activar HTTPS" ON \
  654. "MediaWiki" "Instalar wiki con MediaWiki" ON \
  655. "Moodle" "Instalar campus virtual con Moodle" ON \
  656. "InfoPHP" "Instalar info.php (sólo para pruebas)" OFF \
  657. "Backup" "Programar backups automáticos" ON \
  658. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  659. comprobarError $? 1
  660. # Mejora: autodetección de componentes ya instalados
  661. for i in $componentes; do
  662. case $i in
  663. \"SSL/TLS\")
  664. # 2 Opciones: Let's Encrypt o Autofirmado
  665. mostrarSSL
  666. ;;
  667. \"MediaWiki\")
  668. mediaWikiOn=true
  669. mostrarMediaWiki
  670. ;;
  671. \"Moodle\")
  672. moodleOn=true
  673. mostrarMoodle
  674. ;;
  675. \"InfoPHP\")
  676. infoPHPOn=true
  677. ;;
  678. \"Backup\")
  679. backupOn=true
  680. ;;
  681. *)
  682. comprobarError 1 3
  683. ;;
  684. esac
  685. done
  686. unset componentes
  687. }
  688. mostrarSSL() {
  689. # Pantalla que permite seleccionar el tipo de certificados
  690. 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 \
  691. "LetsEncrypt" "Compatible con todos los navegadores" ON \
  692. "Auto-Firmado" "Certificados auto-firmados (sólo para pruebas)" OFF \
  693. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  694. comprobarError $? 1
  695. for i in $ssl; do
  696. case $i in
  697. LetsEncrypt)
  698. sslOn=true
  699. letsEncryptOn=true
  700. ;;
  701. Auto-Firmado)
  702. sslOn=true
  703. ;;
  704. *)
  705. comprobarError 1 6
  706. ;;
  707. esac
  708. done
  709. unset ssl
  710. }
  711. mostrarMediaWiki(){
  712. # Pantalla que pregunta sobre las opciones necesarias para configurar MediaWiki
  713. # Introducir nombre wiki
  714. while [ -z "$nombreMediaWiki" ]; do
  715. 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)
  716. comprobarError $? 1
  717. done
  718. # Introducir dominio
  719. while [ -z "$dominioMediaWiki" ]; do
  720. 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)
  721. comprobarError $? 1
  722. done
  723. cont=1
  724. serverName=""
  725. aliasMediaWiki=""
  726. for dominio in $dominioMediaWiki;do
  727. if [ $cont -eq 1 ];then
  728. # Dominio Principal (ServerName)
  729. serverName=$dominio
  730. else
  731. # Dominios Secundarios (ServerAlias)
  732. aliasMediaWiki=$aliasMediaWiki" "$dominio
  733. fi
  734. cont=$((cont + 1))
  735. done
  736. dominioMediaWiki=$serverName
  737. # Introducir contraseña
  738. control=false
  739. error=""
  740. while [ $control = false ]; do
  741. 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)
  742. comprobarError $? 1
  743. 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)
  744. comprobarError $? 1
  745. if [ -z "$passwdMediaWiki" ] || [ -z "$passwdMediaWiki2" ]; then
  746. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  747. elif [ $passwdMediaWiki != $passwdMediaWiki2 ];then
  748. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  749. else
  750. control=true
  751. fi
  752. done
  753. unset control error passwdMediaWiki2 dominio cont serverName
  754. }
  755. mostrarMoodle() {
  756. # Pantalla que pregunta sobre las opciones necesarias para configurar Moodle
  757. # Introducir Nombre Moodle
  758. while [ -z "$nombreMoodle" ]; do
  759. 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)
  760. comprobarError $? 1
  761. done
  762. # Introducir Nombre Corto Moodle
  763. while [ -z "$nombreCortoMoodle" ]; do
  764. 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)
  765. comprobarError $? 1
  766. done
  767. nombreCortoMoodle=$(echo $nombreCortoMoodle | cut -d ' ' -f 1)
  768. # Introducir dominio
  769. while [ -z "$dominioMoodle" ]; do
  770. 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)
  771. comprobarError $? 1
  772. done
  773. cont=1
  774. serverName=""
  775. aliasMoodle=""
  776. for dominio in $dominioMoodle;do
  777. if [ $cont -eq 1 ];then
  778. # Dominio Principal (ServerName)
  779. serverName=$dominio
  780. else
  781. # Dominios Secundarios (ServerAlias)
  782. aliasMeoodle=$aliasMoodle" "$dominio
  783. fi
  784. cont=$((cont + 1))
  785. done
  786. dominioMoodle=$serverName
  787. # Introducir contraseña
  788. control=false
  789. error=""
  790. while [ $control = false ]; do
  791. 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)
  792. comprobarError $? 1
  793. 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)
  794. comprobarError $? 1
  795. if [ -z "$passwdMoodle" ] || [ -z "$passwdMoodle2" ]; then
  796. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  797. elif [ $passwdMoodle != $passwdMoodle2 ];then
  798. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  799. else
  800. control=true
  801. fi
  802. done
  803. unset control error passwdMoodle2 dominio cont serverName aliasMoodle
  804. }
  805. mostrarConfirmacion() {
  806. # Pantalla que presenta una confirmación antes de realizar la instalación
  807. 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"
  808. comprobarError $? 1
  809. }
  810. establecerFQDN() {
  811. # Configura el FQDN (dominio principal del servidor)
  812. while [ -z "$hostname" ]; do
  813. 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)
  814. if [ $? -eq 0 ] && [ ! -z "$hostname" ]; then
  815. hostnamectl set-hostname $hostname
  816. else
  817. hostname=$(hostname)
  818. fi
  819. done
  820. echo -en "Hostname: $hostname\n" >> $logFile
  821. }
  822. instalarApache() {
  823. # Instala Apache2
  824. webServerName=$apacheName
  825. if [ $debianOS = true ];then
  826. result=$(apt-get -q -y install apache2 2>&1)
  827. comprobarError $? 101 $result
  828. elif [ $rhelOS = true ]; then
  829. result=$(yum -y install httpd 2>&1)
  830. comprobarError $? 101 $result
  831. if [ $sslOn = true ];then
  832. # Instalamos módulo mod_ssl (no se instala por defecto)
  833. result=$(yum -y install mod_ssl 2>&1)
  834. comprobarError $? 101 $result
  835. fi
  836. else
  837. comprobarError 1 104
  838. fi
  839. deshabilitarServicio $webServerName
  840. }
  841. configurarApache() {
  842. # Configura Apache2
  843. if [ $debianOS = true ];then
  844. apacheConfFile="./etc/apache2/apache2.conf"
  845. if [ ! -f $apacheConfFile ];then
  846. comprobarError 1 4 $apacheConfFile
  847. fi
  848. cp -f $apacheConfFile /etc/$webServerName/apache2.conf 2>/dev/null
  849. comprobarError $? 108
  850. webServerUser=$(grep ^User /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
  851. webServerGroup=$(grep ^Group /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
  852. if [ ! -L /etc/$webServerName/logs ];then
  853. ln -s /var/log/apache2 /etc/$webServerName/logs 2>/dev/null
  854. comprobarError $? 108
  855. fi
  856. # Activamos mod_rewrite (no viene activado por defecto)
  857. a2enmod rewrite >/dev/null 2>&1
  858. comprobarError $? 108
  859. # Activamos mod_ssl y mod_headers (no viene activado por defecto)
  860. if [ $sslOn = true ];then
  861. a2enmod ssl >/dev/null 2>&1
  862. comprobarError $? 108
  863. a2enmod headers >/dev/null 2>&1
  864. comprobarError $? 108
  865. fi
  866. unset apacheConfFile
  867. elif [ $rhelOS = true ];then
  868. apacheConfFile="./etc/apache2/conf/httpd.conf"
  869. sslConfFile="./etc/apache2/conf.d/ssl.conf"
  870. welcomeConfFile="/etc/apache2/conf.d/welcome.conf"
  871. if [ ! -f $apacheConfFile ];then
  872. comprobarError 1 4 $apacheConfFile
  873. fi
  874. cp -f $apacheConfFile /etc/$webServerName/conf/httpd.conf 2>/dev/null
  875. comprobarError $? 108
  876. # Desactivamos Mensaje de Bienvenida
  877. if [ -f $welcomeConfFile ];then
  878. sed -i -e 's/^/#/' $welcomeConfFile
  879. comprobarError $? 108
  880. fi
  881. # Configuramos mod_ssl
  882. if [ $sslOn = true ];then
  883. if [ ! -f $sslConfFile ];then
  884. comprobarError 1 4 $sslConfFile
  885. fi
  886. cp -f $sslConfFile /etc/$webServerName/conf.d/ssl.conf 2>/dev/null
  887. comprobarError $? 108
  888. fi
  889. webServerUser=$(grep ^User /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
  890. webServerGroup=$(grep ^Group /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
  891. unset apacheConfFile sslConfFile welcomeConfFile
  892. fi
  893. if [ ! -d "/etc/$webServerName/sites-available" ];then
  894. mkdir "/etc/$webServerName/sites-available" 2>/dev/null
  895. comprobarError $? 5 "/etc/$webServerName/sites-available"
  896. fi
  897. if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
  898. mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
  899. comprobarError $? 5 "/etc/$webServerName/sites-enabled"
  900. else
  901. # Eliminar Virtual Host por defecto
  902. if [ -f /etc/$webServerName/sites-enabled/000-default.conf ];then
  903. rm -f /etc/$webServerName/sites-enabled/000-default.conf 2>/dev/null
  904. fi
  905. fi
  906. }
  907. instalarNginx() {
  908. # Instala Nginx
  909. webServerName=$nginxName
  910. if [ $debianOS = true ];then
  911. result=$(apt-get -q -y install nginx 2>&1)
  912. comprobarError $? 102 $result
  913. elif [ $rhelOS = true ]; then
  914. # Hay que instalar primero otro repositorio
  915. result=$(yum -y install epel-release)
  916. comprobarError $? 103 $result
  917. result=$(yum -y install nginx 2>&1)
  918. comprobarError $? 102 $result
  919. else
  920. comprobarError 1 105
  921. fi
  922. deshabilitarServicio $webServerName
  923. }
  924. configurarNginx() {
  925. # Configura Nginx
  926. rm -Rf "/etc/$webServerName/!(sites-available|sites-enabled)" 2>/dev/null
  927. comprobarError $? 107
  928. nginxConfFile="./etc/$webServerName"
  929. if [ -d "$nginxConfFile" ];then
  930. cp -Rf $nginxConfFile/* /etc/$webServerName/ 2>/dev/null
  931. comprobarError $? 107
  932. else
  933. comprobarError 1 5 "$nginxConfFile"
  934. fi
  935. if [ ! -d "/etc/$webServerName/sites-available" ];then
  936. mkdir "/etc/$webServerName/sites-available" 2>/dev/null
  937. comprobarError $? 5 "/etc/$webServerName/sites-available"
  938. fi
  939. if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
  940. mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
  941. comprobarError $? 5 "/etc/$webServerName/sites-enabled"
  942. else
  943. # Eliminar Virtual Host por defecto
  944. if [ -f /etc/$webServerName/sites-enabled/default ];then
  945. rm -f /etc/$webServerName/sites-enabled/default 2>/dev/null
  946. fi
  947. fi
  948. # Configuramos Usuario y Grupo
  949. if [ $debianOS = true ];then
  950. webServerUser="www-data"
  951. webServerGroup=$webServerUser
  952. elif [ $rhelOS = true ];then
  953. webServerUser="nginx"
  954. webServerGroup=$webServerUser
  955. fi
  956. sed -i '/user /c\user '$webServerUser';' /etc/$webServerName/nginx.conf
  957. comprobarError $? 107
  958. unset nginxConfFile
  959. }
  960. instalarVirtualHost() {
  961. # Configuramos un Virtual Host para Apache o Nginx
  962. # Uso: instalarVirtualHost $root $virtualHost $dominio $alias
  963. if [ $# -ge 3 ];then
  964. rootVirtualHost=$(realpath $1)
  965. shift
  966. virtualHostFile=$(realpath $1)
  967. shift
  968. dominioVirtualHost=$1
  969. virtualHostName=$dominioVirtualHost".conf"
  970. shift
  971. aliasVirtualHost=$@
  972. else
  973. comprobarError 1 908
  974. fi
  975. if [ ! -f $virtualHostFile ];then
  976. comprobarError 1 909 $virtualHostName
  977. fi
  978. if [ $apacheOn = true ];then
  979. # Configuramos root, dominio y logs
  980. sed -i '/ServerName /c\\tServerName '"$dominioVirtualHost" $virtualHostFile
  981. comprobarError $? 908
  982. if [ ! -z "$aliasVirtualHost" ];then
  983. sed -i '/ServerName /a\\tServerAlias '"$aliasVirtualHost" $virtualHostFile
  984. comprobarError $? 908
  985. fi
  986. sed -i '/DocumentRoot /c\\tDocumentRoot '"$rootVirtualHost" $virtualHostFile
  987. comprobarError $? 908
  988. sed -i '/ErrorLog /c\\tErrorLog logs/'"$dominioVirtualHost"'-error.log' $virtualHostFile
  989. comprobarError $? 908
  990. sed -i '/CustomLog /c\\tCustomLog logs/'"$dominioVirtualHost"'-access.log common' $virtualHostFile
  991. comprobarError $? 908
  992. if [ $sslOn = true ];then
  993. sed -i '/SSLCertificateFile /c\\tSSLCertificateFile ssl/'"$dominioVirtualHost"'.crt' $virtualHostFile
  994. comprobarError $? 908
  995. sed -i '/SSLCertificateKeyFile /c\\tSSLCertificateKeyFile ssl/'"$dominioVirtualHost"'.key' $virtualHostFile
  996. comprobarError $? 908
  997. fi
  998. elif [ $nginxOn = true ];then
  999. # Configuramos root, dominio, logs y php-fpm.sock (NGINX)
  1000. sed -i '/root /c\\troot '$rootVirtualHost';' "$virtualHostFile"
  1001. comprobarError $? 908
  1002. sed -i '/server_name /c\\tserver_name '"$dominioVirtualHost"' '"$aliasVirtualHost"';' $virtualHostFile
  1003. comprobarError $? 908
  1004. sed -i '/access_log /c\\taccess_log /var/log/nginx/'"$dominioVirtualHost"'-access.log;' $virtualHostFile
  1005. comprobarError $? 908
  1006. sed -i '/error_log /c\\terror_log /var/log/nginx/'"$dominioVirtualHost"'-error.log;' $virtualHostFile
  1007. comprobarError $? 908
  1008. socket=$(find /var/run/ -type s -name 'php*.sock')
  1009. sed -i '/fastcgi_pass /c\\t\tfastcgi_pass unix:'"$socket"';' $virtualHostFile
  1010. comprobarError $? 908
  1011. if [ $sslOn = true ];then
  1012. sed -i '/ssl_certificate /c\\tssl_certificate ssl/'"$dominioVirtualHost"'.crt;' $virtualHostFile
  1013. comprobarError $? 908
  1014. sed -i '/ssl_certificate_key /c\\tssl_certificate_key ssl/'"$dominioVirtualHost"'.key;' $virtualHostFile
  1015. comprobarError $? 908
  1016. fi
  1017. fi
  1018. # Copiamos ficheros de configuración
  1019. cp -f $virtualHostFile "/etc/$webServerName/sites-available/$virtualHostName" >> $logFile 2>&1
  1020. comprobarError $? 910
  1021. if [ -f "/etc/$webServerName/sites-enabled/$virtualHostName" ];then
  1022. rm -f /etc/$webServerName/sites-enabled/$virtualHostName 2>/dev/null
  1023. comprobarError 911 $virtualHostName
  1024. fi
  1025. ln -s "/etc/$webServerName/sites-available/$virtualHostName" "/etc/$webServerName/sites-enabled/$virtualHostName" >> $logFile 2>&1
  1026. comprobarError $? 911 $virtualHostName
  1027. recargarServicio $webServerName
  1028. unset rootVirtualHost dominioVirtualHost virtualHostFile virtualHostName aliasVirtualHost socket
  1029. }
  1030. mostrarDatabase() {
  1031. # Pantalla que permite escoger entre instalar MariaDB o MySQL
  1032. if [ $debianOS = true ]; then
  1033. 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 \
  1034. "MariaDB" "Instalar la base de datos MariaDB (fork de MySQL)" ON \
  1035. "MySQL" "Instalar la base de datos MySQL (uso no comercial)" OFF \
  1036. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  1037. comprobarError $? 1
  1038. case $database in
  1039. MariaDB)
  1040. mariaDBOn=true
  1041. ;;
  1042. MySQL)
  1043. mySQLOn=true
  1044. ;;
  1045. *)
  1046. comprobarError 1 200
  1047. ;;
  1048. esac
  1049. unset database
  1050. elif [ $rhelOS = true ]; then
  1051. 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"
  1052. comprobarError $? 1
  1053. mariaDBOn=true
  1054. else
  1055. comprobarError 1 200
  1056. fi
  1057. # Otras opciones (contraseña)
  1058. leerSQLPasswd
  1059. }
  1060. leerSQLPasswd() {
  1061. # Pantalla para leer la contraseña para el usuario root de SQL
  1062. control=false
  1063. error=""
  1064. # Leemos la contreseña (stdin) y confirmamos
  1065. while [ $control = false ]; do
  1066. 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)
  1067. comprobarError $? 1
  1068. 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)
  1069. comprobarError $? 1
  1070. #echo -en "SQL Password 1: $sqlPasswd\n"
  1071. #echo -en "SQL Password 2: $sqlPasswd2\n"
  1072. if [ -z "$sqlPasswd" ] || [ -z "$sqlPasswd2" ]; then
  1073. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  1074. elif [ $sqlPasswd != $sqlPasswd2 ];then
  1075. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  1076. else
  1077. control=true
  1078. fi
  1079. done
  1080. #echo -en "SQL Password: $sqlPasswd\n"
  1081. unset control error sqlPasswd2
  1082. }
  1083. establecerSQLPasswd() {
  1084. # Establecemos SQL root passwd y securizamos BD (mysql_secure_installation)
  1085. # Comprobamos si ya tiene una contraseña asignada
  1086. mysql -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1087. if [ $? -eq 0 ];then
  1088. # Establecemos contraseña del usuario root (y desactivamos posibles plugins para forzar login por contraseña)
  1089. mysql -e "UPDATE mysql.user SET plugin = '', Password = PASSWORD('$sqlPasswd') WHERE User = 'root'" >> $logFile 2>&1
  1090. if [ $? -ne 0 ];then
  1091. # Lo intentamos de otra forma (para versiones modernas de mysql)
  1092. mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$sqlPasswd'" >> $logFile 2>&1
  1093. comprobarError $? 207
  1094. fi
  1095. # Aplicamos el cambio de contraseña
  1096. mysql -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1097. # Desactivamos acceso root desde el exterior (solo localhost)
  1098. 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
  1099. comprobarError $? 208
  1100. # Eliminamos todos los usuarios anónimos
  1101. mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.user WHERE User=''" >> $logFile 2>&1
  1102. comprobarError $? 209
  1103. # Eliminamos bases de datos 'test'
  1104. mysql -u root --password=$sqlPasswd -e "DROP DATABASE IF EXISTS test" >> $logFile 2>&1
  1105. comprobarError $? 210
  1106. # Eliminamos privilegios de la base de datos 'test'
  1107. mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'" >> $logFile 2>&1
  1108. comprobarError $? 211
  1109. # Aplicamos los cambios
  1110. mysql -u root --password=$sqlPasswd -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1111. comprobarError $? 212
  1112. else
  1113. comprobarError 1 206
  1114. fi
  1115. }
  1116. instalarMySQL() {
  1117. # Instala MySQL (sólo para Debian)
  1118. sqlServerName=$mysqlName
  1119. if [ $debianOS = true ];then
  1120. result=$(apt-get -q -y install mysql-server mysql-client 2>&1)
  1121. comprobarError $? 201 $result
  1122. elif [ $rhelOS = true ];then
  1123. # MySQL no disponible en RHEL. 2 opciones:
  1124. # 1) Instalar un repositorio adicional
  1125. # 2) No instalar MySQL en distribuciones RHEL
  1126. comprobarError 1 205
  1127. else
  1128. comprobarError 1 203
  1129. fi
  1130. deshabilitarServicio $sqlServerName
  1131. }
  1132. instalarMariaDB() {
  1133. # Instala MariaDB
  1134. sqlServerName=$mariadbName
  1135. if [ $debianOS = true ];then
  1136. result=$(apt-get -q -y install mariadb-server mariadb-client 2>&1)
  1137. comprobarError $? 202 $result
  1138. elif [ $rhelOS = true ];then
  1139. result=$(yum -y install mariadb-server mariadb 2>&1)
  1140. comprobarError $? 202 $result
  1141. else
  1142. comprobarError 1 204
  1143. fi
  1144. deshabilitarServicio $sqlServerName
  1145. }
  1146. configurarSQL() {
  1147. # Configura BarracudaFS en mysql (necesario para Moodle)
  1148. # Configura MariaDB o MySQL
  1149. if [ $mariaDBOn = true ] && [ $debianOS = true ];then
  1150. sqlConfFile="/etc/mysql/my.cnf"
  1151. elif [ $mariaDBOn = true ] && [ $rhelOS = true ];then
  1152. sqlConfFile="/etc/my.cnf"
  1153. elif [ $mySQLOn = true ] && [ $debianOS = true ];then
  1154. sqlConfFile="/etc/mysql/my.cnf"
  1155. else
  1156. comprobarError 1 213
  1157. fi
  1158. if [ ! -f $sqlConfFile ];then
  1159. comprobarError 1 213
  1160. fi
  1161. grep "# Configuration for Moodle" $sqlConfFile >/dev/null 2>&1
  1162. if [ $? -ne 0 ];then
  1163. # Establecemos UTF8 (codificación de caracteres) y Barracuda (sistema de ficheros)
  1164. echo -en "\n# Configuration for Moodle\n" >> $sqlConfFile
  1165. echo -en "[client]\n" >> $sqlConfFile
  1166. echo -en "default-character-set = utf8mb4\n\n" >> $sqlConfFile
  1167. echo -en "[mysqld]\n" >> $sqlConfFile
  1168. echo -en "innodb_file_format = Barracuda\n" >> $sqlConfFile
  1169. echo -en "innodb_file_per_table = 1\n" >> $sqlConfFile
  1170. echo -en "innodb_large_prefix\n\n" >> $sqlConfFile
  1171. echo -en "character-set-server = utf8mb4\n" >> $sqlConfFile
  1172. echo -en "collation-server = utf8mb4_unicode_ci\n" >> $sqlConfFile
  1173. echo -en "skip-character-set-client-handshake\n\n" >> $sqlConfFile
  1174. echo -en "[mysql]\n" >> $sqlConfFile
  1175. echo -en "default-character-set = utf8mb4\n" >> $sqlConfFile
  1176. else
  1177. comprobarError 1 214
  1178. fi
  1179. unset sqlConfFile
  1180. }
  1181. instalarPHP() {
  1182. # Instalamos PHP-7 y los módulos PHP que necesitan MediaWiki y Moodle
  1183. if [ $debianOS = true ];then
  1184. if [ $apacheOn = true ]; then
  1185. 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)
  1186. comprobarError $? 302 $result
  1187. elif [ $nginxOn = true ];then
  1188. 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)
  1189. comprobarError $? 302 $result
  1190. deshabilitarServicio $phpFPMName
  1191. else
  1192. comprobarError 1 301
  1193. fi
  1194. elif [ $rhelOS = true ];then
  1195. # Necesitamos un repositorio adicional para PHP-7 (EPEL-RELEASE)
  1196. result=$(yum -y install epel-release yum-utils 2>&1)
  1197. comprobarError $? 103 $result
  1198. # Necesitamos un repositorio adicional para PHP-7 (REMI-RELEASE)
  1199. if [ ! -f /etc/yum.repos.d/remi-php72.repo ];then
  1200. result=$(yum -y install "$remiRepo" 2>&1)
  1201. comprobarError $? 303 $result
  1202. fi
  1203. # Activamos repositorio remi-php72
  1204. result=$(yum-config-manager --enable remi-php72 2>&1)
  1205. comprobarError $? 303 $result
  1206. # Instalamos PHP-7.2
  1207. if [ $apacheOn = true ];then
  1208. 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)
  1209. comprobarError $? 302 $result
  1210. elif [ $nginxOn = true ];then
  1211. 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)
  1212. comprobarError $? 302 $result
  1213. deshabilitarServicio $phpFPMName
  1214. else
  1215. comprobarError 1 301
  1216. fi
  1217. else
  1218. comprobarError 1 300
  1219. fi
  1220. }
  1221. configurarPHP() {
  1222. # Configura PHP para segurizarlo y establecer máximo de subida.
  1223. if [ $debianOS = true ];then
  1224. phpConfFile="./etc/php/php.ini.debian"
  1225. phpDest="/etc/php/7.2/cli/php.ini"
  1226. elif [ $rhelOS = true ];then
  1227. phpConfFile="./etc/php/php.ini.rhel"
  1228. phpDest="/etc/php.ini"
  1229. fi
  1230. if [ ! -f $phpConfFile ];then
  1231. comprobarError 1 4 "$phpConfFile"
  1232. fi
  1233. # Copiamos configuración
  1234. cp -f $phpConfFile $phpDest 2>/dev/null
  1235. comprobarError $? 305
  1236. # Configuramos cgi.fix_pathinfo
  1237. sed -i '/cgi.fix_pathinfo=/c\cgi.fix_pathinfo=0' $phpDest
  1238. comprobarError $? 305
  1239. # Configuramos post_max_size
  1240. sed -i '/post_max_size =/c\post_max_size = '$maxUpload $phpDest
  1241. comprobarError $? 305
  1242. # Configuramos upload_max_filesize
  1243. sed -i '/upload_max_filesize =/c\upload_max_filesize = '$maxUpload $phpDest
  1244. comprobarError $? 305
  1245. # Configurar php-fpm (sólo en RHEL con Nginx)
  1246. if [ $rhelOS = true ] && [ $nginxOn = true ];then
  1247. # Configurar Socket UNIX
  1248. phpConfFile="./etc/php/php-fpm.d/www.conf"
  1249. phpDest="/etc/php-fpm.d/www.conf"
  1250. if [ ! -f $phpConfFile ];then
  1251. comprobarError $? 4 "$phpConfFile"
  1252. fi
  1253. cp -f $phpConfFile $phpDest 2>/dev/null
  1254. comprobarError $? 305
  1255. # Configurar Permisos /var/lib/php
  1256. chown -R $webServerUser:$webServerGroup /var/lib/php/
  1257. comprobarError $? 305
  1258. fi
  1259. unset phpConfFile phpDest
  1260. }
  1261. establecerMaxUpload() {
  1262. # Pantalla para establecer el máximo de subida al servidor (vía PHP)
  1263. control=false
  1264. error=""
  1265. while [ $control = false ];do
  1266. 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)
  1267. comprobarError $? 1
  1268. if [ -z "$maxUpload2" ];then
  1269. error="ERROR: NO PUEDES DEJAR ESTE PARÁMETRO VACIO.\n"
  1270. else
  1271. control=true
  1272. fi
  1273. done
  1274. maxUpload=$maxUpload2
  1275. unset control maxUpload2
  1276. }
  1277. instalarLetsEncrypt() {
  1278. # Instala certbot (para certificados Let's Encrypt)
  1279. # Comprobamos si cerbot está instalado
  1280. which certbot > /dev/null 2>&1
  1281. if [ $? -ne 0 ];then
  1282. # Descargar Let's Encrypt, hacer ejecutable e instalar
  1283. curl -o ./var/certbot https://dl.eff.org/certbot-auto 2>/dev/null
  1284. comprobarError $? 401
  1285. chmod 755 ./var/certbot 2>/dev/null
  1286. comprobarError $? 401
  1287. cp -f ./var/certbot /usr/bin/certbot 2>/dev/null
  1288. comprobarError $? 401
  1289. # Configurar /etc/cron.d/certbot para renovar automáticamente los certificados
  1290. echo -en "# /etc/cron.d/certbot: certbot autorenew the certificates twice a day\n" > /etc/cron.d/certbot
  1291. echo -en "SHELL=/bin/sh\n" >> /etc/cron.d/certbot
  1292. echo -en "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\n\n" >> /etc/cron.d/certbot
  1293. echo -en "# Job start twice per day (4am & 2pm) in a random minute" >> /etc/cron.d/certbot
  1294. echo -en "0 4,14 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew\n" >> /etc/cron.d/certbot
  1295. fi
  1296. }
  1297. generarCertLetsEncrypt() {
  1298. # Generar Certificados SEGUROS Let's Encrypt
  1299. dominios=""
  1300. if [ $apacheOn = true ];then
  1301. # Usamos plugin para apache
  1302. if [ $mediaWikiOn = true ];then
  1303. if [ ! -z "$aliasMediaWiki" ];then
  1304. dominios=$dominioMediaWiki$(echo "$aliasMediaWiki" | sed -e 's/ /,/g')
  1305. else
  1306. dominios=$dominioMediaWiki
  1307. fi
  1308. certbot -n --agree-tos --email "admin@$hostname" --apache --domains "$dominios" >> $logFile 2>&1
  1309. comprobarError $? 404
  1310. fi
  1311. if [ $moodleOn = true ];then
  1312. certbot -n --agree-tos --email "admin@$hostname" --apache --domains "$dominioMoodle" >> $logFile 2>&1
  1313. comprobarError $? 404
  1314. fi
  1315. elif [ $nginxOn = true ];then
  1316. # Usamos plugin para nginx
  1317. if [ $mediaWikiOn = true ];then
  1318. if [ ! -z "$aliasMediaWiki" ];then
  1319. dominios=$dominioMediaWiki$(echo "$aliasMediaWiki" | sed -e 's/ /,/g')
  1320. else
  1321. dominios=$dominioMediaWiki
  1322. fi
  1323. certbot -n --agree-tos --email "admin@$hostname" --nginx --domains "$dominios" >> $logFile 2>&1
  1324. comprobarError $? 404
  1325. fi
  1326. if [ $moodleOn = true ];then
  1327. certbot -n --agree-tos --email "admin@$hostname" --nginx --domains "$dominioMoodle" >> $logFile 2>&1
  1328. comprobarError $? 404
  1329. fi
  1330. else
  1331. comprobarError 1 404
  1332. fi
  1333. unset dominios
  1334. }
  1335. generarCertAutofirmado() {
  1336. # Genera certificados autofirmados
  1337. # Estos certificados no son seguros, pero valen para pruebas o como paso intermedio para obtener los válidos
  1338. # Uso: generarCertAutofirmado $dominio
  1339. dominio=$1
  1340. sslDir="/etc/$webServerName/ssl"
  1341. keyFile="$sslDir/$dominio.key"
  1342. reqFile="$sslDir/$dominio.csr"
  1343. certFile="$sslDir/$dominio.crt"
  1344. dhParamFile="$sslDir/dhparam.pem"
  1345. if [ ! -d "$sslDir" ];then
  1346. mkdir "$sslDir" 2>/dev/null
  1347. comprobarError $? 5 "$sslDir"
  1348. fi
  1349. # Generamos clave privada RSA de 2048 bits
  1350. openssl genrsa -out "$keyFile" 2048 >/dev/null 2>&1
  1351. comprobarError $? 402
  1352. # Generamos petición de firma
  1353. 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
  1354. comprobarError $? 402
  1355. # Autofirmados clave para 2 años (730 días)
  1356. openssl x509 -req -days 730 -in "$reqFile" -signkey "$keyFile" -out "$certFile" >/dev/null 2>&1
  1357. comprobarError $? 402
  1358. # Eliminamos petición
  1359. rm -f $reqFile
  1360. comprobarError $? 402
  1361. # Añadimos clave Diffie-Hellman al certificado
  1362. if [ -f "$dhParamFile" ];then
  1363. cat "$dhParamFile" >> $certFile
  1364. comprobarError $? 402
  1365. fi
  1366. # Cambiamos permisos
  1367. chmod 644 $certFile
  1368. comprobarError $? 402
  1369. chmod 400 $keyFile
  1370. comprobarError $? 402
  1371. unset dominio sslDir keyFile reqFile certFile dhParamFile
  1372. }
  1373. generarDHParam() {
  1374. # Genera clave de intercambio Diffie-Hellman y lo configuramos
  1375. # Esto aumenta notablemente la seguridad de SSL/TLS
  1376. sslDir="/etc/$webServerName/ssl"
  1377. dhParamFile="$sslDir/dhparam.pem"
  1378. # apacheConfFile=""
  1379. nginxConfFile="/etc/$webServerName/nginx.conf"
  1380. if [ ! -d "$sslDir" ];then
  1381. mkdir "$sslDir" 2>/dev/null
  1382. comprobarError $? 5 "$sslDir"
  1383. fi
  1384. openssl dhparam -out "$dhParamFile" 2048 >/dev/null 2>&1
  1385. comprobarError $? 403
  1386. # Configuramos Servidor Web
  1387. # if [ $apacheOn = true ];then
  1388. # if [ $debianOS = true ];then
  1389. # apacheConfFile="/etc/$webServerName/apache2.conf"
  1390. # elif [ $rhelOS = true ];then
  1391. # # La version de httpd de RHEL no acepta SSLOpenSSLConfCmd
  1392. # # Solución: añadirlo al certificado
  1393. # apacheConfFile="/etc/$webServerName/conf/httpd.conf"
  1394. # else
  1395. # comprobarError 1 403
  1396. # fi
  1397. # echo -en "\n# Set Stronger Diffie-Hellman key exchange\n" >> $apacheConfFile
  1398. # echo -en "SSLOpenSSLConfCmd DHParameters \"$dhParamFile\"\n" >> $apacheConfFile
  1399. # el
  1400. if [ $nginxOn = true ];then
  1401. sed -i '/ssl_param /c\\tssl_dhparam '$dhParamFile';' $nginxConfFile
  1402. comprobarError $? 403
  1403. fi
  1404. # unset sslDir dhParamFile apacheConfFile nginxConfFile
  1405. unset sslDir dhParamFile nginxConfFile
  1406. }
  1407. habilitarServicio() {
  1408. # Arrancamos y habilitamos el servicio (con SystemD, Upstart o SystemV)
  1409. # Intentamos con systemctl (SystemD)
  1410. #echo -en "Habilitando Servicio '$1'" | tee -a $logFile
  1411. if [ $# -le 0 ];then
  1412. comprobarError 1 900
  1413. fi
  1414. which systemctl > /dev/null 2>&1
  1415. if [ $? -eq 0 ]; then
  1416. #echo -en " (SystemD)..." | tee -a $logFile
  1417. systemctl start $1 > /dev/null 2>&1
  1418. comprobarError $? 901 $1
  1419. systemctl enable $1 > /dev/null 2>&1
  1420. comprobarError $? 902 $1
  1421. else
  1422. # Intentamos con service (Upstart)
  1423. which service > /dev/null 2>&1
  1424. if [ $? -eq 0 ]; then
  1425. #echo -en " (Upstart)..." | tee -a $logFile
  1426. service $1 start > /dev/null 2>&1
  1427. comprobarError $? 901 $1
  1428. else
  1429. # Intentamos con init.d (SystemV)
  1430. #echo -en " (SystemV)..." | tee -a $logFile
  1431. /etc/init.d/$1 start > /dev/null 2>&1
  1432. comprobarError $? 901 $1
  1433. fi
  1434. # Intentamos habilitar en el arranque (Upstart)
  1435. which update-rc.d > /dev/null 2>&1
  1436. if [ $? -eq 0 ];then
  1437. update-rc.d $1 enable
  1438. comprobarError $? 902 $1
  1439. else
  1440. # Intentamos habilitar en el arranque (SystemV)
  1441. which chkconfig > /dev/null 2>&1
  1442. if [ $? -eq 0 ];then
  1443. chkconfig $1 on
  1444. comprobarError $? 902 $1
  1445. else
  1446. # ¿Qué mas opciones nos quedan?
  1447. comprobarError 1 902 $1
  1448. fi
  1449. fi
  1450. fi
  1451. # Mejora: comprobar si el servicio está parado
  1452. #echo -en " OK.\n" | tee -a $logFile
  1453. }
  1454. deshabilitarServicio() {
  1455. # Paramos y deshabilitamos el servicio (con SystemD, Upstart o SystemV)
  1456. # Intentamos con systemctl (SystemD)
  1457. #echo -en "Deshabilitando Servicio '$1'" | tee -a $logFile
  1458. if [ $# -le 0 ];then
  1459. comprobarError 1 903
  1460. fi
  1461. which systemctl > /dev/null 2>&1
  1462. if [ $? -eq 0 ]; then
  1463. #echo -en " (SystemD)..." | tee -a $logFile
  1464. systemctl stop $1 > /dev/null 2>&1
  1465. comprobarError $? 904 $1
  1466. systemctl disable $1 > /dev/null 2>&1
  1467. comprobarError $? 905 $1
  1468. else
  1469. # Intentamos con service (Upstart)
  1470. which service > /dev/null 2>&1
  1471. if [ $? -eq 0 ]; then
  1472. #echo -en " (Upstart)..." | tee -a $logFile
  1473. service $1 stop > /dev/null 2>&1
  1474. comprobarError $? 904 $1
  1475. else
  1476. # Intentamos con init.d (SystemV)
  1477. #echo -en " (SystemV)..." | tee -a $logFile
  1478. /etc/init.d/$1 stop > /dev/null 2>&1
  1479. comprobarError $? 904 $1
  1480. fi
  1481. # Intentamos habilitar en el arranque (Upstart)
  1482. which update-rc.d > /dev/null 2>&1
  1483. if [ $? -eq 0 ];then
  1484. update-rc.d $1 disable
  1485. comprobarError $? 905 $1
  1486. else
  1487. # Intentamos habilitar en el arranque (SystemV)
  1488. which chkconfig > /dev/null 2>&1
  1489. if [ $? -eq 0 ];then
  1490. chkconfig $1 off
  1491. comprobarError $? 905 $1
  1492. else
  1493. # ¿Qué mas opciones nos quedan?
  1494. comprobarError 1 905 $1
  1495. fi
  1496. fi
  1497. fi
  1498. # Mejora: comprobar si el servicio está funcionando
  1499. #echo -en " OK.\n" | tee -a $logFile
  1500. }
  1501. recargarServicio() {
  1502. # Recargamos el servicio (con SystemD, Upstart o SystemV)
  1503. # Intentamos con systemctl (SystemD)
  1504. #echo -en "Recargando Servicio '$1'" | tee -a $logFile
  1505. if [ $# -le 0 ];then
  1506. comprobarError 1 912
  1507. fi
  1508. which systemctl > /dev/null 2>&1
  1509. if [ $? -eq 0 ]; then
  1510. #echo -en " (SystemD)..." | tee -a $logFile
  1511. systemctl reload $1 > /dev/null 2>&1
  1512. comprobarError $? 913 $1
  1513. else
  1514. # Intentamos con service (Upstart)
  1515. which service > /dev/null 2>&1
  1516. if [ $? -eq 0 ]; then
  1517. #echo -en " (Upstart)..." | tee -a $logFile
  1518. service $1 reload > /dev/null 2>&1
  1519. comprobarError $? 913 $1
  1520. else
  1521. # Intentamos con init.d (SystemV)
  1522. #echo -en " (SystemV)..." | tee -a $logFile
  1523. /etc/init.d/$1 reload > /dev/null 2>&1
  1524. comprobarError $? 913 $1
  1525. fi
  1526. fi
  1527. # Mejora: comprobar si el servicio está funcionando
  1528. #echo -en " OK.\n" | tee -a $logFile
  1529. }
  1530. configurarCortafuegos() {
  1531. # Configuramos cortafuegos (añadir reglas y encender)
  1532. # Comprobamos si estamos usando SSH
  1533. esSSH $PPID
  1534. if [ $debianOS = true ];then
  1535. ufw allow 80/tcp >> $logFile 2>&1
  1536. comprobarError $? 906 "80/tcp"
  1537. if [ $sshControl = true ];then
  1538. ufw allow 22/tcp >> $logFile 2>&1
  1539. comprobarError $? 906 "22/tcp"
  1540. fi
  1541. if [ $sslOn = true ];then
  1542. ufw allow 443/tcp >> $logFile 2>&1
  1543. comprobarError $? 906 "443/tcp"
  1544. fi
  1545. ufw --force enable >> $logFile 2>&1
  1546. comprobarError $? 907
  1547. elif [ $rhelOS = true ];then
  1548. firewall-cmd --add-port=80/tcp >> $logFile 2>&1
  1549. comprobarError $? 906 "80/tcp"
  1550. if [ $sshControl = true ];then
  1551. firewall-cmd --add-port=22/tcp >> $logFile 2>&1
  1552. comprobarError $? 906 "22/tcp"
  1553. fi
  1554. if [ $sslOn = true ];then
  1555. firewall-cmd --add-port=443/tcp >> $logFile 2>&1
  1556. comprobarError $? 906 "443/tcp"
  1557. fi
  1558. firewall-cmd --runtime-to-permanent >> $logFile 2>&1
  1559. comprobarError $? 907
  1560. habilitarServicio firewalld >> $logFile 2>&1
  1561. comprobarError $? 907
  1562. fi
  1563. unset sshControl
  1564. }
  1565. esSSH() {
  1566. # Comprobamos si nuestro terminal usa SSH
  1567. p=${1:-$PPID}
  1568. #read pid name x ppid y < <( cat /proc/$p/stat )
  1569. read pid name ppid < <( ps -o pid= -o comm= -o ppid= -p $p)
  1570. [[ "$name" =~ sshd ]] && { sshControl=true; return 0; }
  1571. [ "$ppid" -le 1 ] && { sshControl=false; return 1; }
  1572. esSSH $ppid
  1573. }
  1574. descargarMediaWiki() {
  1575. # Descargar la versión 1.31.0 de MediaWiki
  1576. if [ ! -d ./var ];then
  1577. comprobarError 1 5 "./var"
  1578. fi
  1579. curl "https://releases.wikimedia.org/mediawiki/1.31/mediawiki-1.31.0.tar.gz" 2>/dev/null | tar -xz -C "./var/"
  1580. comprobarError $? 501
  1581. }
  1582. configurarMediaWiki() {
  1583. # Configuramos MediaWiki
  1584. if [ ! -f /var/www/$dominioMediaWiki/LocalSettings.php ];then
  1585. # Copiamos archivos
  1586. cp -fR ./var/mediawiki-1.31.0/ /var/www/$dominioMediaWiki
  1587. comprobarError $? 502
  1588. # Configuramos LocalSettings.php (y crea la base de datos por nosotros)
  1589. nombreDBMW=$(echo $dominioMediaWiki | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1590. userDBMW=$(echo "mediawiki_user" | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1591. 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
  1592. comprobarError $? 502
  1593. # Configuraciones adicionales
  1594. sed -i '/$wgLanguageCode =/c\$wgLanguageCode = "es";' /var/www/$dominioMediaWiki/LocalSettings.php
  1595. comprobarError $? 502
  1596. sed -i '/$wgEnableEmail =/c\$wgEnableEmail = false;' /var/www/$dominioMediaWiki/LocalSettings.php
  1597. comprobarError $? 502
  1598. sed -i '/$wgEnableUploads =/c\$wgEnableUploads = true;' /var/www/$dominioMediaWiki/LocalSettings.php
  1599. comprobarError $? 502
  1600. echo -en "\$wgArticlePath = \"/wiki/\$1\";\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1601. echo -en "\$wgUsePathInfo = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1602. echo -en "\$wgGroupPermissions['*']['createaccount'] = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1603. echo -en "\$wgGroupPermissions['*']['edit'] = false;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1604. echo -en "\$wgGroupPermissions['*']['read'] = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1605. # Actualizamos permisos
  1606. chown -R $webServerUser:$webServerGroup /var/www/$dominioMediaWiki
  1607. comprobarError $? 502
  1608. # Configuramos VirtualHost
  1609. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1610. virtualHost="./etc/apache2/sites-available/mediawiki.conf"
  1611. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1612. virtualHost="./etc/nginx/sites-available/mediawiki.conf"
  1613. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1614. virtualHost="./etc/apache2/sites-available/mediawiki-ssl.conf"
  1615. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1616. virtualHost="./etc/nginx/sites-available/mediawiki-ssl.conf"
  1617. else
  1618. comprobarError 1 502
  1619. fi
  1620. if [ ! -f $virtualHost ];then
  1621. comprobarError $? 502
  1622. fi
  1623. instalarVirtualHost "/var/www/$dominioMediaWiki" $virtualHost $dominioMediaWiki $aliasMediaWiki
  1624. unset virtualHost
  1625. else
  1626. comprobarError 1 503 $dominioMediaWiki
  1627. fi
  1628. }
  1629. descargarMoodle() {
  1630. # Descargar la versión 1.31.0 de MediaWiki
  1631. if [ ! -d ./var ];then
  1632. comprobarError 1 5 "./var"
  1633. fi
  1634. #echo -en "Descargando Moodle-3.5-1..." | tee -a $logFile
  1635. #curl -o "./var/moodle-3.5.1.tgz" "https://download.moodle.org/download.php/direct/stable35/moodle-latest-35.tgz" >> $logFile 2>&1
  1636. curl "https://download.moodle.org/download.php/direct/stable35/moodle-latest-35.tgz" 2>/dev/null | tar -xz -C "./var/"
  1637. comprobarError $? 501
  1638. #echo -en " OK.\n" | tee -a $logFile
  1639. }
  1640. configurarMoodle() {
  1641. # Configurar Moodle
  1642. if [ ! -f /var/www/$dominioMoodle/config.php ];then
  1643. # Copiamos archivos
  1644. cp -Rf ./var/moodle/ /var/www/$dominioMoodle
  1645. comprobarError $? 602
  1646. # Crear carperta de datos (no online)
  1647. if [ ! -d /var/www/moodledata ];then
  1648. mkdir /var/www/moodledata 2>/dev/null
  1649. comprobarError $? 602
  1650. fi
  1651. #Actualizamos permisos
  1652. perm=$(stat -c %a /var/www/moodledata)
  1653. if [ $perm -ne 777 ];then
  1654. chmod -R 777 /var/www/moodledata 2>/dev/null
  1655. comprobarError $? 602
  1656. fi
  1657. perm=$(stat -c %U /var/www/moodledata)
  1658. if [ $perm != "$webServerUser" ];then
  1659. chown -R $webServerUser:$webServerGroup /var/www/moodledata 2>/dev/null
  1660. comprobarError $? 602
  1661. fi
  1662. unset perm
  1663. # Creamos Base de Datos
  1664. nombreDBMo=$(echo $dominioMoodle | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1665. userDBMo=$(echo "moodle_user" | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1666. crearDBMoodle
  1667. # Configurar SE-Linux (RHEL)
  1668. if [ $rhelOS = true ];then
  1669. configurarSELinux
  1670. fi
  1671. # Configuramos e instalamos Moodle
  1672. if [ $sslOn = true ];then
  1673. wwwroot="https://$dominioMoodle"
  1674. else
  1675. wwwroot="http://$dominioMoodle"
  1676. fi
  1677. if [ $mySQLOn = true ];then
  1678. dbtype="mysqli"
  1679. elif [ $mariaDBOn = true ];then
  1680. dbtype="mariadb"
  1681. else
  1682. comprobarError 1 602
  1683. fi
  1684. 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
  1685. comprobarError $? 602
  1686. # Actualizamos permisos
  1687. chown -R $webServerUser:$webServerGroup /var/www/$dominioMoodle /var/www/moodledata
  1688. # Configuramos VirtualHost
  1689. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1690. virtualHost="./etc/apache2/sites-available/moodle.conf"
  1691. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1692. virtualHost="./etc/nginx/sites-available/moodle.conf"
  1693. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1694. virtualHost="./etc/apache2/sites-available/moodle-ssl.conf"
  1695. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1696. virtualHost="./etc/nginx/sites-available/moodle-ssl.conf"
  1697. else
  1698. comprobarError 1 602
  1699. fi
  1700. instalarVirtualHost "/var/www/$dominioMoodle" $virtualHost $dominioMoodle
  1701. unset virtualHost wwwroot dbtype
  1702. else
  1703. comprobarError 1 603 $dominioMoodle
  1704. fi
  1705. }
  1706. crearDBMoodle() {
  1707. # Crear base de datos para Moodle
  1708. dbDir="./etc/db"
  1709. if [ ! -d $dbDir ];then
  1710. mkdir $dbDir 2>/dev/null
  1711. comprobarError $? 603
  1712. fi
  1713. dbFile=$dbDir"/moodle.sql"
  1714. echo -en "CREATE DATABASE IF NOT EXISTS $nombreDBMo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n" > $dbFile
  1715. echo -en "GRANT ALL PRIVILEGES ON $nombreDBMo.* TO '$userDBMo'@'localhost' IDENTIFIED BY '$sqlPasswd';\n" >> $dbFile
  1716. mysql -u root --password=$sqlPasswd < $dbFile > /dev/null 2>&1
  1717. control=$?
  1718. rm -f $dbFile 2>/dev/null
  1719. comprobarError $? 603
  1720. comprobarError $control 603
  1721. unset control dbFile dbDir
  1722. }
  1723. configurarSELinux() {
  1724. # Configurar SELinux (Sólo para RHEL)
  1725. which semanage >/dev/null 2>&1
  1726. if [ $? -ne 0 ];then
  1727. result=$(yum -y install policycoreutils-python 2>&1)
  1728. comprobarError $? 605 $result
  1729. fi
  1730. semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/moodledata(/.*)?" > /dev/null 2>&1
  1731. comprobarError $? 604
  1732. restorecon -R /var/www/ > /dev/null 2>&1
  1733. comprobarError $? 604
  1734. }
  1735. instalarPHPInfo() {
  1736. # Instalar fichero info.php y su VirtualHost
  1737. if [ ! -f /etc/$webServerName/sites-enabled/phpinfo.conf ];then
  1738. infoFile="./var/www/info.php"
  1739. if [ ! -f $infoFile ];then
  1740. comprobarError 1 4 "$infoFile"
  1741. fi
  1742. mkdir /var/www/localhost 2>/dev/null
  1743. comprobarError $? 106
  1744. cp -f $infoFile /var/www/localhost/ 2>/dev/null
  1745. comprobarError $? 106
  1746. chown -R $webServerUser:$webServerGroup /var/www/localhost 2>/dev/null
  1747. comprobarError $? 106
  1748. unset infoFile
  1749. # Instalar VirtualHost
  1750. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1751. virtualHost="./etc/apache2/sites-available/phpinfo.conf"
  1752. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1753. virtualHost="./etc/nginx/sites-available/phpinfo.conf"
  1754. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1755. virtualHost="./etc/apache2/sites-available/phpinfo-ssl.conf"
  1756. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1757. virtualHost="./etc/nginx/sites-available/phpinfo-ssl.conf"
  1758. else
  1759. comprobarError 1 106
  1760. fi
  1761. instalarVirtualHost "/var/www/localhost" $virtualHost "localhost"
  1762. unset virtualHost
  1763. return 0
  1764. else
  1765. return 1
  1766. fi
  1767. }
  1768. configurarBackups() {
  1769. # Instala backup-server y lo configura
  1770. letsEncryptCode=""
  1771. if [ ! -d "./var" ];then
  1772. comprobarError 1 5 "./var"
  1773. fi
  1774. which backup-server > /dev/null 2>&1
  1775. if [ $? -ne 0 ];then
  1776. # Descargamos backup-server
  1777. curl "https://code.castanedo.es/guzman/backup-server/archive/2.1.tar.gz" 2>/dev/null | tar -xz -C "./var/"
  1778. if [ $? -ne 0 ];then
  1779. comprobarError 1 701
  1780. return 1
  1781. fi
  1782. # Copiamos backup-server y logrotate
  1783. cp -f ./var/backup-server/backup-server /usr/bin/backup-server
  1784. if [ $? -ne 0 ];then
  1785. comprobarError 1 701
  1786. return 1
  1787. fi
  1788. cp -f ./var/backup-server/scripts/logrotate.d/backup-server /etc/logrotate.d/backup-server
  1789. if [ $? -ne 0 ];then
  1790. comprobarError 1 701
  1791. return 1
  1792. fi
  1793. # Creamos carpeta de backups
  1794. if [ ! -d /var/backup ];then
  1795. mkdir /var/backup 2>/dev/null
  1796. comprobarError $? 5 "/var/backup"
  1797. fi
  1798. # Configuramos cron.d
  1799. if [ $letsEncryptOn = false ];then
  1800. letsEncryptCode="--no-letsencrypt "
  1801. fi
  1802. echo -en "# /etc/cron.d/backup-server: crontab for $hostname\n\n" > /etc/cron.d/backup-server
  1803. echo -en "# Backup every day at 4:00 am\n" >> /etc/cron.d/backup-server
  1804. 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
  1805. comprobarError $? 701
  1806. fi
  1807. unset letsEncryptCode
  1808. }
  1809. # Comprobación del sistema e inicialización
  1810. horaInicial=$(date +"%s")
  1811. inicializarVariables
  1812. comprobarRoot
  1813. OSInfo
  1814. comprobarDependencias
  1815. # Bienvenida
  1816. mostrarBienvenida
  1817. # Selección de componentes (express vs avanzada)
  1818. mostrarExpress
  1819. # Instalación Servidor Web
  1820. if [ $apacheOn = true ]; then
  1821. echo -en "Instalando Servidor Web Apache..." | tee -a $logFile
  1822. instalarApache
  1823. echo -en " OK.\n" | tee -a $logFile
  1824. elif [ $nginxOn = true ]; then
  1825. echo -en "Instalando Servidor Web Nginx..." | tee -a $logFile
  1826. instalarNginx
  1827. echo -en " OK.\n" | tee -a $logFile
  1828. fi
  1829. # Instalación Base de Datos
  1830. if [ $mySQLOn = true ]; then
  1831. echo -en "Instalando Base de Datos MySQL..." | tee -a $logFile
  1832. instalarMySQL
  1833. echo -en " OK.\n" | tee -a $logFile
  1834. elif [ $mariaDBOn = true ]; then
  1835. echo -en "Instalando Base de Datos MariaDB..." | tee -a $logFile
  1836. instalarMariaDB
  1837. echo -en " OK.\n" | tee -a $logFile
  1838. fi
  1839. # Instalación PHP-7
  1840. if [ $phpOn = true ]; then
  1841. echo -en "Instalando PHP-7..." | tee -a $logFile
  1842. instalarPHP
  1843. echo -en " OK.\n" | tee -a $logFile
  1844. fi
  1845. # Instalación Let's Encrypt
  1846. if [ $letsEncryptOn = true ];then
  1847. echo -en "Instalando Let's Encrypt..." | tee -a $logfile
  1848. instalarLetsEncrypt
  1849. echo -en " OK.\n" | tee -a $logFile
  1850. fi
  1851. # Configuración Web Server
  1852. if [ $apacheOn = true ];then
  1853. echo -en "Configurando Servidor Web Apache..." | tee -a $logFile
  1854. configurarApache
  1855. echo -en " OK.\n" | tee -a $logFile
  1856. elif [ $nginxOn = true ]; then
  1857. echo -en "Configurando Servidor Web Nginx..." | tee -a $logFile
  1858. configurarNginx
  1859. echo -en " OK.\n" | tee -a $logFile
  1860. fi
  1861. # Configuración Database (Configurar Ficheros, Arrancar Base de Datos, establecer contraseña y configuración segura)
  1862. if [ $mySQLOn = true ] || [ $mariaDBOn = true ];then
  1863. echo -en "Configurando Base de Datos..." | tee -a $logFile
  1864. configurarSQL
  1865. echo -en " OK.\n" | tee -a $logFile
  1866. habilitarServicio "$sqlServerName"
  1867. echo -en "Estableciendo contraseña de la Base de Datos..." | tee -a $logFile
  1868. establecerSQLPasswd
  1869. echo -en " OK.\n" | tee -a $logFile
  1870. fi
  1871. # Configuración PHP (cgi.fix_pathinfo=0 y Configurar máximo de subida de archivos)
  1872. if [ $phpOn = true ];then
  1873. echo -en "Configurando PHP-7..." | tee -a $logFile
  1874. configurarPHP
  1875. echo -en " OK.\n" | tee -a $logFile
  1876. fi
  1877. # Configuración SSL/TLS
  1878. # Generar certificados auto-firmados
  1879. if [ $sslOn = true ];then
  1880. echo -en "Generando claves de intercambio Diffie-Hellman (puede llevar un largo tiempo)..." | tee -a $logFile
  1881. generarDHParam
  1882. echo -en " OK.\n" | tee -a $logFile
  1883. echo -en "Generando Certificados Auto-Firmados..." | tee -a $logFile
  1884. if [ $mediaWikiOn = true ];then
  1885. generarCertAutofirmado $dominioMediaWiki
  1886. fi
  1887. if [ $moodleOn = true ];then
  1888. generarCertAutofirmado $dominioMoodle
  1889. fi
  1890. if [ $infoPHPOn = true ];then
  1891. generarCertAutofirmado "localhost"
  1892. fi
  1893. echo -en " OK.\n" | tee -a $logFile
  1894. fi
  1895. # Arrancar y habilitar todos los servicios (SystemD, Service o SystemV)
  1896. echo -en "Habilitando todos los servicios..." | tee -a $logFile
  1897. if [ $apacheOn = true ] || [ $nginxOn = true ];then
  1898. habilitarServicio $webServerName
  1899. fi
  1900. if [ $nginxOn = true ] && [ $phpOn = true ];then
  1901. habilitarServicio $phpFPMName
  1902. fi
  1903. echo -en " OK.\n" | tee -a $logFile
  1904. # Instalar MediaWiki
  1905. if [ $mediaWikiOn = true ]; then
  1906. # Descargar MediaWiki
  1907. echo -en "Descargando MediaWiki-1.31.0..." | tee -a $logFile
  1908. descargarMediaWiki
  1909. echo -en " OK.\n" | tee -a $logFile
  1910. # Configurar MediWiki
  1911. echo -en "Configurando MediaWiki..." | tee -a $logFile
  1912. configurarMediaWiki
  1913. echo -en " OK.\n" | tee -a $logFile
  1914. fi
  1915. # Instalar Moodle
  1916. if [ $moodleOn = true ]; then
  1917. # Descargar Moodle
  1918. echo -en "Descargando Moodle-3.5.1..." | tee -a $logFile
  1919. descargarMoodle
  1920. echo -en " OK.\n" | tee -a $logFile
  1921. # Configuración Moodle
  1922. echo -en "Configurando Moodle (puede llevar un tiempo largo)..." | tee -a $logFile
  1923. configurarMoodle
  1924. echo -en " OK.\n" | tee -a $logFile
  1925. fi
  1926. # Instalar info.php
  1927. if [ $infoPHPOn = true ];then
  1928. echo -en "Configurando 'info.php'..." | tee -a $logFile
  1929. instalarPHPInfo
  1930. if [ $? -eq 0 ];then
  1931. echo -en " OK.\n" | tee -a $logFile
  1932. else
  1933. echo -en " Ya se encuentra configurado.\n" | tee -a $logFile
  1934. fi
  1935. fi
  1936. # Añadir reglas del cortafuegos
  1937. echo -en "Configurando Cortafuegos..." | tee -a $logFile
  1938. configurarCortafuegos
  1939. echo -en " OK.\n" | tee -a $logFile
  1940. # Generar certificados Let's Encrypt
  1941. if [ $letsEncryptOn = true ];then
  1942. echo -en "Generando Certificados Válidos Let's Encrypt..." | tee -a $logFile
  1943. generarCertLetsEncrypt
  1944. echo -en " OK.\n" | tee -a $logFile
  1945. fi
  1946. # Configurar Backup
  1947. if [ $backupOn = true ]; then
  1948. echo -en "Configurando Backup Automático..." | tee -a $logFile
  1949. configurarBackups
  1950. echo -en " OK.\n" | tee -a $logFile
  1951. fi
  1952. # Finalizamos
  1953. horaFinal=$(date +"%s")
  1954. echo -en "\n--------------------------------------------------\n" | tee -a $logFile
  1955. echo -en "\t¡INSTALACION FINALIZADA CON EXITO! \n" | tee -a $logFile
  1956. echo -en "\tDuración: "$((horaFinal-horaInicial))" seg." | tee -a $logFile
  1957. echo -en "\n--------------------------------------------------\n" | tee -a $logFile