pause-café
destinée aux informaticiens sur plateforme IBM i.
Pause-café #85
Nouveautés
Annonce du Power 10!
- https://newsroom.ibm.com/2020-08-17-IBM-Reveals-Next-Generation-IBM-POWER10-Processor
-
gravure en 7nm
- 16 cœurs
- puce fabriquée par Samsung
- la puce est livrée avec la fonction « memory inception »
autorisant tout système basé sur Power 10 dans un cluster à partager la mémoire avec d’autres systèmes. - On parle de X3 par rapport au Power9 !
(voir https://images.anandtech.com/doci/15985/202008171819571.jpg) - premières disponibilités en 2021
-
Nouveautés sur IBM i
- TR2/TR8, rappelez vous, sur la pause-café 84, nous vous indiquions :
Première remarque : il n'y a pas de PTF pour marquer la TR (ni en 7.4, ni en 7.3)
Il y a bien une microcode (MF99302 en 7.4, MF99208 en 7.3), mais pas de PTF sur SS1
il faut appliquer les dernières PTF sur DG1 et DB2, ainsi que la dernière cumulative
voir https://ibmsystemsmag.com/Power-Systems/05/2020/confusion-about-tr (pourquoi ?)
il y a donc des PTF matérielles : commandez SF99737 level 2 (7.4) et SF99727 level 8 (7.3)
- Nouvelle version d'ACS : 1.1.8.5
- le gestionnaire de fichiers IFS propose le choix de la codifications lors du téléchargement
- et les temps de réponse sont amméliorés(nettement !) , suivant les colonnes que vous sélectez à l'affichage
- sur les liens symboliques les colonnes dates (création, accès et modif), propriètaire et CCSID dégradent les performances
- sur les autres fichiers, seules les colonnes propriètaire et CCSID dégradent les performances
- sur le gestionnaire de scripts SQL, F4 est équivalent à ctrl+espace (demander de l'assistance), et est admis
- sur une ligne vierge
- et pour une fonction intégrée du SQL
si l'assistant vous propose la liste des colonnes, à nouveau F4 permet de switcher sur la liste des expressions et des BIF
- dans Schéma on peut désormais
- demander l'exécution d'une procédure stockée dans le gestionnaire de scripts
- D'une fonction (scalaire) utilisateur
- D'une fonction table
- Open source
- Rappel unixODBC (ODBC en mode Pase)
- le driver d'IBMi Access lui même :
Téléchargez le sur https://www-01.ibm.com/support/docview.wss?uid=isg3T1026805
(la dernière ligne nommée ACS PASE App pkg)
Dézippez puis transférez le fichier dans un répertoire sur l'IBM i
Installez le par :yum install ibm-iaccess-1.1.0.11-0.ibmi7.2.ppc64.rpmIl doit apparaitre, ici :
Pour une mise à jour (ici la version 1.1.013) utilisez l'option -U
- il est à nouveau mis à jour en Août (1.1.0.14)
La config se trouve dans /QOpenSys/etc/odbc.ini
l'installation du driver à créé une entrée *LOCAL
Vous pouvez l'utiliser en mode commande
- Driver ODBC pour mac
il faut d'abord installer unixODBC pour mac , pour cela
- Nous sommes allés sur ce site : http://macappstore.org/unixodbc/
- puis, dans un terminal, tapez la commande
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
< /dev/null 2> /dev/null
- ensuite brew install unixodbc
- Allez chercher le driver sur le site de téléchargement d'ACS
Dézippez et lancez le package
C'est parti
jusqu'à :
Ensuite cela fonctionne comme le Unixodbc vu plus haut dans ce cours.
- Une page très bien faite explique la configuration d'ODBC sur tous les OS (Windows,Linux,Mac,IBM i)
- Autres produits
- Man, Le système d'aide du monde unix
- textinfo utilitaire de génération de documentation
- ghostscript : utilitaire de manipulation de fichier postscript et pdf.
Avec un serveur X11 actif sur votre poste (ici Xming sous Windows)
- Enfin, PHP est livré en open source (sous forme de RPM)
- Pour installer PHP sur ce mode vous devez ajouter un dépot (repository) sous QSH
Puis vous connecter avec ACS
N'hésitez pas à profiter de la nouvelle option où votre PC va servir de passerelle (tunnel SSH)
Vous devez voir tous ces modules comme étant disponibles
choisissez Installation, confirmez !
Et voilà
Modifiez votre config Apache, pour ajouter
Créez un fichier fastcgi.conf dans /www/<votre instance>/conf
# Chargement du module FastCGI à l'origine créé pour Zend (utilisable aussi pour Node.JS)
LoadModule zend_enabler_module /QSYS.LIB/QHTTPSVR.LIB/QZFAST.SRVPGM
# indique à Apache que tous les fichiers se terminant par .PHP
# s'exécutent via FastCGI, handler "application/x-httpd-php"
AddType application/x-httpd-php .php
AddHandler fastcgi-script .php
# si on tape uniquement le nom du site, il cherche index.php puis index.html
DirectoryIndex index.php index.html
contenant
puis, pour tester, un fichier dans htdocs, contenant
Server type="application/x-httpd-php" CommandLine="/QOpenSys/pkgs/bin/php-cgi" StartProcesses="1"
Ce qui doit vous afficher
<?php phpinfo(); ?>
- Se connecter à la base de données
- il faut unixODBC (ODBC en mode Pase)
- le driver d'IBMi Access pour PASE, vu plus haut
- Page php de test
Connectez vous par :
En remplacant VOTRE-IBMi par le nom indiqué dans la commande WRKRDBDIRE (*LOCAL)
$dsn = "DRIVER=IBM i Access ODBC Driver;SYSTEM=VOTRE -IBMi";
$user = "un-profil";
$pwd = "sonMotDepasse";
$db = odbc_connect($dsn , $user , $pwd);
par exemple
<html>
<head>
<title>test ODBC</title>
</head>
<body>
<h2>connexion ODBC avec PHP RPM</h2>
<?php
$dsn = "DRIVER=IBM i Access ODBC Driver;SYSTEM=MONIBMi";
$user = "PHPUSER";
$pwd = "phppwd";
$db = odbc_connect($dsn , $user , $pwd);
$resultat = odbc_exec($db, "select * from qiws.qcustcdt");
if ($resultat == 0) {
echo ("<BR><B>Erreur " . odbc_error() . " : " . odbc_errormsg() . "</B>");
} else {
$rc = odbc_fetch_row($resultat);
while($rc != FALSE) {
echo("<BR>");
for ($j = 1; $j <= odbc_num_fields($resultat); $j++) {
if ($j <> 1) {
echo(' , ');
}
echo(odbc_result($resultat, $j));
}
$rc = odbc_fetch_row($resultat);
}
}
?>
</body>
</html>
Affiche
vous pouvez aussi renseigner des options dans php.ini
- Par contre avec des données accentuées, nous avons des problèmes de CCSID
sous un shell avec l'utilitaire isql
La règle serait de configurer la connexion
- soit avec
setlocale(LC_ALL, 'FR_FR.UTF-8') ; $dsn = "DRIVER=IBM i Access ODBC Driver;SYSTEM=MONIBMi";Par exemple sous le même shell, avec
LC_ALL=FR_FR.UTF-8
export LC_ALL
- soit avec
$dsn = "DRIVER=IBM i Access ODBC Driver;SYSTEM=MONIBMi;CCSID=1208;"Mais, nous obtenons alors
avec une erreur MCH0601 dans la JOBLOG, qui génére un arrêt brutal de PASE (CPFB9C6)
voici ce que dit le lab. (Août 2020)
De fait, avec
This is a bug in PHP. We plan to submit changes to them and work with Zend to get their version of PHP patched in the meantime.The bug is due to PHP's misuse of the return indicator from SQLGetData .
The following values are valid as length/indicator values ...:SQL_NO_TOTAL. The driver cannot determine the number of bytes of long data still available to return in an output buffer. This value is legal only for SQL data retrieved from the driver.
When converting from EBCDIC to UTF-8 there is no way for the driver to determine how much data will be available to return other than temporarily converting all the data and throwing away the results. Instead of doing that work, we return SQL_NO_TOTAL, which indicates that the result is not known. SQL_NO_TOTAL has the value -4, which read as an unsigned value is huge and will cause segmentation faults ...
Try adding "DEBUG=524288" to the connection string.
$dsn = "DRIVER=IBM i Access ODBC Driver;SYSTEM=MONIBMi;DEBUG=524288;"
L'option DEBUG est bien documentée, mais, à aujourd'hui, pas l'utilisation de la valeur 524288 ?
Retour d'expérience
Un certificat gratuit pour commonfrance.fr
Le site let's Encrypt fournit des certificats gratuits !
le principe de ce type de sites est :
- soit de placer un fichier temporaire sur votre site afin de vérifier qu'il correspond bien au domaine demandé
- soit de vous demander d'ajouter (souvent manuellement) un enregistrement txt dans vos DNS afin de faire la même vérification
Pour demander à let's Encrypt de générer un certificat et le télécharger, utilisez le script acme.sh
acme.sh –issue –insecure -d volubis.fr -w /www/VOLUBIS/htdocs
- -issue : demande initiale de certificat (-renew permet un renouvellement)
- -insecure : actuellement le site est en http
- -d : domaine
- -w : répertoire dans lequel écrire (représente la racine du site)
• Allons chercher le certificat de commonFrance
il faut, dans DCM, avant d'importer le certificat, importer les certificats de la chaîne certifiant le site letsencryp.org
- DST Root CA
- Lets encrypt Authority
- Letsencrypt.org
Pour importer ensuite votre certificat, il faut
- soit avoir créé une demande (certificat request) par DCM
ce qui n'est pas notre cas
- soit importer un fichier pfx (pkcs12) contenant toute la chaîne de certification
A fabriquer par openssl
importation (resaisissez le même mot de passe)
résultat
- Ensuite, comme avec n'importe quel certificat
- modifiez la configuration Apache
LoadModule ibm_ssl_module /QSYS.LIB/QHTTPSVR.LIB/QZSRVSSL.SRVPGM
Listen 192.168.1.2:443<VirtualHost 192.168.1.2:443>
ServerName www.commonfrance.fr
SSLEngine On
SSLAppName QIBM_HTTP_SERVER_COMMONFRANCE
</VirtualHost>- Ce qui doit faire apparaitre une nouvelle application dans DCM, lui associer le certificat
- une fois le certificat assigné, si l'instance Apache gère plusieurs domaines
vous devrez ajouter une SNI (Server Name Indication).
<VirtualHost 192.168.1.2:443>
ServerName www.commonfrance.fr
SSLEngine On
SSLAppName QIBM_HTTP_SERVER_COMMONFRANCE
SSLServerCert commonfrance.fr <-le common name du certificat
</VirtualHost>sinon le premier certificat défini sera utilisé pour tous les domaines !
- Les certificats lets Encrypt sont gratuits, mais valables 2 mois uniquement
nous avons donc cherché à les renouveller automatiquement, voilà comment (job planifié)
dans le fichier www.common.log
- PGM
DCL &CERNAME *CHAR 16 /* certificat label */
DCL &CERMOINS *CHAR 16 /* certificat précédent */
DCL &CMD *CHAR 512 /* cmd PASE */
DCL &PFX *CHAR 64 /* nom fichier PKCS12 */
DCL &ANC *CHAR 2
DCL &MOIC *CHAR 2
DCL &AN *DEC (2 0)
DCL &AMOINS *DEC (2 0)
DCL &MOIS *DEC (2 0)
DCL &MMOINS *DEC (2 0)- MONMSG (CPF0000 CEE0000) EXEC(GOTO PRB)
- /* certificat = (par ex.) commonfrance820 en Août 2020 */
RTVSYSVAL SYSVAL(QYEAR) RTNVAR(&ANC)
RTVSYSVAL SYSVAL(QMONTH) RTNVAR(&MOIC)
CHGVAR &AN &ANC
CHGVAR &MOIS &MOIC- CHGVAR VAR(&MMOINS) VALUE(&MOIS - 1)
IF COND(&MMOINS = 0) THEN(DO)
CHGVAR &MMOINS 12
CHGVAR &AMOINS (&AN - 1)
ENDDO
ELSE CHGVAR &AMOINS &AN
/* certificat à créer */
CHGVAR VAR(&CERNAME) VALUE('commonfrance' *TCAT %CHAR(&MOIS) *TCAT %CHAR(&AN))
/* mois précédent */
CHGVAR VAR(&CERMOINS) VALUE('commonfrance' *TCAT %CHAR(&MMOINS) *TCAT %CHAR(&AMOINS))- CD '/home/root/.acme.sh'
DEL OBJLNK('www.common.log') /* log des sorties (stdout) */
MONMSG CPFA0A9 /* n'existe pas */
DEL OBJLNK('www.common.err') /* log des erreurs (strerr) */
MONMSG CPFA0A9 /* n'existe pas */- /*==============================*/
/* 1ere fois acme.sh */
/* --issue */
/* -d commonfrance.fr */
/* -w /www/volubis/htdocs */
/*==============================*/
/* ici --renew = renouvellement */
/*==============================*/
CHGVAR VAR(&CMD) VALUE('/home/root/acme.sh-master/acme.sh +
--force --debug --renew -d commonfrance.fr -w +
/www/volubis/htdocs +
1>>/home/root/.acme.sh/www.common.log +
2>>/home/root/.acme.sh/www.common.err')
CALL PGM(QP2SHELL) PARM('/QOpenSys/pkgs/bin/bash' '-c' &CMD)
/*==============================*/
/* fabrication du fichier pkcs12 */
/*==============================*/
CD '/home/root/.acme.sh/commonfrance.fr'
CHGVAR &CMD VALUE('openssl pkcs12 -export -inkey commonfrance.fr.key -in +
commonfrance.fr.cer -name ' *CAT &CERNAME *CAT ' -caname commonfrance.fr +
-password pass:abc123 -out ' *CAT &CERNAME *TCAT '.pfx')
CALL PGM(QP2SHELL) PARM('/QOpenSys/pkgs/bin/bash' '-c' &CMD)- /*==============================*/
/* puis importation dans DCM */
/* le nom (&CERNAME) ou "label" */
/* doit être UNIQUE dans DCM ! */
/*==============================*/
CHGVAR &PFX VALUE('/home/root/.acme.sh/commonfrance.fr/' *CAT &CERNAME *TCAT '.pfx')
CALL IMPORTPKS PARM(&PFX)
/*==============================*/
/* association à l'application */
/*==============================*/
CALL UPDATECER PARM('QIBM_HTTP_SERVER_COMMONFRANCE' &CERNAME)- /*==============================*/
/* modification SNI dans fichier .conf */
/*==============================*/
CHGVAR VAR(&CMD) VALUE('/QopenSys/pkgs/bin/sed -i -e "s/' *CAT +
%TRIM(&CERMOINS) *TCAT '/' *CAT %TRIM(&CERNAME) *TCAT +
'/g" /www/volubis/conf/commonfrance.conf')
CALL PGM(QP2SHELL) PARM('/QOpenSys/pkgs/bin/bash' '-c' &CMD)- SNDMSG MSG('Certificat ' *CAT &CERNAME *CAT ' renouvelé') TOUSR(QSYSOPR)
RETURN- PRB:
SNDMSG MSG('*** Certificat ' *CAT &CERNAME *CAT ' NON renouvelé ***') TOUSR(QSYSOPR)
ENDPGM
https://github.com/Neilpang/acme.sh
v2.8.4
[jeu 27 aoû 09:53:40 CEST 2020] Renew: 'commonfrance.fr'
[jeu 27 aoû 09:53:57 CEST 2020] Single domain='commonfrance.fr'
[jeu 27 aoû 09:53:58 CEST 2020] Getting domain auth token for each domain
[jeu 27 aoû 09:55:28 CEST 2020] Getting webroot for domain='commonfrance.fr'
[jeu 27 aoû 09:55:34 CEST 2020] commonfrance.fr is already verified, skip http-01.
[jeu 27 aoû 09:55:35 CEST 2020] Verify finished, start to sign.
[jeu 27 aoû 09:55:36 CEST 2020] Lets finalize the order, Le_OrderFinalize: https://acme-v02.api.letsencrypt.org/acme/finalize/73655950/4885192960
[jeu 27 aoû 09:55:47 CEST 2020] Download cert, Le_LinkCert: https://acme-v02.api.letsencrypt.org/acme/cert/03ca06215fbb3c87164688a490d1ae2bec0b
Certificate:
Data:
Version: 3 (0x2)
Serial Number:
03:ca:06:21:5f:bb:3c:87:16:46:88:a4:90:d1:ae:2b:ec:0b
Signature Algorithm: sha256WithRSAEncryption
Issuer: C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
Validity
Not Before: Aug 27 06:55:44 2020 GMT
Not After : Nov 25 06:55:44 2020 GMT
Subject: CN = commonfrance.fr
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public-Key: (2048 bit)
Modulus:
00:bb:c2:cb:6a:bd:69:1c:32:21:91:73:b2:c4:c9:
3d:4a:3f:52:12:2a:74:b2:d8:9b:19:68:2e:ec:19:
78:1e:cd:24:02:ac:72:4a:25:e3:4c:c3:f6:bb:eb:
.../...
70:5f:6f:07:1b:63:d6:a2:41:46:52:cd:25:91:4d:
21:6e:5f:79:e8:86:2d:54:65:12:cf:aa:27:98:77:
b6:b9:62:02:bf:05:cb:0b:7e:34:db:3c:3e:12:28:
2e:15
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Key Usage: critical
Digital Signature, Key Encipherment
X509v3 Extended Key Usage:
TLS Web Server Authentication, TLS Web Client Authentication
X509v3 Basic Constraints: critical
CA:FALSE
X509v3 Subject Key Identifier:
F5:D7:91:46:94:B3:1F:42:29:3D:C2:B4:93:F0:A2:8F:46:8D:49:E2
X509v3 Authority Key Identifier:
keyid:A8:4A:6A:63:04:7D:DD:BA:E6:D1:39:B7:A6:45:65:EF:F3:A8:EC:A1
Authority Information Access:
OCSP - URI:http://ocsp.int-x3.letsencrypt.org
CA Issuers - URI:http://cert.int-x3.letsencrypt.org/
X509v3 Subject Alternative Name:
DNS:commonfrance.fr
X509v3 Certificate Policies:
Policy: 2.23.140.1.2.1
Policy: 1.3.6.1.4.1.44947.1.1.1
CPS: http://cps.letsencrypt.org
CT Precertificate SCTs:
Signed Certificate Timestamp:
Version : v1 (0x0)
Log ID : 6F:53:76:AC:31:F0:31:19:D8:99:00:A4:51:15:FF:77:
15:1C:11:D9:02:C1:00:29:06:8D:B2:08:9A:37:D9:13
Timestamp : Aug 27 07:55:44.687 2020 GMT
Extensions: none
Signature : ecdsa-with-SHA256
30:46:02:21:00:82:11:64:43:D2:C2:EF:4F:0B:22:D5:
DE:FE:31:41:6C:E0:ED:23:BB:64:C6:6D:64:48:2D:EC:
51:0B:78:A1:03:02:21:00:CC:E7:9B:2A:40:CD:19:C7:
7B:0D:15:30:D6:B5:AE:BE:51:CE:CC:85:94:C0:3E:E4:
C1:A6:74:03:55:B9:BE:12
Signed Certificate Timestamp:
Version : v1 (0x0)
Log ID : B2:1E:05:CC:8B:A2:CD:8A:20:4E:87:66:F9:2B:B9:8A:
25:20:67:6B:DA:FA:70:E7:B2:49:53:2D:EF:8B:90:5E
Timestamp : Aug 27 07:55:44.674 2020 GMT
Extensions: none
Signature : ecdsa-with-SHA256
30:44:02:20:5F:35:B9:3C:84:D7:B3:1F:8D:EE:5B:A8:
69:6F:52:DB:4A:BA:52:AC:FC:15:7A:A3:35:61:B5:AB:
73:87:2B:AF:02:20:70:7B:CA:5A:0F:33:28:C2:CA:B3:
49:0F:40:AA:FC:95:43:42:AA:EF:00:C2:6C:98:CA:F4:
3B:0D:00:C6:47:EC
Signature Algorithm: sha256WithRSAEncryption
6e:cc:d8:9d:b8:a3:8a:01:1e:83:02:b3:b8:9e:3d:95:cb:58:
04:54:75:80:d3:19:0b:96:66:19:29:fb:e3:52:b4:63:74:43:
.../...
1b:3c:80:5e:99:3e:35:b8:2a:b9:c1:eb:94:2f:81:46:bd:75:
0e:09:b0:56:65:65:db:96:84:23:c9:2c:a3:cd:0d:b8:d0:74:
75:0c:df:51
[jeu 27 aoû 09:55:53 CEST 2020] Cert success.
-----BEGIN CERTIFICATE-----
MIIFVjCCBD6gAwIBAgISA8oGIV+7PIcWRoikkNGuK+wLMA0GCSqGSIb3DQEBCwUA
MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD
.../...
X9kImY/d2iY/fdB8c9uErOG2X4NACjYj1ZAlazflrcyyYRs8gF6ZPjW4KrnB65Qv
gUa9dQ4JsFZlZduWhCPJLKPNDbjQdHUM31E=
-----END CERTIFICATE-----
[jeu 27 aoû 09:55:53 CEST 2020] Your cert is in /home/ROOT/.acme.sh/commonfrance.fr/commonfrance.fr.cer
[jeu 27 aoû 09:55:53 CEST 2020] Your cert key is in /home/ROOT/.acme.sh/commonfrance.fr/commonfrance.fr.key
[jeu 27 aoû 09:55:54 CEST 2020] The intermediate CA cert is in /home/ROOT/.acme.sh/commonfrance.fr/ca.cer
[jeu 27 aoû 09:55:54 CEST 2020] And the full chain certs is there: /home/ROOT/.acme.sh/commonfrance.fr/fullchain.cer
Résultat (avec la nouvelle version de DCM)
- sed "s/toto/TOTO/g" fichier va changer toutes les occurrences de la chaîne toto par TOTO
- L'option -e permet d'activer les expressions régulières
- L'option -i permet d'être insensible à la casse
- Dans le fichier .conf
(httpd.conf contient include /www/volubis/conf/commonfrance.conf )
un peu de code...
- Programme d'importation de certificats (API QyKmImportKeyStore)
- Programme d'assignation d'un certificat à une application (API QycdUpdateCertUsage)
SED, éditeur de fichier en ligne de commande
par défaut le résultat de cette commande va dans la sortie standard stdout
La fonction de substitution s
La fonction de substitution s permet de changer la première ou toutes les occurrences d'une chaîne par une autre. La syntaxe est la suivante:
- sed "s/toto/TOTO/" fichier va changer la première occurrence de la chaîne toto par TOTO (la première chaîne toto rencontrée dans le texte uniquement)
- sed "s/toto/TOTO/3" fichier va changer la troisième occurrence de la chaîne toto par TOTO (la troisième chaîne toto rencontrée dans le texte uniquement)
- sed "s/toto/TOTO/g" fichier va changer toutes les occurrences de la chaîne toto par TOTO
- La fonction de suppression d
- sed -e '/[aA]/d' fichier enlève toutes les lignes contenant un a ou un A
- La fonction a ajoute un texte après le texte sélectionné
- La fonction i ajoute un texte avant le texte selectionné
- Attention, vous pouvez avoir plusieurs versions de sed installées sur votre système
(suivant que vous ayez installé 5733OPS ou pas, par exemple)
voici ce que nous affiche :find /QOpenSys/* -name sed
/QOpenSys/opt/freeware/bin/sed
/QOpenSys/pkgs/bin/sed
/QOpenSys/QIBM/ProdData/OS400/PASE/bin/sed
/QOpenSys/testRoot/QOpenSys/usr/bin/sed
/QOpenSys/usr/bin/sedla version de /QOpensys/pkgs/bin est sans doute la plus récente, alors vérifiez votre PATH...
- Reste à redémarrer le serveur (ENDTCPSVR / STRTCPSVR)