Il est possible d'avoir le dock Gnome-Shell affiché en permanence afin d'avoir un apérçu des fenêtres ouvertes.
Il faut dans un premier temps installer l'extension Dock.
Par défaut il sera à droite et s'affichera lorsque vous le survolerez. Si vous voulez l'afficher en permanance, utilisez la commande:
dconf write "/org/gnome/shell/extensions/dock/autohide" false
Si vous voulez placer le dock à gauche:
dconf write "/org/gnome/shell/extensions/dock/position" "'left'"
jeudi 4 juillet 2013
mardi 2 juillet 2013
STunnel (SSL) + HAProxy + Debian Squeeze
Il est possible d'ajouter un pont SSL à la configuration HAProxy du billet précédent
openssl req -new -nodes -x509 -out /etc/stunnel/stunnel.pem -keyout /etc/stunnel/stunnel.pem
Aller dans le répertoire /etc/stunnel et corriger les droits du certificat:
chown stunnel4:stunnel4 stunnel.pem
Sauvegarder la configuration par defaut:
mv /etc/stunnel/stunnel.conf /etc/stunnel/stunnel.conf.bck
Puis éditer le fichier le fichier de configuration pour avoir:
sslVersion = all
options = NO_SSLv2
chroot = /var/lib/stunnel4/
setuid = stunnel4
setgid = stunnel4
; PID is created inside the chroot jail
pid = /stunnel.pid
socket = l:TCP_NODELAY=0
socket = r:TCP_NODELAY=1
output = /var/log/stunnel.log
[mon.domain.com]
cert = /etc/stunnel/stunnel.pem
accept = 192.168.0.20:443
connect = 192.168.0.20:80
TIMEOUTclose = 0
Il faut modifier les IP mentionnées dans 'accept' et 'connect' avec votre adresse IP publique pour le 'accept' et l'adresse où se trouve HAProxy pour le 'connect'
Enfin, il faut modifier le fichier /etc/default/stunnel4 pour permettre à stunnel de se lancer en modifiant la ligne
service stunnel restart
Vous avez maintenant un Load balancer (HAProxy) avec une connectivité chiffré grâce à stunnel
Step 1 : installer stunnel
apt-get install stunnelStep 2 : générer le certificat
openssl req -new -nodes -x509 -out /etc/stunnel/stunnel.pem -keyout /etc/stunnel/stunnel.pem
Aller dans le répertoire /etc/stunnel et corriger les droits du certificat:
chown stunnel4:stunnel4 stunnel.pem
Step 3 : Configurer
Sauvegarder la configuration par defaut:
mv /etc/stunnel/stunnel.conf /etc/stunnel/stunnel.conf.bck
Puis éditer le fichier le fichier de configuration pour avoir:
sslVersion = all
options = NO_SSLv2
chroot = /var/lib/stunnel4/
setuid = stunnel4
setgid = stunnel4
; PID is created inside the chroot jail
pid = /stunnel.pid
socket = l:TCP_NODELAY=0
socket = r:TCP_NODELAY=1
output = /var/log/stunnel.log
[mon.domain.com]
cert = /etc/stunnel/stunnel.pem
accept = 192.168.0.20:443
connect = 192.168.0.20:80
TIMEOUTclose = 0
Il faut modifier les IP mentionnées dans 'accept' et 'connect' avec votre adresse IP publique pour le 'accept' et l'adresse où se trouve HAProxy pour le 'connect'
Enfin, il faut modifier le fichier /etc/default/stunnel4 pour permettre à stunnel de se lancer en modifiant la ligne
- ENABLED=0
- ENABLED=1
Step 4 : relancer stunnel
Vous pouvez maintenant relancer stunnel:service stunnel restart
Vous avez maintenant un Load balancer (HAProxy) avec une connectivité chiffré grâce à stunnel
lundi 1 juillet 2013
HAProxy et Debian Squeeze
HAProxy permet de faire du load balancing entre plusieurs serveurs. Il peut faire de l'équilibrage de charge entre plusieurs Tomcat ou encore entre plusieurs serveurs de streaming. La configuration qui va suivre va le faire pour 2 Tomcat et 2 serveurs qui peuvent accepter un flux TCP.
Ce qui est suit fonctionne sur une Debian Squeeze.
apt-get install haproxy
Sauvegarder le fichier par defaut :
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bck
puis éditons ce fichier : vi /etc/haproxy/haproxy.cfg
Comme dit plus haut, nous allons rediriger le traffic HTTP vers 2 Tomcat en prenant soin de prendre l'éventuelle session Tomcat ouverte sur les serveur.
Nous allons rediriger aussi 1 flux TCP venant sur le port 3637 vers un des serveurs prenant en charge ces flots.
global
daemon
maxconn 256
log 127.0.0.1 local0
defaults
retries 3
option logasap
log global
timeout connect 5000ms
timeout client 600000ms
timeout server 600000ms
listen TOMCAT :80
mode http
option httplog
balance roundrobin
option redispatch
option httpclose
option forwardfor
cookie JSESSIONID prefix
server liferay_server1 192.168.0.26:8080 cookie tomcat1 check
server liferay_server2 192.168.0.27:8080 cookie tomcat2 check
stats uri /admin?stats
stats realm haproxy
stats scope .
listen VOTRE_PROTOCOLE :3637
mode tcp
option tcplog
balance leastconn
server mscodec_1 192.168.0.31:3637
server mscodec_2 192.168.0.32:3637
Pour le protocole sur le port 3637, il est possible d'utiliser la configuration:
listen VOTRE_PROTOCOLE :3637
mode tcp
option tcplog
balance leastconn
server mscodec_1 192.168.0.31:3637 check
server mscodec_2 192.168.0.32:3637 check
Le mot clé 'check' va indiquer à HAproxy de vérifier régulièrement si le service est disponible sur le serveur indiqué
Ce qui est suit fonctionne sur une Debian Squeeze.
Step 1 : installer
apt-get install haproxy
Step 2 : configurer
Editer le fichier /etc/default/haproxy pour remplacer- ENABLED=0
- ENABLED=1
Sauvegarder le fichier par defaut :
cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bck
puis éditons ce fichier : vi /etc/haproxy/haproxy.cfg
Comme dit plus haut, nous allons rediriger le traffic HTTP vers 2 Tomcat en prenant soin de prendre l'éventuelle session Tomcat ouverte sur les serveur.
Nous allons rediriger aussi 1 flux TCP venant sur le port 3637 vers un des serveurs prenant en charge ces flots.
global
daemon
maxconn 256
log 127.0.0.1 local0
defaults
retries 3
option logasap
log global
timeout connect 5000ms
timeout client 600000ms
timeout server 600000ms
listen TOMCAT :80
mode http
option httplog
balance roundrobin
option redispatch
option httpclose
option forwardfor
cookie JSESSIONID prefix
server liferay_server1 192.168.0.26:8080 cookie tomcat1 check
server liferay_server2 192.168.0.27:8080 cookie tomcat2 check
stats uri /admin?stats
stats realm haproxy
stats scope .
listen VOTRE_PROTOCOLE :3637
mode tcp
option tcplog
balance leastconn
server mscodec_1 192.168.0.31:3637
server mscodec_2 192.168.0.32:3637
Pour le protocole sur le port 3637, il est possible d'utiliser la configuration:
listen VOTRE_PROTOCOLE :3637
mode tcp
option tcplog
balance leastconn
server mscodec_1 192.168.0.31:3637 check
server mscodec_2 192.168.0.32:3637 check
Le mot clé 'check' va indiquer à HAproxy de vérifier régulièrement si le service est disponible sur le serveur indiqué
Step 3 : relancer HAProxy
service haproxy restartmercredi 29 mai 2013
SVN, supprimer les fichiers non 'versionnés'
svn -R revert . ne suffit pas pour revenir à un état des répertoires similaires à celui du dépôt. La commande suivante devrait arriver à bout du problème :
svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r
Source
svn status | grep ^\? | cut -c9- | xargs -d \\n rm -r
Source
mardi 7 mai 2013
Maven et paquet Debian
Il est possible de réaliser un paquet Debian avec Maven en s'aidant du plugin JDeb
Dans l'exemple qui suit, j'ai fait un programme Java qui va logguer un message toute les 5 secondes. J'utilise dans cette exemple Lombok , SLF4 et le @Scheduled de Spring . Il sera lancer comme service au lancement de l'OS.
Les sources de l'exemple sont sur github.
Dans l'exemple qui suit, j'ai fait un programme Java qui va logguer un message toute les 5 secondes. J'utilise dans cette exemple Lombok , SLF4 et le @Scheduled de Spring . Il sera lancer comme service au lancement de l'OS.
Les sources de l'exemple sont sur github.
Fichier control
Pour la réalisation du paquet, il est nécessaire d'avoir un fichier control contenant les informations de votre paquet tel que son nom, sa version, ses dépendances...
Dans l'exemple, j'ai mis 2 dépendances pour illustrer cette utilisation :
- dos2unix interviendra dans le script de post-installation (postinst) pour s'assurer que le script de lancement est bien au format unix.
- sudo sera utilisé pour lancer le service avec l'utilisateur approprié
Scripts de pre et post-installation
L'installation d'un paquet peut aussi faire intervenir des scripts avant la phase d'installation de votre application et après installation de votre application. Vous pouvez faire intervenir les scripts :
- preinst : avant installation
- postinst : après installation
- prerm : avant désinstallation
- postrm : après désinstallation
Je met l'ensemble de ces fichiers dans le répertoire src/main/deb/control de mon projet :
Dans cet exemple, le script de pre-installation vérifie par exemple l'existence d'un utilisateur dédié au lancement du service. Il va aussi préparer l'arborescence pour le bon fonctionnement du service.
Le script de post-installation utilisera la commande update-rc.d pour inscrire le service et le démarrera.
Fichier init.d
Pour lancer et arrêter le service, j'utilise le fichier jdeb-tips.sh que j'ai mis dans le répertoire src/main/deb/init.d
J'ai utilisé et modifié un template provenant d'ici.
pom.xml
Step 1
Ayant utilisé des propriétés Maven dans les fichiers du répertoire src/main/deb, je les copies dans le répertoire 'target' en utilisant le filtragre :
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<id>copy-deb-package-resources</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/deb</outputDirectory>
<resources>
<resource>
<directory>src/main/deb</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
Step 2
Je récupère les dépendances pour permettre une exécution autonome du programme :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
Step 3
J'utilise ensuite maven-jar-plugin pour réaliser mon Jar exécutable :
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>libs/</classpathPrefix>
<mainClass>fr.gunduz.tips.jdeb.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
Step 4
Enfin, l'utilisation du plugin JDeb. Ce qui est important de noter dans ce qui suit est comment indiquer au plugin où ce trouve les fichiers control grâce à la balise <controlDir>. Etant donnée que j'ai copié les fichiers -afin qu'ils soient valués- dans le répertoire target, il faut absolument utiliser cette balise.
Le reste de la configuration indique uniquement les fichiers à inclure dans le paquet deb ainsi que les répertoires de destination et leurs propriétés.
<plugin>
<artifactId>jdeb</artifactId>
<groupId>org.vafer</groupId>
<version>1.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jdeb</goal>
</goals>
<configuration>
<verbose>true</verbose>
<controlDir>${basedir}/target/deb/control</controlDir>
<dataSet>
<data>
<src>${project.basedir}/target/libs</src>
<type>directory</type>
<mapper>
<type>perm</type>
<prefix>${debian.target.dir}/jdeb-tips/libs/</prefix>
<user>jdeb-tips</user>
<group>jdeb-tips</group>
<filemode>644</filemode>
</mapper>
</data>
<data>
<src>${basedir}/target/${project.build.finalName}.jar</src>
<dst>${debian.target.dir}/jdeb-tips/${project.build.finalName}.jar</dst>
<type>file</type>
<mapper>
<type>perm</type>
<user>jdeb-tips</user>
<group>jdeb-tips</group>
<filemode>644</filemode>
</mapper>
</data>
<data>
<src>${basedir}/target/deb/init.d/jdeb-tips.sh</src>
<dst>/etc/init.d/jdeb-tips</dst>
<type>file</type>
<mapper>
<type>perm</type>
<user>root</user>
<group>root</group>
<filemode>755</filemode>
</mapper>
</data>
</dataSet>
</configuration>
</execution>
</executions>
</plugin>
Construction et installation
Il vous suffit de lancer la commande mvn clean install pour avoir votre paquet Debian. Pour l'installer sur le système hôte, il faudra utiliser la commande dpkg -i <votre paquet>.
Attention, si vos dépendances ne sont pas installées au préalable à l'aide d'apt, la commande dpkg retournera une erreur.
samedi 24 novembre 2012
tomcat-maven-plugin, Tomcat 7, tomcat:deploy et un 403
Si vous vous retrouvez face à une erreur 403 en utilisant la commande mvn tomcat:deploy, c'est que l'URL permettant le déploiement a été modifié. Il faut changer la configuration du plugin pour avoir :
[...]
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<url>http://localhost:8080/manager/html</url>
[...]
</configuration>
</plugin>
[...]
[...]
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<configuration>
<url>http://localhost:8080/manager/html</url>
[...]
</configuration>
</plugin>
[...]
lundi 5 mars 2012
Tomcat, Spring, JNDI & Oracle
Step 1:
Ajouter le JAR du driver Oracle dans le répertoire common/lib de Tomcat. S'assurer que dans le catalina.properties, la variable common.loader contient bien
Step 2:
Dans le fichier
<resource
auth="Container"
driverclassname="oracle.jdbc.driver.OracleDriver"
factory="oracle.jdbc.pool.OracleDataSourceFactory"
maxactive="40" maxidle="3"
maxopenpreparedstatements="100" maxwait="10000"
name="jdbc/oracleDataSource" password="password"
poolpreparedstatements="true"
type="oracle.jdbc.pool.OracleDataSource"
url="jdbc:oracle:thin:@oracle_host:oracle_port:oracle_sid"
username="username" validationquery="SELECT SYSDATE FROM DUAL">
</resource>
Step 3:
Dans le fichier web.xml
<resource-ref>
<description>Connection Pool</description>
<res-ref-name>jdbc/oracleDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Step 4:
Déclaration du data source dans le fichier de context Spring
<bean class="org.springframework.jndi.JndiObjectFactoryBean" id="dataSource">
<property name="jndiName" value="java:comp/env/jdbc/oracleDataSource"></property>
<property name="resourceRef" value="true"> </property>
<property name="proxyInterface" value="javax.sql.DataSource"></property>
<property name="lookupOnStartup" value="true"></property>
</bean>
Step 5:
Modifier les valeur maxActive, maxWait... pour qu'ils correspondent aux besoins.
...avec Maven et Cargo plugin
Ajouter la dépendance vers la librairie Oracle dans votre POM :
<dependency>
<groupid>com.oracle</groupid>
<artifactid>ojdbc5</artifactid>
<version>${oracle.version}</version>
<type>jar</type>
</dependency>
Dans la configuration du plugin cargo, dans la section 'container', ajouter la dépendance vers la librairie Oracle:
<pluginmanagement>
<plugins>
...
<plugin>
<groupid>org.codehaus.cargo</groupid>
<artifactid>cargo-maven2-plugin</artifactid>
<version>1.1.3</version>
<configuration>
<container>
<containerid>tomcat6x</containerid>
...
<dependencies>
<dependency>
<groupid>com.oracle</groupid>
<artifactid>ojdbc5</artifactid>
<classpath>extra</classpath>
</dependency>
</dependencies>
</container>
</configuration>
</plugin>
</plugins>
</pluginmanagement>
Réaliser un fichier tomcat-context.xml dans un répertoire de resource (par exemple, resource/conf/) avec pour contenu :
<context>
<resource
auth="Container"
driverclassname="oracle.jdbc.driver.OracleDriver"
factory="oracle.jdbc.pool.OracleDataSourceFactory"
maxactive="40" maxidle="3" maxopenpreparedstatements="100"
maxwait="10000" name="jdbc/oracleDataSource" password="password"
poolpreparedstatements="true" type="oracle.jdbc.pool.OracleDataSource"
url="jdbc:oracle:thin:@oracle_host:oracle_port:oracle_sid"
username="username" validationquery="SELECT SYSDATE FROM DUAL">
</resource>
Finalement, modifier la configuration du plugin cargo :
<plugins>
<plugin>
<groupid>org.codehaus.cargo</groupid>
<artifactid>cargo-maven2-plugin</artifactid>
<executions>
<execution>
<id>start-cargo</id>
<phase>pre-integration-test</phase>
<goals>
<goal>${cargo.goal}</goal>
</goals>
<configuration>
<container>
<timeout>200</timeout>
</container>
<configuration>
<properties>
<cargo .servlet.port=".servlet.port">${servlet.port}</cargo>
</properties>
<deployables>
<deployable>
<groupid>application.group.id</groupid>
<artifactid>myapp</artifactid>
<type>war</type>
</deployable>
...
</deployables>
<configfiles>
<configfile>
<file>${project.build.directory}/test-classes/tomcat-context.xml</file>
<todir>conf/</todir>
<tofile>context.xml</tofile>
</configfile>
...
</configfiles></configuration></configuration></execution></executions></plugin>
</plugins>
Ajouter le JAR du driver Oracle dans le répertoire common/lib de Tomcat. S'assurer que dans le catalina.properties, la variable common.loader contient bien
${catalina.base}/common/lib/*.jarStep 2:
Dans le fichier
context.xml du répertoire conf de Tomcat, ajouter la ressource suivante :<resource
auth="Container"
driverclassname="oracle.jdbc.driver.OracleDriver"
factory="oracle.jdbc.pool.OracleDataSourceFactory"
maxactive="40" maxidle="3"
maxopenpreparedstatements="100" maxwait="10000"
name="jdbc/oracleDataSource" password="password"
poolpreparedstatements="true"
type="oracle.jdbc.pool.OracleDataSource"
url="jdbc:oracle:thin:@oracle_host:oracle_port:oracle_sid"
username="username" validationquery="SELECT SYSDATE FROM DUAL">
</resource>
Step 3:
Dans le fichier web.xml
<resource-ref>
<description>Connection Pool</description>
<res-ref-name>jdbc/oracleDataSource</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
Step 4:
Déclaration du data source dans le fichier de context Spring
<bean class="org.springframework.jndi.JndiObjectFactoryBean" id="dataSource">
<property name="jndiName" value="java:comp/env/jdbc/oracleDataSource"></property>
<property name="resourceRef" value="true"> </property>
<property name="proxyInterface" value="javax.sql.DataSource"></property>
<property name="lookupOnStartup" value="true"></property>
</bean>
Step 5:
Modifier les valeur maxActive, maxWait... pour qu'ils correspondent aux besoins.
...avec Maven et Cargo plugin
Ajouter la dépendance vers la librairie Oracle dans votre POM :
<dependency>
<groupid>com.oracle</groupid>
<artifactid>ojdbc5</artifactid>
<version>${oracle.version}</version>
<type>jar</type>
</dependency>
Dans la configuration du plugin cargo, dans la section 'container', ajouter la dépendance vers la librairie Oracle:
<pluginmanagement>
<plugins>
...
<plugin>
<groupid>org.codehaus.cargo</groupid>
<artifactid>cargo-maven2-plugin</artifactid>
<version>1.1.3</version>
<configuration>
<container>
<containerid>tomcat6x</containerid>
...
<dependencies>
<dependency>
<groupid>com.oracle</groupid>
<artifactid>ojdbc5</artifactid>
<classpath>extra</classpath>
</dependency>
</dependencies>
</container>
</configuration>
</plugin>
</plugins>
</pluginmanagement>
Réaliser un fichier tomcat-context.xml dans un répertoire de resource (par exemple, resource/conf/) avec pour contenu :
<context>
<resource
auth="Container"
driverclassname="oracle.jdbc.driver.OracleDriver"
factory="oracle.jdbc.pool.OracleDataSourceFactory"
maxactive="40" maxidle="3" maxopenpreparedstatements="100"
maxwait="10000" name="jdbc/oracleDataSource" password="password"
poolpreparedstatements="true" type="oracle.jdbc.pool.OracleDataSource"
url="jdbc:oracle:thin:@oracle_host:oracle_port:oracle_sid"
username="username" validationquery="SELECT SYSDATE FROM DUAL">
</resource>
Finalement, modifier la configuration du plugin cargo :
<plugins>
<plugin>
<groupid>org.codehaus.cargo</groupid>
<artifactid>cargo-maven2-plugin</artifactid>
<executions>
<execution>
<id>start-cargo</id>
<phase>pre-integration-test</phase>
<goals>
<goal>${cargo.goal}</goal>
</goals>
<configuration>
<container>
<timeout>200</timeout>
</container>
<configuration>
<properties>
<cargo .servlet.port=".servlet.port">${servlet.port}</cargo>
</properties>
<deployables>
<deployable>
<groupid>application.group.id</groupid>
<artifactid>myapp</artifactid>
<type>war</type>
</deployable>
...
</deployables>
<configfiles>
<configfile>
<file>${project.build.directory}/test-classes/tomcat-context.xml</file>
<todir>conf/</todir>
<tofile>context.xml</tofile>
</configfile>
...
</configfiles></configuration></configuration></execution></executions></plugin>
</plugins>
Inscription à :
Articles (Atom)