chat for ppp, from ppp 2.1.2

This commit is contained in:
Lars Fredriksen 1994-11-12 05:25:32 +00:00
parent 0b06d15f3a
commit 9b1aec4804
10 changed files with 1809 additions and 0 deletions

5
usr.bin/chat/Example Normal file
View File

@ -0,0 +1,5 @@
#
../pppd/pppd -d connect 'chat "" ATDT5551212 CONNECT "" ogin: ppp' netmask 255.255.255.0 /dev/com1 38400
../pppd/pppd connect 'chat "" AATDT5551212 CONNECT "" ogin: ppp' netmask 255.255.255.0 /dev/com1 38400

8
usr.bin/chat/Makefile Normal file
View File

@ -0,0 +1,8 @@
# $Id: Makefile.bsd,v 1.2 1994/05/26 06:45:03 paulus Exp $
PROG= chat
SRCS= chat.c
MAN8= chat.8
BINDIR= /usr/bin
.include <bsd.prog.mk>

169
usr.bin/chat/README Normal file
View File

@ -0,0 +1,169 @@
I run PPP between crappie.morningstar.com (137.175.6.3, my home
machine) and remora.morningstar.com (137.175.2.7, my workstation at
the office). This document describes how I use it. The installation
of PPP itself is covered in the PPP distribution.
I put a line like this in remora's /etc/passwd:
Pkarl:2y4613BDaQD3x:51:10:Karl's PPP login:/tmp:/usr/local/etc/pppstart
I created a login shell script on remora called
/usr/local/etc/pppstart:
#!/bin/sh
/usr/bin/mesg n
stty -tostop
exec /usr/local/etc/ppp 137.175.2.7:
I use the ppp-on command to bring up a connection, and ppp-off to shut
it down. These shell scripts, plus the unlock and fix-cua scripts and
the source to the chat program are included. You will need to heavily
modify these to suit your own situation, including Internet addresses,
machine names, telephone numbers, modem dialing commands, baud rates,
login names and passwords. Make the "ppp..." command in the ppp-on
script look something like this:
ppp 137.175.6.3: /dev/cua &
The "137.175.6.3:" is of the format "local-addr:remote-addr" with the
remote address null (it will be negotiated by PPP). Look at the login
shell script above; it can be common to all dial-in PPP users on your
machine because it only specifies the address of the remora
(receiving) end of the link.
If you use the enclosed chat and unlock programs, be sure they are
suid uucp, and fix-cua should be suid root. The ppp-on script should
be chmod 700, owner yourself, to keep the password (semi-) secure.
I use the following eeprom settings and /dev and /etc/ttytab entries
in order to support dial-in and dial-out on a single phone line:
crappie 12% eeprom | grep ttya
ttya-mode=19200,8,1,n,h
ttya-rts-dtr-off=false
ttya-ignore-cd=false
crappie 13% ls -lg /dev/cua /dev/ttya
crw-rw-rw- 1 root staff 12, 128 Nov 20 09:14 /dev/cua
crw--w--w- 1 root wheel 12, 0 Nov 20 08:25 /dev/ttya
crappie 14% grep ttya /etc/ttytab
ttya "/usr/etc/getty std.19200" unknown on
crappie 15%
On SunOS 4.1 and later, make sure that the /etc/ttytab line for ttya
doesn't say "local":
ttya "/usr/etc/getty std.38400" unknown on
Make sure your modem passes data transparently; watch out especially
for ^S, ^Q, ^P (UUCP spoofing) and parity problems. I have a Telebit
Trailblazer+ attached to /dev/ttya with the following register
settings:
aaatz
OK
aat&n
E1 F1 M1 Q6 P V1 X0 Version BA4.00
S00=001 S01=000 S02=043 S03=013 S04=010 S05=008 S06=002 S07=060 S08=002 S09=006
S10=007 S11=070 S12=050
S45=000 S47=004 S48=000 S49=000
S50=000 S51=005 S52=002 S53=003 S54=001 S55=000 S56=017 S57=019 S58=002 S59=000
S60=000 S61=000 S62=003 S63=001 S64=000 S65=000 S66=001 S67=000 S68=255
S90=000 S91=000 S92=001 S95=000
S100=000 S101=000 S102=000 S104=000
S110=001 S111=030 S112=001
S121=000
N0:
N1:
N2:
N3:
N4:
N5:
N6:
N7:
N8:
N9:
OK
And, the following entry is in /etc/gettytab:
#
# 19200/2400 dialin for Telebit Trailblazer+ modem
#
T|T19200:dial-19200:\
:nx=T2400:sp#19200:
T2400|dial-2400:\
:nx=T19200:sp#2400:
My chat script dialing command looks like "ATs50=255s111=0DT4515678"
instead of just "ATDT4515678" in order to force a PEP mode connection
and to disable the UUCP spoofing (otherwise, the modem swallows or
delays ^P characters).
I run /usr/etc/in.routed on crappie (the calling end) and have this in
my /etc/gateways file:
net 0.0.0.0 gateway remora metric 1 passive
host crappie gateway crappie metric 0 passive
Routed is started in /etc/rc.local. This way, I don't have to
manually add or delete routes when links come up. I ifconfig the ppp0
interface on crappie at boot time like this (in /etc/rc.local with the
other ifconfig's):
ifconfig ppp0 crappie remora netmask 0xffffff00 down
I put "init ppp_attach" in my /sys/sun4c/conf/CRAPPIE file so that the
above ifconfig down will work:
pseudo-device ppp1 init ppp_attach # Point-to-Point Protocol, 1 line
Routed now keeps my routes sane at the crappie.MorningStar.Com end.
My ethernet (le0) and PPP (ppp0) interfaces are configured with the
same address and netmask. IP is smart enough to figure out (via the
routes in /etc/gateways) that everything useful needs to go out ppp0.
Also, the remora end of my PPP link is configured the same way -- the
ppp0 interface there is configured with the same address and netmask
as remora's le0 ethernet. This means that separate interface names
like "remora-ppp" are not needed; point-to-point links (whether PPP,
Xerox Synchronous Point-to-Point Protocol, SLIP, IGP or whatever) have
(apparently) been used this (seemingly bizarre) way for some time.
This works because when IP looks at a POINTOPOINT link it ignores the
local address (unlike an ethernet interface) and only looks at the
remote address.
Here's what netstat shows for me:
crappie 109% netstat -r
Routing tables
Destination Gateway Flags Refcnt Use Interface
localhost localhost UH 0 0 lo0
crappie crappie UH 1 11339 le0
default remora UG 0 1266 ppp0
mstar-net-ppp-remora crappie U 0 0 le0
crappie 110% netstat -rn
Routing tables
Destination Gateway Flags Refcnt Use Interface
127.0.0.1 127.0.0.1 UH 0 0 lo0
137.175.6.3 137.175.6.3 UH 1 11339 le0
default 137.175.2.7 UG 0 1266 ppp0
137.175.6.0 137.175.6.3 U 0 0 le0
crappie 111%
The default route to remora is a result of the first line in the
/etc/gateways file ("default" can't be used there; you have to say
"0.0.0.0").
On the network at work, I add a static route in our gateway machine's
/etc/rc.local file:
/usr/etc/route add net 137.175.6 remora 1
All the other machines in the office have default routes pointing at
the gateway machine, and all PPP-connected external machines are on the
137.175.6 subnet.
Send me mail or post to the newsgroup comp.protocols.ppp if you have
any questions.
Karl Fox <karl@MorningStar.Com>

251
usr.bin/chat/chat.8 Normal file
View File

@ -0,0 +1,251 @@
.\" -*- nroff -*-
.\" manual page [] for chat 1.8
.\" $Id: chat.8,v 1.7 1994/03/04 20:19:30 callahan Exp $
.\" SH section heading
.\" SS subsection heading
.\" LP paragraph
.\" IP indented paragraph
.\" TP hanging label
.TH CHAT 8 "17 April 1994" "Chat Version 1.8"
.SH NAME
chat \- Automated conversational script with a modem
.SH SYNOPSIS
.B chat
[
.I options
]
.I script
.SH DESCRIPTION
.LP
The \fIchat\fR program defines a conversational exchange between the
computer and the modem. Its primary purpose is to establish the
connection between the Point-to-Point Protocol Daemon (\fIpppd\fR) and
the remote's \fIpppd\fR process.
.SH OPTIONS
.TP
.B -f \fI<chat file>
Read the chat script from the chat \fIfile\fR. The use of this option
is mutually exclusive with the chat script parameters. The user must
have read access to the file. Multiple lines are permitted in the
file. Space or horizontal tab characters should be used to separate
the strings.
.TP
.B -l \fI<lock file>
Perform the UUCP style locking using the indicated lock file.
.IP
If the file could not be created then the \fIchat\fR program will
fail. The lock file will be deleted only if the \fIchat\fR program
fails to perform the script for any reason. If the script is
successful the lock file will be left on the disk. It is expected that
the lock file will be deleted when the \fIpppd\fR process no longer
wishes to use the serial device.
.IP
The use of a lock file with
.I chat
and
\fIpppd\fR\'s
.I lock
option should not be used at the same time. They are mutually
exclusive options and will cause one or the other program to fail to
achieve the required lock if you use both.
.TP
.B -t \fI<timeout>
Set the timeout for the expected string to be received. If the string
is not received within the time limit then the reply string is not
sent. An alternate reply may be sent or the script will fail if there
is no alternate reply string. A failed script will cause the
\fIchat\fR program to terminate with a non-zero error code.
.TP
.B -v
Request that the \fIchat\fR script be executed in a verbose mode. The
\fIchat\fR program will then log all text received from the modem and
the output strings which it sends to the SYSLOG.
.TP
.B script
If the script is not specified in a file with the \fI-f\fR option then
the script is included as parameters to the \fIchat\fR program.
.SH CHAT SCRIPT
.LP
The \fIchat\fR script defines the communications.
.LP
A script consists of one or more "expect-send" pairs of strings,
separated by spaces, with an optional "subexpect-subsend" string pair,
separated by a dash as in the following example:
.IP
ogin:-BREAK-ogin: ppp ssword: hello2u2
.LP
This line indicates that the \fIchat\fR program should expect the string
"ogin:". If it fails to receive a login prompt within the time interval
allotted, it is to send a break sequence to the remote and then expect the
string "ogin:". If the first "ogin:" is received then the break sequence is
not generated.
.LP
Once it received the login prompt the \fIchat\fR program will send the string ppp
and then expect the prompt "ssword:". When it receives the prompt for the
password, it will send the password hello2u2.
.LP
A carriage return is normally sent following the reply string. It is not
expected in the "expect" string unless it is specifically requested by using
the \\r character sequence.
.LP
The expect sequence should contain only what is needed to identify the
string. Since it is normally stored on a disk file, it should not contain
variable information. It is generally not acceptable to look for time
strings, network identification strings, or other variable pieces of data as
an expect string.
.LP
To help correct for characters which may be corrupted during the initial
sequence, look for the string "ogin:" rather than "login:". It is possible
that the leading "l" character may be received in error and you may never
find the string even though it was sent by the system. For this reason,
scripts look for "ogin:" rather than "login:" and "ssword:" rather than
"password:".
.LP
A very simple script might look like this:
.IP
ogin: ppp ssword: hello2u2
.LP
In other words, expect ....ogin:, send ppp, expect ...ssword:, send hello2u2.
.LP
In actual practice, simple scripts are rare. At the vary least, you
should include sub-expect sequences should the original string not be
received. For example, consider the following script:
.IP
ogin:--ogin: ppp ssowrd: hello2u2
.LP
This would be a better script than the simple one used earlier. This would look
for the same login: prompt, however, if one was not received, a single
return sequence is sent and then it will look for login: again. Should line
noise obscure the first login prompt then sending the empty line will
usually generate a login prompt again.
.SH ABORT STRINGS
Many modems will report the status of the call as a string. These
strings may be \fBCONNECTED\fR or \fBNO CARRIER\fR or \fBBUSY\fR. It
is often desirable to terminate the script should the modem fail to
connect to the remote. The difficulty is that a script would not know
exactly which modem string it may receive. On one attempt, it may
receive \fBBUSY\fR while the next time it may receive \fBNO CARRIER\fR.
.LP
These "abort" strings may be specified in the script using the \fIABORT\fR
sequence. It is written in the script as in the following example:
.IP
ABORT BUSY ABORT 'NO CARRIER' '' ATZ OK ATDT5551212 CONNECT
.LP
This sequence will expect nothing; and then send the string ATZ. The
expected response to this is the string \fIOK\fR. When it receives \fIOK\fR,
the string ATDT5551212 to dial the telephone. The expected string is
\fICONNECT\fR. If the string \fICONNECT\fR is received the remainder of the
script is executed. However, should the modem find a busy telephone, it will
send the string \fIBUSY\fR. This will cause the string to match the abort
character sequence. The script will then fail because it found a match to
the abort string. If it received the string \fINO CARRIER\fR, it will abort
for the same reason. Either string may be received. Either string will
terminate the \fIchat\fR script.
.SH TIMEOUT
The initial timeout value is 45 seconds. This may be changed using the \fB-t\fR
parameter.
.LP
To change the timeout value for the next expect string, the following
example may be used:
.IP
ATZ OK ATDT5551212 CONNECT TIMEOUT 10 ogin:--ogin: TIMEOUT 5 assowrd: hello2u2
.LP
This will change the timeout to 10 seconds when it expects the login:
prompt. The timeout is then changed to 5 seconds when it looks for the
password prompt.
.LP
The timeout, once changed, remains in effect until it is changed again.
.SH SENDING EOT
The special reply string of \fIEOT\fR indicates that the chat program
should send an EOT character to the remote. This is normally the
End-of-file character sequence. A return character is not sent
following the EOT.
.PR
The EOT sequence may be embedded into the send string using the
sequence \fI^D\fR.
.SH GENERATING BREAK
The special reply string of \fIBREAK\fR will cause a break condition
to be sent. The break is a special signal on the transmitter. The
normal processing on the receiver is to change the transmission rate.
It may be used to cycle through the available transmission rates on
the remote until you are able to receive a valid login prompt.
.PR
The break sequence may be embedded into the send string using the
\fI\\K\fR sequence.
.SH ESCAPE SEQUENCES
The expect and reply strings may contain escape sequences. All of the
sequences are legal in the reply string. Many are legal in the expect.
Those which are not valid in the expect sequence are so indicated.
.TP
.B ''
Expects or sends a null string. If you send a null string then it will still
send the return character. This sequence may either be a pair of apostrophe
or quote characters.
.TP
.B \\\\b
represents a backspace character.
.TP
.B \\\\c
Suppresses the newline at the end of the reply string. This is the only
method to send a string without a trailing return character. It must
be at the end of the send string. For example,
the sequence hello\\c will simply send the characters h, e, l, l, o.
.I (not valid in expect.)
.TP
.B \\\\d
Delay for one second. The program uses sleep(1) which will delay to a
maximum of one second.
.I (not valid in expect.)
.TP
.B \\\\K
Insert a BREAK
.I (not valid in expect.)
.TP
.B \\\\n
Send a newline or linefeed character.
.TP
.B \\\\N
Send a null character. The same sequence may be represented by \\0.
.I (not valid in expect.)
.TP
.B \\\\p
Pause for a fraction of a second. The delay is 1/10th of a second.
.I (not valid in expect.)
.TP
.B \\\\q
Suppress writing the string to the SYSLOG file. The string ?????? is
written to the log in its place.
.I (not valid in expect.)
.TP
.B \\\\r
Send or expect a carriage return.
.TP
.B \\\\s
Represents a space character in the string. This may be used when it
is not desirable to quote the strings which contains spaces. The
sequence 'HI TIM' and HI\\sTIM are the same.
.TP
.B \\\\t
Send or expect a tab character.
.TP
.B \\\\\\\\
Send or expect a backslash character.
.TP
.B \\\\ddd
Collapse the octal digits (ddd) into a single ASCII character and send that
character.
.I (some characters are not valid in expect.)
.TP
.B \^^C
Substitute the sequence with the control character represented by C.
For example, the character DC1 (17) is shown as \^^Q.
.I (some characters are not valid in expect.)
.SH SEE ALSO
Additional information about \fIchat\fR scripts may be found with UUCP
documentation. The \fIchat\fR script was taken from the ideas proposed by the
scripts used by the \fIuucico\fR program.
.LP
uucico(1), uucp(1)
.SH COPYRIGHT
The \fIchat\fR program is in public domain. This is not the GNU public
license. If it breaks then you get to keep both pieces.

1166
usr.bin/chat/chat.c Normal file

File diff suppressed because it is too large Load Diff

129
usr.bin/chat/connect-ppp Executable file
View File

@ -0,0 +1,129 @@
#!/bin/sh
#
# USAGE: connect-ppp <host>
#
# Set up a PPP link to host.
#
# This script locks the tty so that faxd and uucp will not
# interfere. If you are running with faxd as you "getty" then
# faxd will remove the lock once it notices that pppd is gone.
# This is the reason for pppd running in with the -detach flag,
# and you probably would run this script in the background.
#
# I had to create the nodropdtr option to pppd in order to be
# able to do what the script is doing here. Pathces has been
# sent to the respective people, but I don't know if they like
# them :-).
#
# Look for comments with <LOCAL> in the string. They identify
# things that you want to set for your system
#<LOCAL> define whatever your config file is.
CON_DB=/etc/ppp-connections
#<LOCAL> define whatever your device is.
DEVICE=tty00
#<LOCAL> define whatever your device speed is.
DEVICESPEED=57600
#<LOCAL> define whatever your lock directory is.
LOCKDIR=/var/spool/lock
LOCKFILE=$LOCKDIR/LCK..$DEVICE
#<LOCAL> define whatever debug level you want.
DEBUG="-d -d -d -d"
# Check that we got a name to connect to. This need not be an actuall hostname
# just the name you specified in the config file.
if [ $# -ne 1 ] ; then
echo "Usage: $0 <host> &"
exit 1
fi
# Get the configuration that is in effect for <name>
LINE=`grep "^$1" $CON_DB`
if [ -z "$LINE" ] ; then
echo "Unknow host $1"
exit 1
fi
# parse the CON_DB. The format is:
#
# <hostname>:<phone number>:<user id>:<password>:<local ip address>:\
# <remove_ip_address><netmask>:<pppd options>
#
# The last three are optional. But I would recomend specifying a netmask also
# when you specify a ip address.
IP_ADDR=""
IFS=':'
set $LINE
IFS=' '
HOST=$1
PHONE=$2
USER=$3
PASSWORD=$4
OUR_IP_ADDR=$5
THEIR_IP_ADDR=$6
NETMASK=$7
shift 7
OPTIONS=$*
if [ -f $LOCKFILE ] ; then
echo "PPP device is locked"
exit 1
else
# Lock the device
# faxd and UUCP wants 10 character lock id.
echo "$$" | awk '{printf("%10s",$0)}' > $LOCKFILE
fi
#Do we know our local ip address? If so pppd needs a : at the end of it.
if [ ! -z "$OUR_IP_ADDR" ] ; then
IP_ADDR=${OUR_IP_ADDR}:${THEIR_IP_ADDR}
fi
#Did we specify a netmask? If so convert to pppd format.
if [ ! -z "$NETMASK" ] ; then
NETMASK="netmask ${NETMASK}"
fi
# Do the actual work in a subshell so that we can turn off tostop and set
# the tty speed before chat dials. The second reason for doing in like
# is that if you aren't running BIDIR, and you are running faxd, clocal
# doesn't get turned on from pppd so chat will never work if you exec
# it from within pppd. I found that I needed to run uucp with the
# HAVE_CLOCAL_BUG flag set to 1 in order to get it to work in conjunction
# with faxd. Anyway, this setup seem to work.
(
stty $DEVICESPEED -tostop hupcl 2> /dev/null
# <LOCAL> Modify the Modem initialization strings to be whatever works for you
if chat -v ABORT "NO CARRIER" ABORT BUSY "" ATZ0E1 OK ATS50=255DT$PHONE \
CONNECT "" ogin: $USER ssword: \\q$PASSWORD
then
# We got connected.
/usr/libexec/pppd $DEBUG $OPTIONS -detach modem defaultroute \
crtscts $NETMASK $DEVICE $DEVICESPEED $IP_ADDR
else
echo "PPP call failed" 1>&2
exit 1
fi
) < /dev/$DEVICE > /dev/$DEVICE
# Get the return code from the subshell.
RC=$?
# Clear the lock. Slight window here where someone could detect that
# pppd is no longer running, remove its lock file and create its own.
# How to fix??
rm -f $LOCKFILE
#Pass on the exit code.
exit $RC

16
usr.bin/chat/fix-cua Normal file
View File

@ -0,0 +1,16 @@
#!/bin/sh
LOCKDIR=/var/spool/lock
case "$1" in
"") echo "Usage: fix-cua device"; exit 1 ;;
esac
if [ -f $LOCKDIR/LCK..$1 ]
then
echo "/dev/$1 is locked" 2>&1
exit 1
fi
chown root /dev/$1
chmod 666 /dev/$1

5
usr.bin/chat/ppp-off Executable file
View File

@ -0,0 +1,5 @@
#!/bin/sh
kill -INT `ps -ax | egrep " ppp " | egrep -v "egrep" | sed 's/^\([ 0-9]*\) .*/\1'/`
exit 0

37
usr.bin/chat/ppp-on Executable file
View File

@ -0,0 +1,37 @@
#!/bin/sh
#
# ppp-on
#
# Set up a PPP link
#
LOCKDIR=/var/spool/lock
DEVICE=com1
PHONE=4511234
USER=Pkarl
PASSWORD=password
OUR_IP_ADDR=137.175.6.3
if [ -f $LOCKDIR/LCK..$DEVICE ]
then
echo "PPP device is locked"
exit 1
fi
fix-cua $DEVICE
(
stty 19200 -tostop
if chat -l LCK..$DEVICE ABORT "NO CARRIER" ABORT BUSY "" ATZ OK ATs50=255s111=0DT$PHONE CONNECT "" ogin: $USER ssword: \\q$PASSWORD
then
ppp mru 1500 $OUR_IP_ADDR: /dev/$DEVICE &
sleep 10
exit 0
else
echo "PPP call failed" 1>&2
exit 1
fi
) < /dev/$DEVICE > /dev/$DEVICE

23
usr.bin/chat/unlock Executable file
View File

@ -0,0 +1,23 @@
#!/bin/sh
LOCKDIR=/var/spool/lock
case "$1" in
"") echo "Usage: unlock lockfile"; exit 1 ;;
.*) echo "Usage: unlock lockfile"; exit 1 ;;
esac
if [ -f $LOCKDIR/$1 ]
then
if [ `wc -c < $LOCKDIR/$1` -eq 4 ]
then
rm -f $LOCKDIR/$1
exit 0
else
echo "Usage: unlock lockfile"
exit 1
fi
else
echo "lockfile" $LOCKDIR/$1 "does not exist"
exit 1
fi