lundi 19 avril 2010

bash :script de remplacement

Voici un petit script utile, pour effectuer des remplacements de masse dans des fichiers de configuration ... (testé sous cygwin)

voici un super lien : un super cours

a noter:
que le premier caractère après le sed est son délimiteur .. du coup, ici c'est très pratique car les slash sont très embêtant .. ici j'ai choisi @ ...

et le if en bash qui s'effectue simplement avec $? == 0 (teste si la dernière commande s'est bien déroulée)

une astuce simple pour tester les expressions arithmétiques :

echo $(( 5 > 7))
1





#!/bin/bash

chaineATrouver=/5
chaineARemplacer=/3

files=`find . -name "rebuild.*" `
echo "remplacement de la chaine [${chaineATrouver}] par [${chaineARemplacer}]"
for file in ${files}
do
echo "traitement du fichier [${file}]"
sed -e "s@${chaineATrouver}@${chaineARemplacer}@g" ${file} > ${file}.new
if [ $? == 0 ]
then
if [ -e "${file}.new" ]
then
mv "${file}" "${file}.old"
mv "${file}.new" "${file}"
else
echo "le fichier [${file}.new]n'existe pas"
fi
else
rm -v *.new
fi
done

echo 'fin du traitement'

mercredi 14 avril 2010

oracle: locker une table ....

Voici, une manière de locker une table via une commande oracle

LOCK TABLE UNE_TABLE IN EXCLUSIVE MODE

Oracle : script d'import de base

Voici un jolie script d'import d'un SID nommé "copieProd" une base nommée "maBDD", et du user "userProd" vers mon "userCopieProd"


#!/bin/ksh
# procedure restauration base de recette
set -x
CDATE=`date '+%Y%m%d'`
LOG=/logs/import_monSchema_${CDATE}.log
export ORACLE_HOME=/oracle/app/product/9.2.0.7
export PATH=$ORACLE_HOME/bin:$PATH
echo "debut de import_sid.ksh " > $LOG
date >> $LOG
cd /logs

date >> $LOG
echo "\nDebut de l'import" >> $LOG
#definition variable
export ORACLE_SID=copieProd
export DB_NAME=maBDD
mknod pipe_${DB_NAME} p

# decompression du dump
nohup uncompress pipe_${DB_NAME} & >> $LOG

#lancement de ma commande d'import
imp system/manager file=pipe_${DB_NAME} log=imp_${DB_NAME}_${CDATE}.log fromuser=userProd touser=userCopieProd buffer=104857600 commit=y
rm pipe_${DB_NAME} >> $LOG

date >> $LOG
echo "\nFin de l'import" >> $LOG

# Calcul des statistiques ${DB_NAME}
date >> $LOG
echo "\nCalcul des statistiques de ${DB_NAME}" >> $LOG
su - oracle -c "/users/oracle/admin/calc_stats_sid.ksh ${DB_NAME}" >> $LOG

lundi 5 avril 2010

unix / linux : bash scripts compteur

petit script utilisant des variables ...

#!/bin/bash
echo "demarrage analyse FS";
ptsMontages=`df -k`;



((i=0));
((first=0));
((val=1));
for currentPt in $ptsMontages;
do
((i++));
if test $i -ge 8
then
((first++));
((val=first%7));
fi

if test $val -eq 0
then
echo "trouve [$i] [$first] [$val]= [$currentPt]";
fi
done
echo "fin analyse FS";


jeudi 18 mars 2010

J2EE : faire une servlet / un bouchon de telechargement

Pour ce projet, il faut créer un projet web, et faire un war qui sera exporté et deployer sur le serveur cible.

Voici, un exemple de code de la méthode doGet :


// TODO Auto-generated method stub
File f = new File("D:/temp/zones.pdf");
int length = 0;
ServletOutputStream op = resp.getOutputStream();
ServletContext context = getServletConfig().getServletContext();
String mimetype = context.getMimeType("D:/temp/zones.pdf");

//
// Set the response and go!
//
//
resp.setContentType((mimetype != null) ? mimetype
: "application/octet-stream");
resp.setContentLength((int) f.length());
String original_filename = "zones.pdf";
resp.setHeader("Content-Disposition", "attachment; filename=\""
+ original_filename + "\"");

//
// Stream to the requester.
//
byte[] bbuf = new byte[4096];
DataInputStream in = new DataInputStream(new FileInputStream(f));

while ((in != null) && ((length = in.read(bbuf)) != -1)) {
op.write(bbuf, 0, length);
}

in.close();
op.flush();
op.close();
}


Et voila, c'est fini, et vous obtenez une popup qui vous propose d'enregistrer le pdf.

vendredi 12 mars 2010

J2EE : apache + weblogic

J'ai rencontré un problème bizarre sur une application sur laquelle je travaille ... Cette application web lance un traitement très long plus de 5 minutes .... (c'est pas bien et c'est mal conçu mais ce n'est pas moi qui l'ai fait ... ). Et la j'ai un problème très bizarre ...

Je clique sur ma page et le formulaire "POST" est envoyé, le traitement commence, et au bout de 5 minutes (300s) comme par magie, je recois un nouveau POST et un nouveau traitement se lance et ça par en vrille !!!

Après avoir cherché pas mal de temps, il semblerait que le plugin "apache weblogic" relance une requete POST car il n'a pas eu de réponse au bout du temps par defaut (WLIOTimeoutSecs)(300s)


<VirtualHost 10.14.51.139>
ServerName bocvalobod3.si.fret.sncf.fr
ServerAlias bocvalobod3
<IfModule mod_weblogic.c>
WebLogicHost bocvalobod2.si.fret.sncf.fr
WebLogicPort 11132
WLIOTimeoutSecs 600
idempotent ON
</IfModule>
<Location />
SetHandler weblogic-handler
</Location>
</VirtualHost>



Voici une solution, qui consiste à configurer le plugin et a augmenter la valeur du timeout !!

mardi 2 mars 2010

J2EE : EAR / WAR / JAR / EJB

Comment parteger des jars entre une ou plusieurs webapps, et par exemples des modules ejbs ?

supposons que nous ayons une application de type EAR nommé monApplicationEntreprise.ear.

Ce dernier est composé de 2 webApps (frontOffice.war, backOffice.war), et de 2 modules EJBs nommés frontOffficeServices.jar et backOfficeServices.jar). Chacun de ces jar ont besoin de framework.jar.

1) Une première méthode consisiterais à copier les jars dans chacun des répertoires WEB-INF/lib de chacune des webapps. Cependant, cela conduit à une augmentation importante de la taille des EAR.

Afin de ne pas copier ce jar, nous allons le mettre dans l'EAR au niveau APP-INF/LIB, et la référencer dans le MANIFEST des webapps et des ejbs.

Voici la cible :

monApplicationEntreprise.ear
|
|-- META-INF
| |-- application.xml
|
|-- APP-INF
| |-- lib
| |-- framework.jar
|
|-- frontOffice.war
| |-- META-INF
| |--MANIFEST.MF
|
|-- backOffice.war
| |-- META-INF
| |--MANIFEST.MF
|
|-- backOfficeServices.jar
| |-- META-INF
| |--MANIFEST.MF
| |--ejb-jar.xml
|
|-- frontOfficeServices.jar
|-- META-INF
|--MANIFEST.MF
|--ejb-jar.xml



Voici pour mémoire, le descripteur de deploiement de EAR:


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title>Nouveau2</title>
</head>
<body>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC

"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
<display-name>mon application entreprise</display-name>
<description>EAR de mon application entreprise frontOffice</description>
<module>
<ejb>frontOfficeServices.jar</ejb>
</module>
<module>
<ejb>backOfficeServices.jar</ejb>
</module>
<module>
<web>
<web-uri>frontOffice.war</web-uri>
<context-root>/frontOffice</context-root>
</web>
</module>
<module>
<web>
<web-uri>backOffice.war</web-uri>
<context-root>/backOffice</context-root>
</web>
</module>
</application>
</body>
</html>


Ensuite, pour chacune des applications, il nous faut éditer les MANIFEST.MF des applications, et y ajouter la balise classpath (attention, il faut le couper au 60ième caractères, le plus simple étant d'utiliser des outils comme maven pour générer l'ensemble ...)


Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: enwoo
Build-Jdk: 1.4.2_19
buildDate:
svnrevision:
Class-Path: APP-INF/lib/framework.jar APP-INF/ APP-INF/lib/lo
g4j-1.2.11.jar




Voici pour mémoire un exemple de descripteur d'ejbs:

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
<meta name="generator" content="PSPad editor, www.pspad.com">
<title>ejb-jar</title>
</head>
<body>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/dtd/ejb-jar_2_0.dtd">
<ejb-jar>
<display-name>frontOfficeServices</display-name>
<enterprise-beans>
<session>
<display-name>FrontOfficeServices</display-name>
<ejb-name>FrontOfficeServices</ejb-name>
<home>com.ejb.FrontOfficeServicesHome</home>
<remote>com.fr.sncf.fret.boctarification.ejb.FrontOfficeServices</remote>
<local-home>com.ejb.FrontOfficeServicesLocalHome</local-home>
<local>com.ejb.FrontOfficeServicesLocal</local>
<ejb-class>com.ejb.FrontOfficeServicesBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
</enterprise-beans>
<assembly-descriptor>
<container-transaction>
<method>
<ejb-name>FrontOfficeServices</ejb-name>
<method-name>*</method-name>
</method>
<trans-attribute>Required</trans-attribute>
</container-transaction>
</assembly-descriptor>
</ejb-jar>
</body>
</html>