*BSD News Article 71665


Return to BSD News archive

Path: euryale.cc.adfa.oz.au!newshost.anu.edu.au!harbinger.cc.monash.edu.au!news.mira.net.au!vic.news.telstra.net!act.news.telstra.net!psgrain!news.uoregon.edu!newsfeed.internetmci.com!howland.reston.ans.net!Germany.EU.net!Dortmund.Germany.EU.net!interface-business.de!usenet
From: j@ida.interface-business.de (J Wunsch)
Newsgroups: comp.unix.bsd.freebsd.misc,comp.unix.bsd.misc
Subject: Re: Setting up a PPP server for FreeBSD
Date: 21 Jun 1996 12:03:01 GMT
Organization: interface business GmbH, Dresden
Lines: 105
Message-ID: <4qe31l$ha5@innocence.interface-business.de>
References: <4qd7bd$3m8@natasha.rmii.com>
Reply-To: joerg_wunsch@interface-business.de (Joerg Wunsch)
NNTP-Posting-Host: ida.interface-business.de
X-Newsreader: knews 0.9.6
X-Phone: +49-351-31809-14
X-Fax: +49-351-3361187
X-PGP-Fingerprint: DC 47 E6 E4 FF A6 E9 8F  93 21 E0 7D F9 12 D6 4E
Xref: euryale.cc.adfa.oz.au comp.unix.bsd.freebsd.misc:21845 comp.unix.bsd.misc:1148

tjacobs@vaultbbs.com (Thomas R. Jacobs, Jr.) wrote:

> I have found lots of documentation on getting user PPP set up, but not
> a whole lot on setting up a PPP server.  The bit I did see that looked
> the most promising would require that I replace getty in ttys with
> ppp.  I can't do this because, I still need to be able to use the
> dialin ports for shell logins and SLIP.  The other method I saw used a
> ppplogin script.  I have not been able to get that to work at all.

Here's mine.  As you can see, it uses /etc/sliphome/slip.hosts in its
native format, so it can share its client database with SLIP.  The
script is setuid root and runnable by group ppp only.

#!/usr/bin/suidperl
#
#
# login script for PPP logins
#

$ENV{'PATH'} = "/bin:/usr/bin:/sbin:/usr/sbin";

#
# Q: how to check if the fork succeeded?
# A: ask Larry Wall :-/
#
open(LOG, "|-") || exec "logger", "-p", "local0.debug";


if(open(SLHOST, "/etc/sliphome/slip.hosts") == 0) {
    print LOG "Cannot open /etc/sliphome/slip.hosts\n";
    close LOG;
    exit 1;
}

if(!defined($ENV{'USER'})) {
    print LOG "PPP login with unknown \${USER}\n";
    close LOG;
    exit 1;
}

$user = $ENV{'USER'};
$sluser = $user;
$sluser =~ s/^pp/sl/;

while(<SLHOST>) {
    next if /^([ \t]*\#.*)?$/;
    ($login,$local,$remote,$mask,$optargs) = split;
    last if $login eq $sluser;
}

close(SLHOST);

if($local eq "" || $remote eq "" || $mask eq "" || $login ne $sluser) {
    print LOG "PPP login for user $user, required information not found\n";
    close LOG;
    exit 1;
}

print LOG "$user ($sluser/$login) attached, $local -> $remote, mask $mask\n";

$local = &convaddr($local);
$remote = &convaddr($remote);
$mask = &convaddr($mask);

print LOG "$user attached, $local -> $remote, mask $mask\n";

close LOG;

exec "pppd", "crtscts", "modem",
    "$local:$remote", "netmask", "$mask";

# should not be reached at all
open(LOG, "|-") || exec "logger", "-p", "local0.debug";
print LOG "exec of pppd failed for user $user\n";
close(LOG);
exit 2;

#
# convert address to dotted quad
#
sub convaddr
{
    local($input) = @_;
    local($ip,$a,$b,$c,$d);

    # return if already dotted quad
    return $input if $input =~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/;

    if($input =~ /^0[xX]/) {
	$ip = oct($input);
	return sprintf("%d.%d.%d.%d", ($ip >> 24) & 0xff,
		       ($ip >> 16) & 0xff, ($ip >> 8) & 0xff,
		       $ip & 0xff);
    }

    # neither dotted quad, nor hex number, ask the name server
    ($name,$aliases,$addrtype,$length,$addr) = gethostbyname($input);
    ($a,$b,$c,$d) = unpack("C4",$addr);
    return "$a.$b.$c.$d";
}

-- 
J"org Wunsch					       Unix support engineer
joerg_wunsch@interface-business.de       http://www.interface-business.de/~j