install 66 KB

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