Quelqu’un m’a dit

(goguette incomplète)

On me dit qu'insoumis niveau démocratie
C'est pas la panacée c'est plus une tyranie
On me dit que la gauche est morte pour le moment
Et que je ferais mieux de changer de mouvement
Pourtant quelqu'un m'a dit d'être moins démocratif
C'est quelqu'un qui m'a dit, d'être, plus collectif
Attend la convention…
On dit que les marcheurs ne valent pas un clou
Qu'ils suivent aveuglément comme des gentils toutous
Parait qu'on est meilleur vu qu'on est insoumis
Puisqu'on est insoumis c'est donc qu'on est meilleur 
Pourtant quelqu'un m'a dit qu'il faut pas la ram'ner
C'est quelqu'un qui m'a dit
De n'pas trop me moquer
Serais-je trop impliqué … ?
Mais que c'passe t-il en Corse
Y'aurait des dissidents
…

Qwerty-Lafayette v0.5 avec setxkbmap

Petit article pour remettre au propre les étapes pour intégrer qwerty-lafayette à une distrib basée sur Debian.

Résultat attendu : la commande `setxkbmap fr lafayette` vous fera changer de layout.

Qwerty-Lafayette, c’est là : http://fabi1cazenave.github.io/qwerty-lafayette/

Cet article est basé sur http://simos.info/blog/archives/1134

Version courte en mode copier/coller :

wget http://qwerty-lafayette.org/releases/lafayette_linux_v0.5.xkb --output-document=lafayette.xkb
cut_start=$(echo "$(cat -n lafayette.xkb |grep 'partial alphanumeric_keys' | awk '{print $1-1}')")
cut_end=$(wc lafayette.xkb | awk '{print $1-3}')
sed -ni "${cut_start},${cut_end}p" lafayette.xkb
sed -i 's/"lafayette_group2"/"lafayette"/' lafayette.xkb | sudo tee --append /usr/share/X11/xkb/symbols/fr
sudo vim -e +"/<layout>\\n *<configItem>\\n *<name>fr<//name>\\n[//<>\\na-zA-Z0-9 ]*<variantList>/" +"/<variantList>/+1" +"i
 <variant>
 <configItem>
 <name>lafayette</name>
 <description>French (coding, Qwerty-Lafayette)</description>
 <languageList><iso639Id>fra</iso639Id></languageList>
 </configItem>
 </variant>
" +wq /usr/share/X11/xkb/rules/base.xml
sudo vim -e +"/<layout>\\n *<configItem>\\n *<name>fr<//name>\\n[//<>\\na-zA-Z0-9 ]*<variantList>/" +"/<variantList>/+1" +"i
 <variant>
 <configItem>
 <name>lafayette</name>
 <description>French (coding, Qwerty-Lafayette)</description>
 <languageList><iso639Id>fra</iso639Id></languageList>
 </configItem>
 </variant>
" +wq /usr/share/X11/xkb/rules/evdev.xml

Pour tester que le layout fr «habituel» fonctionne toujours :

setxkbmap fr

Pour (enfin!) tester le layout qwerty-lafayette

setxkbmap fr lafayette

twitter-bootstrap 3.x, the easy way for customization

create an empty bootstrap.less inside your project that will import variables.less, then customize variables you want, then import bootstrap.less.

Less `@import` is an implicit « import once » (like the php `require_once`) , so the `@import variables.less` present in official bootstrap.less file will not reload the default variables.

This way allows you to update easier the twitter bootstrap library when you need.

@import "../twitter-bootstrap/less/variables.less"
@import "variables.less" // customize (or not) variables
@import "../twitter-bootstrap/less/mixins.less"
@import "mixins.less"

// in that file already imported .less will be not re-imported
// unless you explicitely ask it when compiling
@import "../twitter-bootstrap/less/bootstrap.less"
// Alternative : 
// instead of importing native bootstrap.less
// you can only take some importation

//== Custom
//
//## add your own specific rules here


 

Traitement des images en lignes de commandes

Quelques commandes rapides

# jesaisplus
$ convert -geometry 50x50 image_originale.jpg image_cible-50x50.jpg

# Agrandir une image (sera remplie par du blanc)
$ convert rectangle-150x300.png -extent 300x300 carre-300x300.png
# Découper une image 
$ convert rectangle-150x300.png -extent 300x300 carre-300x300.png
# Redimensionner une image (conserve les proportions)
$ convert rectangle-150x300.png -resize 300x rectangle-300x600.png
# découpe une image
$ convert rectangle-150x300.png -crop 100x300 rectangle-100x300.png
# output : rectangle-100x300-0.png (100x300) / rectangle-100x300-1.png  (50x300)


# Pour rendre une image transparente (méthode dite de Lapheuprait)
# source: image.png
# 1 - créer le masque de l'image
$ convert image.png -colorspace HSB -separate -negate image_mask.png
# 2 - générer l'image avec le canal alpha
$ feh image-mask-2.png
# après tests des différentes masques générés, le -2 était le bon pour moi
convert image.png -alpha Off image_mask-2.png -compose CopyOpacity -composite PNG32:image-avec-bg-transparent.png


convert image.png -alpha Off image_mask-2.png -compose CopyOpacity -composite PNG32:test.png




Et sinon grosso modo mon script pour générer toutes les bonnes favicon (merci https://realfavicongenerator.net/ pour la marche à suivre)

#!/bin/bash
# Ce script permet de générer les favicon nécessaires pour ếtre prises en comptes par la majorité des navigateurs. Ce script essaye de suivre les recommandations de https://realfavicongenerator.net/ :)

###############################################
# AVANT: créer deux fichier .png :            #
# un carré et un rectangle (pour windows) )   #
###############################################
 
original_file_square=/home/michael/test_favicon/baselogo-square-transparent.png
original_file_rect=/home/michael/test_favicon/baselogo.png
dest_path=/home/michael/test_favicon/

##############################################

# convert logo-base.png -extent 300x300! logo-square.png

args=("$@")
#echo ${args[0]}
#echo ${args[1]}
do_xml=0
do_ico=0
do_apple=0
do_ms=0
do_chrome=0

for i in $@; do
    if [ $i == '--xml' ]; then
        do_xml=1
    fi

    if [ $i == '--ico' ]; then
        do_ico=1
    fi

    if [ $i == '--apple' ]; then
        do_apple=1
    fi

    if [ $i == '--ms' ]; then
        do_ms=1
    fi

    if [ $i == '--chrome' ]; then
        do_chrome=1
    fi

done
#BEST:
#convert logo.png  -crop 2290x1300+630+80 logo-base.png
#SQUARE:
#convert logo.png  -size 2290x2290 -crop 2290x1300+630+80 logo-base.png
#exit


if [ $do_xml -eq 1 ]; then
    echo "do xml"
else
    echo "skip browserconfig";
fi



if [ $do_ico -eq 1 ]; then
    echo "do ico…"
    convert $original_file_square -resize 96x96 ${dest_path}favicon.png
    # The classic favicon, displayed in the tabs.
    convert $original_file_square -resize 16x16 ${dest_path}favicon-16x16.png
    # For Safari on Mac OS.
    convert $original_file_square -resize 32x32 ${dest_path}favicon-32x32.png
    convert $original_file_square -resize 48x48 ${dest_path}favicon-48x48.png
    # For Google TV.
    convert $original_file_square -resize 96x96 ${dest_path}favicon-96x96.png
    # Used by IE, and also by some other browsers if we are not careful.

        #${dest_path}favicon-96x96.png \
    convert \
        ${dest_path}favicon-16x16.png \
        ${dest_path}favicon-32x32.png \
        ${dest_path}favicon-48x48.png \
        ${dest_path}favicon.ico
fi

#convert $original_file_square -resize 70x70 ${dest_path}favicon-70x70.png

if [ $do_apple -eq 1 ]; then
    echo "do apple …"
    convert $original_file_square -resize 57x57 ${dest_path}apple-touch-icon-57x57.png
    convert $original_file_square -resize 60x60 ${dest_path}apple-touch-icon-60x60.png
    convert $original_file_square -resize 72x72 ${dest_path}apple-touch-icon-72x72.png
    convert $original_file_square -resize 114x114 ${dest_path}apple-touch-icon-114x114.png
    convert $original_file_square -resize 120x120 ${dest_path}apple-touch-icon-120x120.png
    convert $original_file_square -resize 144x144 ${dest_path}apple-touch-icon-144x144.png
    convert $original_file_square -resize 152x152 ${dest_path}apple-touch-icon-152x152.png
    convert $original_file_square -resize 180x180 ${dest_path}apple-touch-icon-180x180.png
    convert $original_file_square -resize 57x57 ${dest_path}apple-touch-icon.png
    #convert $original_file_square -resize 57x57 -round ${dest_path}apple-touch-icon-precomposed.png
fi

if [ $do_ms -eq 1 ]; then
    echo "do ms …"
    # for Windows 8 / IE11
    convert $original_file_square -resize 70x70   ${dest_path}mstile-70x70.png
    convert $original_file_square -resize 144x144 ${dest_path}mstile-144x144.png
    convert $original_file_square -resize 150x150 ${dest_path}mstile-150x150.png
    convert $original_file_square -resize 310x310 ${dest_path}mstile-310x310.png
    convert $original_file_rect -resize 310x150 ${dest_path}mstile-310x150.png
browserconfig='<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
	<msapplication>
		<tile>
			<square70x70logo src="/mstile-70x70.png"/>
			<square150x150logo src="/mstile-150x150.png"/>
			<wide310x150logo src="/mstile-310x150.png"/>
			<square310x310logo src="/mstile-310x310.png"/>
			<TileColor>#009900</TileColor>
		</tile>
	</msapplication>
</browserconfig>
'
echo "$browserconfig" > ${dest_path}browserconfig.xml
fi

if [ $do_chrome -eq 1 ]; then
    echo "generating for chrome …"
    # For Android Chrome M39+ with 0.75 screen density.
    convert $original_file_square -resize 36x36   ${dest_path}android-chrome-36x36.png
    #     For Android Chrome M39+ with 1.0 screen density.
    convert $original_file_square -resize 48x48   ${dest_path}android-chrome-48x48.png
    #     For Android Chrome M39+ with 1.5 screen density.
    convert $original_file_square -resize 72x72   ${dest_path}android-chrome-72x72.png
    #     For Android Chrome M39+ with 2.0 screen density.
    convert $original_file_square -resize 96x96   ${dest_path}android-chrome-96x96.png
    #     For Android Chrome M39+ with 3.0 screen density.
    convert $original_file_square -resize 114x114   ${dest_path}android-chrome-114x114.png
    #     For Android Chrome M39+ with 4.0 screen density.
    convert $original_file_square -resize 192x192 ${dest_path}android-chrome-192x192.png
fi

 

 

[QuickStart] Thélia – brouillon/prises de notes

Cela fait 3 ans que j’ai quitté Prestashop, et que je m’intéressais à Thélia sans jamais oser l’essayer « pour de vrai ».

Je me suis lancé, et en moins de 10 minutes le nouveau site était en ligne. il m’a quand même fallu une petite demi journée pour me familiariser avec l’interface et être capable de rendre la boutique exploitable (question de configuration des messages, moyens de paiement, etc.).

Je commence cet article sans être vraiment « à l’aise » avec le code mais il me semble à priori beaucoup plus clair et stable que ce que j’ai pu voir avant :) .

Au sommaire

  1. Conclusion sur Thélia
  2. L’installation (à partir de rien, jusqu’à la mise en ligne « basique »)
  3. Adaptation de la Configuration à mes besoins
  4. Personnalisation plus importante

Conclusion

  • +++ installation / opérations de maintenance en ligne de commande
  • +++ Code solide
  • +++++ Symfony2
  • +++++ Utilisation intelligente de Smarty (si vous voyez ici une critique importante de PrestaShop, c’est tout à fait ça :) )
  • +++ fonctions de base (ajout produits/catégories ok)
  • ±±± On ne peut pas ordonner les produits dans chaque catégorie, uniquement la principale, mais ça va changer !!
  • — Mauvaise surprise d’arrondis que paypal refuse… du coup modification du module pour n’envoyer que le total commande. Mais bon c’est un problème présent sur tous les cms d’ecommerce.
  • — rajouter un transporteur n’est pas facile (ou je m’y prends mal)
  • — offrir les frais de ports à partir d’un certain montant n’est pas très simple
  • — les fonctions de bases, ok, mais il manque d’autres fonctions très utiles à un site d’e-commerce (faut que je fasse une liste)
  • — Mise à jour manuelle (pour l’instant … * teasing * )

Les fonctions de bases sont là: produits, catégories, commandes, clients. Il n’y a pas de paillette, l’interface admin est propre.

Les différences avec Prestashop ne sont pas très « visible » (l’essentiel se passe sous le code), mais j’étais surpris de la rapidité avec laquelle une action en back-office était traité (Ajouter un produit, une catégorie, un module, changer une traduction, une config, …).

Coté code source, les fichiers occupent (dépot git uniquement) 109M pour Thélia contre 231M pour PrestaShop , mais le chiffre augmente beaucoup pour Thélia après installation car il se base sur le framework Symfony, PHPUnit et autre librairies, là où prestashop n’utilise rien d’autre que Smarty (et très très mal, mais c’est un autre sujet !).

Thélia propose nativement l’installation en ligne de commande (c’est par là que je vais commencer), utilise une version encore maintenu de PHP, des normes qui respectent les « bonnes pratiques de développement », bref tout pour plaire. Ah, c’est libre aussi !

 

Préparer l’installation (download, dépendances)

suivre les instructions, installer les dépendances, entre les php composer et apt-get install php5-curl ou php5-mcrypt  (au passage je déplore que seul composer soit disponible, en tant que développeur j’aurais préféré un git submodule update –init –recursive )

Installation (génération du sql, config de base)

curl -sS https://getcomposer.org/installer | php
php composer.phar install # download and install EVERYTHING
php Thelia # affiche des erreurs si database.yml existe déjà et est mal configuré
php Thelia thelia:install # me demande d'augmenter "post_max_size" à 20M au moins alors que je suis en ligne de commande
# du coup je le fais pour /etc/php5/cli et /etc/php5/apache2 (droit root requis)
sudo sed -i "s/^post_max_size = .*/post_max_size = 32M/" /etc/php5/cli/php.ini
sudo sed -i "s/^post_max_size = .*/post_max_size = 32M/" /etc/php5/apache2/php.ini
# et ça m'indiquait quelques autres paquets à installer, selon ce que j'avais déjà
apt-get install php5-intl php5-mcrypt php5-md php5-curl
# je peux enfin installer Thélia ! bon, je met user toor sans mot de passe
php Thelia thelia:install --db_host=localhost --db_username=toor --db_name=thelia --db_password=secret_password
# …
# ça marche et y'a plein de message vert dans la console (c'est rassurant, surtout la fin "config file created with success. Your thelia is installed")
# …
php Thelia admin:create # créé un premier administrateur

Voilà pour l’install de base (pas très utilisable avec le logo thélia d’origine et toutes les valeurs par défaut). Voyons voir maintenant ce que je peux personnaliser rapidement sans trop me fatiguer …

Personnalisation minimale

J’ai trouvé tout de suite ce qu’il fallait faire (après avoir longtemps cherché :/ ) d’abord dans l’administration, puis dans les fichiers sur le serveur

Configuration de la boutique (français et euros uniquement)

Version courte: je regarde ce qui est dispo dans la partie « configuration » et je met ce que je veux.

La boutique aura des clients français, je vais donc mettre par défaut la bonne langue, et même désactiver les autres (au pire, je pourrais toujours les remettre j’imagine !)

Ah.. et en fait je vais carrément supprimer les autres langues, car apparemment on ne peux pas juste les désactiver :/ (Au passage au lieu de « Langues et URLs » j’aurais plutôt mis « Langues et Domaines »

Devises, je ne veux que des euros.

Informations sur la boutique, je sais quoi mettre (adresse, téléphone, email, …)

Administrateur: je créé un 2eme compte admin pour un pote qui n’est pas dev (car la boutique c’est pour lui, et en plus il me fait des retours pertinents sur ce qui ne marche pas ou ce qui n’est pas clair).

Le logo de la boutique

version courte : sautez ce paragraphe, c’est même pas du reverse engineering…

Apparemment les développeurs ne se sont pas fatigué à faire une fonction pour changer facilement de logo. C’est une position qui se défend, mais du coup, ça demande un minimum de connaissance technique, ou d’avoir en main une documentation qui indique comment faire (ce que je n’ai pas trouvé) (pour l’instant).

C’est pas grave, je me débrouille (clic droit, regarder la source, hop je navigue sur le serveur, et je change le logo à la main qui se trouve dans /assets/frontOffice/default/template-assets/assets/dist/img/9d31666.gif ). Je verrai plus tard (apparemment il y a du cache :) )

Page d’accueil (config basique)

Version courte: je veux les « nouveaux produits », je coche la case « c’est un nouveau produit » dans leur fiche.

Bon comme je ne sais pas trop ce que je veux, je vais juste activer le module « nouveau produits » (j’en ai déjà créé 2, ils devraient apparaitre). Rien ne s’affiche, je cherche longtemps (je vide les cache avec php Thelia cache:clear  (et perd du coup mon logo, zut, je refais la manip précédente), mais rien ne marche.. Je pose la question sur twitter, et je trouve juste après une case à cocher « ceci est un nouveau produit » dans la fiche produit, donc j’efface ma question :)

Un thème perso

Version courte: je copie celui par défaut / j’édite la configuration des variables / je met mon logo / j’édite le layout.tpl

Je ne vais pas me lancer dans le fait de faire un thème perso compliqué. Mais je cherche comment faire pour le savoir pour plus tard. Et puis c’est facile, ça doit être dans templates/ . Plus précisément pour l’instant je m’intéresse qu’au look extérieur, donc le frontOffice. Facile !

cp -r templates/frontOffice/default templates/frontOffice/perso
sed -i "s/domain='fo.default'/domain='fo.perso'" templates/frontOffice/perso/layout.tpl templates/frontOffice/perso/ajax/order-delivery-module-list.html templates/frontOffice/perso/includes/addedToCart.html

(La 2eme ligne permet de corriger le problème de traduction que j’ai eu dans le paragraphe suivant)

Je vais en suite sur le back office de ma boutique pour changer la variable concernée dans http://localhost/admin/configuration/variables ( active-front-template )

Thélia est mal traduit (ah non, c’est encore ma faute)

Premier test d’achat de produit (en activant le module chèque), j’ai trouvé pas mal de termes qui sont en anglais (donc la traduction manque?). Ça m’étonne je croyais que Thélia était plutôt sérieux. Tant pis, je cherche. Pour le coup, le système de traduction est assez proche de celui de PrestaShop (je ne me sens pas très dépaysé), et donc je dois modifier la config php pour autoriser au minimum 1100 champs dans un envoi post (au moins Thélia me prévient, c’est gentil :) , mais je me dit qu’un truc en ajax pour sauver les champs que l’on modifie un par un pourrait être une contribution future plutôt utile de ma part ).

Bref, je cherche d’abord à changer « Derniers produits » en « Dernières parutions » (oui, je préfère ça pour la boutique que je prépare). Et j’en profite pour traduire les termes qui me manque… et qui sont en fait déjà traduit ! Je ne comprends pas trop donc qu’un bug aussi énorme (c’est traduit dans le BO, mais ça reste en anglais) soit dans une version pourtant stable..

En fait, (apparemment) le thème par défaut contenait {default_translation_domain domain='fo.default'} et il y avait un problème (quelque part, je sais pas où) entre le fait d’utilisé le thème nommé « perso » et les traductions de « default »

Configuration module de paiement

La encore je ne suis pas dépaysé, on dirait encore du PrestaShop, mais plus beau, plus rapide et avec moins de bug :)

 

 

Installer qwerty-lafayette

Qwerty-Lafayette, c’est là : http://fabi1cazenave.github.io/qwerty-lafayette/

(Basé sur : http://simos.info/blog/archives/1134 )

# 1 – download layout

wget https://raw.githubusercontent.com/fabi1cazenave/qwerty-lafayette/master/lafayette.xkb

# 2 – enlever les 80 premières lignes + le « }; » à la fin

tail, head, etc.

# 3 – ajouter dans /usr/share/X11/xkb/symbols/fr

cat lafayette.xkb >> /usr/share/X11/xkb/symbols/fr

# 4 – ajouter dans evdev.xml and base.xml

dans la balise `variableList` adéquate (fr donc :) )

/usr/share/X11/xkb/rules/base.xml
/usr/share/X11/xkb/rules/evdev.xml
-----

 <variant>
 <configItem>
 <name>lafayette</name>
 <description>French (coding, Qwerty-Lafayette)</description>
 <languageList><iso639Id>fra</iso639Id></languageList>
 </configItem>
 </variant>

# 5 – vérifier qu’il n’y a pas d’erreur et que le fichier « fr » se recharge bien

setxkbmap fr

# 6 – tester la variation lafayette

setxkbmap fr lafayette

Sous Ubuntu (unity), le raccourci pour changer de langue est +

avec i3, j’utilise <super> + <w> pour tourner entre en/fr/fr-lafayette

Et ces lignes pour afficher le layout actuel dans la barre i3:

i3status --config ~/.i3/i3status-light | while :
do
read line
        LG=$(setxkbmap -print | grep xkb_symbols | awk -F"+" '{print $2}')
        echo "LG: $LG | $line" || exit 1
done

(voir ici : https://github.com/Asenar/dotfiles/blob/master/i3/keymap.sh )

un peu d’admin sys

Outils pratique pour débutant (parce qu’il faut bien commencer quelquepart).

  • logwatch : envoi un rapport sur les événements des dernières 24h, avec le nombre de tentative de connexion ssh et diverses stats qui peuvent être utiles.
  • shorewall  : outil pour gérer iptables (à configurer)
  • mrtg          : graphiques et stats de traffic et d’utilisation (à configurer)
  • rkhunter   : recherche si le serveur est infecté ou si des fichiers « importants » ont été modifiés (penser à utiliser `rkhunter –propupd` après un `apt-get upgrade`
  • chkrootkit : détermine si la machine est infectée par un rootkit

  • cron-apt: vérifie tous les jour si le serveur doit être mis à jour. (a configurer)
  • clamav : détecte trojans, viruses, malware, …
  • spamassassin : détermine si un email est un spam (utile si on utilise la machine comme serveur de mail)

 

shorewall

pour gérer iptables avec des fichiers de configuration.
installation : apt-get ?
utilisation  : editer les fichiers /etc/shorewall  & service start
config : nécessaire, un peu complexe
http://biowikifarm.net/meta/Server_ports_and_shorewall_installation

mrtg

pour avoir des stats temps réel sur l’état de santé de la machine (cpu, hits apache, traffic réseau)
Installation: apt-get ?
Utilisation : (se cron
utiliser cfgmaker > mrtg.cfg / indexmaker mrtg.cfg > index.html
config : nécessaire
difficulté moyenne
http://blog.nicolargo.com/2010/02/mrtg-un-tutoriel-simple-et-rapide.html
http://www.onlamp.com/pub/a/bsd/2000/10/05/Big_Scary_Daemons.html

rkhunter

cherche les trucs louche sur la machine (malware, rootkit, faille potentielles)
installation: apt-get
utilisation: se lance en cron tout seul comme un grand
configuration : nécessaire si vous voulez recevoir un rapport par mail
/etc/rkhunter.conf ( MAIL-ON-WARNING )
/etc/default/rkhunter ( REPORT_EMAIL pour recevoir tous les rapports)
plutot simple
la commande –propupd est à connaitre

chkrootkit

détermine si la machine est infectée par un rootkit
installation: apt-get
utilisation: exécuter en root
configuration: rien de particulier

spamassassin

pour filtrer les spams
installation:
utilisation:
configuration:

logwatch

recevoir un rapport journalier (ou plus, ou moins) sur ce qui s’est passé sur le serveur
installation:
utilisation:
configuration:

cron-apt

exécuter un apt-cron –update automatique et recevoir un message quand une mise à jour est à faire
installation:
utilisation:
configuration:

vim colorscheme

Note: bon, va falloir contribuer à highlight.js pour que vim soit ajouté on dirait …

 
"progressively check higher values... falls out on first "true"
" (note addition of zero ... this guarantees return from function is numeric
 if strftime("%H") < 6 + 0
 colorscheme darkblue
 echo "setting colorscheme to darkblue"
 elseif strftime("%H") < 12 + 0
 colorscheme morning
 echo "setting colorscheme to morning"
 elseif strftime("%H") < 18 + 0
 colorscheme shine
 echo "setting colorscheme to shine"
 else
 colorscheme evening
 echo "setting colorscheme to evening"
 endif

script to quickly create vhost + dir + chrooted sftp user

Attention ! This script is a draft. A lot of checks are not made.

Note: This require a little configuration in /etc/ssh/sshd_config

#!/bin/bash
# File : new-site
# Author: Michaël Marinetti
# Description: Create a new vhost named "foo.com", for the user "foo"
# and add him to the sftp user (which is chrooted).
# Default vhost does not allow php.
#
# Created : 2012-07-21
# Modified :
#
# CHANGELOG
#
# TODO
# * apache check vhost syntax
# * template file for vhost
# * config file for default values
# * add --help and --verbose
# *

DEFAULT_MAIL=default.mail.to.use@example.com
# ServerAdmin mail
ADMINMAIL=admin@example.com

sitename="$1"
usermail="$2"

apache_sites_dir=/etc/apache2/sites-available
base_dir=/home/web
if (test "$usermail" = "" ) then
usermail=$DEFAULT_MAIL

fi

if (test "$sitename" = "" ) then
echo "error, sitename empty. USAGE: new-site [sitename] [user email]"
exit 1
fi

# test if this name is valid and available
valid_name=`echo "$sitename"|grep '^[0-9a-z.-]*\.\(com\|net\|fr\|org\|info\)$'`

if ( test "$valid_name" != "$sitename") then
echo "invalid domain name: must match the regex #^[a-z.-]*\.(com|net|fr|org|info)$#"
exit 2
fi

user=$(echo $sitename|sed 's#\(.*\)\.[^.]*#\1#' )

if ( test -e "$base_dir/$user" ) then
echo "oO, directory already exists"
exit 3
fi

if ( test -e "$apache_sites_dir/$sitename" ) then
echo "oO, vhost already exists"
exit 4
else
echo "no vhost of that name present (this is normal) "
fi

# creating user for that directory only :)
# username is, by default, the domain name without ".fr/.com" at the end
user=$(echo $sitename|sed 's#\(.*\)\.[^.]*#\1#' )
# let's generate an easy to remember random password with apg
pass=`apg -q -a 0 -n 1 -M NCL`
pass_crypted=$(perl -e "print crypt($pass, 'password')");

# creating directory with correct rights :)
mkdir -p $base_dir/$user/www $base_dir/$user/prive

useradd -s /bin/false -M -d $base_dir/$user -g sftp -p $pass_crypted $user
if (test $? -eq 0 ) then
echo "user $user created."
else
echo "User $user NOT CREATED...... MAYBE ALREADY EXIST ?"
fi

chown root:sftp $base_dir/$user -R && chmod 755 $base_dir/$user/www -R

chmod g+w $base_dir/$user/www $base_dir/$usr/prive
#@TODO use a template file
echo "ici" > $base_dir/$user/www/index.html

chmod +x $base_dir/$user -R

tmpfile=`mktemp`

vhost_def="
ServerAdmin $ADMINMAIL
ServerName $sitename
ServerAlias www.$sitename

php_admin_value engine off

Options FollowSymLinks
AllowOverride None


DocumentRoot /home/web/$user/www

Options FollowSymLinks
AllowOverride None


Options -Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all


# Possible values include: debug, info, notice, warn, error, crit, alert, emerg.
LogLevel warn
ErrorLog \${APACHE_LOG_DIR}/error-$sitename.log
CustomLog \${APACHE_LOG_DIR}/access-$sitename.log combined

"
echo "$vhost_def" > $tmpfile

echo "$vhost_def"

echo "Validate (no will open edit) (y/n) ?"
read pouet
if (test "$pouet" != "y" -a "$pouet" != "Y") then
echo "Edition vhost ..."
# vim +":r! cat $tmpfile" $apache_sites_dir/$sitename
vim $tmpfile
fi

cp $tmpfile $apache_sites_dir/$sitename
# always cleaning after works is done
rm $tmpfile

echo "I'm really proud of that script which
- create vhost
- create sftp user and chroot him.
- m'envoie tout ça !

host $sitename
user $user
pass $pass
"|mail -s "sftp - new user password" $usermail
# how to handle password ?
# passwd
# how to send all this informations :p

# enabling vhost
a2ensite $sitename

# reload apache :)
service apache2 restart