install 78 KB

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