install 67 KB

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