Les terminaux asynchrones

mercredi 17 septembre 2008
par  Jerome ROBERT
popularité : 3%

Les terminaux asynchrones

 

Le but du jeu est d’obtenir le prompt login sur un terminal.

La gestion des terminaux asynchrones est assurée au moyen de fichiers. Suivant les systèmes, les fichiers peuvent avoir des noms différents ( s’est pour faire simple … je suppose).

 

I. Principe du SAF ( System Access Facility ) SVR4 :

 

Le SAF est une suite de commandes qui fournit l’accès via
les ports série à des périphériques comme les modems ou les terminaux. En
plus, le SAF fournit un accès aux services réseau comme par exemple une
imprimante distante mais ce service est peu utilisé, on utilise plutôt le
système BSD dans ce cas.

La souplesse du SAF est de gérer un nombre important de
ports série, une structure hiérarchique de fichiers et de commandes
d’administration est mise en place pour contrôler chaque port individuellement
et en groupe.

SAC ( System Access Controler ) :

Processus, lancé par init à partir de /etc/inittab,
qui assure le contrôle général de l’ensemble.

 

Port_moniteur :

Un port moniteur gère un groupe de terminaux.

 

Port_service :

Un port service correspond à une voie ( un terminal ).

 

A. Les Port_moniteurs

1. ttymon

 

Les démons portmon ont pour rôle la gestion des
contrôleurs asynchrones. Ils lancent chaque fois que cela est nécessaire un
processus ttymon assurant la gestion du terminal asynchrone concerné. Le
processus ttymon remplace le processus getty.

Gestion des terminaux classiques, assure :

- l’initiation matérielle des ports

- la mise à jour des paramètres de la ligne

- l’activation du service dès qu’une connexion est établie.

Un seul processus pour un groupe de terminaux.

Le mode express de ttymon gère des terminaux
particuliers ( console par exemple ). Il est lancé directement par init via
/etc/inittab avec l’option -g.

2. muxmon

Gestion des terminaux sous le multiplexeur de voies logiques DPTG2
( ba80 ou 9766 ), assure le chargement de ces terminaux puis ttymon
prend le relais pour lancer le service.

A chaque terminal déclaré sous DPTG2, un processus muxmon
sera associé à un processus ttymon.

 

3. Inetd

Il est à l’écoute des demandes de services réseau et lance
le service approprié lorsqu’elles surviennent. Les services réseau sont
spécifiés dans le fichier /etc/inetd.conf.

 

4. listen

Pour les connexions orientées réseaux tcp/ip.

 

Le démon listen remplit une fonctionnalité proche de celle
assuré par le démon inetd. Il est à l’écoute des demandes de services
réseau et lance le service approprié lorsqu’elles surviennent. Les commandes pmadm
et nlsadmin permettent de configurer ce démon.

 

 

Informations préliminaires :

 

Un port_moniteur appelé pmtag de type pmtype
(ttymon,inetd,listen,...) pilotera un ou plusieurs terminaux appelés port_service.

 

Ce port_service sera défini sous un
mnémonique appelé svctag. C’est sous cette appellation que
l’administrateur du système pourra agir au niveau port_service.

 

B. Le fichier au niveau SAC

 

Le fichier /etc/saf/_sactab contient tous les
port_moniteurs et leur type qui doivent être demarré par SAC.

 

L’utilisateur communique avec SAC à travers la
commande sacadm.

 

Le format de la commande est :

 

sacadm –a -p pmtag -t type –c commande
–v version

 

Options :

-a : pour ajouter un moniteur de port

-p : le pmtab ( nom symbolique ) associé au moniteur de port

-t : le type de moniteur de port (ttymon)

-c cmd : la chaîne de commande cmd est utilisée pour le
démarrer un moniteur de port

-v : le numéro de version

-k : pour arrêter un moniteur de port

-r : pour supprimer un moniteur de port

-l : pour obtenir la liste des services

 

Pour le reste de options cf. le man adoré.

 

La lecture du fichier /etc/saf/_sactab se fait par la
commande :

 

sacadm -l

 

PMTAG

Identificateur du port_moniteur

PMTYPE

Type du port_moniteur

FLGS

Indicateurs

RCNT

Nombre d’essais en cas de problème

STATUS

Etat (start, stop, enable ou disable)

COMMAND

Nom absolu du port_monitor à démarrer

 

1. Le fichier au niveau port_moniteur

 

Les fichiers /etc/saf/pmtag/_pmtab contiennent
tous les services démarrés par le port_moniteur spécifié par pmtag.

 

L’utilisateur communique avec les port_moniteurs à travers
la commande pmadm.

 

Format de la commande :

 

pmadm –a –p pmtag –s service_tag –i identity –f
flag –v version –m "`ttyadm –l tty_label –d device –T term_type
–i ’message’ –s service -S y|n`"

 

Options :

 

-a : ajouter un service à un moniteur de port particulier

-p : le pmtab ( nom symbolique ) associé au moniteur de port

-s : le nom symbolique du service

-i id : l’identité à assigner au service au démarrage. id
doit être une entrée valide du fichier

/etc/passwd

-f : pour associer un drapeau (flag) au service : ce flag peut
être

u, pour créer une entrée dans /var/adm/utmp

x, pour ne pas valider le service

-v : le numéro de version du moniteur de port

-m : information de configuration spécial ttymon
fourni par la commande ttyadm.

-r : supprimer un service sur un port

-S y|n : y è contrôle soft (
Xon/Xoff) : DTE

n è contrôle hard ( DCD) :
DCE

 

Pour le reste de options cf. le man adoré.

 

Un exemple concret :

pmadm –a –p newpmtag –s ttya –i root –f u –v 1
–m "`ttyadm –l 9600 –d /dev/term/a –T tvi925 –i ’message’ –s /usr/bin/login
- S y`"

La lecture des fichiers /etc/saf/pmtag/_pmtab se
fait par la commande :

pmadm –l

SVCTAG

Identificateur du port_service

FLGS

Indicateur d’état (si x—> disable)

ID

Identité de l’utilisateur sous lequel est lancé le
service

PMSPECIFIC

Identification de la voie physique, le nom du process,
le label ligne et le prompt

COMMENTS

Commentaires

 

Exemple de la commande :

PMTAG PMTYPE SVCTAG FLGS ID <PMSPECIFIC>

toto ttymon ttya u root /dev/term/a - - /usr/bin/login - 9600 ldterm,ttcompat
ttya login : - tvi925 y #Terminal – Hardwired

zsmon ttymon ttyb u root /dev/term/b I - /usr/bin/login - 9600
ldterm,ttcompat ttyb login : - tvi925 y #

 

2. Arborescence de SAF

 

La représentation suivante permet de comprendre comment
évoluent les répertoires et fichiers de SAF :

Exemple 1 : Schéma d’une arborescence solaris
2.7

Le port_moniteur de pmtype zsmon portant le pmtag
ttymon est créé.

 

Les fichiers SAF :

 

/etc/saf/_sysconfig : Script de configuration système

 

/etc/saf/_sactab : Le fichier
d’administration du SAC. Contient les données de configuration pour
les moniteurs de ports que le SAC contrôle.

 

/etc/saf/pmtag : Le répertoire pour le moniteur
de ports pmtag

(/etc/saf/zsmon : ici zsmon)

 

/etc/saf/pmtag/_pmtab : Fichier d’administration
de pmtag. Contient les données de

configuration du moniteur de ports.

 

/var/saf/_log : le fichier journal du sac

 

/var/saf/pmtag : le répertoire pour les fichiers
journal créés pour pmtag

 

 

Exemple 2 :

 

Le port_moniteur de pmtype ttymon portant le pmtag
ttymon1 est créé.

Le port_service de svctag voie5 correspondant
à la voie écran /dev/term/05 est validé.

 

Le port_moniteur de pmtype ttymon portant le pmtag
lpt6 est créé.

Le port_service de svctag lpt6 correspondant à
la voie imprimante /dev/term/06 est validé.

 

Nota : 16 écrans max par port moniteur. Il est conseillé de ne mettre
qu’une imprimante par port moniteur.

 

3. Les fichiers de trace

 

Les évenements survenant au cours de l’administration de SAF
sont mémorisés.

 

Le fichier /etc/saf/pmtag/_pid contient le
numéro du processus du port_moniteur pmtag.

 

Les fichiers /etc/saf/pmtag/svctag
contiennent les actions à lancer sur le port_service svctag.

 

4. Le fichier /etc/ttydefs

 

Ce fichier contient des entrées permettant de déterminer la
vitesse et les paramètres d’un port tty.

 

La commande sttydefs -l 9600NP
(
par exemple ) permet de visualiser l’entrée 9600NP de ce fichier :

 

ttylabel

Label identifiant la ligne (voir le champ PMSPECIFIC du
fichier _pmtab)

Initial flags

Paramètres de la ligne avant connexion

Final flags

Paramètres de la ligne après connexion

autobaud

Option pour la recherche de vitesse automatique (A)

nextlabel

Nouveau label identifiant la ligne à exécuter en cas
d’erreur

 

Exemple du fichier :

 

4800E:4800 hupcl evenp:4800 evenp::2400

2400E:2400 hupcl evenp:2400 evenp::1200

auto:hupcl:sane hupcl:A:9600

console:9600 hupcl opost onlcr:9600::console

 

 

5. La commande who

 

La commande who -lH
permet de lister les port_moniteurs ayant l’état RUNNING.

 

# who -lH

NAME LINE TIME IDLE PID COMMENTS

LOGIN console mars 18 12:06 2:53 250

toto . mars 18 12:06 old 255

zsmon . mars 18 12:06 old 256

LOGIN console mars 18 12:06 2:53 259 (:0)

6. Divers commandes :

a) Déclaration d’un terminal par termadd

 

Cette commande crée les port_moniteurs, les port_services,
les fichiers spéciaux et le fichier contenant le chargement du clavier.

 

termadd -T type
-n nom_tty -b interface

-s nationalité -l label

-t pmtag -p prompt -k clavier

 

 

 

Exemples :

 

termadd -T 97801-5 -n 019 -b itp1,3 -s FR -t ttymon2
- l 97801 -p " itp0v4 login : "

 

termadd -T generic -n 003 -b echase0,unit0,4 -l 9600NP

 

termadd -T printer -n lptr1 -b echase0,unit0,16 -t lptr1
- l printer

 

termadd -T printer -n parall -b centronics0,0 -t centronics
–d

 

 

La commande Termadd pour DPTG2 :

 

DPTG2 étant un multiplexeur 10 voies logiciel qui permet
d’avoir le multifenêtrage sur les terminaux 9766. On peut
déclarer 8 fenêtres ( 0 à 7 ) plus deux canaux pour des imprimantes ( 8 et 9
).

 

termadd -T type
-n nom_tty

-b interface -o channel=fenêtre

 

 

Fenêtre

numéro de la fenêtre à déclarer ( 0 à 7 )

 

 

Exemples :

 

termadd -T 9766 -n ba0120 -b chase0,12 -o channel=0

termadd -T ba80 -n itp094 -b itp0,9 -o channel=4

 

 

Déclaration des imprimantes sur ba80/9766

 

termadd -T type
-n nom_tty

-b interface

-o channel=canal,login=0

 

L’option login=0 sert à préciser qu’il ne faut pas
envoyer de message de prompt sur cette voie.

 

Le numéro de canal (fenêtre) utilisé pour le fichier
spécial est en général :

p pour le canal 8 (imprimante sas)

q pour la canal 9 (imprimante sas ou v24)

pour les différencier des fenêtres

 

Exemple :

 

Déclaration du canal 8 pour une imprimante sur le terminal
de l’exemple précédant.

 

termadd -T ba80-08 -n ba11p -b chase1,1 -o channel=8,login=0

 

b) Visualisation des terminaux déclarés

La commande de visualisation est : termshow

 

c) Effacement d’un terminal

La commande d’effacement d’un terminal est : termdel
nom_tty

 

 !Attention  :

L’effacement d’un terminal créé par termadd
doit toujours se faire par termdel.

 

7. Voir les caractèristiques d’un terminal

 

La commande stty permet de lire ou de modifier
certaines caractéristiques (modes) du protocole de communication avec le
terminal courant.

 

stty -a

 

# stty -a

speed 38400 baud ;

eucw 1:0:0:0, scrw 1:0:0:0

intr = ^c ; quit = ^~; erase = ^ ? ; kill = ^u ;

eof = ^d ; eol = <undef> ; eol2 = <undef> ; swtch =
<undef> ;

start = ^q ; stop = ^s ; susp = ^z ; dsusp = ^y ;

rprnt = ^r ; flush = ^o ; werase = ^w ; lnext = ^v ;

-parenb -parodd cs8 -cstopb -hupcl cread -clocal -loblk -crtscts
- crtsxoff –pare xt

-ignbrk brkint ignpar -parmrk -inpck -istrip -inlcr -igncr
icrnl –iuclc ixon -ixany -ixoff imaxbel isig icanon -xcase echo echoe echok -echonl
–noflsh -tostop echoctl -echoprt echoke -defecho -flusho -pendin iexten opost
- olcuc onlcr -ocrnl -onocr -onlret -ofill -ofdel tab3

 

 

8. Modifier les caractèristiques

 

stty mode
valeur

 

Exemples :

stty kill ’w’

 

stty -icrnl

 

Liste des paramètres de stty

 

brkint

signale une interruption sur unbreak

bs0

sélectionne le type de délai pour le retour arrière

clocal

ligne sans modem

cr0

sélectionne le type de délai pour le retour chariot

cread

entrée validée

cs8

format bits

-cstopb

1 bit de stop

-defecho

 

dsusp = EM

caractère d’arrêt des processus foreground

echo

écho des caractères tapés

echoctl

echo des caractères "controlés" sous la
forme ^caractère

echoe

écho des caractères effacés

echok

envoie NL après KILL

echoke

BS SP BS efface la ligne entière

-echonl

pas d’écho de NL

-echoprt

pas d’echo des caractères erase

eof = EOT

caractère fin de fichier

eol = NULL

caractère de fin de ligne

eol2 = NULL

caractère de fin de ligne additionnel

erase = ^H

caractère d’effacement

ff0

sélectionne le type de délai pour le FF

flush = ^o

 

-flusho

la sortie n’est pas vidée

hupcl

la déconnexion interrompt la transmission

icanon

traitement caractère à caractère (traitement de
ERASE et de KILL)

-icrnl

cr = cr ne pas ajouter CR à NL

iexten

valide les fonctions étendues pour une donnée en
entrée

-ignbrk

prise en compte des interruptions en entrée

-igncr

prendre en compte les rc en entrée

ignpar

ignorer les erreurs de parité

-imaxbel

pas de BEL si la ligne en entrée est trop longue

-inlcr

nl = nl ne pas ajouter NL à CR

-inpck

pas de contrôle de parité en entrée

intr = DEL

caractère d’interruption

isig

active le contrôle de caractères pour éviter INTR et
QUIT

-istrip

lire les 8 bits/caractère entrés

iuclc

les majuscules sont transformées en minuscules en
entrée

ixany

tout caractère relance la sortie

-ixoff

pas de régulation d’entrée

ixon

régulation de sortie par XON/XOFF

kill = ^U

caractère d’effacement de ligne

lnext = SYN

caractère qui inhibe le caractère suivant

loblk

bloque la sortie d’un process précédent s’il n’y a
pas de process courant

nl0

sélectionne le type de délai pour le LF

-noflsh

activer le vidage des tampons sur interruption

-ocrnl

ajouter CR à NL en sortie

-ofdel

remplissage par ’\0’

ofill

délai sur temporisation

olcuc

remplacer les caractères minuscules en majuscules en
sortie

onlcr

ajouter NL à CR-NL en sortie

-onlret

NL exécute la fonction CR

-onocr

pas de CR en colonne 0 après un retour à la ligne

opost

traitement des caractères finaux en sortie

-parenb

sans parité

-parext

non validation de la parité étendue

-parmrk

ne pas masquer les erreurs de parité

-parodd

parité paire (si parenb)

-pendin

ne réaffiche pas l’entrée à chaque lecture

quit = FS

caractère d’abandon

rprnt = DC2

caractère de réimpression des caractères

speed = 9600

débit en bauds de la ligne

start = DC1

caractère XON

stop = DC3

caractère XOFF

susp = SUB

caractère d’arrêt des processus foreground

swtch = EM

caractère utilisé par shl

tab0 à tab3

valeur du caractère de tabulation

-tostop

n’émet pas SIGTTOU quand un process background écrit
sur le terminal

vt0

sélectionne le type de délai pour la tabulation
verticale

Werase = ETX

caractère d’effacement d’un mot

-xcase

pas de traitement des minuscules/majuscules

 

9. Définition du type de terminal

 

Pour utiliser un terminal, certains utilitaires comme vi
s’appuient sur une description du terminal.

 

TERM=97801 ; export TERM

 

Le fichier /etc/ttytype est consulté pour affecter le
bon TERM au bon terminal.

 

Ces commandes peuvent être mises dans le fichier .profile
de l’utilisateur.

 

La descripton de la plupart des terminaux vendus sur le
marché se trouvent dans les bases de données /usr/lib/terminfo et/ou
dans le fichier /usr/share/lib/termcap (plus ancienne).

 

10. terminfo

 

Pour décrire un terminal, on codifie l’ensemble de ses
capacités sous la forme d’une description source.

 

La source est compilée par l’utilitaire tic. Le code
objet généré est rangé dans un sous-répertoire de /usr/lib/terminfo.

 

* Compilation

 

tic -v fichier

* Visualisation d’une description ("décompilation")

 

 

infocmp -I TypeTerminal

 

 

Exemple :

 

Le terminal 97801 est décrit par le fichier /usr/lib/terminfo/9/97801

 

infocmp -I 97801 > 97801.ti

 

Exemple terminfo :

 

infocmp -I 97801

 

\E signifie <ESCAPE>

^X signifie <CTRL X>

 

 

La commande tput permet d’activer les
caractéristiques définies dans le fichier.

 

Exemples :

 

tput clear

tput smso

 

 

 

 

 

 

11. Liste des codes utilisés dans TERMINFO

 

terminfo

termcap

caractéristiques générales

code

code

cols

co

nombre de colonnes

lines

li

nombre de lignes

hc

hc

sortie imprimante locale (hard copy)

os

os

superposition de caractères

mouvements du curseur

am

am

marge automatique

cuu1

up

déplacement du curseur vers le haut

cud1

do

déplacement du curseur vers le bas

cuf1

nd

déplacement non destructeur du curseur vers la droite

home

ho

déplacement du curseur au début de l’écran (home)

hd

hd

demi-page vers le bas

hu

hu

demi-page vers le haut

rmm

mo

adressage direct de l’écran

gestion de l’écran

clear

cl

effacement de l’écran

el

ce

effacement jusqu’à la fin de la ligne

ed

cd

effacement jusqu’à la fin de l’écran

dl1

dl

suppression de la ligne

il1

al

insertion d’une ligne

smir

im

entrée en mode insertion de caractères

rmir

ei

sortie du mode insertion de caractères

ich1

ic

insertion de 1 caractère

dch1

dc

suppression de 1 caractère

touches de fonctions spéciales

kf<n>

k<n>*

où <n> est un entier, donne la valeur de la
touche de fonction

kcuu1

ku

flèche vers le haut

kcud1

Kd

flèche vers le bas

kcub1

Kl

flèche vers la gauche

kcuf1

Kr

flèche vers la droite

kbs

Kb

touche <backspace>

khome

Kh

touche home

smkx

Ks

entrée en mode fonction du clavier auxiliaire

rmkx

Ke

sortie du mode fonction du clavier auxiliaire

attributs d’affichage

smso

So

entrée en mode vidéo inverse

rmso

Se

sortie du mode vidéo inverse

smacs

As

passage en mode caractères spéciaux

rmacs

Ae

retour au mode caractères normaux

hs

Hs

existence d’une ligne spéciale

eslok

Es

droits d’accès à la ligne spéciale

ts1

Ts

accès à la ligne spéciale

smul

Us

entrée en mode souligné

rmul

Ue

sortie en mode souligné

civis

Vi

curseur invisible

cnorm

Ve

curseur normal

 

pour les touches fonctions de 0 à 9.

II. Les fichiers de définitions des terminaux

Ces fichiers sont utilisés par toutes les commandes et bibliothèques UNIX
qui font de la gestion d’écran comme emacs, more, vi … Ils permettent
d’assurer une gestion d’écran indépendante du type de terminal utilisé.

 

A. Le fichier /etc/termcap (BSD 4.[1-4])

 

Le fichier /etc/termcap est une base de données qui décrit les
caractéristiques des terminaux existant. Il utilise une syntaxe similaire à
celle du fichier /etc/gettytab déjà vu.

Voici un exemple de configuration d’un modèle vt220 dans ce fichier :

dl|vt200|vt220|vt200-js|vt220-js|dec vt200 series with jump
scroll :

:im=\E[4h:ei=\E[4l:mi:dc=\E[P:dm=:ed=:al=\E[L:dl=\E[M :

:cs=\E[%i%d ;%dr:sf=\ED:sr=\EM:sb=\EM :

:ce=\E[K:cl=\E[H\E[J:cd=\E[J:cm=\E[%i%d ;%dH:nd=\E[C:up=\E[A :

:so=\E[7m:se=\E[27m:us=\E[4m:ue=\E[24m :

:md=\E[1m:mr=\E[7m:mb=\E[5m:me=\E[m :

:is=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h\E[1 ;24r\E[24 ;1H :

:rs=\E>\E[?3l\E[?4l\E[?5l\E[?7h\E[?8h :

:tc=vt100 :

B. Le répertoire /usr/lib/terminfo ( SV R[1-4] )

 

Ce répertoire joue le même rôle que le fichier /etc/termcap.
Il contient un fichier de description compilé par terminal. Chaque fichier est
ranger dans un répertoire qui a pour intitulé la premier lettre du terminal.

 

L’exemple ci dessous nous montre les différents répertoires
existants.

 

/usr/lib/terminfo # ls

1 3 5 7 9 X b d f h j l n p r t v x z

2 4 6 8 D a c e g i k m o q s u w y

 

Cette exemple montre les différents terminaux dans le
répertoire /usr/lib/terminfo/c :

 

/usr/lib/terminfo # ls v

toto vi200 virtual vt100-nav vt100.ti vt220.ti vc103 vi200-f
visual vt100-nav-w vt100am vt320 vc203 vi200-ic vitty vt100-np vt100nam vt320-am
vc303 vi200-rv vk100 vt100-s vt100s vt320-nam vc303-a vi200-rv-ic vs100
vt100-s-bot vt100w vt320.ti vc403a vi300 vs100s vt100-s-top vt125 vt50 vc404
vi300-aw vt100 vt100-top-s vt132 vt50h

vc404-na vi300-rv vt100-am vt100-w vt200 vt52 vc404-s
vi300-ss vt100-bot-s vt100-w-am vt220 vc404-s-na vi550 vt100-nam vt100-w-nam
vt220-am

vc415 viewpoint vt100-nam-w vt100-w-nav vt220-nam


Commentaires  Forum fermé

Navigation

Articles de la rubrique

Statistiques

Dernière mise à jour

mercredi 5 juillet 2017

Publication

264 Articles
Aucun album photo
Aucune brève
6 Sites Web
2 Auteurs

Visites

9 aujourd’hui
231 hier
545762 depuis le début
8 visiteurs actuellement connectés