| Managing tty Attributes in AIX
 
Stephen Peterson 
I once supported an installation with 200 to 300 tty
devices, 
split between 64- and 128-port concentrators. There
were a dozen modems 
and about a dozen printers of various types. Much of
the support was 
performed via 9600 serial dialup lines. Using the System
Management 
Interface Tool, or SMIT (the ASCII version), to manage
tty 
attributes in this environment turned out to be highly
problematic, 
for these reasons: 
1. There are about 50 different tty attributes 
to scan through, but in my experience only two or three
are of interest, 
so long as you can be sure that all the rest were set
to default values. 
2. Changing/showing tty attributes in SMIT 
requires plodding through a list of ttys that can number
in 
the hundreds, then picking one of four screens for a
particular attribute. 
Guess wrong and you must start over. This can become
time-consuming 
over low speed modem-lines. 
3. When you are creating ttys, SMIT does 
not allow you to specify the device name. Instead, it
assigns the 
next available tty number. This is a problem if you
prefer 
to assign tty names consistent with port addresses. 
4. It is often handy to be able to add new devices,
with attributes identical to existing devices. SMIT
does not offer 
the capability to duplicate ttys, except when you are
creating 
a group of new, identical devices all at once. 
Given these limitations, I developed the getattr script
(Listing 1). 
It's a simple command-line tool that saves a lot
of time by filtering 
out all the default settings. This script can be extended
in various 
ways. Two of those ways are shown here: the duptty script
(Listing 2), which can create a new tty with attributes
matching 
a specified existing tty, and the alltty script (Listing
3), 
which can facilitate redefinition of all ttys, printers,
and 
modems on a system after a total reinstall of AIX. This
second extension 
might generate a list of mkdev and duptty commands 
to be executed after a disaster, or after a CPU upgrade
requiring 
a new level of AIX (such as the model 590, which required
AIX 3.2.5). 
The getattr Script 
The getattr script works with terminals, modems, or
printers 
connected on serial ports. The technique is to use the
lsattr 
command to compare the effective attribute values (generated
with 
the -E flag) with the default values (generated with
the -D 
flag), and report only on the non-default settings.
Each lsattr 
command redirects output into a separate temporary file.
The $$ 
suffix on the filenames is a Korn-shell reserved variable,
which is 
set to the PID of the current process. This serves to
provide unique 
filenames. 
The diff command does most of the work. For example,
using 
diff to compare the two lines 
 
term    vt100    TERMINAL type   (our setting, in the t1 file) 
 
and 
 
term    dumb     TERMINAL type   (the default, in the t2 file) 
 
would produce the following result: 
 
< term  vt100    TERMINAL type
---
> term  dumb     TERMINAL type 
 
So, to find the lines that differ from the defaults,
getattr 
pipes the diff output to an awk script, which prints
out the 
second and third blank-delimited words of every record
for which the 
first word is a "<". With a little formatting
of the print 
statement, and a BEGIN and END clause added, STDOUT
can be redirected to a file and executed as a chdev
command. 
However, I have used it primarily for concise reporting
of attributes, 
to do quick comparisons between devices when trouble-shooting.
Since 
each line in the BEGIN/END construct has an escaped
newline 
to accommodate the multiple-line chdev command, I use
the END clause to add a line to the end of the output.
A typical 
invocation, such as 
 
getattr tty0 
 
might produce the following output: 
 
chdev -a term=vt100 \
-a login=enable -l tty0 
 
You can use the script with other device classes as
well. The -b 
option of the diff command causes leading tabs or spaces,
as as well as strings between spaces, to be ignored
in comparisons. 
I added this option because column alignment on output
from the lsattr 
command can vary, depending on values for the effective
attributes. 
The last line deletes the temporary files. The AIX version
on our 
systems has an alias set for rm: the command whence
rm 
outputs the command rm -i. This is handy, since the
prompt 
helps root to avoid accidentally removing the wrong
files. In this 
script, however, it is sensible to specify the full
pathname to rm, 
so this safety feature is deactivated. 
There's one other thing to remember. When the $ metacharacter
is inside single quotes, the shell does not interpret
it. These $ 
variables have special meaning to the awk interpreter.
The awk variables 
$1, $2, etc., correspond to the first, second, etc.
word in the current input line. 
The duptty Script 
The duptty script (Listing 2) builds on the getattr
script. It creates a new tty with attributes identical
to 
any specified existing tty, assigning it whatever devicename
and port address you care to specify. 
Remembering the -p, -w, -t, -s, and 
-c parameters is difficult. What I have often done is
use 
SMIT to generate a command to add a device, then note
all the parameters 
in the command that SMIT builds. 
Each 64- or 128-port concentrator is assigned a serial
adapter number 
-- such as sa1, sa2, etc. -- when it is configured.
You can 
obtain these numbers from the output of the lsdev -C
command. 
The 64-port concentrators are addressed somewhat differently
than 
the 128-port concentrators. Both boxes have 16 ports
numbered 0-15. 
For the 16-port concentrator, a value such as sa1 corresponds
to 1, 2, 3, or 4 concentrators connected to 4 jacks
in the adapter 
installed in a particular microchannel slot, and the
connection numbers 
will be 0-15 on the first, 16-31 on the second, 32-47
on the third, 
and 48-63 on the fourth. The 128-port concentrators
are individually 
assigned to separate serial adapter numbers, so the
connection numbers 
are much more straightforward, always being 0-15, just
as they are 
labeled on the concentrator. 
One caveat concerning 128-port adapters: you cannot
include 
a leading zero on the connection number for ports 0
thru 9. If you 
do, an invalid connection message will result, and you
will probably 
have some difficulty identifying the problem. 
To delete a tty, follow this sequence of steps (substituting
the applicable number for NNN): 
1. pdisable ttyNNN (this stops the getty 
process on the tty) 
2. chdev -l ttyNNN -a login=disable (again, 
this halts the getty process) 
3. rmdev -dl ttyNNN (this deletes the tty 
definition) 
The alltty script 
I have written several throwaway scripts which execute
duptty 
repeatedly, to define ttys after a reconfiguration.
For example, 
if tty0 has a certain set of attributes you want to
roll out 
for ttys on five 128-port concentrators, you could use
something 
like the alltty script (Listing 3). This script will
define 
80 ttys, on each of five concentrators, giving them
device 
names such as tty100, tty101... tty115, tty200...tty215,
etc. 
Three-digit tty numbers sort easily. The command: 
 
lsdev -Cc tty | sort -k1 
 presents the ttys in numerical order only if 
the ttys are defined with three digits. 
Summary 
This covers most of what I've learned in working with
serial devices 
such as ttys, printers, and modems on an RS/6000. If
you have 
any comments or other feedback, I'd like to hear from
you.  
 
 About the Author
 
Steve Peterson is currently employed as an RS/6000
Systems Administrator
consultant. His current client is Aetna Life Insurance
in Middletown,
CT, where he is helping to implement distributed AIX/DB2/DCE
applications
on multiple RS/6000 systems. Prior to that he worked
at The Travelers for
12 years. He can be reached via email at StephenPet@Delphi.com. 
 
 
 |