--- /dev/null
+#!/usr/bin/perl
+#
+# ip-up
+#
+# Script started when the PPP daemon makes a connection.
+#
+
+# This script is given:
+# interface-name tty-device speed local-IP-address remote-IP-address
+# Since this is a PPP server, local-IP-address does not change.
+
+# TODO: Clean up this file and make it really modular.
+
+use strict;
+use GDBM_File;
+
+#### RADIUS section Begins
+
+# Configuration section.
+
+# Port information database.
+my $path_portinfo = "/var/ipoint/acct/portinfo";
+
+
+# Radius accounting record generator.
+ my $prog_radacct = "/usr/local/lib/radiusclient/radacct";
+
+sub netmask
+{
+ my $count = int ($_[0] / 8);
+
+ my $c1 = ("255." x $count);
+ $c1 = substr ($c1, 0, -1) if ($count == 4);
+ my $c2 = (256 - (1<<(8 - ($_[0] - $count * 8)))) || "0";
+ $c2 .= '.' if ($count < 3);
+ my $c3 = substr (("0." x (3-$count)), 0, -1);
+ return $c1 . $c2. $c3;
+}
+
+my ($sessionid, $username, $port, $portid, $timeout, $routelist) =
+ split (/:/, $ARGV[5]);
+
+if ($sessionid)
+{
+# I-Way code to inform the server that we're getting in.
+
+# If there was routing, add it. Format for $route, from the Framed-Route
+# parameter, is address/netmask gateway metric. If gateway is 0.0.0.0,
+# add the route here.
+
+# Unescape the route list.
+ $routelist =~ s/%20/ /g;
+
+ my $route;
+
+ # Debug this.
+ open (H, ">>/tmp/ip-up.log");
+ print H "ROUTELIST: " . $routelist . "\n";
+
+ foreach $route (split ("@", $routelist)) {
+ # Split the route into the components.
+ my @routevalue = split (' ', $route);
+ my ($netmaskcmd, $gwcmd, $metriccmd);
+ my @network = split ("/", $routevalue[0]);
+
+ if ($network[1]) {
+ $netmaskcmd = "netmask " . netmask($network[1]);
+ }
+
+ if ($routevalue[1] eq "0.0.0.0") {
+ $gwcmd = "gw $ARGV[4]";
+ }
+ elsif ($routevalue[1]) {
+ $gwcmd = "gw $routevalue[1]";
+ }
+
+ if ($routevalue[2]) {
+ $metriccmd = "metric $routevalue[2]";
+ }
+
+ my $routecmd = "/sbin/route add -net $network[0] $netmaskcmd $gwcmd " .
+ "$metriccmd";
+
+ system ($routecmd);
+ print H "COMMAND: " . $routecmd . "\n";
+ }
+ close (H);
+
+# The session ID, username, raw port and ID are given to this script
+# through the ipparam parameter of pppd 2.2.0e and above.
+
+# Generate the accounting entry, and hand it over to RADIUS.
+
+ open (H, "| $prog_radacct -i $port");
+
+ my $cmd =
+ "Acct-Session-ID = \"$sessionid\"\n" .
+ "User-Name = \"$username\"\n" .
+ "Acct-Status-Type = Start\n" .
+ "Acct-Authentic = RADIUS\n" .
+ "Service-Type = Framed\n" .
+ "Framed-Protocol = PPP\n" .
+ "Framed-IP-Address = $ARGV[4]\n";
+
+ print H $cmd;
+ close (H);
+}
+
+# Store the username, the connection type, the IP address, the PID of pppd.
+# Index it on the port ID, since 'portman' makes use of this.
+
+my ($timenow, %s);
+$timenow = time();
+tie (%s, "GDBM_File", $path_portinfo, GDBM_WRCREAT, 0600);
+$s{$portid} = join (':', $username, "Framed-User/PPP", $ARGV[4], getppid (),
+ $timenow, $timeout);
+untie (%s);
+
+
+#### RADIUS ends
+