Comment faire un ping en boucle sur votre IBMi ?

Sans être un expert réseau on a parfois besoin de surveiller périodiquement des accès à notre partition
(suite à des migrations, des pb réseaux etc …)

Ce poste vous explique comment suivre ces problèmes.

1) Créer un fichier de log

CREATE TABLE VOTREBIB.PINGLOG (
PRESULT CHAR(10) CCSID 1147 NOT NULL DEFAULT  » ,
ADRESIP CHAR(20) CCSID 1147 NOT NULL DEFAULT  » ,
PDATE DATE NOT NULL DEFAULT CURRENT_DATE ,
PHEURE TIME NOT NULL DEFAULT CURRENT_TIME )

2) Créer un programme qui écrit dans ce fichier

/* +
Ping en boucle et capture le résultat dans le fichier LOG

p_IP : IP sur laquelle effectuer le ping
p_delai : délai en seconde entre chaque ping

*/

PGM PARM( &P_IP &P_DELAI)

/* Paramètres / DCL VAR(&P_IP) TYPE(CHAR) LEN(15)
DCL VAR(&P_DELAI) TYPE(*DEC) LEN(5)

/* Variables / DCL VAR(&L_SQL) TYPE(CHAR) LEN(1300)
DCL VAR(&L_ERR) TYPE(LGL) / Cote */
DCL &L_COTE *CHAR 1 VALUE( » »)

/* Corps */

LOOP: /* Boucle principale */

/* Ping /

CHGVAR &L_ERR VALUE(‘0’)

PING RMTSYS(&P_IP) MSGMODE(QUIET ESCAPE)

MONMSG MSGID(TCP0000)

EXEC(DO)

CHGVAR &L_ERR VALUE(‘1’)

ENDDO /* Log* /

IF COND( &L_ERR = ‘0’ ) THEN(DO)

        
   /* values( 'PING', 'OK', '8.8.8.8' )                 */         
          CHGVAR     VAR(&L_SQL) VALUE('insert into pinglog +      
                       values( ''OK'', ''' *TCAT &P_IP *TCAT ''' + 
                       , current date, current time   )')          
ENDDO                                                              
ELSE       CMD(DO)                                                 
          CHGVAR     VAR(&L_SQL) VALUE('insert into pinglog +      
                       values( ''KO'', ''' *TCAT &P_IP *TCAT ''' + 
                       , current date, current time   )')          
ENDDO                                                              
/* Logger le binz */                                               
RUNSQL     SQL(&L_SQL) COMMIT(*NONE)                               

/* Continuer */                                            
 IF         COND( &P_DELAI > 0 ) THEN(DLYJOB &P_DELAI)       
DLYJOB &P_DELAI        
GOTO       LOOP                                             ENDLOOP:       

ENDPGM

ce programme va loguer toutes les n secondes

3) Il est conseiller d’associer une commande


CMD PROMPT(‘trace ping’)
PARM KWD(IPADR) TYPE(CHAR) LEN(50) + PROMPT(‘Adresse ip’)

PARM KWD(DELAY) TYPE(DEC) LEN(5) DFT(15) MIN(0) +
PROMPT(‘Delai en secondes’)

Conseils :


Entre 15 et 30 secondes semble être le bon compromis !
Si vous voulez savoir ou est le problème vous devez tester les éléments discriminants,
d’abord sur votre réseau local, ensuite sur le wan, et puis le lan distant, par exemple.


Attention certain équipements ne répondent au trames ICMP

, 5 astuces pour utiliser SMTP sur l’IBMi

1) Utilisez l’annuaire SMTP

Il faut arrêter d’utiliser la directory SNA, l’objectif est se passer complètement de SNA
c’est le paramètre DIRTYPE, exemple CHGSMTPA DIRTYPE(*SMTP)
Il vous faudra inscrire les utilisateurs à SMTP , addsmtpusr ou wrksmtpusr pour qu’ils puissent envoyer des mails

Sinon vous recevrez un message TCP5090 comme celui ci !

2) Utilisez un user mail en NOREPLY

Créer un utilisateur NOREPLY sans mot de passe
inscrivez le à la directory SMTP
wrksmtpusr ou addsmtpusr

et ensuite envoyer vos mails en les soumettant avec cet utilisateur

exemple :

SBMJOB CMD(SNDSMTPEMM RCP((‘xxx@gaia.fr’)) SUBJECT(‘votre sujet’) NOTE(‘ici texte’)) JOB(MAIL)
USER(NOREPLY)

3) Utiliser du HTML dans le corps du message

paramètre CONTENT(*HTML)

dans la commande SNDSMTPEMM … CONTENT(*HTML)

Vous pouvez alors utiliser des balises HTML dans votre message
Un très bon site ici !
https://openclassrooms.com/fr/courses/1603881-apprenez-a-creer-votre-site-web-avec-html5-et-css3/1608357-memento-des-balises-html

4) Historique des mails

A partir du moment ou vous êtes en DIRTYPE(*SMTP)
Vous n’écrivez plus dans le journal QZMF de QUSRSYS, il est conseillé de passer à JOURNAL(*NO) et ALLMAILMSF(*NO)

pour arrêter MSF qui ne sert plus à rien vous devez supprimer le job à démarrage automatique avec la jobd QZMFEJBD ou vous pouvez changer la jobd et remplacer le STRMSF … par un SNDMSG (‘coucou’) TOUSR(*SYSOPR)

5) Utilisez un sous-système spécifique

Pour des questions d’administration, vous pouvez mettre un sous système spécifique qui permet de mieux gérer les travaux relatives aux mails et qui par défaut sont dans QSYSWRK

CHGSMTPA SBSD(QSYS/QSMTP)

Vous devez arrêter et redémarrer le service pour la prise en compte

Conclusion:

C’est la meilleur solution pour envoyer des mails, il y a des nouveautés à chaque version.

, Advanced Job Scheduler avec alerte sur plantage !

Vous utilisez AJS sur votre machine pour planifier les jobs sur votre IBMi.

Vous connaissez l’interface 5250, mais certaines options ne sont disponibles que dans l’interface Navigator for i.

Exemple, si vous voulez avoir un message en cas de plantage de votre job planifié.

Vous aurez défini au préalable la liste des utilisateurs avec leur rôle et leur mail, ici De garde

Remarque :

Attention si vous avez des robots de supervision qui vont analyser la msgq QSYSOPR

Cette option ne devra être mise que sur certain jobs plus stratégiques que d’autres !

Merci à Laurent pour les informations

, Comparer 2 fichiers sur l’IBMi

Il y a maintenant un procédure qui permet de comparer 2 tables (COMPARE_FILE), c’est celle qui est utilisée dans ACS.

Voici comment elle s’utilise avec un exemple sur les fichiers AIRPORTS et AIRPORTS2

SELECT * FROM TABLE(QSYS2.COMPARE_FILE(
LIBRARY1=>’FORM01′, FILE1=>’AIRPORTS’,
LIBRARY2=>’FORM01′, FILE2=>’AIRPORTS2′,
COMPARE_ATTRIBUTES=>’NO’,
COMPARE_DATA=>’YES’))

Il y a 2 options de comparaison sur les données et les attributs du fichier

COMPARE_DATA=>’YES’ et COMPARE_ATTRIBUTES=>’YES’ sont les valeurs par défaut
Vous avez alors la liste des rangs (RRN) qui sont différents !


vous pouvez indiquez QUICK si vous voulez juste savoir si vous avez une différence

Vous pouvez indiquez NO si un des 2 paramètres ne vous intéresse pas

Attention vous avez intérêt à faire ça en batch

Donc à mettre dans un fichier résultat

Exemple

create table … as(votre requête) with data

Attention les zones sont des VARGRAPHICs vous devrez les caster pour les utiliser simplement

Exemple :

cast(substr(ATTRIBUTE_NAME , 1 , 132) as char(132)) as ATTRIBUT_NAME

, Analyser les homedir de vos utilisateurs

Vous utilisez de plus en plus les fichiers dans l’IFS pour échanger vos csv , PDF etc … ou par des connexions qui utilisent l’open source.

.

Ces chiffres sont ceux , constatés sur les clients du groupe Gaia Volubis et incluent la partie complètes des fichiers de l’IFS (/home et le reste).

Par défaut quand vous créer un profil par la commande CRTUSRPRF, vous avez le paramètre HOMEDIR( *USRPRF) ce qui indique un répertoire par défaut /home/USRPRF.

Le Homedir correspond au répertoire par défaut comme la *Curlib du coté de QSYS.LIB.

Attention il n’y a pas de contrôle d’existence et si le répertoire n’existe pas l’utilisateur va travailler à la racine ce qui peut créer des fichiers indésirables à la racine de votre système, et qui contribue à une désorganisation de l’IFS !

De même si certains utilisateurs ont un répertoire par défaut différent de cela peut complexifier vos procédures de ménage. Les répertoires homedir de vos users devant servir le plus souvent à des échanges et non pas du stockage.

Voici quelques requêtes pour vous aider à analyser cela

Liste des répertoires utilisateurs avec leur répertoire théorique

Select AUTHORIZATION_NAME as user_profile, home_directory from QSYS2.USER_INFO

Liste des utilisateurs avec leur répertoire associé existant

create table exploit.usr_dir as(
WITH TEMP_A AS(
SELECT cast(substr(PATH_NAME , 1 , 132) as char(132)) as path_name, ALLOCATED_SIZE
FROM TABLE(IFS_OBJECT_STATISTICS(
START_PATH_NAME => ‘/HOME’ ,
OBJECT_TYPE_LIST => ‘*ALLDIR’))
where
LOCATE_IN_STRING(path_name, ‘/’, 1 , 2) > 1
)
select * from temp_a join QSYS2.USER_INFO on ucase(‘/home/’ concat authorization_name) = ucase(path_name)
) with data

dans ce cas je crée un fichier temporaire, mais vous pouvez le faire en une seule requête

Voici donc 2 principales erreurs à surveiller

Liste des utilisateurs avec un homedir qui n’est pas dans /home

select * from QSYS2.USER_INFO
where ucase(home_directory) not like(‘/HOME/%’)

Liste des utilisateurs avec une homedir inexistante

select a.AUTHORIZATION_NAME, a.HOME_DIRECTORY from QSYS2.USER_INFO as a exception join exploit.usr_dir as b on ucase(trim(a.Home_directory)) = ucase(trim(b.Path_name))

Liste des partages avec sur /home

SELECT SERVER_SHARE_NAME, PATH_NAME, PERMISSIONS FROM QSYS2.SERVER_SHARE_INFO
where ucase(path_name) like(‘/HOME%’) and SHARE_TYPE = ‘FILE’

Vous devez en avoir un seul avec *RW

Rappel , par contre vous ne devez pas partager la racine pour contrôler passez la requête suivante,

SELECT SERVER_SHARE_NAME, PATH_NAME, PERMISSIONS FROM QSYS2.SERVER_SHARE_INFO
where path_name = ‘/’

Remarque :

Dans cette partie de l’ifs pas de différentiation majuscule minuscule

Si vous avez beaucoup de fichiers à la racine, regardez les propriétaires, vous avez surement un homedir mal paramétré.

Rappel, vous ne devez pas partager la racine

, Faire une sauvegarde complète de votre système.

On parle souvent de Sauvegarde 21 à cause de l’option du menu qui servait à le lancer historiquement

Cette sauvegarde nécessite d’être en mode restreint

Voici comment passer dans ce mode sans vous signer sur la console

On peut passer en mode restreint grâce au paramètre BCHTIMLMT de la commande ENDSBS

Pour passer en mode restreint, vous devez indiquer la durée en minutes avant redémarrage !

ENDSBS SBS(ALL) OPTION(IMMED) BCHTIMLMT(240)

Ici au bout de 3 Heures, le système se relancera de lui même en interrompant votre sauvegarde si besoin.

Par contre si votre sauvegarde se termine votre système redémarrera de suite grâce à la commande STRSBS SBSD(QCTL)
Si votre sous système de contrôle est qctl

Pour estimer votre temps de sauvegarde regarder la sauvegarde précédente.
Si vous n’avez pas de référence mettez 480 soit 8 heures lancer votre sauvegarde un weekend ajustez ensuite le temps avec les chiffres constatés, prenez toujours un peu de marge !

Pour la liste des éléments à sauvegarder voir le schéma ci dessous extrait de la documentation IBM

Quelle est la bonne fréquence pour faire une sav21

Si vous pouvez en faire une tous les soirs faites le !

Sinon un fois par mois semble être le minimum, même si vous avez du backup !

Ci joint un exemple à améliorer en ajoutant des contrôles d’erreur par exemple !

PGM parm(&dev &time)
dcl &dev *char 10
dcl &time *char 3
/**/
dcl &timn *dec 3
ENDHOSTSVR *ALL
ENDTCPSVR *ALL
DLYJOB DLY(300)
ENDTCP
ENDSBS SBS(ALL) OPTION(IMMED) BCHTIMLMT(&timn)
DLYJOB DLY(180)
SAVSYS DEV(&DEV) DTACPR(YES)

MONMSG MSGID(CPF0000) EXEC(DO)

SNDUSRMSG MSG(‘Probléme pendant le SAVSYS’) +

MSGTYPE(INFO)
return
enddo
SAVLIB LIB(NONSYS) DEV(&DEV) ACCPTH(YES) +
SPLFDTA(ALL) QDTA(DTAQ) PVTAUT(YES) +

DTACPR(YES)
MONMSG MSGID(CPF0000) EXEC(DO)
SNDUSRMSG MSG(‘Probléme pendant le SAVLIB’) +
MSGTYPE(INFO)

return

enddo

SAVDLO DLO(ALL) DEV(&DEV) DTACPR(YES)

MONMSG MSGID(CPF0000) EXEC(DO)

SNDUSRMSG MSG(‘Probléme pendant le SAVDLO’) +

MSGTYPE(INFO)
return
enddo
SAV DEV((‘/QSYS.LIB/’ *TCAT &DEV *TCAT ‘.DEVD’)) +
OBJ((‘/*’) (‘/QSYS.LIB’ *OMIT) (‘/QDLS’ +
OMIT)) UPDHST(YES) DTACPR(YES)

MONMSG MSGID(CPF0000) EXEC(DO)

SNDUSRMSG MSG(‘Probléme pendant le SAVIFS’) +

MSGTYPE(INFO)
return
enddo
STRSBS SBSD(QCTL)
ENPPGM

Remarque :


Votre programme devra être placé dans le sous système QCTL
Si vous utilisez BRMS la procédure diffère un peu , surtout pour la restauration