install 77 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455
  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. # Comprobamos openssl
  544. which openssl > /dev/null 2>&1
  545. if [ $? -ne 0 ];then
  546. result=$(apt-get -q -y install openssl 2>&1)
  547. comprobarError $? 815 $result
  548. fi
  549. ;;
  550. centos|fedora)
  551. # Comprobamos yum
  552. which yum > /dev/null 2>&1
  553. comprobarError $? 804
  554. # Actualizamos base de datos del repositorio
  555. echo -en "Actualizando repositorio YUM..." | tee -a $logFile
  556. result=$(yum -y makecache 2>&1)
  557. comprobarError $? 805 $result
  558. echo -en " OK.\n" | tee -a $logFile
  559. # Comprobamos Firewall (firewall-cmd)
  560. which firewall-cmd > /dev/null 2>&1
  561. comprobarError $? 807
  562. # Comprobamos tput
  563. which tput > /dev/null 2>&1
  564. if [ $? -ne 0 ];then
  565. result=$(yum -y install ncurses 2>&1)
  566. comprobarError $? 808 $result
  567. fi
  568. # Comprobar sed
  569. which sed > /dev/null 2>&1
  570. if [ $? -ne 0 ];then
  571. result=$(yum -y install sed 2>&1)
  572. comprobarError $? 809 $result
  573. fi
  574. # Comprobar curl
  575. which curl > /dev/null 2>&1
  576. if [ $? -ne 0 ];then
  577. result=$(yum -y install curl 2>&1)
  578. comprobarError $? 810 $result
  579. fi
  580. # Comprobamos tar, gzip, bzip2 y xz
  581. which tar > /dev/null 2>&1
  582. if [ $? -ne 0 ];then
  583. result=$(yum -y install tar 2>&1)
  584. comprobarError $? 811 $result
  585. fi
  586. which gzip > /dev/null 2>&1
  587. if [ $? -ne 0 ];then
  588. result=$(yum -y install gzip 2>&1)
  589. comprobarError $? 812 $result
  590. fi
  591. which bzip2 > /dev/null 2>&1
  592. if [ $? -ne 0 ];then
  593. result=$(yum -y install bzip2 2>&1)
  594. comprobarError $? 813 $result
  595. fi
  596. which xz > /dev/null 2>&1
  597. if [ $? -ne 0 ];then
  598. result=$(yum -y install xz 2>&1)
  599. comprobarError $? 814 $result
  600. fi
  601. # Comprobamos openssl
  602. which openssl > /dev/null 2>&1
  603. if [ $? -ne 0 ];then
  604. result=$(yum -y install openssl 2>&1)
  605. comprobarError $? 815 $result
  606. fi
  607. ;;
  608. esac
  609. }
  610. inicializarVariables() {
  611. # Inicializa las variables que necesitan de un estado previo
  612. apacheOn=false
  613. nginxOn=false
  614. mySQLOn=false
  615. mariaDBOn=false
  616. phpOn=false
  617. sslOn=false
  618. letsEncryptOn=false
  619. mediaWikiOn=false
  620. moodleOn=false
  621. infoPHPOn=false
  622. backupOn=false
  623. hostname=""
  624. logFile="./."$(basename $0)".log"
  625. maxUpload="100M"
  626. webServerName=""
  627. webServerUser=""
  628. webServerGroup=""
  629. sqlServerName=""
  630. dbType=""
  631. phpFPMName=""
  632. nombreMediaWiki=""
  633. dominioMediaWiki=""
  634. passwdMediaWiki=""
  635. nombreMoodle=""
  636. nombreCortoMoodle=""
  637. dominioMoodle=""
  638. passwdMoodle=""
  639. }
  640. instalacionExpress() {
  641. # Permite una instalación rápida, haciendo el menor número de preguntas
  642. # Defecto: Nginx + MariaDB + PHP + Let's Encrypt + MediaWiki + Moodle + Backup
  643. nginxOn=true
  644. case $ID in
  645. debian)
  646. mySQLOn=true
  647. dbType="mariadb"
  648. ;;
  649. ubuntu|centos|fedora)
  650. mariaDBOn=true
  651. dbType="mariadb"
  652. ;;
  653. esac
  654. phpOn=true
  655. sslOn=true
  656. letsEncryptOn=true
  657. mediaWikiOn=true
  658. moodleOn=true
  659. backupOn=true
  660. }
  661. mostrarBienvenida() {
  662. # Pantalla de bienvenida y muestra SO y estado de los discos
  663. ANCHO=$(tput cols)
  664. ALTO=$(tput lines)
  665. 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"
  666. comprobarError $? 1
  667. }
  668. mostrarExpress() {
  669. # Pantalla de elección entre instalación express o avanzada
  670. 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 \
  671. "Express" "Instalación rápida" ON \
  672. "Avanzada" "Permite escoger todas las opciones disponibles" OFF \
  673. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  674. comprobarError $? 1
  675. case $express in
  676. Express)
  677. instalacionExpress
  678. # Preguntas mínimas
  679. establecerFQDN
  680. leerSQLPasswd
  681. mostrarMediaWiki
  682. mostrarMoodle
  683. mostrarConfirmacion
  684. ;;
  685. Avanzada)
  686. mostrarAvanzada
  687. ;;
  688. *)
  689. comprobarError 1 2
  690. ;;
  691. esac
  692. unset express
  693. }
  694. mostrarAvanzada() {
  695. # Pantalla que permite instalar un servidor LAMP o LEMP
  696. 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 \
  697. "LEMP" "GNU/Linux + (E)Nginx + MySQL/MariaDB + PHP-7" ON \
  698. "LAMP" "GNU/Linux + Apache + MySQL/MariaDB + PHP-7" OFF \
  699. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  700. comprobarError $? 1
  701. for i in $webServer; do
  702. case $i in
  703. LEMP)
  704. nginxOn=true
  705. ;;
  706. LAMP)
  707. apacheOn=true
  708. ;;
  709. *)
  710. comprobarError 1 100
  711. ;;
  712. esac
  713. done
  714. # Opciones comunes
  715. establecerFQDN
  716. mostrarDatabase
  717. phpOn=true
  718. establecerMaxUpload
  719. mostrarComponentes
  720. mostrarConfirmacion
  721. unset webServer
  722. }
  723. leerSQLPasswd() {
  724. # Pantalla para leer la contraseña para el usuario root de SQL
  725. control=false
  726. error=""
  727. # Leemos la contreseña (stdin) y confirmamos
  728. while [ $control = false ]; do
  729. 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)
  730. comprobarError $? 1
  731. 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)
  732. comprobarError $? 1
  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. unset control error sqlPasswd2
  742. }
  743. establecerFQDN() {
  744. # Configura el FQDN (dominio principal del servidor)
  745. while [ -z "$hostname" ]; do
  746. 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)
  747. if [ $? -eq 0 ] && [ ! -z "$hostname" ]; then
  748. hostnamectl set-hostname $hostname
  749. else
  750. hostname=$(hostname)
  751. fi
  752. done
  753. echo -en "Hostname: $hostname\n" >> $logFile
  754. }
  755. mostrarDatabase() {
  756. # Pantalla que permite escoger entre instalar MariaDB o MySQL
  757. case $ID in
  758. debian)
  759. 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"
  760. comprobarError $? 1
  761. # Excepción: aunque es MariaDB (se instala con el nombre de mysql-server)
  762. mySQLOn=true
  763. dbType="mariadb"
  764. ;;
  765. ubuntu)
  766. case $VERSION in
  767. 18.04)
  768. 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 \
  769. "MariaDB" "Instalar la base de datos MariaDB (fork de MySQL)" ON \
  770. "MySQL" "Instalar la base de datos MySQL (uso no comercial)" OFF \
  771. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  772. comprobarError $? 1
  773. case $database in
  774. MariaDB)
  775. mariaDBOn=true
  776. dbType="mariadb"
  777. ;;
  778. MySQL)
  779. mySQLOn=true
  780. dbType="mysqli"
  781. ;;
  782. *)
  783. comprobarError 1 200
  784. ;;
  785. esac
  786. ;;
  787. 16.04)
  788. # Ubuntu 16.04 presenta un bug en MySQL (así que lo deshabilitamos)
  789. 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"
  790. comprobarError $? 1
  791. mariaDBOn=true
  792. dbType="mariadb"
  793. ;;
  794. esac
  795. ;;
  796. centos|fedora)
  797. 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"
  798. comprobarError $? 1
  799. mariaDBOn=true
  800. dbType="mariadb"
  801. ;;
  802. *)
  803. comprobarError 1 200
  804. ;;
  805. esac
  806. # Otras opciones (contraseña)
  807. leerSQLPasswd
  808. }
  809. establecerMaxUpload() {
  810. # Pantalla para establecer el máximo de subida al servidor (vía PHP)
  811. control=false
  812. error=""
  813. while [ $control = false ];do
  814. 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)
  815. comprobarError $? 1
  816. if [ -z "$maxUpload2" ];then
  817. error="ERROR: NO PUEDES DEJAR ESTE PARÁMETRO VACIO.\n"
  818. else
  819. control=true
  820. fi
  821. done
  822. maxUpload=$maxUpload2
  823. unset control maxUpload2
  824. }
  825. mostrarComponentes() {
  826. # Pantalla de elección de componentes (SSL/TLS, MediaWiki, Moodle, InfoPHP y Backup)
  827. 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 \
  828. "SSL/TLS" "Instalar certificados para activar HTTPS" ON \
  829. "MediaWiki" "Instalar wiki con MediaWiki" ON \
  830. "Moodle" "Instalar campus virtual con Moodle" ON \
  831. "InfoPHP" "Instalar info.php (sólo para pruebas)" OFF \
  832. "Backup" "Programar backups automáticos" ON \
  833. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  834. comprobarError $? 1
  835. for i in $componentes; do
  836. case $i in
  837. \"SSL/TLS\")
  838. # 2 Opciones: Let's Encrypt o Autofirmado
  839. mostrarSSL
  840. ;;
  841. \"MediaWiki\")
  842. mediaWikiOn=true
  843. mostrarMediaWiki
  844. ;;
  845. \"Moodle\")
  846. moodleOn=true
  847. mostrarMoodle
  848. ;;
  849. \"InfoPHP\")
  850. infoPHPOn=true
  851. ;;
  852. \"Backup\")
  853. backupOn=true
  854. ;;
  855. *)
  856. comprobarError 1 3
  857. ;;
  858. esac
  859. done
  860. unset componentes
  861. }
  862. mostrarSSL() {
  863. # Pantalla que permite seleccionar el tipo de certificados
  864. 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 \
  865. "LetsEncrypt" "Compatible con todos los navegadores" ON \
  866. "Auto-Firmado" "Certificados auto-firmados (sólo para pruebas)" OFF \
  867. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  868. comprobarError $? 1
  869. for i in $ssl; do
  870. case $i in
  871. LetsEncrypt)
  872. sslOn=true
  873. letsEncryptOn=true
  874. ;;
  875. Auto-Firmado)
  876. sslOn=true
  877. ;;
  878. *)
  879. comprobarError 1 6
  880. ;;
  881. esac
  882. done
  883. unset ssl
  884. }
  885. mostrarMediaWiki(){
  886. # Pantalla que pregunta sobre las opciones necesarias para configurar MediaWiki
  887. # Introducir nombre wiki
  888. while [ -z "$nombreMediaWiki" ]; do
  889. 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)
  890. comprobarError $? 1
  891. done
  892. # Introducir dominio
  893. while [ -z "$dominioMediaWiki" ]; do
  894. 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)
  895. comprobarError $? 1
  896. done
  897. cont=1
  898. serverName=""
  899. aliasMediaWiki=""
  900. for dominio in $dominioMediaWiki;do
  901. if [ $cont -eq 1 ];then
  902. # Dominio Principal (ServerName)
  903. serverName=$dominio
  904. else
  905. # Dominios Secundarios (ServerAlias)
  906. aliasMediaWiki=$aliasMediaWiki" "$dominio
  907. fi
  908. cont=$((cont + 1))
  909. done
  910. dominioMediaWiki=$serverName
  911. # Introducir contraseña
  912. control=false
  913. error=""
  914. while [ $control = false ]; do
  915. 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)
  916. comprobarError $? 1
  917. 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)
  918. comprobarError $? 1
  919. if [ -z "$passwdMediaWiki" ] || [ -z "$passwdMediaWiki2" ]; then
  920. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  921. elif [ $passwdMediaWiki != $passwdMediaWiki2 ];then
  922. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  923. else
  924. control=true
  925. fi
  926. done
  927. unset control error passwdMediaWiki2 dominio cont serverName
  928. }
  929. mostrarMoodle() {
  930. # Pantalla que pregunta sobre las opciones necesarias para configurar Moodle
  931. # Introducir Nombre Moodle
  932. while [ -z "$nombreMoodle" ]; do
  933. 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)
  934. comprobarError $? 1
  935. done
  936. # Introducir Nombre Corto Moodle
  937. while [ -z "$nombreCortoMoodle" ]; do
  938. 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)
  939. comprobarError $? 1
  940. done
  941. nombreCortoMoodle=$(echo $nombreCortoMoodle | cut -d ' ' -f 1)
  942. # Introducir dominio
  943. while [ -z "$dominioMoodle" ]; do
  944. 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)
  945. comprobarError $? 1
  946. done
  947. cont=1
  948. serverName=""
  949. aliasMoodle=""
  950. for dominio in $dominioMoodle;do
  951. if [ $cont -eq 1 ];then
  952. # Dominio Principal (ServerName)
  953. serverName=$dominio
  954. else
  955. # Dominios Secundarios (ServerAlias)
  956. aliasMoodle=$aliasMoodle" "$dominio
  957. fi
  958. cont=$((cont + 1))
  959. done
  960. dominioMoodle=$serverName
  961. # Introducir contraseña
  962. control=false
  963. error=""
  964. while [ $control = false ]; do
  965. 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)
  966. comprobarError $? 1
  967. 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)
  968. comprobarError $? 1
  969. if [ -z "$passwdMoodle" ] || [ -z "$passwdMoodle2" ]; then
  970. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  971. elif [ $passwdMoodle != $passwdMoodle2 ];then
  972. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  973. else
  974. control=true
  975. fi
  976. done
  977. unset control error passwdMoodle2 dominio cont serverName aliasMoodle
  978. }
  979. mostrarConfirmacion() {
  980. # Pantalla que presenta una confirmación antes de realizar la instalación
  981. 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"
  982. comprobarError $? 1
  983. }
  984. instalarApache() {
  985. # Instala Apache2
  986. case $ID in
  987. debian|ubuntu)
  988. webServerName="apache2"
  989. result=$(apt-get -q -y install apache2 2>&1)
  990. comprobarError $? 101 $result
  991. ;;
  992. centos|fedora)
  993. webServerName="httpd"
  994. result=$(yum -y install httpd 2>&1)
  995. comprobarError $? 101 $result
  996. if [ $sslOn = true ];then
  997. # Instalamos módulo mod_ssl (no se instala por defecto)
  998. result=$(yum -y install mod_ssl 2>&1)
  999. comprobarError $? 101 $result
  1000. fi
  1001. ;;
  1002. *)
  1003. comprobarError 1 104
  1004. ;;
  1005. esac
  1006. deshabilitarServicio $webServerName
  1007. }
  1008. configurarApache() {
  1009. # Configura Apache2
  1010. case $ID in
  1011. debian|ubuntu)
  1012. apacheConfFile="./etc/apache2/apache2.conf"
  1013. if [ ! -f $apacheConfFile ];then
  1014. comprobarError 1 4 $apacheConfFile
  1015. fi
  1016. cp -f $apacheConfFile /etc/$webServerName/apache2.conf 2>/dev/null
  1017. comprobarError $? 108
  1018. webServerUser=$(grep ^User /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
  1019. webServerGroup=$(grep ^Group /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
  1020. if [ ! -L /etc/$webServerName/logs ];then
  1021. ln -s /var/log/apache2 /etc/$webServerName/logs 2>/dev/null
  1022. comprobarError $? 108
  1023. fi
  1024. # Activamos mod_rewrite (no viene activado por defecto)
  1025. a2enmod rewrite >/dev/null 2>&1
  1026. comprobarError $? 108
  1027. # Activamos mod_ssl y mod_headers (no viene activado por defecto)
  1028. if [ $sslOn = true ];then
  1029. a2enmod ssl >/dev/null 2>&1
  1030. comprobarError $? 108
  1031. a2enmod headers >/dev/null 2>&1
  1032. comprobarError $? 108
  1033. fi
  1034. unset apacheConfFile
  1035. ;;
  1036. centos|fedora)
  1037. apacheConfFile="./etc/apache2/conf/httpd.conf"
  1038. sslConfFile="./etc/apache2/conf.d/ssl.conf"
  1039. welcomeConfFile="/etc/apache2/conf.d/welcome.conf"
  1040. if [ ! -f $apacheConfFile ];then
  1041. comprobarError 1 4 $apacheConfFile
  1042. fi
  1043. cp -f $apacheConfFile /etc/$webServerName/conf/httpd.conf 2>/dev/null
  1044. comprobarError $? 108
  1045. # Desactivamos Mensaje de Bienvenida
  1046. if [ -f $welcomeConfFile ];then
  1047. sed -i -e 's/^/#/' $welcomeConfFile
  1048. comprobarError $? 108
  1049. fi
  1050. # Configuramos mod_ssl
  1051. if [ $sslOn = true ];then
  1052. if [ ! -f $sslConfFile ];then
  1053. comprobarError 1 4 $sslConfFile
  1054. fi
  1055. cp -f $sslConfFile /etc/$webServerName/conf.d/ssl.conf 2>/dev/null
  1056. comprobarError $? 108
  1057. fi
  1058. webServerUser=$(grep ^User /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
  1059. webServerGroup=$(grep ^Group /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
  1060. unset apacheConfFile sslConfFile welcomeConfFile
  1061. ;;
  1062. *)
  1063. comprobarError 1 108
  1064. ;;
  1065. esac
  1066. # Creamos directorios sites-available y sites-enabled
  1067. if [ ! -d "/etc/$webServerName/sites-available" ];then
  1068. mkdir "/etc/$webServerName/sites-available" 2>/dev/null
  1069. comprobarError $? 5 "/etc/$webServerName/sites-available"
  1070. fi
  1071. if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
  1072. mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
  1073. comprobarError $? 5 "/etc/$webServerName/sites-enabled"
  1074. else
  1075. # Eliminar Virtual Host por defecto
  1076. if [ -f /etc/$webServerName/sites-enabled/000-default.conf ];then
  1077. rm -f /etc/$webServerName/sites-enabled/000-default.conf 2>/dev/null
  1078. fi
  1079. fi
  1080. }
  1081. instalarNginx() {
  1082. # Instala Nginx
  1083. webServerName="nginx"
  1084. case $ID in
  1085. ubuntu|debian)
  1086. result=$(apt-get -q -y install nginx 2>&1)
  1087. comprobarError $? 102 $result
  1088. ;;
  1089. centos)
  1090. # CentOS requiere un repositorio extra ('epel-release')
  1091. result=$(yum -y install epel-release)
  1092. comprobarError $? 103 $result
  1093. result=$(yum -y install nginx 2>&1)
  1094. comprobarError $? 102 $result
  1095. ;;
  1096. fedora)
  1097. result=$(yum -y install nginx 2>&1)
  1098. comprobarError $? 102 $result
  1099. ;;
  1100. *)
  1101. comprobarError 1 105
  1102. ;;
  1103. esac
  1104. deshabilitarServicio $webServerName
  1105. }
  1106. configurarNginx() {
  1107. # Configura Nginx
  1108. rm -Rf "/etc/$webServerName/!(sites-available|sites-enabled)" 2>/dev/null
  1109. comprobarError $? 107
  1110. nginxConfFile="./etc/$webServerName"
  1111. if [ -d "$nginxConfFile" ];then
  1112. cp -Rf $nginxConfFile/* /etc/$webServerName/ 2>/dev/null
  1113. comprobarError $? 107
  1114. else
  1115. comprobarError 1 5 "$nginxConfFile"
  1116. fi
  1117. # Creamos directorios sites-available y sites-enabled
  1118. if [ ! -d "/etc/$webServerName/sites-available" ];then
  1119. mkdir "/etc/$webServerName/sites-available" 2>/dev/null
  1120. comprobarError $? 5 "/etc/$webServerName/sites-available"
  1121. fi
  1122. if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
  1123. mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
  1124. comprobarError $? 5 "/etc/$webServerName/sites-enabled"
  1125. else
  1126. # Eliminar Virtual Host por defecto
  1127. if [ -f /etc/$webServerName/sites-enabled/default ];then
  1128. rm -f /etc/$webServerName/sites-enabled/default 2>/dev/null
  1129. fi
  1130. fi
  1131. # Configuramos Usuario y Grupo
  1132. case $ID in
  1133. debian|ubuntu)
  1134. webServerUser="www-data"
  1135. webServerGroup=$webServerUser
  1136. ;;
  1137. centos|fedora)
  1138. webServerUser="nginx"
  1139. webServerGroup=$webServerUser
  1140. ;;
  1141. esac
  1142. sed -i '/user /c\user '$webServerUser';' /etc/$webServerName/nginx.conf
  1143. comprobarError $? 107
  1144. unset nginxConfFile
  1145. }
  1146. instalarVirtualHost() {
  1147. # Configuramos un Virtual Host para Apache o Nginx
  1148. # Uso: instalarVirtualHost $root $virtualHost $dominio $alias
  1149. if [ $# -ge 3 ];then
  1150. rootVirtualHost=$(realpath $1)
  1151. shift
  1152. virtualHostFile=$(realpath $1)
  1153. shift
  1154. dominioVirtualHost=$1
  1155. virtualHostName=$dominioVirtualHost".conf"
  1156. shift
  1157. aliasVirtualHost=$@
  1158. else
  1159. comprobarError 1 908
  1160. fi
  1161. if [ ! -f $virtualHostFile ];then
  1162. comprobarError 1 909 $virtualHostName
  1163. fi
  1164. if [ $apacheOn = true ];then
  1165. # Configuramos root, dominio y logs
  1166. sed -i '/ServerName /c\\tServerName '"$dominioVirtualHost" $virtualHostFile
  1167. comprobarError $? 908
  1168. if [ ! -z "$aliasVirtualHost" ];then
  1169. sed -i '/ServerName /a\\tServerAlias '"$aliasVirtualHost" $virtualHostFile
  1170. comprobarError $? 908
  1171. fi
  1172. sed -i '/DocumentRoot /c\\tDocumentRoot '"$rootVirtualHost" $virtualHostFile
  1173. comprobarError $? 908
  1174. sed -i '/ErrorLog /c\\tErrorLog logs/'"$dominioVirtualHost"'-error.log' $virtualHostFile
  1175. comprobarError $? 908
  1176. sed -i '/CustomLog /c\\tCustomLog logs/'"$dominioVirtualHost"'-access.log common' $virtualHostFile
  1177. comprobarError $? 908
  1178. if [ $sslOn = true ];then
  1179. sed -i '/SSLCertificateFile /c\\tSSLCertificateFile ssl/'"$dominioVirtualHost"'.crt' $virtualHostFile
  1180. comprobarError $? 908
  1181. sed -i '/SSLCertificateKeyFile /c\\tSSLCertificateKeyFile ssl/'"$dominioVirtualHost"'.key' $virtualHostFile
  1182. comprobarError $? 908
  1183. fi
  1184. elif [ $nginxOn = true ];then
  1185. # Configuramos root, dominio, logs y php-fpm.sock
  1186. sed -i '/root /c\\troot '$rootVirtualHost';' "$virtualHostFile"
  1187. comprobarError $? 908
  1188. sed -i '/server_name /c\\tserver_name '"$dominioVirtualHost"' '"$aliasVirtualHost"';' $virtualHostFile
  1189. comprobarError $? 908
  1190. sed -i '/access_log /c\\taccess_log /var/log/nginx/'"$dominioVirtualHost"'-access.log;' $virtualHostFile
  1191. comprobarError $? 908
  1192. sed -i '/error_log /c\\terror_log /var/log/nginx/'"$dominioVirtualHost"'-error.log;' $virtualHostFile
  1193. comprobarError $? 908
  1194. socket=$(find /var/run/ -type s -name 'php*.sock')
  1195. sed -i '/fastcgi_pass /c\\t\tfastcgi_pass unix:'"$socket"';' $virtualHostFile
  1196. comprobarError $? 908
  1197. if [ $sslOn = true ];then
  1198. sed -i '/ssl_certificate /c\\tssl_certificate ssl/'"$dominioVirtualHost"'.crt;' $virtualHostFile
  1199. comprobarError $? 908
  1200. sed -i '/ssl_certificate_key /c\\tssl_certificate_key ssl/'"$dominioVirtualHost"'.key;' $virtualHostFile
  1201. comprobarError $? 908
  1202. fi
  1203. fi
  1204. # Copiamos Virtual Host
  1205. cp -f $virtualHostFile "/etc/$webServerName/sites-available/$virtualHostName" >> $logFile 2>&1
  1206. comprobarError $? 910
  1207. if [ -f "/etc/$webServerName/sites-enabled/$virtualHostName" ];then
  1208. rm -f /etc/$webServerName/sites-enabled/$virtualHostName 2>/dev/null
  1209. comprobarError 911 $virtualHostName
  1210. fi
  1211. # Habilitamos Virtual Host
  1212. ln -s "/etc/$webServerName/sites-available/$virtualHostName" "/etc/$webServerName/sites-enabled/$virtualHostName" >> $logFile 2>&1
  1213. comprobarError $? 911 $virtualHostName
  1214. # Recargamos servicio
  1215. recargarServicio $webServerName
  1216. unset rootVirtualHost dominioVirtualHost virtualHostFile virtualHostName aliasVirtualHost socket
  1217. }
  1218. establecerSQLPasswd() {
  1219. # Establecemos SQL root passwd y securizamos BD (mysql_secure_installation)
  1220. # Comprobamos si ya tiene una contraseña asignada
  1221. mysql -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1222. if [ $? -eq 0 ];then
  1223. # Establecemos contraseña del usuario root (y desactivamos posibles plugins para forzar login por contraseña)
  1224. mysql -e "UPDATE mysql.user SET plugin = '', Password = PASSWORD('$sqlPasswd') WHERE User = 'root'" >> $logFile 2>&1
  1225. if [ $? -ne 0 ];then
  1226. # Lo intentamos de otra forma (para versiones modernas de mysql)
  1227. mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '$sqlPasswd'" >> $logFile 2>&1
  1228. comprobarError $? 207
  1229. fi
  1230. # Aplicamos el cambio de contraseña
  1231. mysql -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1232. # Desactivamos acceso root desde el exterior (solo localhost)
  1233. 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
  1234. comprobarError $? 208
  1235. # Eliminamos todos los usuarios anónimos
  1236. mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.user WHERE User=''" >> $logFile 2>&1
  1237. comprobarError $? 209
  1238. # Eliminamos bases de datos 'test'
  1239. mysql -u root --password=$sqlPasswd -e "DROP DATABASE IF EXISTS test" >> $logFile 2>&1
  1240. comprobarError $? 210
  1241. # Eliminamos privilegios de la base de datos 'test'
  1242. mysql -u root --password=$sqlPasswd -e "DELETE FROM mysql.db WHERE Db='test' OR Db='test\\_%'" >> $logFile 2>&1
  1243. comprobarError $? 211
  1244. # Aplicamos los cambios
  1245. mysql -u root --password=$sqlPasswd -e "FLUSH PRIVILEGES" >> $logFile 2>&1
  1246. comprobarError $? 212
  1247. else
  1248. comprobarError 1 206
  1249. fi
  1250. }
  1251. instalarMySQL() {
  1252. # Instala MySQL (sólo para Debian)
  1253. sqlServerName="mysql"
  1254. case $ID in
  1255. debian|ubuntu)
  1256. result=$(apt-get -q -y install mysql-server mysql-client 2>&1)
  1257. comprobarError $? 201 $result
  1258. ;;
  1259. centos|fedora)
  1260. # MySQL no disponible en RHEL.
  1261. # No se instalará MySQL en distribuciones RHEL
  1262. comprobarError 1 205
  1263. ;;
  1264. *)
  1265. comprobarError 1 203
  1266. ;;
  1267. esac
  1268. deshabilitarServicio $sqlServerName
  1269. }
  1270. instalarMariaDB() {
  1271. # Instala MariaDB
  1272. sqlServerName="mariadb"
  1273. case $ID in
  1274. debian)
  1275. result=$(apt-get -q -y install mariadb-server mariadb-client 2>&1)
  1276. comprobarError $? 202 $result
  1277. ;;
  1278. ubuntu)
  1279. case $VERSION in
  1280. 16.04)
  1281. sqlServerName="mysql"
  1282. ;;
  1283. esac
  1284. result=$(apt-get -q -y install mariadb-server mariadb-client 2>&1)
  1285. comprobarError $? 202 $result
  1286. ;;
  1287. centos|fedora)
  1288. result=$(yum -y install mariadb-server mariadb 2>&1)
  1289. comprobarError $? 202 $result
  1290. ;;
  1291. *)
  1292. comprobarError 1 204
  1293. ;;
  1294. esac
  1295. deshabilitarServicio $sqlServerName
  1296. }
  1297. configurarSQL() {
  1298. # Configura BarracudaFS en mysql (necesario para Moodle)
  1299. # Configura MariaDB o MySQL
  1300. case $ID in
  1301. debian|ubuntu)
  1302. sqlConfFile="/etc/mysql/my.cnf"
  1303. ;;
  1304. centos|fedora)
  1305. sqlConfFile="/etc/my.cnf"
  1306. ;;
  1307. *)
  1308. comprobarError 1 213
  1309. ;;
  1310. esac
  1311. if [ ! -f $sqlConfFile ];then
  1312. comprobarError 1 213
  1313. fi
  1314. grep "# Configuration for Moodle" $sqlConfFile >/dev/null 2>&1
  1315. if [ $? -ne 0 ];then
  1316. # Establecemos UTF8 (codificación de caracteres) y Barracuda (sistema de ficheros)
  1317. echo -en "\n# Configuration for Moodle\n" >> $sqlConfFile
  1318. echo -en "[client]\n" >> $sqlConfFile
  1319. echo -en "default-character-set = utf8mb4\n\n" >> $sqlConfFile
  1320. echo -en "[mysqld]\n" >> $sqlConfFile
  1321. echo -en "innodb_file_format = Barracuda\n" >> $sqlConfFile
  1322. echo -en "innodb_file_per_table = 1\n" >> $sqlConfFile
  1323. echo -en "innodb_large_prefix\n\n" >> $sqlConfFile
  1324. echo -en "character-set-server = utf8mb4\n" >> $sqlConfFile
  1325. echo -en "collation-server = utf8mb4_unicode_ci\n" >> $sqlConfFile
  1326. echo -en "skip-character-set-client-handshake\n\n" >> $sqlConfFile
  1327. echo -en "[mysql]\n" >> $sqlConfFile
  1328. echo -en "default-character-set = utf8mb4\n" >> $sqlConfFile
  1329. else
  1330. comprobarError 1 214
  1331. fi
  1332. unset sqlConfFile
  1333. }
  1334. instalarPHP() {
  1335. # Instalamos PHP-7 y los módulos PHP que necesitan MediaWiki y Moodle
  1336. case $ID in
  1337. debian)
  1338. phpFPMName="php7.0-fpm"
  1339. if [ $apacheOn = true ]; then
  1340. 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)
  1341. comprobarError $? 302 $result
  1342. elif [ $nginxOn = true ];then
  1343. 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)
  1344. comprobarError $? 302 $result
  1345. deshabilitarServicio $phpFPMName
  1346. else
  1347. comprobarError 1 301
  1348. fi
  1349. ;;
  1350. ubuntu)
  1351. case $VERSION in
  1352. 18.04)
  1353. phpFPMName="php7.2-fpm"
  1354. ;;
  1355. 16.04)
  1356. phpFPMName="php7.0-fpm"
  1357. ;;
  1358. esac
  1359. if [ $apacheOn = true ]; then
  1360. 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)
  1361. comprobarError $? 302 $result
  1362. elif [ $nginxOn = true ];then
  1363. 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)
  1364. comprobarError $? 302 $result
  1365. deshabilitarServicio $phpFPMName
  1366. else
  1367. comprobarError 1 301
  1368. fi
  1369. ;;
  1370. centos)
  1371. phpFPMName="php-fpm"
  1372. # Necesitamos un repositorio adicional para PHP-7 (EPEL-RELEASE) sólo en CentOS
  1373. result=$(yum -y install epel-release yum-utils 2>&1)
  1374. comprobarError $? 103 $result
  1375. # Necesitamos un repositorio adicional para PHP-7 (REMI-RELEASE)
  1376. if [ ! -f /etc/yum.repos.d/remi-php72.repo ];then
  1377. result=$(yum -y install "http://remi.mirrors.cu.be/enterprise/remi-release-7.rpm" 2>&1)
  1378. comprobarError $? 303 $result
  1379. fi
  1380. # Activamos repositorio remi-php72
  1381. result=$(yum-config-manager --enable remi-php72 2>&1)
  1382. comprobarError $? 303 $result
  1383. # Instalamos PHP-7.2
  1384. if [ $apacheOn = true ];then
  1385. 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)
  1386. comprobarError $? 302 $result
  1387. elif [ $nginxOn = true ];then
  1388. 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)
  1389. comprobarError $? 302 $result
  1390. deshabilitarServicio $phpFPMName
  1391. else
  1392. comprobarError 1 301
  1393. fi
  1394. ;;
  1395. fedora)
  1396. phpFPMName="php-fpm"
  1397. # Instalamos PHP-7.2
  1398. if [ $apacheOn = true ];then
  1399. 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)
  1400. comprobarError $? 302 $result
  1401. elif [ $nginxOn = true ];then
  1402. 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)
  1403. comprobarError $? 302 $result
  1404. deshabilitarServicio $phpFPMName
  1405. else
  1406. comprobarError 1 301
  1407. fi
  1408. ;;
  1409. *)
  1410. comprobarError 1 300
  1411. ;;
  1412. esac
  1413. }
  1414. configurarPHP() {
  1415. # Configura PHP para segurizarlo y establecer máximo de subida.
  1416. case $ID in
  1417. debian)
  1418. phpConfFile="./etc/php/php.ini.debian"
  1419. phpDest="/etc/php/7.0/cli/php.ini"
  1420. ;;
  1421. ubuntu)
  1422. phpConfFile="./etc/php/php.ini.debian"
  1423. case $VERSION in
  1424. 18.04)
  1425. phpDest="/etc/php/7.2/cli/php.ini"
  1426. ;;
  1427. 16.04)
  1428. phpDest="/etc/php/7.0/cli/php.ini"
  1429. ;;
  1430. esac
  1431. ;;
  1432. centos|fedora)
  1433. phpConfFile="./etc/php/php.ini.rhel"
  1434. phpDest="/etc/php.ini"
  1435. ;;
  1436. *)
  1437. comprobarError 1 305
  1438. ;;
  1439. esac
  1440. if [ ! -f $phpConfFile ];then
  1441. comprobarError 1 4 "$phpConfFile"
  1442. fi
  1443. # Copiamos configuración
  1444. cp -f $phpConfFile $phpDest 2>/dev/null
  1445. comprobarError $? 305
  1446. # Configuramos cgi.fix_pathinfo
  1447. sed -i '/cgi.fix_pathinfo=/c\cgi.fix_pathinfo=0' $phpDest
  1448. comprobarError $? 305
  1449. # Configuramos post_max_size
  1450. sed -i '/post_max_size =/c\post_max_size = '$maxUpload $phpDest
  1451. comprobarError $? 305
  1452. # Configuramos upload_max_filesize
  1453. sed -i '/upload_max_filesize =/c\upload_max_filesize = '$maxUpload $phpDest
  1454. comprobarError $? 305
  1455. # Configurar php-fpm (sólo en RHEL con Nginx)
  1456. case $ID in
  1457. centos|fedora)
  1458. if [ $nginxOn = true ];then
  1459. # Configurar Socket UNIX
  1460. phpConfFile="./etc/php/php-fpm.d/www.conf"
  1461. phpDest="/etc/php-fpm.d/www.conf"
  1462. if [ ! -f $phpConfFile ];then
  1463. comprobarError $? 4 "$phpConfFile"
  1464. fi
  1465. cp -f $phpConfFile $phpDest 2>/dev/null
  1466. comprobarError $? 305
  1467. # Configurar Permisos /var/lib/php
  1468. chown -R $webServerUser:$webServerGroup /var/lib/php/
  1469. comprobarError $? 305
  1470. fi
  1471. ;;
  1472. esac
  1473. unset phpConfFile phpDest
  1474. }
  1475. instalarLetsEncrypt() {
  1476. # Instala certbot (para certificados Let's Encrypt)
  1477. # Comprobamos si cerbot está instalado
  1478. which certbot > /dev/null 2>&1
  1479. if [ $? -ne 0 ];then
  1480. # Descargar Let's Encrypt, hacer ejecutable e instalar
  1481. curl -o ./var/certbot https://dl.eff.org/certbot-auto 2>/dev/null
  1482. comprobarError $? 401
  1483. chmod 755 ./var/certbot 2>/dev/null
  1484. comprobarError $? 401
  1485. cp -f ./var/certbot /usr/bin/certbot 2>/dev/null
  1486. comprobarError $? 401
  1487. # Configurar /etc/cron.d/certbot para renovar automáticamente los certificados
  1488. echo -en "# /etc/cron.d/certbot: certbot autorenew the certificates twice a day\n" > /etc/cron.d/certbot
  1489. echo -en "SHELL=/bin/sh\n" >> /etc/cron.d/certbot
  1490. echo -en "PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin\n\n" >> /etc/cron.d/certbot
  1491. echo -en "# Job start twice per day (4am & 2pm) in a random minute" >> /etc/cron.d/certbot
  1492. echo -en "0 4,14 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && certbot renew\n" >> /etc/cron.d/certbot
  1493. fi
  1494. }
  1495. generarCertLetsEncrypt() {
  1496. # Generar Certificados SEGUROS Let's Encrypt
  1497. dominios=""
  1498. if [ $apacheOn = true ];then
  1499. # Usamos plugin para apache
  1500. if [ $mediaWikiOn = true ];then
  1501. if [ ! -z "$aliasMediaWiki" ];then
  1502. dominios=$dominioMediaWiki$(echo "$aliasMediaWiki" | sed -e 's/ /,/g')
  1503. else
  1504. dominios=$dominioMediaWiki
  1505. fi
  1506. certbot -n --agree-tos --email "admin@$hostname" --apache --domains "$dominios" >> $logFile 2>&1
  1507. comprobarError $? 404
  1508. fi
  1509. if [ $moodleOn = true ];then
  1510. certbot -n --agree-tos --email "admin@$hostname" --apache --domains "$dominioMoodle" >> $logFile 2>&1
  1511. comprobarError $? 404
  1512. fi
  1513. elif [ $nginxOn = true ];then
  1514. # Usamos plugin para nginx
  1515. if [ $mediaWikiOn = true ];then
  1516. if [ ! -z "$aliasMediaWiki" ];then
  1517. dominios=$dominioMediaWiki$(echo "$aliasMediaWiki" | sed -e 's/ /,/g')
  1518. else
  1519. dominios=$dominioMediaWiki
  1520. fi
  1521. certbot -n --agree-tos --email "admin@$hostname" --nginx --domains "$dominios" >> $logFile 2>&1
  1522. comprobarError $? 404
  1523. fi
  1524. if [ $moodleOn = true ];then
  1525. certbot -n --agree-tos --email "admin@$hostname" --nginx --domains "$dominioMoodle" >> $logFile 2>&1
  1526. comprobarError $? 404
  1527. fi
  1528. else
  1529. comprobarError 1 404
  1530. fi
  1531. unset dominios
  1532. }
  1533. generarCertAutofirmado() {
  1534. # Genera certificados autofirmados
  1535. # Estos certificados no son seguros, pero valen para pruebas o como paso intermedio para obtener los válidos
  1536. # Uso: generarCertAutofirmado $dominio
  1537. dominio=$1
  1538. sslDir="/etc/$webServerName/ssl"
  1539. keyFile="$sslDir/$dominio.key"
  1540. reqFile="$sslDir/$dominio.csr"
  1541. certFile="$sslDir/$dominio.crt"
  1542. dhParamFile="$sslDir/dhparam.pem"
  1543. if [ ! -d "$sslDir" ];then
  1544. mkdir "$sslDir" 2>/dev/null
  1545. comprobarError $? 5 "$sslDir"
  1546. fi
  1547. # Generamos clave privada RSA de 2048 bits
  1548. openssl genrsa -out "$keyFile" 2048 >/dev/null 2>&1
  1549. comprobarError $? 402
  1550. # Generamos petición de firma
  1551. 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
  1552. comprobarError $? 402
  1553. # Autofirmados clave para 2 años (730 días)
  1554. openssl x509 -req -days 730 -in "$reqFile" -signkey "$keyFile" -out "$certFile" >/dev/null 2>&1
  1555. comprobarError $? 402
  1556. # Eliminamos petición
  1557. rm -f $reqFile
  1558. comprobarError $? 402
  1559. # Añadimos clave Diffie-Hellman al certificado
  1560. if [ -f "$dhParamFile" ];then
  1561. cat "$dhParamFile" >> $certFile
  1562. comprobarError $? 402
  1563. fi
  1564. # Cambiamos permisos
  1565. chmod 644 $certFile
  1566. comprobarError $? 402
  1567. chmod 400 $keyFile
  1568. comprobarError $? 402
  1569. unset dominio sslDir keyFile reqFile certFile dhParamFile
  1570. }
  1571. generarDHParam() {
  1572. # Genera clave de intercambio Diffie-Hellman y lo configuramos
  1573. # Esto aumenta notablemente la seguridad de SSL/TLS
  1574. sslDir="/etc/$webServerName/ssl"
  1575. dhParamFile="$sslDir/dhparam.pem"
  1576. nginxConfFile="/etc/$webServerName/nginx.conf"
  1577. if [ ! -d "$sslDir" ];then
  1578. mkdir "$sslDir" 2>/dev/null
  1579. comprobarError $? 5 "$sslDir"
  1580. fi
  1581. openssl dhparam -out "$dhParamFile" 2048 >/dev/null 2>&1
  1582. comprobarError $? 403
  1583. # Configuramos Servidor Web
  1584. if [ $nginxOn = true ];then
  1585. sed -i '/ssl_param /c\\tssl_dhparam '$dhParamFile';' $nginxConfFile
  1586. comprobarError $? 403
  1587. fi
  1588. unset sslDir dhParamFile nginxConfFile
  1589. }
  1590. habilitarServicio() {
  1591. # Arrancamos y habilitamos el servicio (con SystemD, Upstart o SystemV)
  1592. # Arrancamos el servicio
  1593. if [ $# -le 0 ];then
  1594. comprobarError 1 900
  1595. fi
  1596. # Intentamos con Systemd
  1597. which systemctl > /dev/null 2>&1
  1598. if [ $? -eq 0 ]; then
  1599. systemctl start $1 > /dev/null 2>&1
  1600. comprobarError $? 901 $1
  1601. systemctl enable $1 > /dev/null 2>&1
  1602. comprobarError $? 902 $1
  1603. else
  1604. # Intentamos con service (Upstart)
  1605. which service > /dev/null 2>&1
  1606. if [ $? -eq 0 ]; then
  1607. service $1 start > /dev/null 2>&1
  1608. comprobarError $? 901 $1
  1609. else
  1610. # Intentamos con init.d (SystemV)
  1611. /etc/init.d/$1 start > /dev/null 2>&1
  1612. comprobarError $? 901 $1
  1613. fi
  1614. # Intentamos habilitar en el arranque (Upstart)
  1615. which update-rc.d > /dev/null 2>&1
  1616. if [ $? -eq 0 ];then
  1617. update-rc.d $1 enable
  1618. comprobarError $? 902 $1
  1619. else
  1620. # Intentamos habilitar en el arranque (SystemV)
  1621. which chkconfig > /dev/null 2>&1
  1622. if [ $? -eq 0 ];then
  1623. chkconfig $1 on
  1624. comprobarError $? 902 $1
  1625. else
  1626. comprobarError 1 902 $1
  1627. fi
  1628. fi
  1629. fi
  1630. }
  1631. deshabilitarServicio() {
  1632. # Paramos y deshabilitamos el servicio (con SystemD, Upstart o SystemV)
  1633. # Paramos el servicio
  1634. if [ $# -le 0 ];then
  1635. comprobarError 1 903
  1636. fi
  1637. # Intentamos con Systemd
  1638. which systemctl > /dev/null 2>&1
  1639. if [ $? -eq 0 ]; then
  1640. systemctl stop $1 > /dev/null 2>&1
  1641. comprobarError $? 904 $1
  1642. systemctl disable $1 > /dev/null 2>&1
  1643. comprobarError $? 905 $1
  1644. else
  1645. # Intentamos con service (Upstart)
  1646. which service > /dev/null 2>&1
  1647. if [ $? -eq 0 ]; then
  1648. service $1 stop > /dev/null 2>&1
  1649. comprobarError $? 904 $1
  1650. else
  1651. # Intentamos con init.d (SystemV)
  1652. /etc/init.d/$1 stop > /dev/null 2>&1
  1653. comprobarError $? 904 $1
  1654. fi
  1655. # Intentamos deshabilitar en el arranque (Upstart)
  1656. which update-rc.d > /dev/null 2>&1
  1657. if [ $? -eq 0 ];then
  1658. update-rc.d $1 disable
  1659. comprobarError $? 905 $1
  1660. else
  1661. # Intentamos deshabilitar en el arranque (SystemV)
  1662. which chkconfig > /dev/null 2>&1
  1663. if [ $? -eq 0 ];then
  1664. chkconfig $1 off
  1665. comprobarError $? 905 $1
  1666. else
  1667. comprobarError 1 905 $1
  1668. fi
  1669. fi
  1670. fi
  1671. }
  1672. recargarServicio() {
  1673. # Recargamos el servicio (con SystemD, Upstart o SystemV)
  1674. # Recargamos el servicio
  1675. if [ $# -le 0 ];then
  1676. comprobarError 1 912
  1677. fi
  1678. # Intentamos con Systemd
  1679. which systemctl > /dev/null 2>&1
  1680. if [ $? -eq 0 ]; then
  1681. systemctl reload $1 > /dev/null 2>&1
  1682. comprobarError $? 913 $1
  1683. else
  1684. # Intentamos con service (Upstart)
  1685. which service > /dev/null 2>&1
  1686. if [ $? -eq 0 ]; then
  1687. service $1 reload > /dev/null 2>&1
  1688. comprobarError $? 913 $1
  1689. else
  1690. # Intentamos con init.d (SystemV)
  1691. /etc/init.d/$1 reload > /dev/null 2>&1
  1692. comprobarError $? 913 $1
  1693. fi
  1694. fi
  1695. }
  1696. configurarCortafuegos() {
  1697. # Configuramos cortafuegos (añadir reglas y encender)
  1698. # Comprobamos si estamos usando SSH
  1699. esSSH $PPID
  1700. case $ID in
  1701. debian|ubuntu)
  1702. ufw allow 80/tcp >> $logFile 2>&1
  1703. comprobarError $? 906 "80/tcp"
  1704. if [ $sshControl = true ];then
  1705. ufw allow 22/tcp >> $logFile 2>&1
  1706. comprobarError $? 906 "22/tcp"
  1707. fi
  1708. if [ $sslOn = true ];then
  1709. ufw allow 443/tcp >> $logFile 2>&1
  1710. comprobarError $? 906 "443/tcp"
  1711. fi
  1712. ufw --force enable >> $logFile 2>&1
  1713. comprobarError $? 907
  1714. ;;
  1715. centos|fedora)
  1716. firewall-cmd --add-port=80/tcp >> $logFile 2>&1
  1717. comprobarError $? 906 "80/tcp"
  1718. if [ $sshControl = true ];then
  1719. firewall-cmd --add-port=22/tcp >> $logFile 2>&1
  1720. comprobarError $? 906 "22/tcp"
  1721. fi
  1722. if [ $sslOn = true ];then
  1723. firewall-cmd --add-port=443/tcp >> $logFile 2>&1
  1724. comprobarError $? 906 "443/tcp"
  1725. fi
  1726. firewall-cmd --runtime-to-permanent >> $logFile 2>&1
  1727. comprobarError $? 907
  1728. habilitarServicio firewalld >> $logFile 2>&1
  1729. comprobarError $? 907
  1730. ;;
  1731. esac
  1732. unset sshControl
  1733. }
  1734. esSSH() {
  1735. # Comprobamos si nuestro terminal usa SSH
  1736. p=${1:-$PPID}
  1737. #read pid name x ppid y < <( cat /proc/$p/stat )
  1738. read pid name ppid < <( ps -o pid= -o comm= -o ppid= -p $p)
  1739. [[ "$name" =~ sshd ]] && { sshControl=true; return 0; }
  1740. [ "$ppid" -le 1 ] && { sshControl=false; return 1; }
  1741. esSSH $ppid
  1742. }
  1743. descargarMediaWiki() {
  1744. # Descargar la versión 1.31.0 de MediaWiki
  1745. if [ ! -d ./var ];then
  1746. comprobarError 1 5 "./var"
  1747. fi
  1748. curl "https://releases.wikimedia.org/mediawiki/1.31/mediawiki-1.31.0.tar.gz" 2>/dev/null | tar -xz -C "./var/"
  1749. comprobarError $? 501
  1750. }
  1751. configurarMediaWiki() {
  1752. # Configuramos MediaWiki
  1753. if [ ! -f /var/www/$dominioMediaWiki/LocalSettings.php ];then
  1754. # Copiamos archivos
  1755. cp -fR ./var/mediawiki-1.31.0/ /var/www/$dominioMediaWiki
  1756. comprobarError $? 502
  1757. # Configuramos LocalSettings.php (y crea la base de datos por nosotros)
  1758. nombreDBMW=$(echo $dominioMediaWiki | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1759. userDBMW=$(echo "mediawiki_user" | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1760. 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
  1761. comprobarError $? 502
  1762. # Configuraciones adicionales
  1763. sed -i '/$wgLanguageCode =/c\$wgLanguageCode = "es";' /var/www/$dominioMediaWiki/LocalSettings.php
  1764. comprobarError $? 502
  1765. sed -i '/$wgEnableEmail =/c\$wgEnableEmail = false;' /var/www/$dominioMediaWiki/LocalSettings.php
  1766. comprobarError $? 502
  1767. sed -i '/$wgEnableUploads =/c\$wgEnableUploads = true;' /var/www/$dominioMediaWiki/LocalSettings.php
  1768. comprobarError $? 502
  1769. echo -en "\$wgArticlePath = \"/wiki/\$1\";\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1770. echo -en "\$wgUsePathInfo = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1771. echo -en "\$wgGroupPermissions['*']['createaccount'] = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1772. echo -en "\$wgGroupPermissions['*']['edit'] = false;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1773. echo -en "\$wgGroupPermissions['*']['read'] = true;\n" >> /var/www/$dominioMediaWiki/LocalSettings.php
  1774. # Actualizamos permisos
  1775. chown -R $webServerUser:$webServerGroup /var/www/$dominioMediaWiki
  1776. comprobarError $? 502
  1777. # Configuramos VirtualHost
  1778. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1779. virtualHost="./etc/apache2/sites-available/mediawiki.conf"
  1780. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1781. virtualHost="./etc/nginx/sites-available/mediawiki.conf"
  1782. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1783. virtualHost="./etc/apache2/sites-available/mediawiki-ssl.conf"
  1784. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1785. virtualHost="./etc/nginx/sites-available/mediawiki-ssl.conf"
  1786. else
  1787. comprobarError 1 502
  1788. fi
  1789. if [ ! -f $virtualHost ];then
  1790. comprobarError $? 502
  1791. fi
  1792. instalarVirtualHost "/var/www/$dominioMediaWiki" $virtualHost $dominioMediaWiki $aliasMediaWiki
  1793. unset virtualHost
  1794. else
  1795. comprobarError 1 503 $dominioMediaWiki
  1796. fi
  1797. }
  1798. descargarMoodle() {
  1799. # Descargar la versión 1.31.0 de MediaWiki
  1800. if [ ! -d ./var ];then
  1801. comprobarError 1 5 "./var"
  1802. fi
  1803. curl "https://download.moodle.org/download.php/direct/stable35/moodle-latest-35.tgz" 2>/dev/null | tar -xz -C "./var/"
  1804. comprobarError $? 501
  1805. #echo -en " OK.\n" | tee -a $logFile
  1806. }
  1807. configurarMoodle() {
  1808. # Configurar Moodle
  1809. if [ ! -f /var/www/$dominioMoodle/config.php ];then
  1810. # Copiamos archivos
  1811. cp -Rf ./var/moodle/ /var/www/$dominioMoodle
  1812. comprobarError $? 602
  1813. # Crear carperta de datos (no online)
  1814. if [ ! -d /var/www/moodledata ];then
  1815. mkdir /var/www/moodledata 2>/dev/null
  1816. comprobarError $? 602
  1817. fi
  1818. #Actualizamos permisos
  1819. perm=$(stat -c %a /var/www/moodledata)
  1820. if [ $perm -ne 777 ];then
  1821. chmod -R 777 /var/www/moodledata 2>/dev/null
  1822. comprobarError $? 602
  1823. fi
  1824. perm=$(stat -c %U /var/www/moodledata)
  1825. if [ $perm != "$webServerUser" ];then
  1826. chown -R $webServerUser:$webServerGroup /var/www/moodledata 2>/dev/null
  1827. comprobarError $? 602
  1828. fi
  1829. unset perm
  1830. # Creamos Base de Datos
  1831. nombreDBMo=$(echo $dominioMoodle | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1832. userDBMo=$(echo "moodle_user" | sed -e 's/\./_/g' | sed -e 's/-/_/g')
  1833. crearDBMoodle
  1834. # Configuramos e instalamos Moodle
  1835. if [ $sslOn = true ];then
  1836. wwwroot="https://$dominioMoodle"
  1837. else
  1838. wwwroot="http://$dominioMoodle"
  1839. fi
  1840. 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
  1841. comprobarError $? 602
  1842. # Actualizamos permisos
  1843. chown -R $webServerUser:$webServerGroup /var/www/$dominioMoodle /var/www/moodledata
  1844. # Configurar SE-Linux (RHEL)
  1845. case $ID in
  1846. centos|fedora)
  1847. configurarSELinux
  1848. ;;
  1849. esac
  1850. # Configuramos VirtualHost
  1851. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1852. virtualHost="./etc/apache2/sites-available/moodle.conf"
  1853. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1854. virtualHost="./etc/nginx/sites-available/moodle.conf"
  1855. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1856. virtualHost="./etc/apache2/sites-available/moodle-ssl.conf"
  1857. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1858. virtualHost="./etc/nginx/sites-available/moodle-ssl.conf"
  1859. else
  1860. comprobarError 1 602
  1861. fi
  1862. instalarVirtualHost "/var/www/$dominioMoodle" $virtualHost $dominioMoodle
  1863. unset virtualHost wwwroot
  1864. else
  1865. comprobarError 1 603 $dominioMoodle
  1866. fi
  1867. }
  1868. crearDBMoodle() {
  1869. # Crear base de datos para Moodle
  1870. dbDir="./etc/db"
  1871. if [ ! -d $dbDir ];then
  1872. mkdir $dbDir 2>/dev/null
  1873. comprobarError $? 603
  1874. fi
  1875. dbFile=$dbDir"/moodle.sql"
  1876. echo -en "CREATE DATABASE IF NOT EXISTS $nombreDBMo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;\n" > $dbFile
  1877. echo -en "GRANT ALL PRIVILEGES ON $nombreDBMo.* TO '$userDBMo'@'localhost' IDENTIFIED BY '$sqlPasswd';\n" >> $dbFile
  1878. mysql -u root --password=$sqlPasswd < $dbFile > /dev/null 2>&1
  1879. control=$?
  1880. rm -f $dbFile 2>/dev/null
  1881. comprobarError $? 603
  1882. comprobarError $control 603
  1883. unset control dbFile dbDir
  1884. }
  1885. configurarSELinux() {
  1886. # Configurar SELinux
  1887. which semanage >/dev/null 2>&1
  1888. if [ $? -ne 0 ];then
  1889. case $ID in
  1890. centos)
  1891. result=$(yum -y install policycoreutils-python 2>&1)
  1892. comprobarError $? 605 $result
  1893. ;;
  1894. fedora)
  1895. result=$(yum -y install policycoreutils-python-utils 2>&1)
  1896. comprobarError $? 605 $result
  1897. ;;
  1898. *)
  1899. comprobarError 1 604
  1900. ;;
  1901. esac
  1902. fi
  1903. semanage fcontext -a -t httpd_sys_rw_content_t "/var/www/moodledata(/.*)?" > /dev/null 2>&1
  1904. #comprobarError $? 604
  1905. restorecon -R /var/www/ > /dev/null 2>&1
  1906. comprobarError $? 604
  1907. }
  1908. instalarPHPInfo() {
  1909. # Instalar fichero info.php y su VirtualHost
  1910. if [ ! -f /etc/$webServerName/sites-enabled/phpinfo.conf ];then
  1911. infoFile="./var/www/info.php"
  1912. if [ ! -f $infoFile ];then
  1913. comprobarError 1 4 "$infoFile"
  1914. fi
  1915. mkdir /var/www/localhost 2>/dev/null
  1916. comprobarError $? 106
  1917. cp -f $infoFile /var/www/localhost/ 2>/dev/null
  1918. comprobarError $? 106
  1919. chown -R $webServerUser:$webServerGroup /var/www/localhost 2>/dev/null
  1920. comprobarError $? 106
  1921. unset infoFile
  1922. # Instalar VirtualHost
  1923. if [ $apacheOn = true ] && [ $sslOn = false ];then
  1924. virtualHost="./etc/apache2/sites-available/phpinfo.conf"
  1925. elif [ $nginxOn = true ] && [ $sslOn = false ];then
  1926. virtualHost="./etc/nginx/sites-available/phpinfo.conf"
  1927. elif [ $apacheOn = true ] && [ $sslOn = true ];then
  1928. virtualHost="./etc/apache2/sites-available/phpinfo-ssl.conf"
  1929. elif [ $nginxOn = true ] && [ $sslOn = true ];then
  1930. virtualHost="./etc/nginx/sites-available/phpinfo-ssl.conf"
  1931. else
  1932. comprobarError 1 106
  1933. fi
  1934. instalarVirtualHost "/var/www/localhost" $virtualHost "localhost"
  1935. unset virtualHost
  1936. return 0
  1937. else
  1938. return 1
  1939. fi
  1940. }
  1941. configurarBackups() {
  1942. # Instala backup-server y lo configura
  1943. letsEncryptCode=""
  1944. if [ ! -d "./var" ];then
  1945. comprobarError 1 5 "./var"
  1946. fi
  1947. which backup-server > /dev/null 2>&1
  1948. if [ $? -ne 0 ];then
  1949. # Descargamos backup-server
  1950. curl "https://code.castanedo.es/guzman/backup-server/archive/2.1.tar.gz" 2>/dev/null | tar -xz -C "./var/"
  1951. if [ $? -ne 0 ];then
  1952. comprobarError 1 701
  1953. return 1
  1954. fi
  1955. # Copiamos backup-server y logrotate
  1956. cp -f ./var/backup-server/backup-server /usr/bin/backup-server
  1957. if [ $? -ne 0 ];then
  1958. comprobarError 1 701
  1959. return 1
  1960. fi
  1961. cp -f ./var/backup-server/scripts/logrotate.d/backup-server /etc/logrotate.d/backup-server
  1962. if [ $? -ne 0 ];then
  1963. comprobarError 1 701
  1964. return 1
  1965. fi
  1966. # Creamos carpeta de backups
  1967. if [ ! -d /var/backup ];then
  1968. mkdir /var/backup 2>/dev/null
  1969. comprobarError $? 5 "/var/backup"
  1970. fi
  1971. # Configuramos cron.d
  1972. if [ $letsEncryptOn = false ];then
  1973. letsEncryptCode="--no-letsencrypt "
  1974. fi
  1975. echo -en "# /etc/cron.d/backup-server: crontab for $hostname\n\n" > /etc/cron.d/backup-server
  1976. echo -en "# Backup every day at 4:00 am\n" >> /etc/cron.d/backup-server
  1977. 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
  1978. comprobarError $? 701
  1979. fi
  1980. unset letsEncryptCode
  1981. }
  1982. # Comprobación del sistema e inicialización
  1983. cd $(dirname $0) > /dev/null 2>&1
  1984. inicializarVariables
  1985. OSInfo
  1986. # Leer opciones
  1987. which getopt >/dev/null 2>&1
  1988. if [ $? -eq 0 ] && [ $# -ne 0 ];then
  1989. # Configuración por defecto (opciones de Express)
  1990. instalacionExpress
  1991. # Leer opciones
  1992. 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) -- "$@")
  1993. eval set -- $TEMP
  1994. unset TEMP
  1995. while true; do
  1996. case $1 in
  1997. -h|--help)
  1998. ayuda
  1999. exit 0
  2000. ;;
  2001. -d|--dominio|--fqdn)
  2002. hostname=$2
  2003. shift 2
  2004. ;;
  2005. --lamp)
  2006. apacheOn=true
  2007. nginxOn=false
  2008. shift
  2009. ;;
  2010. --lemp)
  2011. nginxOn=true
  2012. apacheOn=false
  2013. shift
  2014. ;;
  2015. --mariadb)
  2016. case $ID in
  2017. debian)
  2018. mySQLOn=true
  2019. mariaDBOn=false
  2020. dbType="mariadb"
  2021. ;;
  2022. ubuntu|centos|fedora)
  2023. mariaDBOn=true
  2024. mySQLOn=false
  2025. dbType="mariadb"
  2026. esac
  2027. shift
  2028. ;;
  2029. --mysql)
  2030. if [ $ID = "ubuntu" ] && [ $VERSION = "18.04" ];then
  2031. mySQLOn=true
  2032. mariaDBOn=false
  2033. dbType="mysqli"
  2034. else
  2035. # No está soportado
  2036. ayuda
  2037. comprobarError 1 205
  2038. fi
  2039. shift
  2040. ;;
  2041. --password-sql)
  2042. sqlPasswd=$2
  2043. shift 2
  2044. ;;
  2045. --max-upload-size)
  2046. maxUpload=$2
  2047. shift 2
  2048. ;;
  2049. --lets-encrypt)
  2050. sslOn=true
  2051. letsEncryptOn=true
  2052. shift
  2053. ;;
  2054. --auto-firmados)
  2055. sslOn=true
  2056. letsEncryptOn=false
  2057. shift
  2058. ;;
  2059. --no-https|--no-ssl)
  2060. sslOn=false
  2061. letsEncrypt=false
  2062. shift
  2063. ;;
  2064. --media-wiki)
  2065. mediaWikiOn=true
  2066. shift
  2067. ;;
  2068. --no-media-wiki)
  2069. mediaWikiOn=false
  2070. shift
  2071. ;;
  2072. --nombre-mw)
  2073. nombreMediaWiki=$2
  2074. shift 2
  2075. ;;
  2076. --dominios-mw)
  2077. dominioMediaWiki=$2
  2078. cont=1
  2079. serverName=""
  2080. aliasMediaWiki=""
  2081. for dominio in $dominioMediaWiki;do
  2082. if [ $cont -eq 1 ];then
  2083. # Dominio Principal (ServerName)
  2084. serverName=$dominio
  2085. else
  2086. # Dominios Secundarios (ServerAlias)
  2087. aliasMediaWiki=$aliasMediaWiki" "$dominio
  2088. fi
  2089. cont=$((cont + 1))
  2090. done
  2091. dominioMediaWiki=$serverName
  2092. unset cont serverName dominio
  2093. shift 2
  2094. ;;
  2095. --password-mw)
  2096. passwdMediaWiki=$2
  2097. shift 2
  2098. ;;
  2099. --moodle)
  2100. moodleOn=true
  2101. shift
  2102. ;;
  2103. --no-moodle)
  2104. moodleOn=false
  2105. shift
  2106. ;;
  2107. --nombre-mo)
  2108. nombreMoodle=$2
  2109. shift 2
  2110. ;;
  2111. --nombre-corto-mo)
  2112. nombreCortoMoodle=$(echo $2 | cut -d ' ' -f 1)
  2113. shift 2
  2114. ;;
  2115. --dominio-mo)
  2116. dominioMoodle=$2
  2117. cont=1
  2118. serverName=""
  2119. aliasMoodle=""
  2120. for dominio in $dominioMoodle;do
  2121. if [ $cont -eq 1 ];then
  2122. # Dominio Principal (ServerName)
  2123. serverName=$dominio
  2124. else
  2125. # Dominios Secundarios (ServerAlias)
  2126. aliasMoodle=$aliasMoodle" "$dominio
  2127. fi
  2128. cont=$((cont + 1))
  2129. done
  2130. dominioMoodle=$serverName
  2131. unset cont ServerName dominio aliasMoodle
  2132. shift 2
  2133. ;;
  2134. --password-mo)
  2135. passwdMoodle=$2
  2136. shift 2
  2137. ;;
  2138. --php-info)
  2139. infoPHPOn=true
  2140. shift
  2141. ;;
  2142. --no-php-info)
  2143. infoPHPOn=false
  2144. shift
  2145. ;;
  2146. --backup)
  2147. backupOn=true
  2148. shift
  2149. ;;
  2150. --no-backup)
  2151. backupOn=false
  2152. shift
  2153. ;;
  2154. --)
  2155. #Ultimo
  2156. shift
  2157. break
  2158. ;;
  2159. *)
  2160. # Inesperado
  2161. ayuda
  2162. comprobarError 1 10 $1
  2163. ;;
  2164. esac
  2165. done
  2166. # Comprobar si los datos son correctos
  2167. if [ -z "$hostname" ];then
  2168. ayuda
  2169. comprobarError 1 11
  2170. else
  2171. hostnamectl set-hostname $hostname >/dev/null 2>&1
  2172. fi
  2173. if [ -z "$sqlPasswd" ];then
  2174. ayuda
  2175. comprobarError 1 12
  2176. fi
  2177. if [ -z "$maxUpload" ];then
  2178. ayuda
  2179. comprobarError 1 13
  2180. fi
  2181. if [ $mediaWikiOn = true ];then
  2182. if [ -z "$nombreMediaWiki" ];then
  2183. ayuda
  2184. comprobarError 1 14
  2185. fi
  2186. if [ -z "$dominioMediaWiki" ];then
  2187. ayuda
  2188. comprobarError 1 15
  2189. fi
  2190. if [ -z "$passwdMediaWiki" ];then
  2191. ayuda
  2192. comprobarError 1 16
  2193. fi
  2194. fi
  2195. if [ $moodleOn = true ];then
  2196. if [ -z "$nombreMoodle" ];then
  2197. ayuda
  2198. comprobarError 1 17
  2199. fi
  2200. if [ -z "$nombreCortoMoodle" ];then
  2201. ayuda
  2202. comprobarError 1 18
  2203. fi
  2204. if [ -z "$dominioMoodle" ];then
  2205. ayuda
  2206. comprobarError 1 19
  2207. fi
  2208. if [ -z "$passwdMoodle" ];then
  2209. ayuda
  2210. comprobarError 1 20
  2211. fi
  2212. fi
  2213. # Comprobaciones
  2214. comprobarRoot
  2215. comprobarDependencias
  2216. else
  2217. # Preguntas interactivas
  2218. # Comprobaciones
  2219. comprobarRoot
  2220. comprobarDependencias
  2221. # Bienvenida
  2222. mostrarBienvenida
  2223. # Selección de componentes (express vs avanzada)
  2224. mostrarExpress
  2225. fi
  2226. # Instalación Servidor Web
  2227. horaInicial=$(date +"%s")
  2228. if [ $apacheOn = true ]; then
  2229. echo -en "Instalando Servidor Web Apache..." | tee -a $logFile
  2230. instalarApache
  2231. echo -en " OK.\n" | tee -a $logFile
  2232. elif [ $nginxOn = true ]; then
  2233. echo -en "Instalando Servidor Web Nginx..." | tee -a $logFile
  2234. instalarNginx
  2235. echo -en " OK.\n" | tee -a $logFile
  2236. fi
  2237. # Instalación Base de Datos
  2238. if [ $mySQLOn = true ]; then
  2239. echo -en "Instalando Base de Datos MySQL..." | tee -a $logFile
  2240. instalarMySQL
  2241. echo -en " OK.\n" | tee -a $logFile
  2242. elif [ $mariaDBOn = true ]; then
  2243. echo -en "Instalando Base de Datos MariaDB..." | tee -a $logFile
  2244. instalarMariaDB
  2245. echo -en " OK.\n" | tee -a $logFile
  2246. fi
  2247. # Instalación PHP-7
  2248. if [ $phpOn = true ]; then
  2249. echo -en "Instalando PHP-7..." | tee -a $logFile
  2250. instalarPHP
  2251. echo -en " OK.\n" | tee -a $logFile
  2252. fi
  2253. # Instalación Let's Encrypt
  2254. if [ $letsEncryptOn = true ];then
  2255. echo -en "Instalando Let's Encrypt..." | tee -a $logfile
  2256. instalarLetsEncrypt
  2257. echo -en " OK.\n" | tee -a $logFile
  2258. fi
  2259. # Configuración Web Server
  2260. if [ $apacheOn = true ];then
  2261. echo -en "Configurando Servidor Web Apache..." | tee -a $logFile
  2262. configurarApache
  2263. echo -en " OK.\n" | tee -a $logFile
  2264. elif [ $nginxOn = true ]; then
  2265. echo -en "Configurando Servidor Web Nginx..." | tee -a $logFile
  2266. configurarNginx
  2267. echo -en " OK.\n" | tee -a $logFile
  2268. fi
  2269. # Configuración Database (Configurar Ficheros, Arrancar Base de Datos, establecer contraseña y configuración segura)
  2270. if [ $mySQLOn = true ] || [ $mariaDBOn = true ];then
  2271. echo -en "Configurando Base de Datos..." | tee -a $logFile
  2272. configurarSQL
  2273. echo -en " OK.\n" | tee -a $logFile
  2274. habilitarServicio "$sqlServerName"
  2275. echo -en "Estableciendo contraseña de la Base de Datos..." | tee -a $logFile
  2276. establecerSQLPasswd
  2277. echo -en " OK.\n" | tee -a $logFile
  2278. fi
  2279. # Configuración PHP (cgi.fix_pathinfo=0 y Configurar máximo de subida de archivos)
  2280. if [ $phpOn = true ];then
  2281. echo -en "Configurando PHP-7..." | tee -a $logFile
  2282. configurarPHP
  2283. echo -en " OK.\n" | tee -a $logFile
  2284. fi
  2285. # Configuración SSL/TLS
  2286. # Generar certificados auto-firmados
  2287. if [ $sslOn = true ];then
  2288. echo -en "Generando claves de intercambio Diffie-Hellman (puede llevar un largo tiempo)..." | tee -a $logFile
  2289. generarDHParam
  2290. echo -en " OK.\n" | tee -a $logFile
  2291. echo -en "Generando Certificados Auto-Firmados..." | tee -a $logFile
  2292. if [ $mediaWikiOn = true ];then
  2293. generarCertAutofirmado $dominioMediaWiki
  2294. fi
  2295. if [ $moodleOn = true ];then
  2296. generarCertAutofirmado $dominioMoodle
  2297. fi
  2298. if [ $infoPHPOn = true ];then
  2299. generarCertAutofirmado "localhost"
  2300. fi
  2301. echo -en " OK.\n" | tee -a $logFile
  2302. fi
  2303. # Arrancar y habilitar todos los servicios (SystemD, Service o SystemV)
  2304. echo -en "Habilitando todos los servicios..." | tee -a $logFile
  2305. if [ $apacheOn = true ] || [ $nginxOn = true ];then
  2306. habilitarServicio $webServerName
  2307. fi
  2308. if [ $nginxOn = true ] && [ $phpOn = true ];then
  2309. habilitarServicio $phpFPMName
  2310. fi
  2311. echo -en " OK.\n" | tee -a $logFile
  2312. # Instalar MediaWiki
  2313. if [ $mediaWikiOn = true ]; then
  2314. # Descargar MediaWiki
  2315. echo -en "Descargando MediaWiki-1.31.0..." | tee -a $logFile
  2316. descargarMediaWiki
  2317. echo -en " OK.\n" | tee -a $logFile
  2318. # Configurar MediWiki
  2319. echo -en "Configurando MediaWiki..." | tee -a $logFile
  2320. configurarMediaWiki
  2321. echo -en " OK.\n" | tee -a $logFile
  2322. fi
  2323. # Instalar Moodle
  2324. if [ $moodleOn = true ]; then
  2325. # Descargar Moodle
  2326. echo -en "Descargando Moodle-3.5.1..." | tee -a $logFile
  2327. descargarMoodle
  2328. echo -en " OK.\n" | tee -a $logFile
  2329. # Configuración Moodle
  2330. echo -en "Configurando Moodle (puede llevar un tiempo largo)..." | tee -a $logFile
  2331. configurarMoodle
  2332. echo -en " OK.\n" | tee -a $logFile
  2333. fi
  2334. # Instalar info.php
  2335. if [ $infoPHPOn = true ];then
  2336. echo -en "Configurando 'info.php'..." | tee -a $logFile
  2337. instalarPHPInfo
  2338. if [ $? -eq 0 ];then
  2339. echo -en " OK.\n" | tee -a $logFile
  2340. else
  2341. echo -en " Ya se encuentra configurado.\n" | tee -a $logFile
  2342. fi
  2343. fi
  2344. # Añadir reglas del cortafuegos
  2345. echo -en "Configurando Cortafuegos..." | tee -a $logFile
  2346. configurarCortafuegos
  2347. echo -en " OK.\n" | tee -a $logFile
  2348. # Generar certificados Let's Encrypt
  2349. if [ $letsEncryptOn = true ];then
  2350. echo -en "Generando Certificados Válidos Let's Encrypt..." | tee -a $logFile
  2351. generarCertLetsEncrypt
  2352. echo -en " OK.\n" | tee -a $logFile
  2353. fi
  2354. # Configurar Backup
  2355. if [ $backupOn = true ]; then
  2356. echo -en "Configurando Backup Automático..." | tee -a $logFile
  2357. configurarBackups
  2358. echo -en " OK.\n" | tee -a $logFile
  2359. fi
  2360. # Finalizamos
  2361. horaFinal=$(date +"%s")
  2362. echo -en "\n-------------------------------------------------------------\n" | tee -a $logFile
  2363. echo -en "\t¡INSTALACION FINALIZADA CON EXITO! \n" | tee -a $logFile
  2364. echo -en "\tDuración: "$((horaFinal-horaInicial))" seg." | tee -a $logFile
  2365. echo -en "\n-------------------------------------------------------------\n" | tee -a $logFile
  2366. echo -en " GUARDE LA CONFIGURACION EN UN LUGAR SEGURO\n"
  2367. echo -en " LE SERÁ IMPRESCINDIBLE PARA CUALQUIER CAMBIO FUTURO\n"
  2368. echo -en " Dominio: $hostname\n"
  2369. echo -en " Usuarios SQL: root\n"
  2370. echo -en " $userDBMW\n"
  2371. echo -en " $userDBMo\n"
  2372. echo -en " Contraseña SQL: $sqlPasswd\n"
  2373. if [ $mediaWikiOn = true ];then
  2374. echo -en " Nombre MediaWiki: $nombreMediaWiki\n"
  2375. echo -en " Dominios MediaWiki: $dominioMediaWiki\n"
  2376. for dominio in $aliasMediaWiki;do
  2377. echo -en " $dominio\n"
  2378. done
  2379. echo -en " Usuario MediaWiki: admin\n"
  2380. echo -en " Contraseña MediaWiki: $passwdMediaWiki\n"
  2381. fi
  2382. if [ $moodleOn = true ];then
  2383. echo -en " Nombre Moodle: $nombreMoodle\n"
  2384. echo -en " Dominio Moodle: $dominioMoodle\n"
  2385. echo -en " Usuario Moodle: admin\n"
  2386. echo -en " Contraseña Moodle: $passwdMoodle"
  2387. fi
  2388. echo -en "\n-------------------------------------------------------------\n"