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. VERSION=$(grep ^VERSION_ID= /etc/os-release | cut -d = -f 2 | cut -d '"' -f 2)
  312. for i in $ID; do
  313. case $i in
  314. debian)
  315. case $VERSION in
  316. 9)
  317. apacheName="apache2"
  318. nginxName="nginx"
  319. mysqlName="mysql"
  320. mariadbName="mariadb"
  321. phpFPMName="php7.0-fpm"
  322. phpDest="/etc/php/7.0/cli/php.ini"
  323. ;;
  324. *)
  325. comprobarError 1 817
  326. ;;
  327. esac
  328. break
  329. ;;
  330. ubuntu)
  331. case $VERSION in
  332. 18.04)
  333. apacheName="apache2"
  334. nginxName="nginx"
  335. mysqlName="mysql"
  336. mariadbName="mariadb"
  337. phpFPMName="php7.2-fpm"
  338. phpDest="/etc/php/7.2/cli/php.ini"
  339. ;;
  340. 16.04)
  341. apacheName="apache2"
  342. nginxName="nginx"
  343. mysqlName="mysql"
  344. mariadbName="mysql"
  345. phpFPMName="php7.0-fpm"
  346. phpDest="/etc/php/7.0/cli/php.ini"
  347. ;;
  348. *)
  349. comprobarError 1 817
  350. ;;
  351. esac
  352. break
  353. ;;
  354. rhel|centos)
  355. case $VERSION in
  356. 7)
  357. apacheName="httpd"
  358. nginxName="nginx"
  359. mysqlName=""
  360. mariadbName="mariadb"
  361. phpFPMName="php-fpm"
  362. ;;
  363. *)
  364. comprobarError 1 817
  365. ;;
  366. esac
  367. break
  368. ;;
  369. fedora)
  370. case $VERSION in
  371. 28)
  372. apacheName="httpd"
  373. nginxName="nginx"
  374. mysqlName=""
  375. mariadbName="mariadb"
  376. phpFPMName="php-fpm"
  377. ;;
  378. *)
  379. comprobarError 1 817
  380. ;;
  381. esac
  382. break
  383. ;;
  384. *)
  385. comprobarError 1 817
  386. ;;
  387. esac
  388. done
  389. else
  390. # Other Linux (No Soportado)
  391. comprobarError 1 817
  392. fi
  393. else
  394. # UNIX, OS X, ... (No Soportado)
  395. comprobarError 1 817
  396. fi
  397. echo -en " $OS $DIST $REV\n" >> $logFile
  398. HDInfo=$(df -h | head -1)"\n"$(df -h | grep ^/dev/sd)"\n"$(df -h | grep ^/dev/mapper)
  399. echo -en "$HDInfo\n" >> $logFile
  400. }
  401. comprobarRoot() {
  402. # Comprueba si se está ejecutando con privilegios de root
  403. comprobarError $(id -u) 800
  404. }
  405. comprobarDependencias() {
  406. # Comprueba si están instalados todos los programas necesarios.
  407. # En la mayoría de los casos, trata de instalarlos.
  408. # Comprobamos whiptail
  409. which whiptail > /dev/null 2>&1
  410. comprobarError $? 801
  411. # Comprobamos hostnamectl
  412. which hostnamectl > /dev/null 2>&1
  413. comprobarError $? 802
  414. which find > /dev/null 2>&1
  415. comprobarError $? 816
  416. case $ID in
  417. debian|ubuntu)
  418. # Comprobamos apt-get
  419. which apt-get > /dev/null 2>&1
  420. comprobarError $? 803
  421. # Actualizamos base de datos del repositorio
  422. echo -en "Actualizando repositorio APT..." | tee -a $logFile
  423. result=$(apt-get -q -y update 2>&1)
  424. comprobarError $? 805 $result
  425. echo -en " OK.\n" | tee -a $logFile
  426. # Comprobamos Firewall (ufw)
  427. which ufw > /dev/null 2>&1
  428. if [ $? -ne 0 ];then
  429. result=$(apt-get -q -y install ufw 2>&1)
  430. comprobarError $? 806 $result
  431. fi
  432. # Comprobamos tput
  433. which tput > /dev/null 2>&1
  434. if [ $? -ne 0 ];then
  435. result=$(apt-get -q -y install ncurses-bin 2>&1)
  436. comprobarError $? 808 $result
  437. fi
  438. # Comprobar sed
  439. which sed > /dev/null 2>&1
  440. if [ $? -ne 0 ];then
  441. result=$(apt-get -q -y install sed 2>&1)
  442. comprobarError $? 809 $result
  443. fi
  444. # Comprobar curl
  445. which curl > /dev/null 2>&1
  446. if [ $? -ne 0 ];then
  447. result=$(apt-get -q -y install curl 2>&1)
  448. comprobarError $? 810 $result
  449. fi
  450. # Comprobamos tar, gzip, bzip2 y xz
  451. which tar > /dev/null 2>&1
  452. if [ $? -ne 0 ];then
  453. result=$(apt-get -q -y install tar 2>&1)
  454. comprobarError $? 811 $result
  455. fi
  456. which gzip > /dev/null 2>&1
  457. if [ $? -ne 0 ];then
  458. result=$(apt-get -q -y install gzip 2>&1)
  459. comprobarError $? 812 $result
  460. fi
  461. which bzip2 > /dev/null 2>&1
  462. if [ $? -ne 0 ];then
  463. result=$(apt-get -q -y install bzip2 2>&1)
  464. comprobarError $? 813 $result
  465. fi
  466. which xz > /dev/null 2>&1
  467. if [ $? -ne 0 ];then
  468. result=$(apt-get -q -y install xz-utils 2>&1)
  469. comprobarError $? 814 $result
  470. fi
  471. which openssl > /dev/null 2>&1
  472. if [ $? -ne 0 ];then
  473. result=$(apt-get -q -y install openssl 2>&1)
  474. comprobarError $? 815 $result
  475. fi
  476. ;;
  477. centos|fedora)
  478. # Comprobamos yum
  479. which yum > /dev/null 2>&1
  480. comprobarError $? 804
  481. # Actualizamos base de datos del repositorio
  482. echo -en "Actualizando repositorio YUM..." | tee -a $logFile
  483. result=$(yum -y makecache 2>&1)
  484. comprobarError $? 805 $result
  485. echo -en " OK.\n" | tee -a $logFile
  486. # Comprobamos Firewall (firewall-cmd)
  487. which firewall-cmd > /dev/null 2>&1
  488. comprobarError $? 807
  489. # Comprobamos tput
  490. which tput > /dev/null 2>&1
  491. if [ $? -ne 0 ];then
  492. result=$(yum -y install ncurses 2>&1)
  493. comprobarError $? 808 $result
  494. fi
  495. # Comprobar sed
  496. which sed > /dev/null 2>&1
  497. if [ $? -ne 0 ];then
  498. result=$(yum -y install sed 2>&1)
  499. comprobarError $? 809 $result
  500. fi
  501. # Comprobar curl
  502. which curl > /dev/null 2>&1
  503. if [ $? -ne 0 ];then
  504. result=$(yum -y install curl 2>&1)
  505. comprobarError $? 810 $result
  506. fi
  507. # Comprobamos tar, gzip, bzip2 y xz
  508. which tar > /dev/null 2>&1
  509. if [ $? -ne 0 ];then
  510. result=$(yum -y install tar 2>&1)
  511. comprobarError $? 811 $result
  512. fi
  513. which gzip > /dev/null 2>&1
  514. if [ $? -ne 0 ];then
  515. result=$(yum -y install gzip 2>&1)
  516. comprobarError $? 812 $result
  517. fi
  518. which bzip2 > /dev/null 2>&1
  519. if [ $? -ne 0 ];then
  520. result=$(yum -y install bzip2 2>&1)
  521. comprobarError $? 813 $result
  522. fi
  523. which xz > /dev/null 2>&1
  524. if [ $? -ne 0 ];then
  525. result=$(yum -y install xz 2>&1)
  526. comprobarError $? 814 $result
  527. fi
  528. which openssl > /dev/null 2>&1
  529. if [ $? -ne 0 ];then
  530. result=$(yum -y install openssl 2>&1)
  531. comprobarError $? 815 $result
  532. fi
  533. ;;
  534. esac
  535. }
  536. inicializarVariables() {
  537. # Inicializa las variables que necesitan de un estado previo
  538. apacheOn=false
  539. nginxOn=false
  540. mySQLOn=false
  541. mariaDBOn=false
  542. phpOn=false
  543. sslOn=false
  544. letsEncryptOn=false
  545. mediaWikiOn=false
  546. moodleOn=false
  547. infoPHPOn=false
  548. backupOn=false
  549. hostname=""
  550. logFile="./."$(basename $0)".log"
  551. maxUpload="100M"
  552. apacheName=""
  553. nginxName=""
  554. webServerName=""
  555. webServerUser=""
  556. webServerGroup=""
  557. mysqlName=""
  558. mariadbName=""
  559. sqlServerName=""
  560. dbType=""
  561. phpFPMName=""
  562. phpDest=""
  563. nombreMediaWiki=""
  564. dominioMediaWiki=""
  565. passwdMediaWiki=""
  566. nombreMoodle=""
  567. nombreCortoMoodle=""
  568. dominioMoodle=""
  569. passwdMoodle=""
  570. }
  571. instalacionExpress() {
  572. # Permite una instalación rápida, haciendo el menor número de preguntas
  573. # Defecto: Nginx + MariaDB + PHP + Let's Encrypt + MediaWiki + Moodle + Backup
  574. nginxOn=true
  575. case $ID in
  576. debian)
  577. mySQLOn=true
  578. dbType="mariadb"
  579. ;;
  580. ubuntu)
  581. mariaDBOn=true
  582. dbType="mariadb"
  583. ;;
  584. centos|fedora)
  585. mariaDBOn=true
  586. dbType="mariadb"
  587. ;;
  588. esac
  589. phpOn=true
  590. sslOn=true
  591. letsEncryptOn=true
  592. mediaWikiOn=true
  593. moodleOn=true
  594. backupOn=true
  595. # Preguntas mínimas
  596. establecerFQDN
  597. leerSQLPasswd
  598. mostrarMediaWiki
  599. mostrarMoodle
  600. mostrarConfirmacion
  601. }
  602. mostrarBienvenida() {
  603. # Pantalla de bienvenida y muestra SO y estado de los discos
  604. ANCHO=$(tput cols)
  605. ALTO=$(tput lines)
  606. 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"
  607. comprobarError $? 1
  608. }
  609. mostrarExpress() {
  610. # Pantalla de elección entre instalación express o avanzada
  611. 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 \
  612. "Express" "Instalación rápida" ON \
  613. "Avanzada" "Permite escoger todas las opciones disponibles" OFF \
  614. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  615. comprobarError $? 1
  616. case $express in
  617. Express)
  618. instalacionExpress
  619. # DECIDIR QUÉ OPCIONES SON LAS MÍNIMAS
  620. ;;
  621. Avanzada)
  622. mostrarAvanzada
  623. ;;
  624. *)
  625. comprobarError 1 2
  626. ;;
  627. esac
  628. unset express
  629. }
  630. mostrarAvanzada() {
  631. # Pantalla que permite instalar un servidor LAMP o LEMP
  632. 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 \
  633. "LEMP" "GNU/Linux + (E)Nginx + MySQL/MariaDB + PHP-7" ON \
  634. "LAMP" "GNU/Linux + Apache + MySQL/MariaDB + PHP-7" OFF \
  635. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  636. comprobarError $? 1
  637. for i in $webServer; do
  638. case $i in
  639. LEMP)
  640. nginxOn=true
  641. ;;
  642. LAMP)
  643. apacheOn=true
  644. ;;
  645. *)
  646. comprobarError 1 100
  647. ;;
  648. esac
  649. done
  650. # Opciones comunes
  651. establecerFQDN
  652. mostrarDatabase
  653. phpOn=true
  654. establecerMaxUpload
  655. mostrarComponentes
  656. mostrarConfirmacion
  657. unset webServer
  658. }
  659. mostrarComponentes() {
  660. # Pantalla de elección de componentes (SSL/TLS, MediaWiki, Moodle, InfoPHP y Backup)
  661. 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 \
  662. "SSL/TLS" "Instalar certificados para activar HTTPS" ON \
  663. "MediaWiki" "Instalar wiki con MediaWiki" ON \
  664. "Moodle" "Instalar campus virtual con Moodle" ON \
  665. "InfoPHP" "Instalar info.php (sólo para pruebas)" OFF \
  666. "Backup" "Programar backups automáticos" ON \
  667. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  668. comprobarError $? 1
  669. # Mejora: autodetección de componentes ya instalados
  670. for i in $componentes; do
  671. case $i in
  672. \"SSL/TLS\")
  673. # 2 Opciones: Let's Encrypt o Autofirmado
  674. mostrarSSL
  675. ;;
  676. \"MediaWiki\")
  677. mediaWikiOn=true
  678. mostrarMediaWiki
  679. ;;
  680. \"Moodle\")
  681. moodleOn=true
  682. mostrarMoodle
  683. ;;
  684. \"InfoPHP\")
  685. infoPHPOn=true
  686. ;;
  687. \"Backup\")
  688. backupOn=true
  689. ;;
  690. *)
  691. comprobarError 1 3
  692. ;;
  693. esac
  694. done
  695. unset componentes
  696. }
  697. mostrarSSL() {
  698. # Pantalla que permite seleccionar el tipo de certificados
  699. 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 \
  700. "LetsEncrypt" "Compatible con todos los navegadores" ON \
  701. "Auto-Firmado" "Certificados auto-firmados (sólo para pruebas)" OFF \
  702. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  703. comprobarError $? 1
  704. for i in $ssl; do
  705. case $i in
  706. LetsEncrypt)
  707. sslOn=true
  708. letsEncryptOn=true
  709. ;;
  710. Auto-Firmado)
  711. sslOn=true
  712. ;;
  713. *)
  714. comprobarError 1 6
  715. ;;
  716. esac
  717. done
  718. unset ssl
  719. }
  720. mostrarMediaWiki(){
  721. # Pantalla que pregunta sobre las opciones necesarias para configurar MediaWiki
  722. # Introducir nombre wiki
  723. while [ -z "$nombreMediaWiki" ]; do
  724. 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)
  725. comprobarError $? 1
  726. done
  727. # Introducir dominio
  728. while [ -z "$dominioMediaWiki" ]; do
  729. 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)
  730. comprobarError $? 1
  731. done
  732. cont=1
  733. serverName=""
  734. aliasMediaWiki=""
  735. for dominio in $dominioMediaWiki;do
  736. if [ $cont -eq 1 ];then
  737. # Dominio Principal (ServerName)
  738. serverName=$dominio
  739. else
  740. # Dominios Secundarios (ServerAlias)
  741. aliasMediaWiki=$aliasMediaWiki" "$dominio
  742. fi
  743. cont=$((cont + 1))
  744. done
  745. dominioMediaWiki=$serverName
  746. # Introducir contraseña
  747. control=false
  748. error=""
  749. while [ $control = false ]; do
  750. 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)
  751. comprobarError $? 1
  752. 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)
  753. comprobarError $? 1
  754. if [ -z "$passwdMediaWiki" ] || [ -z "$passwdMediaWiki2" ]; then
  755. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  756. elif [ $passwdMediaWiki != $passwdMediaWiki2 ];then
  757. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  758. else
  759. control=true
  760. fi
  761. done
  762. unset control error passwdMediaWiki2 dominio cont serverName
  763. }
  764. mostrarMoodle() {
  765. # Pantalla que pregunta sobre las opciones necesarias para configurar Moodle
  766. # Introducir Nombre Moodle
  767. while [ -z "$nombreMoodle" ]; do
  768. 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)
  769. comprobarError $? 1
  770. done
  771. # Introducir Nombre Corto Moodle
  772. while [ -z "$nombreCortoMoodle" ]; do
  773. 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)
  774. comprobarError $? 1
  775. done
  776. nombreCortoMoodle=$(echo $nombreCortoMoodle | cut -d ' ' -f 1)
  777. # Introducir dominio
  778. while [ -z "$dominioMoodle" ]; do
  779. 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)
  780. comprobarError $? 1
  781. done
  782. cont=1
  783. serverName=""
  784. aliasMoodle=""
  785. for dominio in $dominioMoodle;do
  786. if [ $cont -eq 1 ];then
  787. # Dominio Principal (ServerName)
  788. serverName=$dominio
  789. else
  790. # Dominios Secundarios (ServerAlias)
  791. aliasMeoodle=$aliasMoodle" "$dominio
  792. fi
  793. cont=$((cont + 1))
  794. done
  795. dominioMoodle=$serverName
  796. # Introducir contraseña
  797. control=false
  798. error=""
  799. while [ $control = false ]; do
  800. 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)
  801. comprobarError $? 1
  802. 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)
  803. comprobarError $? 1
  804. if [ -z "$passwdMoodle" ] || [ -z "$passwdMoodle2" ]; then
  805. error="ERROR: LA CONTRASEÑA NO PUEDE ESTAR VACIA.\n"
  806. elif [ $passwdMoodle != $passwdMoodle2 ];then
  807. error="ERROR: LAS CONTRASEÑAS NO COINCIDEN.\n"
  808. else
  809. control=true
  810. fi
  811. done
  812. unset control error passwdMoodle2 dominio cont serverName aliasMoodle
  813. }
  814. mostrarConfirmacion() {
  815. # Pantalla que presenta una confirmación antes de realizar la instalación
  816. 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"
  817. comprobarError $? 1
  818. }
  819. establecerFQDN() {
  820. # Configura el FQDN (dominio principal del servidor)
  821. while [ -z "$hostname" ]; do
  822. 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)
  823. if [ $? -eq 0 ] && [ ! -z "$hostname" ]; then
  824. hostnamectl set-hostname $hostname
  825. else
  826. hostname=$(hostname)
  827. fi
  828. done
  829. echo -en "Hostname: $hostname\n" >> $logFile
  830. }
  831. instalarApache() {
  832. # Instala Apache2
  833. webServerName=$apacheName
  834. case $ID in
  835. debian|ubuntu)
  836. result=$(apt-get -q -y install apache2 2>&1)
  837. comprobarError $? 101 $result
  838. ;;
  839. centos|fedora)
  840. result=$(yum -y install httpd 2>&1)
  841. comprobarError $? 101 $result
  842. if [ $sslOn = true ];then
  843. # Instalamos módulo mod_ssl (no se instala por defecto)
  844. result=$(yum -y install mod_ssl 2>&1)
  845. comprobarError $? 101 $result
  846. fi
  847. ;;
  848. *)
  849. comprobarError 1 104
  850. ;;
  851. esac
  852. deshabilitarServicio $webServerName
  853. }
  854. configurarApache() {
  855. # Configura Apache2
  856. case $ID in
  857. debian|ubuntu)
  858. apacheConfFile="./etc/apache2/apache2.conf"
  859. if [ ! -f $apacheConfFile ];then
  860. comprobarError 1 4 $apacheConfFile
  861. fi
  862. cp -f $apacheConfFile /etc/$webServerName/apache2.conf 2>/dev/null
  863. comprobarError $? 108
  864. webServerUser=$(grep ^User /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
  865. webServerGroup=$(grep ^Group /etc/$webServerName/apache2.conf | cut -d ' ' -f 2)
  866. if [ ! -L /etc/$webServerName/logs ];then
  867. ln -s /var/log/apache2 /etc/$webServerName/logs 2>/dev/null
  868. comprobarError $? 108
  869. fi
  870. # Activamos mod_rewrite (no viene activado por defecto)
  871. a2enmod rewrite >/dev/null 2>&1
  872. comprobarError $? 108
  873. # Activamos mod_ssl y mod_headers (no viene activado por defecto)
  874. if [ $sslOn = true ];then
  875. a2enmod ssl >/dev/null 2>&1
  876. comprobarError $? 108
  877. a2enmod headers >/dev/null 2>&1
  878. comprobarError $? 108
  879. fi
  880. unset apacheConfFile
  881. ;;
  882. centos|fedora)
  883. apacheConfFile="./etc/apache2/conf/httpd.conf"
  884. sslConfFile="./etc/apache2/conf.d/ssl.conf"
  885. welcomeConfFile="/etc/apache2/conf.d/welcome.conf"
  886. if [ ! -f $apacheConfFile ];then
  887. comprobarError 1 4 $apacheConfFile
  888. fi
  889. cp -f $apacheConfFile /etc/$webServerName/conf/httpd.conf 2>/dev/null
  890. comprobarError $? 108
  891. # Desactivamos Mensaje de Bienvenida
  892. if [ -f $welcomeConfFile ];then
  893. sed -i -e 's/^/#/' $welcomeConfFile
  894. comprobarError $? 108
  895. fi
  896. # Configuramos mod_ssl
  897. if [ $sslOn = true ];then
  898. if [ ! -f $sslConfFile ];then
  899. comprobarError 1 4 $sslConfFile
  900. fi
  901. cp -f $sslConfFile /etc/$webServerName/conf.d/ssl.conf 2>/dev/null
  902. comprobarError $? 108
  903. fi
  904. webServerUser=$(grep ^User /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
  905. webServerGroup=$(grep ^Group /etc/$webServerName/conf/httpd.conf | cut -d ' ' -f 2)
  906. unset apacheConfFile sslConfFile welcomeConfFile
  907. ;;
  908. *)
  909. comprobarError 1 108
  910. ;;
  911. esac
  912. # Creamos directorios sites-available y sites-enabled
  913. if [ ! -d "/etc/$webServerName/sites-available" ];then
  914. mkdir "/etc/$webServerName/sites-available" 2>/dev/null
  915. comprobarError $? 5 "/etc/$webServerName/sites-available"
  916. fi
  917. if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
  918. mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
  919. comprobarError $? 5 "/etc/$webServerName/sites-enabled"
  920. else
  921. # Eliminar Virtual Host por defecto
  922. if [ -f /etc/$webServerName/sites-enabled/000-default.conf ];then
  923. rm -f /etc/$webServerName/sites-enabled/000-default.conf 2>/dev/null
  924. fi
  925. fi
  926. }
  927. instalarNginx() {
  928. # Instala Nginx
  929. webServerName=$nginxName
  930. case $ID in
  931. ubuntu|debian)
  932. result=$(apt-get -q -y install nginx 2>&1)
  933. comprobarError $? 102 $result
  934. ;;
  935. centos)
  936. # Sólo para CentOS
  937. result=$(yum -y install epel-release)
  938. comprobarError $? 103 $result
  939. result=$(yum -y install nginx 2>&1)
  940. comprobarError $? 102 $result
  941. ;;
  942. fedora)
  943. result=$(yum -y install nginx 2>&1)
  944. comprobarError $? 102 $result
  945. ;;
  946. *)
  947. comprobarError 1 105
  948. ;;
  949. esac
  950. deshabilitarServicio $webServerName
  951. }
  952. configurarNginx() {
  953. # Configura Nginx
  954. rm -Rf "/etc/$webServerName/!(sites-available|sites-enabled)" 2>/dev/null
  955. comprobarError $? 107
  956. nginxConfFile="./etc/$webServerName"
  957. if [ -d "$nginxConfFile" ];then
  958. cp -Rf $nginxConfFile/* /etc/$webServerName/ 2>/dev/null
  959. comprobarError $? 107
  960. else
  961. comprobarError 1 5 "$nginxConfFile"
  962. fi
  963. # Creamos directorios sites-available y sites-enabled
  964. if [ ! -d "/etc/$webServerName/sites-available" ];then
  965. mkdir "/etc/$webServerName/sites-available" 2>/dev/null
  966. comprobarError $? 5 "/etc/$webServerName/sites-available"
  967. fi
  968. if [ ! -d "/etc/$webServerName/sites-enabled" ]; then
  969. mkdir "/etc/$webServerName/sites-enabled" 2>/dev/null
  970. comprobarError $? 5 "/etc/$webServerName/sites-enabled"
  971. else
  972. # Eliminar Virtual Host por defecto
  973. if [ -f /etc/$webServerName/sites-enabled/default ];then
  974. rm -f /etc/$webServerName/sites-enabled/default 2>/dev/null
  975. fi
  976. fi
  977. # Configuramos Usuario y Grupo
  978. case $ID in
  979. debian|ubuntu)
  980. webServerUser="www-data"
  981. webServerGroup=$webServerUser
  982. ;;
  983. centos|fedora)
  984. webServerUser="nginx"
  985. webServerGroup=$webServerUser
  986. ;;
  987. esac
  988. sed -i '/user /c\user '$webServerUser';' /etc/$webServerName/nginx.conf
  989. comprobarError $? 107
  990. unset nginxConfFile
  991. }
  992. instalarVirtualHost() {
  993. # Configuramos un Virtual Host para Apache o Nginx
  994. # Uso: instalarVirtualHost $root $virtualHost $dominio $alias
  995. if [ $# -ge 3 ];then
  996. rootVirtualHost=$(realpath $1)
  997. shift
  998. virtualHostFile=$(realpath $1)
  999. shift
  1000. dominioVirtualHost=$1
  1001. virtualHostName=$dominioVirtualHost".conf"
  1002. shift
  1003. aliasVirtualHost=$@
  1004. else
  1005. comprobarError 1 908
  1006. fi
  1007. if [ ! -f $virtualHostFile ];then
  1008. comprobarError 1 909 $virtualHostName
  1009. fi
  1010. if [ $apacheOn = true ];then
  1011. # Configuramos root, dominio y logs
  1012. sed -i '/ServerName /c\\tServerName '"$dominioVirtualHost" $virtualHostFile
  1013. comprobarError $? 908
  1014. if [ ! -z "$aliasVirtualHost" ];then
  1015. sed -i '/ServerName /a\\tServerAlias '"$aliasVirtualHost" $virtualHostFile
  1016. comprobarError $? 908
  1017. fi
  1018. sed -i '/DocumentRoot /c\\tDocumentRoot '"$rootVirtualHost" $virtualHostFile
  1019. comprobarError $? 908
  1020. sed -i '/ErrorLog /c\\tErrorLog logs/'"$dominioVirtualHost"'-error.log' $virtualHostFile
  1021. comprobarError $? 908
  1022. sed -i '/CustomLog /c\\tCustomLog logs/'"$dominioVirtualHost"'-access.log common' $virtualHostFile
  1023. comprobarError $? 908
  1024. if [ $sslOn = true ];then
  1025. sed -i '/SSLCertificateFile /c\\tSSLCertificateFile ssl/'"$dominioVirtualHost"'.crt' $virtualHostFile
  1026. comprobarError $? 908
  1027. sed -i '/SSLCertificateKeyFile /c\\tSSLCertificateKeyFile ssl/'"$dominioVirtualHost"'.key' $virtualHostFile
  1028. comprobarError $? 908
  1029. fi
  1030. elif [ $nginxOn = true ];then
  1031. # Configuramos root, dominio, logs y php-fpm.sock (NGINX)
  1032. sed -i '/root /c\\troot '$rootVirtualHost';' "$virtualHostFile"
  1033. comprobarError $? 908
  1034. sed -i '/server_name /c\\tserver_name '"$dominioVirtualHost"' '"$aliasVirtualHost"';' $virtualHostFile
  1035. comprobarError $? 908
  1036. sed -i '/access_log /c\\taccess_log /var/log/nginx/'"$dominioVirtualHost"'-access.log;' $virtualHostFile
  1037. comprobarError $? 908
  1038. sed -i '/error_log /c\\terror_log /var/log/nginx/'"$dominioVirtualHost"'-error.log;' $virtualHostFile
  1039. comprobarError $? 908
  1040. socket=$(find /var/run/ -type s -name 'php*.sock')
  1041. sed -i '/fastcgi_pass /c\\t\tfastcgi_pass unix:'"$socket"';' $virtualHostFile
  1042. comprobarError $? 908
  1043. if [ $sslOn = true ];then
  1044. sed -i '/ssl_certificate /c\\tssl_certificate ssl/'"$dominioVirtualHost"'.crt;' $virtualHostFile
  1045. comprobarError $? 908
  1046. sed -i '/ssl_certificate_key /c\\tssl_certificate_key ssl/'"$dominioVirtualHost"'.key;' $virtualHostFile
  1047. comprobarError $? 908
  1048. fi
  1049. fi
  1050. # Copiamos ficheros de configuración
  1051. cp -f $virtualHostFile "/etc/$webServerName/sites-available/$virtualHostName" >> $logFile 2>&1
  1052. comprobarError $? 910
  1053. if [ -f "/etc/$webServerName/sites-enabled/$virtualHostName" ];then
  1054. rm -f /etc/$webServerName/sites-enabled/$virtualHostName 2>/dev/null
  1055. comprobarError 911 $virtualHostName
  1056. fi
  1057. ln -s "/etc/$webServerName/sites-available/$virtualHostName" "/etc/$webServerName/sites-enabled/$virtualHostName" >> $logFile 2>&1
  1058. comprobarError $? 911 $virtualHostName
  1059. recargarServicio $webServerName
  1060. unset rootVirtualHost dominioVirtualHost virtualHostFile virtualHostName aliasVirtualHost socket
  1061. }
  1062. mostrarDatabase() {
  1063. # Pantalla que permite escoger entre instalar MariaDB o MySQL
  1064. case $ID in
  1065. debian)
  1066. 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"
  1067. comprobarError $? 1
  1068. # Excepción: aunque es MariaDB (se instala con el nombre de mysql-server)
  1069. mySQLOn= true
  1070. dbType="mariadb"
  1071. ;;
  1072. ubuntu)
  1073. 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 \
  1074. "MariaDB" "Instalar la base de datos MariaDB (fork de MySQL)" ON \
  1075. "MySQL" "Instalar la base de datos MySQL (uso no comercial)" OFF \
  1076. --ok-button "Continuar" --cancel-button "Salir" 3>&1 1>&2 2>&3)
  1077. comprobarError $? 1
  1078. case $database in
  1079. MariaDB)
  1080. mariaDBOn=true
  1081. dbType="mariadb"
  1082. ;;
  1083. MySQL)
  1084. mySQLOn=true
  1085. dbType="mysqli"
  1086. ;;
  1087. *)
  1088. comprobarError 1 200
  1089. ;;
  1090. esac
  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