(по материалам Motorola Unix System V/88 4.0)

Обзор
	init (из /etc/inittab, state 2 или 3)
	 |
	 V
	SAC (Service Access Controller) см. sac(1m)
	 |		|             |
	 V              V             V
	port monitor	port monitor  ...
	 |       |      |      |
	 V       V      V      V
	service  ...

	а также процедура конфигурации и адм.файл SAC (/etc/saf/_sysconfig)
		процедура конфигурации и адм.файл  для каждого монитора портов
			(/etc/saf/<имя монитора>/_config)
		процедура конфигурации для каждого сервиса каждого монитора
		команда sacadm(1m)
		команда pmadm(1m)
		команды для конкретных мониторов ttyadm(1m), nlsadmin(1m)
	формат процедур конфигурации описан в doconfig(3n), например:
		assign TZ=EST5EDT
		runwait echo SAC is starting > /dev/console
		run /usr/bin/daemon
		runwait ulimit 4096
		runwait umask 077
		push модуль_в_поток
		(ulimit, umask, cd - внутренние команды)

	только один сервис может быть связан с каждым портом
	много портов может быть привязано к одному сервису

Состояния монитора: STARTING, ENABLED, DISABLED, STOPPING, NOTRUNNING, FAILED

Процедура работы SAC:
	устанавливает окружение
	запускает мониторы
	отслеживает их работу и, при необходимости, перезапускает

Структура адм.файла sac: sacadm, /etc/saf/..., /var/saf/...
	имя(PMTAG) тип(PMTYPE) флаги(FLGS) повторы(RCNT) команда(COMMAND)
	тип - позволяет работать с группой мониторов как с единым целым
	флаги - d (стартовать, но не разрешать обслуживание)
		x (не стартовать)
	повторы - количество попыток запустить монитор
	команда - полный путь команды, реализующей монитор

Адм. процедура монитора берет аргументы из командной строки и преобразует их
	в форму, пригодную для запоминания в базе данных (ttyadm , nlsadmin)

Структура адм.файла монитора: pmadm
	первая строка в форме:
		# VERSION=<версия>
	имя монитора, тип монитора, имя сервиса, флаги, ид.пользователя, спец.парам.
	флаги: x (не разрешать обслуживание)
	       u (создать строку в utmp)
	спец.параметры зависят от монитора

Внимание: при автоконфигурации устройства могут быть переадресованы
	см. boot(1m), /etc/device-map

/usr/lib/saf/sac -t <интервал_проверки>

sacadm -l [ -p <имя монитора> | -t <тип монитора> ] # вывести инф. о мониторах
sacadm -a -p <имя монитора> -t <тип монитора> -c "<команда>" -v <версия>
	[ -f [d|x] ] [ -n <счетчик повторов> ] [ -y "<комментарий>" ]
	[ -z <процедура конфигурации монитора> ]
	добавить монитор портов
	версия обычно выполняется так: -v `ttyadm -V`
sacadm -e -p <имя монитора> # разрешить сервис
sacadm -d -p <имя монитора> # запретить сервис
sacadm -s -p <имя монитора> # запустить монитор
sacadm -k -p <имя монитора> # остановить монитор (kill SIGTERM)
sacadm -r -p <имя монитора> # удалить описание монитора
sacadm -G [ -z <процедура конфигурации sac> ] # показать или установить
sacadm -g -p <имя монитора> [ -z <процедура конфигурации монитора> ]
sacadm -x [ -p <имя монитора> ] # перечитать адм. файл (если поменяли его
				# в текстовом редакторе (лучше не надо)

pmadm -l [ -t <тип монитора> | -p <имя монитора> ] [ -s <имя сервиса> ]
	# показать информацию
pmadm -a [ -p <имя монитора> | -t <тип монитора> ] -s <имя сервиса>
	-i <ид-р пользователя> -m "<специфика>" -v <версия> [ -f [x|u] ]
	[ -y "комментарий" ] [ -z <процедура конфигурации сервиса> ]
	# добавить сервис к монитору(ам)
pmadm -e -p <имя монитора> -s <имя сервиса> # разрешить сервис
pmadm -d -p <имя монитора> -s <имя сервиса> # запретить сервис
pmadm -r -p <имя монитора> -s <имя сервиса> # удалить сервис
pmadm -g -p <имя монитора> -s <имя сервиса> [ -z <пр-ра конф. сервиса> ]
pmadm -g -t <тип монитора> -s <имя сервиса> -z <пр-ра конф.сервиса>


ttymon
	ttymon заменяет getty и uugetty
	инициализирует и следит за портами
	запускает указанный stream-модуль
	устанавливает режимы терминала termio(7) и скорость линии
	выдает приглашение и ждет
	если приходит хоть один неBREAK символ, за которым идет NL,
	то запускает сервис (обычно login)
	если вместо приглашения, пользователь видит мусор, то он жмет
	кнопку BREAK, и ttymon переходит к следующей метке в /etc/ttydefs
	autobaud - перед выдачей приглашения, ttymon читает символ
	и, считая что это NL, пытается определить скорость (5 попыток)
	если не получилось, то как обычно переходим к следующей метке
	если порт закрыт, то сервис на нем не запускается
	если монитор закрыт, то ВСЕ его порты закрыты, скорость и режимы
		не установлены!
	при запуске сервиса монитор заменяет %d на полное имя порта
		(устройства), при запуске сервиса его дескрипторы 0, 1 и 2
		открываются на это устройство

ldterm - line discipline module: либо загружается сервисом, либо
	через autopush(1m): задает стрим-модули, загружаемые в поток при
	открытии устройства (задаются ст. и мл. номера устройства и список
	модулей), обеспечивает почти весь терминальный сервис (кроме
	управления устройством - c_cflag и IGNBRK, IGNPAR, PARMRK, INPCK
	обрабатывает многобайтные символы

для console и contty сервисы задаются не через монитор портов, а
	непосредственно в /etc/inittab с помощью экспресс-режима (см. ttymon(1m)
/usr/lib/saf/ttymon -g [-h] [-d device]  [-l  ttylabel]  [-t timeout]
          [-p prompt] [-m modules] # экспресс-режим (параметры см. ниже)

/etc/inittab
	метка:уровень_выполнения:действие:процесс
		действие: respawn - повторный запуск в параллель
			  wait    - запустить один раз и ждать завершения
			  once    - запустить один раз, но не ждать
			  boot    - запустить один раз после загрузки, не ждать
			  bootwait- запустить один раз после загрузки, ждать
			  powerfail-запустить при получении сигнала SIGPWR
			  powerwait-то же, но ждать завершения
			  off     - не запускать, если уже есть, то остановить
			  ondemand- аналог respawn
			  inidefault-при запуске init определяет уровень вып-я
				     не ставьте 6 или пусто (будет зацикливание)
			  sysinit - запустить (ждать) до определения уровня вып-я
		процесс: делается sh -c 'exec процесс'
	не забудьте выдать init q

sacadm -a -p <имя монитора> -t ttymon -c /usr/lib/saf/ttymon -v `ttyadm -V`
pmadm -a -p <имя монитора> -s <имя сервиса> -i root [ -f [u|x] ]
	-v `ttyadm -V` -m "`ttyadm [ -b ] [ -r count ] [ -c ]
		[ -h ] [ -i msg ] [ -m ldterm ] [ -p prompt ]
		[ -t timeout ] -d device -l ttylabel -s /usr/bin/login`"
	где msg - сообщение, выдаваемое на закрытый терминал
	    -b    двунаправленный порт (и входящие и выходящие вызовы)
		  (BNU должен быть установлен)
	    ttylabel - метка в /etc/ttydefs (ранее был /etc/gettydefs)
Формат ttydefs (в будующем может быть изменен, так что пользуйся sttydefs(1m)):
	метка:нач-флаги:кон-флаги:autobaud:метка-перехода
		флаги - любые параметры stty
		мач-флаги устанавливаются перед выдачех приглашения
		кон-флаги устанавливаются после запроса, но до запуска сервиса
Кстати sttydefs -l позволяет проверить правильность файла /etc/ttydefs


/usr/sbin/ttyadm [ -b ] [ -c ] [ -r count ] [ -h ] [ -i msg ] [-m modules ]
          [ -p prompt ] [ -t timeout ] -d device -l ttylabel -s service
   -b двунаправленный порт (позволяет как звонить на этот порт, так и с него)
   -c монитор запускает сервис как только обнаружена несущая (т.е. не выдает
	приглашение и не определяет скорость порта)
   -d полное имя устройства
   -h если флаг не указан, то монитор сбрасывает линию (на время устанавливая
	нулевую скорость) перед установкой скорости
   -i сообщение, выдаваемое на неактивный или заблокированный порт
   -l метка из /etc/ttydefs
   -m список STREAM-модулей, разделенных запятой, которые будут запиханы в
	поток перед запуском сервиса вместо тех, которые были там ранее
   -r счетчик NL, которые монитор ждет из порта перед тем как нициировать его
   -p приглашение
   -s полное имя программы, отвечающей за сервис
   -t если указано, то прождав это время и ничего не получив монитор закрывает
	порт
   -V выдать номер версии

termio
   первый терминальный файл, открываемый лидером сессии (сессия - это вся
      совокупность процессов, порожденных лидером, пока очередной процесс
      не вызовет системный примитив смены сессии), становится управляющим
      терминалом сессии. Процессы, делятся на группы, одна из которых
      является группой переднего плана, остальные заднего.
   hungup с точки зрения компьютера - это сброс DTR (делается установкой
	нулевой скорости)
   режимы для нормальной работы:
	-ignbrk, brkint - разрешить прерывание по BREAK
	-parmrk, ignpar, inpck - запретить проверку четности
	-istrip, -inlcr, igncr&-icrnl / -igncr&icrnl, -iuclc - преобр.ввода
	ixon, -ixany, ixoff - синхронизация ввода/вывода
	opost, -olcuc, onlcr, -ocrnl, -onocr, -onret - преобр.вывода
	ofill, nl0, cr0, tab3, bs0, vt0, ff0 - задержки
	b9600 | b19200 | b38400 - скорость по вкусу
	-cstopb, cread, -parenb, hupcl - режимы линии
	[-]clocal - модем или терминал
	isig, icanon, -xcase, echo, echoe, echoke, echoctl - ред-е строки
	-flusho, -pendin, iexten - расширения

/usr/lib/saf/listen [ -m devstem ] net_spec
	listen отслеживает сетевой транспорт, ориентированный на соединения
	(TCP), получает входящие запросы и вызывает соответствующий сервис
	обеспечивает приватный адрес транспорта в дополнение к имени сервиса,
	передачу дескриптора файла входного соединения постоянно
	выполняемому серверу вместо fork/exec (через FIFO или именованный
	STREAM), поддерживает сервисы, которые пользуются сокетами вместо
	TLI (реализуются через STREAM-модули), в том числе RPC, статически
	или динамически назначаемые адреса
	на каждую сеть д.б. хотя бы один listen

Самостоятельное использование nlsadmin
net_spec: относительное имя точки входа в /dev для сети (транспорт-провайдер)
адрес:    либо символьное представление сетевого адреса, либо \x а затем
	  шестнадцатеричное представление адреса
nlsadmin -x          # выдать состояние всех listen-процессов
nlsadmin net_spec    # выдать состояние listen-процесса для данной сети
nlsadmin -v net_spec # выдать более болтливый отчет
nlsadmin -z код_сервиса net_spec # выдать отчет для данного сервиса
nlsadmin -l адрес net_spec # устанавливает или изменяет базовый адрес
nlsadmin -t адрес net_spec # устанавливает или изменяет адрес терминального
				сервиса
nlsadmin -i net_spec # инициализирует установку listen для данной сети
		     # должен быть выдан до назначения адресов или сервисов
nlsadmin -a service_code [-p modules] [-w username] -c cmd -y comment
	# добавить сервис; service_code строка символов: от 0 до 100
	# зарезервированы для внутр.полоьзования; 0 - nlps сервер, который
	# вызывается при запросе по базовому адресу; 1 - remote login сервис;
	# по умолчанию в качестве имени пользователя используется имя
	# пользователя, выдавшего запрос
nlsadmin -r service_code net_spec # удалить сервис
nlsadmin -e service_code net_spec # разрешить сервис
nlsadmin -d service_code net_spec # запретить сервис
nlsadmin -s net_spec # запустить монитор
nlsadmin -k net_spec # остановить монитор

Использование nlsadmin под SAF
под SAF для каждой сети можно определить несолько мониторов; тогда они
различаются по -N <имя монитора>
     nlsadmin -c cmd|-o pipename  [-p  modules]  [-A  address|-D]
              [-R prognum:versnum]
используется для форматирования информации для pmadm
сервер задается либо именем (-c cmd) или именем FIFO или STREAM (-o pipename)
-A задает частный адрес
-D динамическое задание адреса; в сочетании с -R позволяет регистрировать
   динамический адрес через rpcbinder

nlsadmin для совместимости позволяет добавлять и удалять сервисы, запускать
	и останавливать listen, запрашивать статус (хотя на самом деле это
	делается через SAF).

pmadm -a -p <имя монитора> -s <имя сервиса> -i <ид-р пользователя>
	-m "`/usr/sbin/nlsadmin <опции>` -v `nlsadmin -V` -y "<комментарий>"

 pmadm -l -p tcp:
tcp listen    0 - root \x00020ace980a01060000000000000000 - c - /usr/lib/saf/nlps_server
	# NLPS server (для совместимости для старых listen)
tcp listen    1 - listen - c - /usr/slan/lib/ttysrv -m ntty,tirdwr,1d0
	# TTY server (remote login, т.е. cu через сеть)
tcp listen  101 - listen - c - /usr/lib/uucp/uucico -r0 0unuucp -iTLI
	# uucp access direct to server
tcp listen  102 - listen - c - /usr/slan/lib/ttysrv -d -m ntty,tirdwr,1d0
	# uucp access to server via login

Журналы:
	/var/saf/_log
	/var/saf/<имя монитора>/log
	/var/saf/<имя монитора>/o.log

getty [ -h ] [ -t timeout  ]  line  [  speed  [  terminal  [ linedisc ] ] ]
	выдает приглашение, ждет имя пользователя и вызывает login
	line - имя файла в /dev
	-h - запрещает hangup (сброс скорость в 0)
	-t - время ожидания ввода имени пользователя
	speed - имя в /etc/ttydefs
	terminal - тип терминала
	linedisc - имя дисциплины линии
/usr/lib/uucp/uugetty [-t timeout] [-r]  line  [speed  [type [linedisc] ] ]
	аналогично getty, но можно использовать в обоих направлениях
	(для cu, uucico, ct). login запускается либо по готовности линии,
	либо (ключ -r) по приходу первого символа (иначе два uugetty будут
        бесконечно ждать друг друга). Для uucico поставьте
		""  \r\d\r\d\r\d\r in:--in: . . .
        30:2:respawn:/usr/lib/uucp/uugetty -r -t 60 tty12 1200
	linedisc - может быть только LDISC0


Популярность: 32, Last-modified: Tue, 26 Aug 2003 12:29:28 GMT