jeudi 25 novembre 2010

Port forwarding à l'aide de iptable

Ip/Port rewriting


Ces commandes se passent en root

Ip table permet de forwarder des ports d'une machine vers une autre.

Les instructions sont à renouveler à chaque démarrage de la machine




#Réécriture du port d'un paquet
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 1521 -j DNAT --to 55.6.110.96:1521

iptables -A INPUT -p tcp -m state --state NEW --dport 1521 -i eth0 -j ACCEPT
#Sécurité par défaut autorise l'accès à la chaine forward
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/ip_forward

# Pour intercepter les paquets à destination d'une ip différente de celle de l'interface

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE



Pour lister les chaines principales



iptable -L



Pour lister toutes les de nat (ip/port rewriting)



iptables -L -t nat



Pour supprimer les règles



iptables -F -t nat

jeudi 4 novembre 2010

Utiliser apache en frontal et forwarder les ports sur un Jetty

Je veux mettre en place un apache frontal lequel délègue sa requête à un serveur archiva ouvert sur le port 8081. Seul le port 80 est ouvert sur le réseau. Je ne souhaite pas de connecteur complexe, car il ne s'agit pas d'une question de performance.
Pour ce faire, j'ai utilisé le mod_proxy de apache et les virtualHost.

<IfModule mod_proxy.c>
ProxyRequests Off

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

<VirtualHost archiva:80>
ServerAdmin webmaster@dummy-host.example.com
ProxyPass / http://archiva:8081/
ProxyPassReverse / http://archiva:8081/
ErrorLog logs/dummy-host.example.com-error_log
CustomLog logs/dummy-host.example.com-access_log common
</VirtualHost>




mardi 28 septembre 2010

Créer un partage Webdav sur Ubuntu 10.4

Installer WebSAV sur apache2


Ajouter les lignes suivantes dans le fichier /etc/apache2/sites-available/default

<Directory "/var/www/webdav/">
Options Indexes FollowSymLinks MultiViews
AllowOverride None
Order allow,deny
allow from all
</Directory>
Alias /webdav /var/www/webdav/
<Location /webdav>
DAV On
AuthType Basic
AuthName "webdav"
AuthUserFile /var/www/.passwd.dav
Require valid-user
DavMinTimeout 600
<LimitExcept GET PUT HEAD OPTIONS POST>
Require valid-user
</LimitExcept>
</Location>


Gérer les droits


Puis nous allons créer les mots de passe.
htpasswd -c /var/www/.passwd.dav myuser
chown root:www-data /var/www/.passwd.dav
chmod 640 /var/www/.passwd.dav
chmod -R 0777 /var/www/webdav
chown www-data:www-data /var/www/webdav
/etc/init.d/apache2 restart

jeudi 10 juin 2010

Intégration continue avec Hudson et Maven

Environnement


Avant de donner la recette pour la mise en oeuvre de hudson, nous
allons donner quelques définitions. En effet, certains termes
utilisé dans ce document ont un sens variable suivant le
contexte.

Précisons d'abord les rôles des différents
environnements :

  • Environnement d'Intégration : sert à
    valider manuellement que le le comportement du produit est
    identique sur les environnements de développement et sur la
    plateforme cible. L'environnement d'intégration doit être
    un clone des plateformes de production.

  • Environnement Intégration continue : sert à
    valider automatiquement que le le comportement du produit est
    identique sur les environnements de développement et sur la
    plateforme cible. L'environnement d'intégration doit être
    un clone des plateformes de production.

  • Environnement de Validation :
    sert à vérifier
    que le produit est conforme aux spécifications.


Jeu de test :
Ensemble de données nécessaires au passage d'un test

Test unitaire : Théoriquement
il s'agit d'un test vérifiant une exigence, mais dans ce
document, nous l'utiliserons dans son acception consacrée
test
Junit
.

Bénéfices de l'intégration
continue


Dans les configurations de développement JAVA« standard »,
le codage s'effectue sur Windows et l'intégration s'effectue
sur LINUX/UNIX, il est donc fréquent d'avoir des surprises au
moment de passer sur l'environnement cible, les environnements
d'intégration permettent anticiper les problèmes
techniques.
L'intégrateur identifie les dysfonctionnements et les
corrige. Malheureusement, dans la plupart des configurations projet,
personne n'étant affecté exclusivement à
l'intégration et les soucis d'intégration tendent à
être reléguées aux dernières tâches.

Au delà de l'effet de mode, le principal bienfait de
l'intégration continue sera d'améliorer la visibilité
de ces problématiques.
L’intégration continue valide automatiquement le
produit sur la plateforme cible.


  • Permet de détecter au plus tôt les problèmes
    de dépendance aux environnements : File System, Encoding,
    Case-sensitive, performances etc.
  • Permet de lisser le stress dans l'équipe (plus de
    pression dans les phases précoces, moins au moment de la
    livraison)

  • Il donne une aperçu de la qualité du produit au
    chef de projet et donne confiance au moment de la livraison
    .

Impacts structurants de l'intégration
continue


Contraintes de codage


L'ensemble des projets sur le référentiel de source
doit être compilable à tout moment.

Pour l'intégration continue, le développeur est
contraint d'écrire des tests unitaires.

Test unitaires

Dans un monde systématique, chaque exigence devrait être
vérifiée par un test unitaire, inversement, chaque test
unitaire devrait se mettre en relation avec une seule exigence.
Cependant, dans le monde réel, un test unitaire pourra être
associé à plusieurs exigences, une exigence pourra
n'être pas couverte... etc. In fine le développeur
arbitrera (mais avec un minimum d'expérience, cela se passe
bien. )
A chaque TU est associé un jeu de tests, mais aucune
hypothèse de données préalable ne peut être
faite. Que l'on parte d'une base totalement vidangée ou pleine
de donnée, le résultat du test unitaire doit être
le même. D'autre part, le séquence des TU ne doit pas
non plus conditionner le résultat.

Ressources



  • L’intégration
    requiert un serveur dédié pour hudson
  • Il faut une base de données
    par utilisateur

    (Elle peux se situer sur la machine de
    développement ou sur un serveur mutualisé)

Contrainte de conception



  • Il faut utiliser maven pour
    l'assemblage
  • Les test unitaires doivent être
    écrit avec Junit

Au quotidien



  • Il faut vraiment s’impliquer
    dans la supervision des builds et être vigilant tout au long
    du développement du produit : codage, intégration,
    validation
  • L'équipe doit s'organiser
    dans ce but, c'est-à-dire qu'il faut un responsable
    Intégration Continue (le même que le responsable GCONF)


Mise en oeuvre




  • Installer un serveur hudson
  • Planifier les tâches à des horaires où la
    machine n'est pas trop chargée

De The French Hack

De The French Hack

De The French Hack

mercredi 26 mai 2010

Transaction explicites sous Spring et JPA dans les applications Batch

Il m'a été difficile d'utiliser une application de traitement batch utilisant Hibernate, JPA. En utilisant des transactions explicite.

J'avais le message "org.hibernate.SessionException: Session is closed!"

Pour démmarrer le contexte transactionnel, j'ai utilisé les lignes suivantes


DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setName("MaTransaction");
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
/** pour démarrer le context transactionnel */
transactionManager.getTransaction(def);


Comment économiser de la mémoire :
- Faire des commit intermédiaires

Comment gagner de la vitesse :
- Faire des insertions et des select dans une table est une opération couteuse (car le recalcul des index prend de plus en plus de temps)

mardi 25 mai 2010

Changer le splash screen sur Ubuntu 10.4

http://maketecheasier.com/change-login-and-boot-screen-in-ubuntu-lucid/2010/05/13

mardi 4 mai 2010

Utilisation des curseurs dans Mysql


DELIMITER |
CREATE PROCEDURE updateTable()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE description_population_type2 TEXT;
DECLARE nom_monentite_type2 CHAR(50);
DECLARE cur1 CURSOR FOR select nom_monentite, description_population from sp_monentite where id_gp=2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
REPEAT
FETCH cur1 INTO nom_monentite_type2, description_population_type2;
IF NOT done THEN
UPDATE sp_monentite
SET description_population = description_population_type2
WHERE nom_monentite_type2=nom_monentite AND id_gp=1;
END IF;
UNTIL done END REPEAT;
CLOSE cur1;
END|


Procédure stockée