Fwd: (RADIATOR) remote radiator restart

Mike McCauley mikem at open.com.au
Sat Sep 8 18:43:30 CDT 2001


Hello Mariano,

Thanks for reporting this. There was a b ug un Mib.pm that prevented the 
correct OID path bing sent back in the SNMP reply. This apparently causes 
some SNMP clients to think it got no reply at all.

I have attached a new Mib.pm for you to test. If it is OK it wil appear in 
the next release.

We apologise for this problem. Thank you for reporting it.

Cheers.

On Sun, 9 Sep 2001 03:44, Mariano Absatz wrote:
> Hi Mike,
>
> Now it (almost) works, the only point is that, apparently, it restarts and
> doesn't send back an acknowledge to the snmp console that sent the request:
>
> Here's the console:
> #snmpset -t 8 -r 1 -p 16146 192.168.19.1 rw-comm .1.3.6.1.2.1.67.1.1.1.1.4
> i 2 Timeout: No Response from 192.168.19.1
>
>
> Here's Radiator's log:
> Sat Sep  8 14:36:50 2001: DEBUG: SNMPAgent: received request from
>    192.168.1.7, 131, 189128152, rw-comm
> Sat Sep  8 14:36:52 2001: INFO: Server started: Radiator 2.18.2 on radius1
>
>
>
> never mind how long the timeout I use (here's 8 secs, but the reset is
> almost immediate). Any idea? (I'm using 2.18.2)
>
> El 7 Sep 2001, a las 9:26, Mike McCauley escribió:
> > Hi Mariano,
> >
> > On Thu, 6 Sep 2001 23:58, Mariano Absatz wrote:
> > > Well, the point is... it didn't work, Radiator receives the request,
> > > but doesn't do anything about it.
> > >
> > > I tried with the three sets of OID's (the draft ones, RFC2619 &
> > > RFC2621), but to no avail.
> > >
> > > In the requesting machine, I send:
> > > snmpset -Ir -p 16146 192.168.19.1 rw-comm 1.3.6.1.3.79.1.1.1.4 i 2
> > > snmpset -Ir -p 16146 192.168.19.1 rw-comm 1.3.6.1.2.1.67.1.1.1.1.4 i
> > > 2 snmpset -Ir -p 16146 192.168.19.1 rw-comm 1.3.6.1.2.1.67.2.1.1.1.4
> > > i 2
> >
> > Ooos, you need to have a . at the front of the OID, else your snmp
> > interprets it as a relative OID. Try this: it works for me on 2.18.3:
> >
> > snmpset oscar public .1.3.6.1.3.79.1.1.1.4 i 2
> >
> > > and I allways get the following output:
> > > > Error in packet.
> > > > Reason: (noSuchName) There is no such variable name in this MIB.
> > > > Failed object:
> > >
> > > The trace 4 in the Radiator server says:
> > > Thu Sep  6 09:56:42 2001: DEBUG: SNMPAgent: received request from
> > >     192.168.1.7, 131, 293287917, rw-comm
> > > Thu Sep  6 10:32:13 2001: DEBUG: SNMPAgent: received request from
> > >     200.x.y.z, 131, 60580895, rw-comm
> > > Thu Sep  6 10:32:13 2001: WARNING: SNMPAgent: requesting host not
> > > defined as manager. Request from 200.x.y.z ignored
> > > Thu Sep  6 10:32:14 2001: DEBUG: SNMPAgent: received request from
> > >     192.168.1.7, 131, 60580895, rw-comm
> > > Thu Sep  6 10:34:35 2001: DEBUG: SNMPAgent: received request from
> > >     192.168.1.7, 131, 1490955430, rw-comm
> > > Thu Sep  6 10:39:45 2001: DEBUG: SNMPAgent: received request from
> > >     192.168.1.7, 131, 267748177, rw-comm
> > > Thu Sep  6 10:41:56 2001: DEBUG: SNMPAgent: received request from
> > >     192.168.1.7, 131, 1188183886, rw-comm
> > >
> > > And it doesn't restart...
> > >
> > > What is going wrong?
> > >
> > > El 6 Sep 2001, a las 15:07, Mike McCauley escribió:
> > > > Hi Mariano,
> > > >
> > > > On Thu, 6 Sep 2001 07:46, Hugh Irvine wrote:
> > > > > ----------  Forwarded Message  ----------
> > > > > Subject: (RADIATOR) remote radiator restart
> > > > > Date: Wed, 5 Sep 2001 14:22:45 -0300
> > > > > From: "Mariano Absatz" <radiator at lists.com.ar>
> > > > > To: Radiator List <radiator at open.com.au>
> > > > >
> > > > >
> > > > > Hi,
> > > > >
> > > > > I am running Radiator 2.18.2 on a couple of Sun Netras (Solaris 8)
> > > > > authenticating against an Oracle database (on yet another Netra).
> > > > >
> > > > > We developed a web based front end for administration of the users
> > > > > in the Oracle database on a Sun Ultra 10 (also Solaris 8) with
> > > > > Apache and embedded Perl.
> > > > >
> > > > > The point is that, for instance, when I try to invoke a restart
> > > > > script through ssh, I get the following error:
> > > > >
> > > > > Doing it so through rsh, it works but it locks the connection (and
> > > > > anyway, I'd rather not have rshd running on the server.
> > > > >
> > > > > On the other hand, the manual states that through the SNMP agent I
> > > > > can restart Radiator, but I don't know how. Am I missing something?
> > > > > (I think this would be the cleanest method to do it).
> > > >
> > > > you need to set the SNMP variable
> > > > 1.3.6.1.3.79.1.1.1.4
> > > >
> > > > to the value 2, with something like:
> > > >
> > > > snmpset your.radius.server.address your_community
> > > > 1.3.6.1.3.79.1.1.1.4 i 2
> > > >
> > > > Note that this does not actually stop the server, it just rereads the
> > > > config, like with HUP.
> > > >
> > > > Cheers.
> > > >
> > > > Cheers.
> > > > ===
> > > > Archive at http://www.open.com.au/archives/radiator/
> > > > Announcements on radiator-announce at open.com.au
> > > > To unsubscribe, email 'majordomo at open.com.au' with
> > > > 'unsubscribe radiator' in the body of the message.
-------------- next part --------------
# Mib.pm
#
# A Mib object is just a dictionary. Each node inside the mib
# is an entry in the hash.
#
# A MIB is arranged as a tree, with the root at .
# Each node in the tree is either:
# 1. A ref to a Mib object (ie a dictionary)
# 2. A ref to an array. Index 0 is a get fn, index 1 is a getnext fn, 
#    index 2 is a set fn, index 3 is an arbitrary arg that will be passed to 
#    all functions as the first argument. If the set function is not defined
#    the tree under that virtual node is assumed to be read-only. If the
#    getnext funciton is undefined, then it is assumed that there is no
#    subtree under the virtual node, and it is therefore a leaf.
#    that will service any subtree under that (virtual) node.
#    The get function is called like
#       ($error, $value, @pathused) = get_fn($arg, @path);
#    The getnext function is called like
#       ($error, $value, @pathused) = getnext_fn($arg, @path);
#    The set function is called like
#       ($error, $resultingvalue, @pathused) 
#            = set_fn($arg, $newvalue, @path);
# 3. A reference to a scalar. 
#
# Author: Mike McCauley (mikem at open.com.au)
# Copyright (C) 1997 Open System Consultants
# $Id: Mib.pm,v 1.3 2000/02/15 07:07:54 mikem Exp mikem $


package Radius::Mib;
use strict;

# These need to match the definitions in @error_status_code
# in SNMP_Session.pm
$Radius::Mib::ERROR_OK = 0;
$Radius::Mib::ERROR_TOOBIG = 1;
$Radius::Mib::ERROR_NOSUCHNAME = 2;
$Radius::Mib::ERROR_BADVALUE = 3;
$Radius::Mib::ERROR_READONLY = 4;
$Radius::Mib::ERROR_GEN_ERR = 5;
$Radius::Mib::ERROR_NOACCESS = 6;
$Radius::Mib::ERROR_WRONGTYPE = 7;
$Radius::Mib::ERROR_WRONGLENGTH = 8;
$Radius::Mib::ERROR_WRONGENCODING = 9;
$Radius::Mib::ERROR_WRONGVALUE = 10;
$Radius::Mib::ERROR_NOCREATION = 11;
$Radius::Mib::ERROR_INCONSISTENTVALUE = 12;
$Radius::Mib::ERROR_RESOURCEUNAVAILABLE = 13;
$Radius::Mib::ERROR_COMMITFAILED = 14;
$Radius::Mib::ERROR_UNDOFAILED = 15;
$Radius::Mib::ERROR_AUTHORIZATIONERROR = 16;
$Radius::Mib::ERROR_NOTWRITABLE = 17;
$Radius::Mib::ERROR_INCONSISTENTNAME = 18;

#####################################################################
# Create a new Mib structure
# Its just an empty dictionary to start with
sub new
{
    my ($class) = @_;

    my $self = {};
    bless $self, $class;

    return $self;
}

#####################################################################
# createPath(@path, $object)
# Adds an object to the Mib at the position indicated by path
# path is an array of oids
# object is one of the permitted object types in a Mib
sub create
{
    my ($self, $object, @path) = @_;

    my $oid = shift(@path);
    if (@path)
    {
	# Add another sub Mib, if not one there already
	if (!exists($self->{$oid}))
	{
	    $self->{$oid} = new Radius::Mib;
	}
	# Else its already there
	$self->{$oid}->create($object, @path);
    }
    else
    {
	# All done, now refer to the object
	$self->{$oid} = $object;
    }
}

#####################################################################
# get(\$root, @path)
# Get the value at the node given by @path relative to the
# root node.
# Returns ($error, $value, @pathused)
# pathused is the portion of @path that was used to get the value
# Usually its the same as @path, unless an error occurred
# This is recursive, and only searches _one_ level of the tree
# 
sub get
{
    my ($self, @path) = @_;

    my $oid = shift(@path);
    if (ref($self->{$oid}) eq 'Radius::Mib')
    {
	# Get the value from the sub Mib
	my ($error, $value, @path) = $self->{$oid}->get(@path);
	return ($error, $value, $oid, @path);
    }
    elsif (ref($self->{$oid}) eq 'SCALAR')
    {
	# Just return the value, and the place we are at
	return ($Radius::Mib::ERROR_OK, ${$self->{$oid}}, ($oid));
    }
    elsif (ref($self->{$oid}) eq 'ARRAY')
    {
	# Its an array of functions, which are to be called
	# to process the rest of the path
	# Call the get function (index 0) and pass it the remaining path
	my $fn = $self->{$oid}[0]; # Be defensive
        return ($Radius::Mib::ERROR_GEN_ERR, undef, ($oid))
            unless defined $fn;

	my ($error, $value, @path_used) 
	    = &{$fn}($self->{$oid}[3], @path);

	# Return the value and the total path that was used
	return ($error, $value, ($oid, @path_used));
    }
    else
    {
	# Perhaps we are not at a leaf node. Anyways its an error
	# REVISIT: what kind of error?
	return ($Radius::Mib::ERROR_NOSUCHNAME, undef, ($oid));
    }
}

#####################################################################
# getnext(\$root, @path)
# Get the next value starting at the node given by @path relative to the
# root node. Root _must_ me a ref to a dictionary.
# Returns ($error, $value, @pathused)
# pathused is the path of the next value that we found
# This is recursive, and only searches _one_ level of the tree
# 
sub getnext
{
    my ($self, @path) = @_;

    my $oid = shift(@path);
    my $node;
    foreach $node (sort { $a <=> $b } keys %$self)
    {
	if (!defined $oid || $node >= $oid)
	{
	    # If we have gone past the last one, then @path must be cleared
	    @path = () if $node > $oid;

	    my $newnode = $self->{$node};
	    if (ref($newnode) eq 'Radius::Mib')
	    {
		# Recursively descend into this dictionary
		my ($error, $retvalue, @path_used) 
		    = $newnode->getnext(@path);
	        # If we found the next one, return it, else keep going
	        return ($error, $retvalue, ($node, @path_used))
		    if $error == $Radius::Mib::ERROR_OK;
		
	    }
	    elsif (ref($newnode) eq 'SCALAR')
	    {
		# If this is the "last" ignore it: its the next 
		# one we are interested in
		next if $node == $oid;

		# Gone past the last value, so take the next one we see
		# Just return the value, and the place we are at
		return ($Radius::Mib::ERROR_OK, $$newnode, ($node));
	    }
	    elsif (ref($newnode) eq 'ARRAY')
	    {
		# Its an array of functions, which are to be called
		# to process the rest of the path
		# Call the getnext function (index 1) and pass it the 
		# remaining path
		my $fn = $$newnode[1]; # Be defensive

		# if no getnext function, then it must be a leaf
		# and we can decide whether its the "next" one,
		# and then call the get function directly
		if (!defined $fn)
		{
		    next if !defined $fn && $node == $oid;
		    $fn = $$newnode[0]; # Be defensive
		    return ($Radius::Mib::ERROR_GEN_ERR, undef, ($oid))
			unless defined $fn;
		}
		
		my ($error, $retvalue, @path_used) 
		    = &{$fn}($$newnode[3], @path);
		# If we found the next one, return it, else keep going
		return ($error, $retvalue, ($node, @path_used))
		    if $error == $Radius::Mib::ERROR_OK;
		
	    }
	    else
	    {
		# Perhaps we are not at a leaf node. Anyways its an error
		# REVISIT: what kind of error?
		return ($Radius::Mib::ERROR_NOSUCHNAME, undef, ($node));
	    }
	}
    }
    # Not found in this level or lower
    return ($Radius::Mib::ERROR_NOSUCHNAME, undef, ($oid));
}

#####################################################################
# set(\$root, $value, @path)
# Set the value at the node given by @path relative to the
# root node.
# Returns ($error, $value, @pathused)
# pathused is the portion of @path that was used to set the value
# $value is the result after doing the set
# Usually its the same as @path, unless an error occurred
# This is recursive, and only searches _one_ level of the tree
# 
sub set
{
    my ($self, $value, @path) = @_;

    my $oid = shift(@path);

    if (ref($self->{$oid}) eq 'Radius::Mib')
    {
	# Get the value from the sub Mib
	my ($error, $value, @path) = $self->{$oid}->set($value, @path);
	return ($error, $value, $oid, @path);
    }
    elsif (ref($self->{$oid}) eq 'SCALAR')
    {
	# Just return the value, and the place we are at
	${$self->{$oid}} = $value;
	return ($Radius::Mib::ERROR_OK, ${$self->{$oid}}, ($oid));
    }
    elsif (ref($self->{$oid}) eq 'ARRAY')
    {
	# Its an array of functions, which are to be called
	# to process the rest of the path
	# Call the set function (index 2) and pass it the remaining path
	my $fn = $self->{$oid}[2];
        return ($Radius::Mib::ERROR_READONLY, undef, ($oid))
            unless defined $fn;

	my ($error, $retvalue, @path_used) 
            = &{$fn}($self->{$oid}[3], $value, @path);

	# Return the value set and the total path that was used
	return ($error, $retvalue, ($oid, @path_used));
    }
    else
    {
	# Perhaps we are not at a leaf node. Anyways its an error
	# REVISIT: what kind of error?
	return ($Radius::Mib::ERROR_NOSUCHNAME, undef, ($oid));
    }
}

#####################################################################
# These functions are the equivalent of the above, but they use
# pretty paths in the form '1.2.3.4.5', both in an out
#
sub createPretty
{
    my ($self, $object, $path) = @_;
    return $self->create($object, split(/\./, $path));
}

sub getPretty
{
    my ($self, $path) = @_;

    my ($error, $value, @pathused) = $self->get(split(/\./, $path));
    return ($error, $value, join('.', @pathused));
}

sub getnextPretty
{
    my ($self, $path) = @_;

    my ($error, $value, @pathused) = $self->getnext(split(/\./, $path));
    return ($error, $value, join('.', @pathused));
}

sub setPretty
{
    my ($self, $nvalue, $path) = @_;

    my ($error, $value, @pathused) = $self->set($nvalue, split(/\./, $path));
    return ($error, $value, join('.', @pathused));
}


1;


More information about the radiator mailing list