Les terminaux asynchrones
par
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 |
PMSPECIFIC |
Identification de la voie physique, le nom du process, |
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 |
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 |
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 |
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 |
-icrnl |
cr = cr ne pas ajouter CR Ã NL |
iexten |
valide les fonctions étendues pour une donnée en |
-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 |
-istrip |
lire les 8 bits/caractère entrés |
iuclc |
les majuscules sont transformées en minuscules en |
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 |
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 |
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 |
vt0 |
sélectionne le type de délai pour la tabulation |
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 |
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é