- Write pid file if filename is set

- Add startup script and monitor script from Yuri
- Some logging correctness fixes from Iain Wade
- Combined LCP patches from Iain and Yuri. This should allow Windows 2k/XP
  clients to connect, as well Linksys DSL modems.
This commit is contained in:
David Parrish 2004-08-02 03:38:01 +00:00
parent 99b207fddf
commit 9c8100d580
7 changed files with 185 additions and 20 deletions

View file

@ -1,8 +1,14 @@
* ??? 2.0.2
- Combined LCP patches from Iain and Yuri. This should allow Windows 2k/XP
clients to connect, as well Linksys DSL modems.
- Apply patch to fix -v option from Juergen Kammer.
- Makefile fix from Juergen Kammer to not overwrite existing config files on
make install
- Configurable radius port patch from Juergen Kammer.
- Send my_address if no bind_address when doing IPCP
- Write pid file if filename is set
- Add startup script and monitor script from Yuri
- Some logging correctness fixes from Iain Wade
* Tue Jul 13 2004 Brendan O'Dea <bod@optusnet.com.au> 2.0.1
- Update INSTALL, Docs/manual.html documentation.

View file

@ -173,6 +173,12 @@ is any one of the syslog logging facilities, such as local5.
<P>
</LI>
<LI><B>pid_file</B> (string)<BR>
If this is set, the process id will be written to this file. The filename must
contain an absolute path.
<P>
</LI>
<LI><B>l2tp_secret</B> (string)<BR>
This sets the string that l2tpns will use for authenticating tunnel request.
This must be the same as the LAC, or authentication will fail. This will

View file

@ -4,7 +4,7 @@
// Copyright (c) 2002 FireBrick (Andrews & Arnold Ltd / Watchfront Ltd) - GPL licenced
// vim: sw=8 ts=8
char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.18 2004-07-28 06:12:30 fred_nerk Exp $";
char const *cvs_id_l2tpns = "$Id: l2tpns.c,v 1.19 2004-08-02 03:38:01 fred_nerk Exp $";
#include <arpa/inet.h>
#include <assert.h>
@ -94,6 +94,7 @@ int bgp_configured = 0;
struct config_descriptt config_values[] = {
CONFIG("debug", debug, INT),
CONFIG("log_file", log_filename, STRING),
CONFIG("pid_file", pid_file, STRING),
CONFIG("l2tp_secret", l2tpsecret, STRING),
CONFIG("primary_dns", default_dns1, IP),
CONFIG("secondary_dns", default_dns2, IP),
@ -2995,6 +2996,10 @@ int main(int argc, char *argv[])
/* remove plugins (so cleanup code gets run) */
plugins_done();
// Remove the PID file if we wrote it
if (config->wrote_pid && *config->pid_file == '/')
unlink(config->pid_file);
/* kill CLI children */
signal(SIGTERM, SIG_IGN);
kill(0, SIGTERM);
@ -3401,6 +3406,22 @@ void update_config()
timeout = config->cluster_hb_timeout;
}
// Write PID file
if (*config->pid_file == '/' && !config->wrote_pid)
{
FILE *f;
if ((f = fopen(config->pid_file, "w")))
{
fprintf(f, "%d\n", getpid());
fclose(f);
config->wrote_pid = 1;
}
else
{
log(0, 0, 0, 0, "Can't write to PID file %s: %s\n", config->pid_file, strerror(errno));
}
}
config->reload_config = 0;
}

View file

@ -1,5 +1,5 @@
// L2TPNS Global Stuff
// $Id: l2tpns.h,v 1.13 2004-07-26 00:20:41 fred_nerk Exp $
// $Id: l2tpns.h,v 1.14 2004-08-02 03:38:01 fred_nerk Exp $
#ifndef __L2TPNS_H__
#define __L2TPNS_H__
@ -195,6 +195,7 @@ typedef struct {
#define SESSIONPFC 1 // PFC negotiated flags
#define SESSIONACFC 2 // ACFC negotiated flags
#define SESSIONLCPACK 4 // LCP negotiated
// 168 bytes per tunnel
typedef struct tunnels
@ -379,6 +380,8 @@ struct configt
int debug; // debugging level
time_t start_time; // time when l2tpns was started
char bandwidth[256]; // current bandwidth
char pid_file[256]; // file to write PID to on startup
int wrote_pid;
clockt current_time; // 1/10ths of a second since the process started.
// means that we can only run a given process
// for 13 years without re-starting!

42
ppp.c
View file

@ -1,6 +1,6 @@
// L2TPNS PPP Stuff
char const *cvs_id_ppp = "$Id: ppp.c,v 1.8 2004-07-11 07:57:35 bodea Exp $";
char const *cvs_id_ppp = "$Id: ppp.c,v 1.9 2004-08-02 03:38:01 fred_nerk Exp $";
#include <stdio.h>
#include <string.h>
@ -230,9 +230,9 @@ void dumplcp(u8 *p, int l)
{
int type = o[0];
int length = o[1];
if (length == 0)
if (length < 2)
{
log(4, 0, 0, 0, " Option length is 0...\n");
log(4, 0, 0, 0, " Option length is %d...\n", length);
break;
}
if (type == 0)
@ -245,13 +245,22 @@ void dumplcp(u8 *p, int l)
switch (type)
{
case 1: // Maximum-Receive-Unit
if (length == 4)
log(4, 0, 0, 0, " %s %d\n", lcp_types[type], ntohs(*(u16 *)(o + 2)));
else
log(4, 0, 0, 0, " %s odd length %d\n", lcp_types[type], length);
break;
case 3: // Authentication-Protocol
{
if (length == 4)
{
int proto = ntohs(*(u16 *)(o + 2));
log(4, 0, 0, 0, " %s %s\n", lcp_types[type],
proto == 0xC223 ? "CHAP" : "PAP");
log(4, 0, 0, 0, " %s 0x%x (%s)\n", lcp_types[type], proto,
proto == 0xC223 ? "CHAP" :
proto == 0xC023 ? "PAP" : "UNKNOWN");
}
else
log(4, 0, 0, 0, " %s odd length %d\n", lcp_types[type], length);
break;
}
case 4: // Quality-Protocol
@ -261,21 +270,24 @@ void dumplcp(u8 *p, int l)
break;
}
case 5: // Magic-Number
{
if (length == 6)
{
u32 magicno = ntohl(*(u32 *)(o + 2));
log(4, 0, 0, 0, " %s %x\n", lcp_types[type], magicno);
}
else
log(4, 0, 0, 0, " %s odd length %d\n", lcp_types[type], length);
break;
}
case 7: // Protocol-Field-Compression
{
u32 pfc = ntohl(*(u32 *)(o + 2));
log(4, 0, 0, 0, " %s %x\n", lcp_types[type], pfc);
log(4, 0, 0, 0, " %s\n", lcp_types[type]);
break;
}
case 8: // Address-And-Control-Field-Compression
{
u32 afc = ntohl(*(u32 *)(o + 2));
log(4, 0, 0, 0, " %s %x\n", lcp_types[type], afc);
log(4, 0, 0, 0, " %s\n", lcp_types[type]);
break;
}
default:
@ -306,6 +318,7 @@ void processlcp(tunnelidt t, sessionidt s, u8 * p, u16 l)
if (*p == ConfigAck)
{
log(3, session[s].ip, s, t, "LCP: Discarding ConfigAck\n");
session[s].flags |= SESSIONLCPACK;
}
else if (*p == ConfigReq)
{
@ -392,15 +405,10 @@ void processlcp(tunnelidt t, sessionidt s, u8 * p, u16 l)
// Already built a ConfigNak... send it
log(3, session[s].ip, s, t, "Sending ConfigNak\n");
tunnelsend(b, l + (q - b), t);
log(3, session[s].ip, s, t, "Sending ConfigReq, requesting PAP login\n");
q = makeppp(b, sizeof(b), NULL, 0, t, s, PPPLCP);
*q++ = ConfigReq;
*(u8 *)(q++) = 3;
*(u8 *)(q++) = 4;
*(u16 *)(q += 2) = htons(0xC023);
tunnelsend(b, l + (q - b), t);
}
if (!(session[s].flags & SESSIONLCPACK))
initlcp(t, s);
}
else if (*p == ConfigNak)
{

28
scripts/l2tpns-monitor Normal file
View file

@ -0,0 +1,28 @@
#!/bin/sh
stopfile=/tmp/l2tpns.stop
first=`date +%s`
min_first_time=3
restart_delay=5
prog=${0##*/}
while :
do
echo "`date`: Starting l2tpns $@"
start=`date +%s`
/usr/sbin/l2tpns ${1+"$@"}
RETVAL=$?
stop=`date +%s`
t=$(($stop - $start));
first=$(($stop - $first));
echo "`date`: l2tpns exited after $t seconds, status $RETVAL"
if [ $first -lt $min_first_time ]; then
echo "`date`: l2tpns exited immediately, $prog exiting"
exit $RETVAL
fi
if [ -f $stopfile ]; then
ls -l $stopfile
echo "`date`: stop file found, $prog exiting"
exit
fi
sleep $restart_delay
done >>/var/log/$prog 2>&1 & # execute in background

93
scripts/l2tpns.script Normal file
View file

@ -0,0 +1,93 @@
#!/bin/bash
#
# Startup script for l2tpns
#
# chkconfig: 2345 83 25
# description: l2tpns.
# processname: l2tpns
# pidfile: /var/run/l2tpns.pid
# config: /etc/l2tpns
# Source function library.
. /etc/rc.d/init.d/functions
if [ -f /etc/sysconfig/lt2pns ]; then
. /etc/sysconfig/lt2pns
fi
# Path to the l2tpns-monitor script, server binary, and short-form for messages.
l2tpns_monitor=/usr/sbin/l2tpns-monitor
l2tpns=/usr/sbin/l2tpns
prog=${l2tpns##*/}
RETVAL=0
start() {
echo -n $"Starting $prog: "
rm -f /tmp/l2tpns.stop
daemon --check=$prog $l2tpns_monitor $OPTIONS
RETVAL=$?
echo
sleep 5
pid=`pidofproc $l2tpns_monitor`
if [ -z "$pid" ] || [ "$pid" -eq 0 ]; then
echo -n "Error starting $prog"
echo_failure
echo
return 99
fi
[ $RETVAL = 0 ] && touch /var/lock/subsys/l2tpns
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
echo >/tmp/l2tpns.stop
killproc $l2tpns
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f /var/lock/subsys/l2tpns /var/run/l2tpns.pid
}
reload() {
echo -n $"Reloading $prog: "
killproc $l2tpns -HUP
RETVAL=$?
echo
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $l2tpns
RETVAL=$?
;;
restart)
stop
sleep 5
start
;;
condrestart)
if [ -f /var/run/l2tpns.pid ] ; then
stop
start
fi
;;
reload)
reload
;;
coldrestart)
stop
sleep 10
rm -f /tmp/l2tpns.dump
start
;;
*)
echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|coldrestart}"
exit 1
esac
exit $RETVAL