java jmx port and the rmi port

java, c’est désespérant. le port jmx est sympa mais il redirige vers un port rmi random, quand on n’est pas au courant ça énerve. Quand on est au courant on se demande pourquoi, et aussi on échafaude des tunnels ssh avec proxy -D. Finalement la solution simple est d’ajouter un fix du port rmi, sur le même port que jmx

-Dcom.sun.management.jmxremote.port=$PORTJMX \
-Dcom.sun.management.jmxremote.rmi.port=$PORTJMX \

(le même port ???!!!)

en comparaison, j’ai passé quelques semaines avec elasticsearch, nodejs, bower, yo, angularjs, etc, et je ne trouve pas de post à faire, autre que ‘whaou’.

 

Pocket

ELK : Elastic by design

Le titre ne veut rien dire. Juste ça jette.
Comme beaucoup, j’ai mis en place eliastic+logstash+kibana, comme indiqué dans la démo. On a choisi des logs, et assez vite visualisé les graphes dans kibana. C’est joli.

Ensuite on explore les contours de l’outil :
– logstash est un peu capricieux,
bien sûr ils veulent tous le dernier java(8) et leurs dernières versions E2L2k2, mais ils tournent sur jruby c’est bien plus la classe, du coup pas de souci sur Solaris. La syntaxe de conf de logstash est naze, pourquoi ils n’utilisent pas ruby(ou alors c’est du ruby??), json, ou yml, c’est batard. Et dans logstash l’astuce qui n’est pas dans la doc est qu’il faut un seul logstash qui tourne, qui charge les fichiers de log et qui les tague dans input{type=>’toto’ } , ensuite dans filter{} on ajoute un if [type]==’toto'{}.

elastic fait son job, il découpe tout en petit morceaux de mots, pour la recherche fulltext (moteur lucene). et il discute en REST et JSON.

Kibana fait un peu son minimum, et ça m’étonne qu’il n’y ait pas de remplaçant, avec de meilleures visualisations.
Apparemment c’est simple de faire une requete elastic, récupérer les data, et reformatter pour une visu D3JS. ça me tente d’essayer.

Petite déception quand on a deux logs genre apache+weblogic avec un java_session_id qui devrait regrouper plusieurs logs de chaque fichier. Eh ben c’est pas bien fait pour. il y a bien un lien parent-child qui existe mais pas possible pour le moment de l’utiliser dans kibana. On peut ruser quand on a des équivalences 1-1 ou 1-0 : forcer l’id et utiliser des actions update+upsert pour fabriquer un document avec les items des deux logs. bref.

Il faut voir ça comme un petit outil – big data little tool.

Pocket

wordpress to templates

Je commence à bien aimer wordpress,

même s’il range toutes les données dans post & post-meta,

même s’il galère sur l’import export,

et sur la gestion des langues.

Par contre ce qui me chiffonne c’est l’affichage du html.

J’avais pris les bonnes habitudes du templating (prestashop/smarty et mon template perso) et je constate que par défaut le code développeur et le code html sont toujours mélangés.

ça n’est pas qu’une question d’habitude, c’est une séparation du travail : l’un récupère du contenu (get_post ou select ou wget ou node etc) et le met en forme en vue de l’afficher, et l’autre (l’artiste) place les élément harmonieusement sur une page web.

Pour contourner toutes les fonctions de base de wordpress qui affichent un résultat au lieu de le rendre (the_title() = echo get_the_title() ) ce bout de code moche :

 

function m3d_the_get($fnc,$argf=array()){
ob_start();
//anything smarter ?
switch(count($argf)){
case 0: $fnc();break;
case 1: $fnc($argf[0]);break;
case 2: $fnc($argf[0],$argf[1]);break;
case 3: $fnc($argf[0],$argf[1],$argf[2]);break;
case 4: $fnc($argf[0],$argf[1],$argf[2],$argf[3]);break;
case 5: $fnc($argf[0],$argf[1],$argf[2],$argf[3],$argf[4]);break;
case 6: $fnc($argf[0],$argf[1],$argf[2],$argf[3],$argf[4],$argf[5]);break;
case 7: $fnc($argf[0],$argf[1],$argf[2],$argf[3],$argf[4],$argf[5],$argf[6]);break;
default: echo "ERR $fnc(args)";break;
}
return(ob_get_clean());
}
 
 
/*
example : 
$tt["header"]=m3d_the_get('get_header');
$tt["breadcrumb"]=m3d_the_get('get_template_part',array('includes/breadcrumb'));
while ( have_posts() ) { the_post();
 $tt["post"][]=m3d_something_to_tt($post->id);
}
print filtpl_compile("somepage.htm",$tt);
*/

je n’en suis qu’au début (bientôt les templates parts) et faudra ranger pour éviter les récursions, mais je sens que ça va me plaire..

inspiré de https://kovshenin.com/

 

Pocket

Solaris réactionnaire: sftp localhost -oPort=1988

Solaris est un vieux con.

On le savait, il met en avant son vieux grep qui ne fait pas de -r ni ne -E. Oh il veut bien des nouveauté, pour amuser les jeunes quand ils passent le week end. Cherchez où je l’ai rangé votre truc, chez xavier-pierre-gilles IV /xpg4/, ou sir frank william /sfw/ .

C’est bien les commandes unix, quand tu les tape sans argument ça de donne la doc :

 

bash-3.2$ sftp
Usage: sftp [-vC1] [-b batchfile] [-o option] [-s subsystem|path]
[-F config] [-P direct server path] [-S program] [-B buffer_size]
[-R num_requests] [user@]host[:file [file]]
 
bash-3.2$ sftp localhost -oPort=1988
Connecting to localhost...
Password:

Hey mais je n’ai rien qui tourne sur ce port ?

Eh oui, c’est auto-documenté, il faut mettre le port AVANT.
Non ça n’est pas une erreur, pas besoin de message.

note: sur la prochaine version de Solaris , la touche backspace va effacer le caractère avant le curseur. (no it’s a joke)

 

Pocket

microsoft phone virus : +78649873

C’est un archaïque et surprenant hacking social qui appelle le téléphone et se présente comme Microsoft (ben voyons..) pour m’avertir qu’il y a un virus sur mon PC personnel… (+78649873 est le numéro qui s’affiche)

La personne est une femme avec un accent trop américain. Comme je suis Européen elle fait l’effort d’être plus intelligible. Une fois devant le PC, je dois faire Windows-R eventvr , mais ça c’est déjà la version courte. “do you see the key with the label ‘ctrl’ ? what is the key on the right ? press it, keep it pressed, and hit the key ‘L’ like ‘Lobot’ ” c’est là que j’ai décelé un accent chinois… “‘R’ like ‘Robot'” . c’est assez ironique de choisir le mot ‘Robot’ …

Dans l’event viewer il te fait croire que les messages rouge de windows/application viennent de l’internet et signalent des virus.

Malheureusement je n’ai pas eu la patience de continuer pour voir quand on allait me demander ma CB ou un mot de passe ou d’installer un troyen (please install vnc, send spams, execute format c: ) la suite de l’histoire est sur le net : ils installent un troyen en passant par une page à visiter ou même teamviewer (!) .

https://www.google.fr/search?hl=fr&q=t%C3%A9l%C3%A9phone+se+fait+passer+pour+microsoft

microsoft fc-2010 rtl rtl.be dhnet luxembourg
(note : “chipoter” en belge se traduit par “bricoler” en français)

ça existe depuis 2010, ça revient à la mode en ce moment (aout 2015) : soyez vigilant et prévenez les personnes âgées ou “vulnérables” de votre entourage.

 

Pocket

nouveautés de la rentrée

Après 15 j de vacances, je reviens avec un oeil nouveau sur le monde virtuel, et encore des nouveautés dans les erreurs :

 

– /dev/null est devenu un fichier

-rw-rw-rw-. 1 root root  Jun 17 11:26 /dev/null

du coup sshd ne démarre plus = argh

sshd -d ou -e

sshd daemon() failed: No such device

merci google (tu te souviens avant google ? on connaissait tous les endroit où il y avait des docs : man, share/docs, sunsolve, et il existait aussi des CDs de knowledge base pour les boites de support)

http://www.linuxquestions.org/questions/linux-networking-3/sshd-fatal-daemon-failed-no-such-device-279664/

rm /dev/null && mknod /dev/null c 1 3

crw-rw-rw-. 1 root root 1, 3 Jun 17 11:26 /dev/null

autre minitruc

sur AIX

find /somewhere/libs -follow -name dddd
find: bad status– libxmlrpc.so

en fait c’est juste du à un lien mort

ls -l : … libxmlrpc.so -> libxmlrpc-epi.so.0.0.3

et libxmlrpc-epi.so.0.0.3 qui n’existe pas

—-

pas intéressant mais voilà  notre quotidien : toujours nouveau

Pocket

powershell , microsoft custom properties for sharepoint

Nouveau challenge, ranger pleins de documents automatiquement dans sharepoint. Revu à la baisse, sur les documents doc et xls il suffira de positionner des “custom properties”. l’onglet en plus qu’on a sur clic-droit-propriété.

La semaine dernière j’étais donc favorablement surpris par powershell. Par sa syntaxe souple et familière, cool sur les majuscules, les antislashes, la complétion, le mode debug, les paramètres, les déclarations, et un peu la doc.

 

#
#`http://blogs.technet.com/b/heyscriptingguy/archive/2010/04/06/hey-scripting-guy-how-can-i-add-custom-properties-to-a-microsoft-word-document.aspx
# get-executionpolicy /# set-executionpolicy remotesigned
# set-psdebug -off /# set-psdebug -trace 2
#
# Product name Ant
# ContentType Document
# Product type Web
# Doc Type TCD (Tech Config Doc)
#
Param (
[string]$file = "",
[string]$Producttype = "",
[string]$ContentType = "Document",
[string]$DocType = "",
[string]$Productname = ""
)
if ($file -eq "") { Write-Host "usage -file \\xxx\PTI-apache-9.9.99.doc [(optional params deducted from filename:) -Producttype Web -ContentType DOC -DocType PTI -Productname apache ]" ; Exit;}
if ( -Not (Test-Path $file)) { Write-Host "ERR -file $file : this file does not exists" ; Exit;}
if ( Test-Path $file -pathtype container ) { Write-Host "ERR -file $file : this is a folder" ; Exit;}
Write-Host "$file"
$filesl = $file.replace('\','/')
$pathsl = $filesl -replace '/[^/]*$',''
$fname = $filesl.replace("$pathsl/",'')
$pathsl = $pathsl.replace('/','\')
$fext = $fname -replace '^.*\.([^\.]*)$','$1'
$ftype = $fname.substring(0,3)
if ($ftype.tolower() -eq 'ebr') { $ftype = $fname.substring(0,6) }
if ($ftype.tolower() -eq 'spe') { $ftype = $fname.substring(0,4) }
$ftxd=$ftype
if ($ftype.tolower() -eq 'pti') { $ftxd='TID' }
if ($ftype.tolower() -eq 'pte') { $ftxd='TOD' }
if ($ftype.tolower() -eq 'spec') { $ftxd='TDD' }
$fappver=$fname.replace($ftype,'').replace(".$fext","") -replace '^[-\.]',''
$fapp=$fappver -replace '[-\.].*$',''
$fver=$fappver -replace "^$fapp[-\.]",''
#$papp = $pathsl -replace '^.*('/','\')
 
if ($DocType -eq '') {$DocType = $ftxd } # unless forced in param
if ($Productname -eq '') {$Productname = $fapp } # unless forced in param
if ($Producttype -eq '') {$Producttype = "Web";
if ($Productname -eq "mysql") {$Producttype="Database"}
if ($Productname -eq "vtom") {$Producttype="Tooling"}
}# unless forced in param
 
#try to stick to official : 
$off_txd=( "TDD (Tech Design Doc)", "TID (Tech Install Doc)", "unknown");
$off_app=("Apache", "ProFTPd","unknown");
ForEach($offi in $off_txd){if ($offi -match "^$DocType") {$DocType=$offi;break;}}
ForEach($offi in $off_app){if ($offi -match "^$Productname") {$Productname=$offi;break;}}
 
if ($fext.toLower() -match 'doc')
{
$application = New-Object -ComObject word.application
$application.Visible = $false
$document = $application.Documents.open($file)
}
if ($fext.toLower() -match 'xls')
{
$application = New-Object -ComObject Excel.Application
$application.Visible = $false
$document = $application.Workbooks.open($file)
}
if ( -Not ($document)) { Write-Host "ERR -file $file : $fext extension = ignored" ; Exit;}
 
$binding = "System.Reflection.BindingFlags" -as [type]
 
$customProperties = $document.CustomDocumentProperties
$typeCustomProperties = $customProperties.GetType()
 
[array]$arrayCPk = "Product name","ContentType","Product type","Doc Type"
[array]$arrayCPv = $Productname,$ContentType,$Producttype,$DocType
for($CPi=0; $CPi -lt 4; $CPi++){
$CustomProperty = $arrayCPk[$CPi]
$Value = $arrayCPv[$CPi]
 
#set custom prop
[array]$arrayArgs = $CustomProperty,$false, 4, $Value
Try
{
$typeCustomProperties.InvokeMember(`
"add", $binding::InvokeMethod,$null,$customProperties,$arrayArgs) |
out-null
}
Catch [system.exception]
{
$propertyObject = $typeCustomProperties.InvokeMember(`
"Item", $binding::GetProperty,$null,$customProperties,$CustomProperty)
$typeCustomProperties.InvokeMember(`
"Delete", $binding::InvokeMethod,$null,$propertyObject,$null)
$typeCustomProperties.InvokeMember(`
"add", $binding::InvokeMethod,$null,$customProperties,$arrayArgs) |
Out-Null
}
}
 
#set title
$propertyName='Title'
$value=$fname
$binding = "System.Reflection.BindingFlags" -as [type]
$builtinProperties = $document.BuiltInDocumentProperties
[Array]$getArgs = $propertyName
$builtinPropertiesType = $builtinProperties.GetType()
$builtinProperty = $builtinPropertiesType.InvokeMember( "Item", $binding::GetProperty, $null, $builtinProperties, $getArgs)
$builtinPropertyType = $builtinProperty.GetType()
[Array]$setArgs = $value
$builtinPropertyType.InvokeMember( "Value", $binding::SetProperty, $null, $builtinProperty, $setArgs)
 
$document.Saved = $false
$document.save()
$application.quit()
$application = $null
[gc]::collect()
[gc]::WaitForPendingFinalizers()

Comme pour les films, on est peu à peu moins enthousiaste quand le temps a passé.

Ici on voit :
– que les syntaxes et objets de mises à jour de custom properties sont lourdes, différentes entre doc et xls, différente pour le titre.
– que d’autres lignes de code (de validation par exemple) sont aussi cryptiques et sont bien sûr copiées d’exemples venant de MSDN.

Donc en gros c’est l’API microsoft qui est désespérante, tandis que le code autour est pas mal. ça date de 2007. voilà, on n’est pas fâché mais c’est pas suffisant pour l’adopter, même à la place des .BAT .

Pocket

reverse symbolic links

c’est bien plus beau quand c’est inutile :

j’installe un apache , donc dans /var/www /usr/share/apache2 /var/log/httpd /var/run/httpd.pid pour schématiser

mais j’ai un DSI maniaque obsessionnel, il veut que tout soit bien rangé dans /data /softs /logs/ ;

qu’à cela ne tienne, embobinons le avec des liens symboliques

 

/softs/apache/share -> /usr/share/apache2
/softs/apache/bin/httpd -> /usr/bin/httpd
/data/apache/data -> /var/www
/data/apache/config -> /etc/apache2.d
/data/run/httpd.pid -> /var/run/httpd.pid
/logs/apache -> /var/log/httpd

Voilà c’est joli, il n’est pas au centre et pourtant il tourne, comme dirait Galilée.

Mais le DSI est technobsessionnel, il veut que ça aille dans les bon filesystems,
le plus simple est de ne rien renommer mais d’inverser les liens symboliques

-> devient <- , ben voyons…

 

#!/bin/sh
act=$1
apps=$2
 
 
 
DRH_softs="redhat"
DRH_logs="redhat/redhat"
DRH_appli="redhat/redhat"
 
# build apps list
if [ "$apps" = "" ];then
 apps=""
 for rdd in `ls -d /softs/*/redhat /appli/*/redhat/redhat /logs/*/redhat/redhat`;do
 app=`echo $rdd|sed -e "s:/redhat.*$::" -e "s:^.*/::"`
 apps="$apps $app"
 done
 apps=`echo "$apps"|tr " " "\n"|sort -u|tr "\n" " "`
fi
 
echo "$0 [link,tar,unlink]:$act [apps]:$apps"
if [ "$act" = "" ];then exit 10;fi
 
 
for app in $apps;do
 
#count links
 cntl=5
 cntf=0
 for s in appli softs logs;do
 cnt=`find /$s/$app/redhat/ -type l |grep -v /tools/|grep -v /conf|wc -l`
 cntl=`expr $cntl + $cnt`
 cnt=`find /$s/$app/redhat/ -type f |grep -v /tools/|grep -v /conf|wc -l`
 cntf=`expr $cntf + $cnt`
 done
 if [ "$cntl" -ge "$cntf" ];then isapplnk=1;else isapplnk=2;fi
 echo "$app $cntl links, $cntf files : "
 if [ "$isapplnk" = "1" ];then echo "ok to tar or link";fi
 if [ "$isapplnk" = "2" ];then echo "ok to unlink";fi
 isok=0
 if [ $act = "link" ];then if [ "$isapplnk" = "1" ];then isok=1;fi;fi
 if [ $act = "tar" ];then if [ "$isapplnk" = "1" ];then isok=1;fi;fi
 if [ $act = "unlink" ];then if [ "$isapplnk" = "2" ];then isok=1;fi;fi
 if [ $isok = "0" ];then echo "ERR: $act not permitted";exit 5;fi
 
#do tar untar if ok
 ru=/appli/$app/redhat
 rur=/appli/$app/redhat/tar
 mkdir -p $ru;
 cd $ru
 if [ $act != "unlink" ];then #create tar
 rm -f $ru/lnks_$app.tgz
 tar cfz $ru/lnks_$app.tgz /softs/$app/redhat/ /appli/$app/redhat/redhat/ /logs/$app/redhat/redhat/
 echo "OK : $ru/lnks_$app.tgz";
 fi
 #always untar
 if [ ! -f lnks_$app.tgz ];then echo "ERR: lnks_$app.tgz not found";exit 1;fi
 rm -rf $rur;mkdir -p $rur;cd $rur;tar xfz ../lnks_$app.tgz;cd -
 
#do link unlink
 for LNKK in softs appli logs;do
 eval "LNKR=\$LNK_${LNKK}"
 eval "LNKS=/\$LNKK/\$app/\$DRH_${LNKK}"
 eval "DIR_${LNKK}=$LNKS"
 dd="$LNKS"
 rdd="$rur$LNKS"
 #for rdd in `ls -d $r/logs/$app/redhat $r/appli/$app/redhat/redhat $r/softs/$app/redhat/redhat`;do
 #dd=`echo $rdd|sed -e "s:^$r::"`
 ###app=`echo $dd|sed -e "s:/$dr/::" -e "s:/.*$::"`
 #filtre si app=papp ou papp=""
 if [ -d "$rdd" ];then
 for rl in `find $rdd -type l`;do
 l=`echo $rl|sed -e "s:^$rur::"`
 ld=`ls -ld $rl|sed -e "s/^.* -> //"`
 if [ $act = "link" ];then
 if [ -L $l ];then
 islocal=0
 if [ "`echo $ld|sed -e 's:^\.::'`" != "$ld" ];then islocal=1;fi
 if [ "`echo $ld|sed -e 's:/redhat/::'`" != "$ld" ];then islocal=1;fi
 if [ "$islocal" = "1" ];then 
 echo "INFO $l -> $ld local link unchanged"
 else
 if [ -e $ld ];then
 rm -f $l
 mv $ld $l
 ln -s $l $ld
 else
 echo "ERR $ld should exists"
 fi
 fi
 else
 echo "ERR $l should be a link"
 fi
 fi
 if [ $act = "unlink" ];then
 if [ -L $ld ];then
 if [ -e $l ];then
 rm -f $ld
 mv $l $ld
 ln -s $ld $l
 else
 echo "ERR $l should exists"
 fi
 else
 echo "ERR $ld should be a link"
 fi
 fi
 done
 fi
 done
 #clean untared
 #if [ "`basename $rur`" != "tar" ];then exit 99;fi;#just checking
 rm -rf $rur
done

en gros :
j’ai une action link, et unlink pour remettre comme avant, et tar
je fais un tar pour me rappeler comment c’était les links avant
je compte le nombre de fichiers et de liens pour savoir si j’ai déjà fait un link
(mais je pourrais plutôt comparer au tar)
je boucle pour faire un rm B, mv A B;ln -s A B.

je relance, c’est moche mais ça marche.
le rpm ne retrouve pas ses fichiers (à tester, ça se trouve c’est bon ?)
apparmor ou selinux sont un peu perdu (binaire pas en place, ou data déplacées)

un peu flippant.

 

Pocket

petits debugs du jour (RewriteRule, iptables udp dns, ulimit)

que des petites choses. allons voir :

avant, toto.fr ne pointait pas au même endroit que www.toto.fr (mais sur tartar.com), un oubli qui n’a pas été modifié de peur que google perde la bonne indexation….

berk c’est laid, je corrige.

Mais pour google je rajoute :

 

RewriteCond /home/sites/toto.fr/www/{REQUEST_URI} !-f
RewriteCond /home/sites/tartar.com/www/%{REQUEST_URI} -f
RewriteRule ^(.+)$ http://www.tartar.com/$1 [R=301,L]
 
RewriteCond /home/sites/toto.fr/www/{REQUEST_URI} !-d
RewriteCond /home/sites/tartar.com/www/%{REQUEST_URI} -d
RewriteRule ^(.+)$ http://www.tartar.com/$1 [R=301,L]

 

autre chose, une machine ne résoud pas les noms depuis que j’ai réparé la config iptables.

faut dire qu’on avait :

 

:INPUT ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

pourtant ça marche sur une machine identique

ah non , ya une différence :

-A INPUT -j REJECT -p tcp –reject-with icmp-host-prohibited

eh oui, du coup les “mauvaises requetes” udp passent , et passent aussi grâce au INPUT:ACCEPT.

faut modifier

INPUT:DROP

-A INPUT -j REJECT –reject-with icmp-host-prohibited

et iptable rules to allow outgoing DNS lookups  wikipedia

les requêtes udp utilisent pour répondre la même ouverture créée par la requête entrante.
-A INPUT -p udp -m udp –sport 53 -j ACCEPT
-A INPUT -p udp -m udp –sport 67 -j ACCEPT


:INPUT DROP
-A INPUT -p udp -m udp --sport 53 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m udp --sport 67 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited

et une correction sur une partie de script qui lit le contenu de limit.conf pour un user et génère les commandes ulimit qui correspondent :

 

# use ulimits from original user
if [ -f "/etc/security/limits.conf" ];then
#syntaxe de ulimit differente selon version de ksh
KSH_ISPDKSH="`ksh -c 'echo \$KSH_VERSION'|sed -e 's/^.*PD *KSH.*$/pdksh/'`"
if [ "$KSH_ISPDKSH" = "pdksh" ];then
KSH_TR_ULIMIT="core-c data-d fsize-f memlock-l rss-m nofile-n stack-s cpu-t nproc-p"
else
KSH_TR_ULIMIT="core-c data-d nice-e fsize-f sigpending-i memlock-l rss-m nofile-n pipe-p msqqueue-q rtprio-r stack-s cpu-t nproc-u"
fi
ULIMIT_SYSUSER=`grep ^$GSCRIPT_SYSUSER /etc/security/limits.conf \
| sed -e 's/\t/ /g' -e 's/ */ /g' |sort -r \
| sed -e 's/^.* soft *//' -e 's/^.* hard *//' -e 's/ /_/g'`
for ULIMTR in $KSH_TR_ULIMIT;do
ULIMTRCNF=`echo $ULIMTR|sed -e 's/-.*$//'`
ULIMTRCMD=`echo $ULIMTR|sed -e 's/^.*-//'`
ULIMIT_SYSUSER=`echo "$ULIMIT_SYSUSER"|sed -e s/$ULIMTRCNF/-$ULIMTRCMD/`
done
for ULIMCMD in $ULIMIT_SYSUSER;do
if [ "`echo x$ULIMCMD|sed -e 's/^x-.*$//'`" = "" ];then
ulimit `echo $ULIMCMD|sed -e 's/_/ /g' -e 's/ -1/ unlimited/'`
fi
done
fi

en plus c’est différent suivant la version de pdksh

(fixed: -1 dans ulimit.conf doit être transcrit en unlimited)

 

Pocket

bash on Windows

ok, c’est juste trois fonctions de rien du tout, mais qui me permettent d’avoir les mêmes scripts (patchs tomcat) entre linux et windows (mingw le site mingw mingw sourceforge)

 

# input can be any C:\* C:/* /C/* /folder/* => Windows, Unix, T:W-slashed-in-file 
function path2u { echo "$*"|tr '\\' '/'|sed -e 's|^\([A-Z]\):|/\U\1|i' -e 's:[/\\]$::';} 
function path2w { echo "$*"|sed -e 's|/\([a-z]\)/|\U\1:/|i' -e 's:[/\\]$::'|tr '/' '\\';} 
function path2t { echo "$*"|sed -e 's|/\([a-z]\)/|\U\1:/|i' -e 's:[/\\]$::'|tr '\\' '/';} 
U_HERE=`path2u $*` 
W_HERE=`path2w $*` 
T_HERE=`path2t $*`

dans le script j’utilise les U_HERE pour naviguer (/C/xxx ou /toto/)

j’écris dans les fichiers de config des T_HERE (C:/xxx/) ou (là ya bien un test) W_HERE (c:\xxx) sur windows

notez le sed ([a-z]) transformé en uppercase \U\1

et le “$*” pour l’affligeant espace de “c:\program files\java\”

Pocket