On Tue, May 27, 2008 at 08:52:42AM +1000, Paul Mackerras wrote: > Looks OK. I want to do a new release of pppd fairly soon, so this is > timely. Would you be interested in the pppd plugin we hold in the pptpd sources? It is attached. It provides wtmp view of logged in tunnel clients, using their original IP address. pptpd passes the original IP address to pppd via command line. There is very little to it. It might have already been solved with session.c and the enable-session option. Or maybe it needs merging. -- James Cameron http://quozl.netrek.org/ HP Open Source, Volunteer http://opensource.hp.com/ PPTP Client Project, Release Engineer http://pptpclient.sourceforge.net/
/* * $Id: pptpd-logwtmp.c,v 1.5 2007/04/16 00:21:02 quozl Exp $ * pptpd-logwtmp.c - pppd plugin to update wtmp for a pptpd user * * Copyright 2004 James Cameron. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version * 2 of the License, or (at your option) any later version. */ #include <unistd.h> #include <utmp.h> #include <string.h> #include "pppd.h" char pppd_version[] = VERSION; static char pptpd_original_ip[PATH_MAX+1]; static bool pptpd_logwtmp_strip_domain = 0; static option_t options[] = { { "pptpd-original-ip", o_string, pptpd_original_ip, "Original IP address of the PPTP connection", OPT_STATIC, NULL, PATH_MAX }, { "pptpd-logwtmp-strip-domain", o_bool, &pptpd_logwtmp_strip_domain, "Strip domain from username before logging", OPT_PRIO | 1 }, { NULL } }; static char *reduce(char *user) { char *sep; if (!pptpd_logwtmp_strip_domain) return user; sep = strstr(user, "//"); /* two slash */ if (sep != NULL) user = sep + 2; sep = strstr(user, "\\"); /* or one backslash */ if (sep != NULL) user = sep + 1; return user; } static void ip_up(void *opaque, int arg) { char *user = reduce(peer_authname); if (debug) notice("pptpd-logwtmp.so ip-up %s %s %s", ifname, user, pptpd_original_ip); logwtmp(ifname, user, pptpd_original_ip); } static void ip_down(void *opaque, int arg) { if (debug) notice("pptpd-logwtmp.so ip-down %s", ifname); logwtmp(ifname, "", ""); } void plugin_init(void) { add_options(options); add_notifier(&ip_up_notifier, ip_up, NULL); add_notifier(&ip_down_notifier, ip_down, NULL); if (debug) notice("pptpd-logwtmp: $Version$"); }