Data hosted with ♥ by Pastebin.com - Download Raw - See Original
  1. #!/bin/bash
  2. ######
  3. ###
  4. ### Script de creation auto de virtualhost pour apache2 sous debian 6 et 7
  5. ###
  6. ### Version : 0.6
  7. ###
  8. ### Date : 19/03/2014
  9. ###
  10. ### Jean-Francois GUILLAUME alias MrBear
  11. ###
  12. ### See bottom of file for changelog
  13. ###
  14. ######
  15.  
  16. prefligh_check() {
  17.     # Verifier si le script est lance par root
  18.     if [ "$(id -u)" != "0" ]; then
  19.        echo "Ce script doit etre lance avec les droits root" 1>&2
  20.        exit 1
  21.     fi
  22.  
  23.     # Verifier si le script est lance sur debian
  24.     if [ $(lsb_release -si) != 'Debian' ]
  25.     then
  26.             echo "Ce script ne fonctionne qu'avec Debian et apache installe depuis les depots"
  27.             exit 1
  28.     fi
  29. }
  30.  
  31. setup() {
  32.     ANS=""
  33.     SITENAME=""
  34.     PASSWORD=""
  35.     FQDN=`dnsdomainname`
  36.     HTTP_PORT=80
  37.     HTTPS_PORT=443
  38.     PROXY_PORT=0
  39.     PASSMYSQL=""
  40.     MYSQL="n"
  41.     TYPE="HTTP"
  42. }
  43.  
  44. promt_info() {
  45.     INFO="USER : $SITENAME  PASSWORD : $PASSWORD\n"
  46.     case $TYPE in
  47.     "HTTP_ONLY")
  48.         INFO=$INFO"
  49.             PORT HTTP : $HTTP_PORT\n
  50.             Adresse : http://$SITENAME.$FQDN\n
  51.             "
  52.         ;;
  53.     "HTTPS_ONLY")
  54.         INFO=$INFO"
  55.             PORT HTTPS : $HTTPS_PORT\n
  56.             Adresse : https://$SITENAME.$FQDN\n
  57.             "
  58.         ;;
  59.     "HTTP_HTTPS")
  60.         INFO=$INFO"
  61.             PORT HTTP : $HTTP_PORT\n
  62.             PORT HTTPS : $HTTPS_PORT\n
  63.             Adresse : http://$SITENAME.$FQDN\n
  64.             Adresse : https://$SITENAME.$FQDN\n
  65.             "
  66.         ;;
  67.     "HTTP_PROXY")
  68.         INFO=$INFO"
  69.             PORT HTTP : $HTTP_PORT\n
  70.             Adresse : http://$SITENAME.$FQDN\n
  71.             PORT DESTINATION : $PROXY_PORT\n
  72.             "
  73.         ;;
  74.     "HTTPS_PROXY")
  75.         INFO=$INFO"
  76.             PORT HTTP : $HTTP_PORT\n
  77.             Adresse : http://$SITENAME.$FQDN\n
  78.             PORT DESTINATION : $PROXY_PORT\n
  79.             "
  80.         ;;
  81.     "HTTP_HTTPS_PROXY")
  82.         INFO=$INFO"
  83.             PORT HTTP : $HTTP_PORT\n
  84.             PORT HTTPS : $HTTPS_PORT\n
  85.             Adresse : http://$SITENAME.$FQDN\n
  86.             Adresse : https://$SITENAME.$FQDN\n
  87.             PORT DESTINATION : $PROXY_PORT\n
  88.             "
  89.         ;;
  90.     esac
  91.     if [ _$MYSQL = _o -a _$MYSQL = _O ]
  92.     then
  93.         INFO=$INFO"
  94.         Mysql :\n
  95.             Host     : localhost\n
  96.             Database : $SITENAME\n
  97.             Password : $PASSWORD\n
  98.         "
  99.     fi
  100.    
  101.     echo -e $INFO
  102. }
  103.  
  104. promt_check_site() {
  105.     echo
  106.     echo "Le site sera accessible a l'adresse : http://$SITENAME.$FQDN"
  107.     echo
  108.     echo -n "Est-ce correct ?(o/[n]) "
  109.     read ANS
  110.     if [ _$ANS != _o -a _$ANS != _O ]
  111.     then
  112.         echo -n "Que doit on mettre apres $SITENAME. ?"
  113.         read FQDN
  114.         promt_check_site
  115.     fi
  116.     create_user
  117. }
  118.  
  119. read_SITENAME() {
  120.     echo "Bienvenue sur le script de creation automatique de site pour apache.
  121. Chaque site est lie à un compte linux.
  122. Nous allon maintenant proceder a la creation d'un nouveau site.
  123. "
  124.    
  125.     echo -n "Entrez le nom du compte a creer : "
  126.     read SITENAME;
  127.  
  128.     echo -n "Entrez son mot de passe : "
  129.     read PASSWORD
  130.     PASSMYSQL=$PASSWORD
  131.     promt_check_site
  132. }
  133.  
  134. create_user() {
  135.     echo "Creating User..."
  136.     adduser --group --system --disabled-login --gecos 'User for $SITENAME.$FQDN' $SITENAME
  137.     echo " + User cree"
  138.     echo $SITENAME:$PASSWORD | chpasswd
  139.     echo " + Mot de passe cree"
  140.  
  141.     mkdir -p /home/$SITENAME/web/ /home/$SITENAME/logs/ /home/$SITENAME/ssl/ /home/$SITENAME/cgi-bin
  142.     echo " + Repertoires crees"
  143.     chmod -R u+rwx,g+rx-w,o-rwx /home/$SITENAME
  144.     chown -R $SITENAME:www-data /home/$SITENAME
  145.     chmod ug+rwx,o-rwx /home/$SITENAME/web
  146.     chmod ug+rwx,o-rwx /home/$SITENAME/logs
  147.     chmod ug+rwx,o-rwx /home/$SITENAME/ssl
  148.     chmod u+rwx,g+rx,o-rwx /home/$SITENAME/cgi-bin
  149.     echo " + Droits accordes"
  150.     echo "==== Utilisateur cree ===="
  151.     type_vhost
  152. }
  153.  
  154. type_vhost() {
  155.     echo "
  156. Quel type de site devons nous creer ?
  157. Type disponibles :
  158.     * HTTP_ONLY
  159.     * HTTPS_ONLY
  160.     * HTTP_HTTPS
  161.     * HTTP_PROXY
  162.     * HTTPS_PROXY
  163.     * HTTP_HTTPS_PROXY"
  164.    
  165.     set_type
  166. }
  167.  
  168. set_type() {
  169.     echo -n "Type de site ? : "
  170.     read ANS
  171.    
  172.     case $ANS in
  173.     "HTTP_ONLY" | "HTTPS_ONLY" | "HTTP_HTTPS" | "HTTP_PROXY" | "HTTPS_PROXY" | "HTTP_HTTPS_PROXY")
  174.         TYPE=$ANS
  175.         check_type
  176.         ;;
  177.     *)
  178.         echo "Type non valide."
  179.         set_type
  180.         ;;
  181.     esac
  182. }
  183.  
  184. check_type() {
  185.     echo "Nous allons creer un site de type $TYPE"
  186.     echo -n "Est-ce correct ?(o/[n]) "
  187.     read ANS
  188.     if [ _$ANS != _o -a _$ANS != _O ]
  189.     then
  190.         set_type
  191.     else
  192.         if [ TYPE = "HTTPS_ONLY" ] || [ TYPE = "HTTP_HTTPS" ] || [ TYPE = "HTTPS_PROXY" ] || [ "HTTP_HTTPS_PROXY" ]
  193.         then
  194.             echo "Merci de bien vouloir deposer votre certificat sous la forme d'un fichier ssl.pem dans le dossier /ssl"
  195.         fi
  196.         check_port
  197.     fi
  198. }
  199.  
  200. create_vhost() {
  201.     case $TYPE in
  202.     "HTTP_ONLY" | "HTTP_PROXY")
  203.         VHOST="<virtualhost *:$HTTP_PORT>\n"
  204.         build_vhost ""
  205.         ;;
  206.     "HTTPS_ONLY" | "HTTPS_PROXY")
  207.         VHOST="<virtualhost *:$HTTPS_PORT>\n"
  208.         build_vhost "HTTPS"
  209.         ;;
  210.     "HTTP_HTTPS" | "HTTP_HTTPS_PROXY")
  211.         VHOST="<virtualhost *:$HTTP_PORT>\n"
  212.         build_vhost ""
  213.         VHOST=$VHOST"<virtualhost *:$HTTPS_PORT>\n"
  214.         build_vhost "HTTPS"
  215.         ;;
  216.     esac
  217.     write_vhost
  218. }
  219.  
  220. check_port() {
  221.     case $TYPE in
  222.     "HTTP_ONLY")
  223.         read_http_port
  224.         ;;
  225.     "HTTPS_ONLY")
  226.         read_https_port
  227.         ;;
  228.     "HTTP_HTTPS")
  229.         read_http_port
  230.         read_https_port
  231.         ;;
  232.     "HTTP_PROXY")
  233.         read_http_port
  234.         read_proxy_port
  235.         ;;
  236.     "HTTPS_PROXY")
  237.         read_https_port
  238.         read_proxy_port
  239.         ;;
  240.     "HTTP_HTTPS_PROXY")
  241.         read_http_port
  242.         read_https_port
  243.         read_proxy_port
  244.         ;;
  245.     esac
  246.     create_vhost
  247. }
  248.  
  249. read_http_port() {
  250.     echo "Port actuel : $HTTP_PORT"
  251.     echo -n "Est-ce correct ?(o/[n]) "
  252.     read ANS
  253.     if [ _$ANS != _o -a _$ANS != _O ]
  254.     then
  255.         echo -n "Nouveau port : "
  256.         read HTTP_PORT
  257.         check_port
  258.     fi
  259.     check_listen
  260. }
  261.  
  262. read_https_port() {
  263.     echo "Port actuel : $HTTPS_PORT"
  264.     echo -n "Est-ce correct ?(o/[n]) "
  265.     read ANS
  266.     if [ _$ANS != _o -a _$ANS != _O ]
  267.     then
  268.         echo -n "Nouveau port : "
  269.         read HTTP_PORT
  270.         check_port
  271.     fi
  272.     check_listen
  273. }
  274.  
  275. read_proxy_port() {
  276.     echo "Port actuel : $PROXY_PORT"
  277.     echo -n "Est-ce correct ?(o/[n]) "
  278.     read ANS
  279.     if [ _$ANS != _o -a _$ANS != _O ]
  280.     then
  281.         echo -n "Nouveau port : "
  282.         read PROXY_PORT
  283.         check_port
  284.     fi
  285.     check_listen
  286. }
  287.  
  288. check_listen() {
  289.     if grep -q "Listen $1" "/etc/apache2/ports.conf"
  290.     then
  291.         if grep -q "NameVirtualHost *:$1" "/etc/apache2/ports.conf"
  292.         then
  293.             echo "Rien a faire" > "/dev/null"
  294.         else
  295.             sed -i".bak" '/Listen $1/d' "/etc/apache2/ports.conf"
  296.             echo -e "NameVirtualHost *:$1\nListen $1" >> "/etc/apache2/ports.conf"
  297.         fi
  298.     else
  299.         echo -e "NameVirtualHost *:$1\nListen $1"
  300.     fi
  301. }
  302.  
  303. build_vhost() {
  304.     VHOST=$VHOST"
  305.         ServerAdmin admin@$SITENAME.$FQDN\n
  306.         ServerName $SITENAME.$FQDN\n
  307.         ServerAlias $SITENAME.$FQDN\n
  308. \n
  309.         # Logfiles\n
  310.         ErrorLog /home/$SITENAME/logs/error.log\n
  311.         CustomLog /home/$SITENAME/logs/access.log combined\n
  312.         \n"
  313.  
  314.     if [ "$1" = "HTTPS" ]
  315.     then
  316.         if [ $TYPE = "HTTPS_ONLY" ] || [ $TYPE = "HTTP_HTTPS" ] || [ $TYPE = "HTTPS_PROXY" ] || [ "HTTP_HTTPS_PROXY" ]
  317.         then
  318.             VHOST=$VHOST"\n
  319.             SSLEngine on\n
  320.             SSLProtocol all -SSLv2\n
  321.             SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM\n
  322.     \n
  323.             SSLCertificateFile /home/$SITENAME/ssl/ssl.pem\n
  324.             \n"
  325.         fi
  326.     fi
  327.    
  328.     if [ $TYPE = "HTTP_PROXY" ] || [ $TYPE = "HTTPS_PROXY" ] || [ $TYPE = "HTTP_HTTPS_PROXY" ]
  329.     then
  330.         VHOST=$VHOST"\n
  331.         #Proxy port\n
  332.         ProxyPass / http://$SITENAME.$FQDN:$PROXY_PORT/\n
  333.         ProxyPassReverse / http://$SITENAME.$FQDN:$PROXY_PORT/\n
  334.         ProxyPreserveHost On\n
  335.         \n"
  336.     else
  337.         VHOST=$VHOST"\n
  338.         # Directory root + Indexes\n
  339.         DocumentRoot /home/$SITENAME/web/\n
  340.         DirectoryIndex index.html index.php\n
  341. \n
  342.         # CGI directory\n
  343.         ScriptAlias /cgi-bin/ /home/$SITENAME/cgi-bin/\n
  344.         <directory /home/$SITENAME/web/>\n
  345.             AllowOverride All\n
  346.             Options -Indexes +ExecCGI\n
  347.             Order Deny,Allow\n
  348.             Allow from all\n
  349.         </directory>\n"
  350.     fi
  351.    
  352.     VHOST=$VHOST"\n
  353.     </virtualhost>\n
  354.     \n"
  355. }
  356.  
  357. write_vhost() {
  358.     echo -e $VHOST >> "/etc/apache2/sites-available/$SITENAME.$FQDN"
  359.     echo " + VirtualHost cree"
  360.     enable_vhost
  361. }
  362.  
  363. enable_vhost() {
  364.     a2ensite $SITENAME.$FQDN
  365.     /etc/init.d/apache2 restart
  366.     ask_mysql
  367. }
  368.  
  369. ask_mysql() {
  370.     echo -n "Faut-il installer une base de donnees MySQL ?(o/[n]) "
  371.     read ANS
  372.  
  373.     if [ _$ANS = _o -o _$ANS = _O ]
  374.     then
  375.         echo -n "Faut-il que la base soit accessible depuis n'importe ou ?(o/[n]) "
  376.         read ANS
  377.         if [ _$ANS != _o -o _$ANS != _O ]
  378.         then
  379.             echo "  Veuillez entrer le password Root MySQL"
  380.             mysql -u root -p <<END_COMMANDS
  381.                 CREATE DATABASE $SITENAME;
  382.                 CREATE USER `$SITENAME`@`localhost` IDENTIFIED BY '$PASSMYSQL';
  383.                 GRANT ALL PRIVILEGES ON `$SITENAME`.* TO `$SITENAME`@`localhost` ;
  384.                 FLUSH PRIVILEGES;
  385. END_COMMANDS
  386.         else
  387.             echo "  Veuillez entrer le password Root MySQL"
  388.             mysql -u root -p <<END_COMMANDS
  389.                 CREATE DATABASE $SITENAME;
  390.                 CREATE USER `$SITENAME`@`localhost` IDENTIFIED BY '$PASSMYSQL';
  391.                 CREATE USER `$SITENAME`@`%` IDENTIFIED BY '$PASSMYSQL';
  392.                 GRANT ALL PRIVILEGES ON `$SITENAME`.* TO `$SITENAME`@`localhost`;
  393.                 GRANT ALL PRIVILEGES ON `$SITENAME`.* TO `$SITENAME`@`%`;
  394.                 FLUSH PRIVILEGES;
  395. END_COMMANDS
  396.         fi
  397.         echo "Base MySQL \"$SITENAME\" creee"
  398.         /etc/init.d/mysql restart
  399.     else
  400.         echo "Pas de base SQL ? OK !"
  401.     fi
  402.     promt_info
  403. }
  404.  
  405. prefligh_check
  406. setup
  407. read_sitename
  408.  
  409. ######
  410. ###
  411. ### Full Changelog
  412. ###
  413. ######
  414. ##
  415. ## v0.6
  416. ##  + Refactoring some switch case
  417. ##
  418. ## v0.5
  419. ##  + Redoing script from scratch