[ale] Perl parsing problem

Christopher Fowler cfowler at outpostsentinel.com
Thu Nov 10 12:50:40 EST 2005


Its working great!  I am using XML::Simple and it has cut down all my
XML code.  Check out this:

[tomcat at sam-devel tmp]$ ./configShell.pl 192.168.2.137
ENS Version: Version: 3.1.4 Development, Build: 110905-170135
localhost # set net 1 fqdn cart.opsup.com
Configuration updated.
localhost # show net 1
###################################################
#                     Network                     #
###################################################
# Network Interface: 1
set net 1 active enabled
set net 1 dhcp disabled
set net 1 fqdn cart.opsup.com
set net 1 address 192.168.2.137
set net 1 netmask 255.255.255.0
set net 1 broadcast 192.168.2.255
set net 1 gateway 192.168.2.254
set net 1 nameserver1 192.168.2.254
set net 1 nameserver2 0.0.0.0
set net 1 nameserver3 0.0.0.0
localhost # save
Saved to flash
localhost # restart
Restarting ENS at 192.168.2.137



It looks just like the config on the device

On Thu, 2005-11-10 at 09:55 -0500, Christopher Fowler wrote:
> That work good.
> 
> I'm trying to identify a better way to parse the XML via XML::Parser;
> Normally I use the xml subs method but I intend to have everything
> readable in one perl program.  I'm also using OOP.  So I want a package
> for each noun but I do not want a package for each noun and one for xml
> parsing of data for each noun.  Here is what my code looks like
> 
> ----------------------------------------
>   # Retrieve ENS Hostname
>   my $ens_network = ENSNetwork->new($ua);
>   $ens_network->load();
> 
> 
> {
>   package ENSNetwork;
> 
>   sub new {
>     my ($proto, $ua) = @_;
>     my $class = ref($proto) || $proto;
> 
>     my $self = {
>       'server' => $ua,
>       'errstr'     => undef,
>     };
>     bless ($self,$class);
>     return $self;
> 
>   }
> 
>   sub load {
>     my ($self) = shift;
>     my $server = Frontier::Client->new( debug => 0,
>       url => "http://$ens_ip/cgi-bin/xml-rpc",ua => $self->{'server'} );
>     my $result = $server->call('get_network_config', ("0"));
>     $result = MIME::Base64::decode_base64($result);
>     print "$result\n";
> 
>     # Need to parse the data!
> 
>   }
> }
> 
> ----------------------------------------
> 
> Here is what XML data looks like when retrieved:
> ----------------------------------------
> <?xml version="1.0"?>
> <config>
>   <network id="1">
>     <active>enabled</active>
>     <fqdn>localhost.localdomain.com</fqdn>
>     <dhcp>disabled</dhcp>
>     <address>192.168.2.137</address>
>     <broadcast>192.168.2.255</broadcast>
>     <netmask>255.255.255.0</netmask>
>     <gateway>192.168.2.254</gateway>
>     <nameserver1>192.168.2.254</nameserver1>
>     <nameserver2>0.0.0.0</nameserver2>
>     <nameserver3>0.0.0.0</nameserver3>
>     <forwarding>disabled</forwarding>
>   </network>
>   <network id="2">
>     <active>disabled</active>
>     <fqdn>localhost.localdomain.com</fqdn>
>     <dhcp>enabled</dhcp>
>     <address>0.0.0.0</address>
>     <broadcast>0.0.0.0</broadcast>
>     <netmask>0.0.0.0</netmask>
>     <gateway>0.0.0.0</gateway>
>     <nameserver1>0.0.0.0</nameserver1>
>     <nameserver2>0.0.0.0</nameserver2>
>     <nameserver3>0.0.0.0</nameserver3>
>     <forwarding>disabled</forwarding>
>   </network>
> </config>
> --------------------------------------
> 
> 
> Can I have a package within a package:
> 
> {
>   package ENSNetwork;
> 
>   { 
>     package ens_network_xml_subs;
>   }
> }
> 
> That makes reading a pain.  If that is doable how would the XML::Parser
> gain access to the current object's data?  Normally I declare a hash as
> readable by the whole program like this:
> 
> 
> my %device = ()
> 
> { 
>   package xml_subs;
> 
>   sub device {
>     my(undef, undef, %attrs) = @_;
>     $device{'id'} = $attrs{'id'};
>   }
> 
> }
> 
> 
> 
> On Thu, 2005-11-10 at 09:41 -0500, Philip Polstra wrote:
> > I would use split instead of what you are doing with the pattern
> > match.  Something like this
> > ($verb, $noun, $cmdline) = split /\s+/, $_, 3;
> > 
> > You can then check to see if $noun and $cmdline are defined to know
> > how many parameters were passed.
> > 
> > On 11/10/05, Christopher Fowler <cfowler at outpostsentinel.com> wrote:
> >         Perl Guru's:
> >         
> >         I'm trying to create a config shell that runs in Linux that
> >         will use 
> >         XML-RPC to configure our embedded device.  The XML-RPC thing
> >         is
> >         complete.  What I'm working on now is parsing the command
> >         line.
> >         
> >         here is my code:
> >         
> >         --------------------------------
> >         sub prompt {
> >           print "# "; 
> >           my $cmd = <STDIN>;
> >           chomp $cmd;
> >           $cmd =~ m/^(.+?)\s(.+?)\s(.+?)$/;
> >           my $verb = $1;
> >           my $noun = $2;
> >           my $cmdline = $3;
> >           print "[[$verb]]\n";
> >           return ($verb, $noun, $cmdline); 
> >         }
> >         -------------------------------
> >         
> >         $1, $2, and $3 substitutions fail when there is only one verb
> >         like
> >         'exit'.  Verbs can be 'show, set, add, delete, or
> >         exit'.  Nouns can be
> >         'port, user, vtun, snmp, etc.'   So to show port 1's config I
> >         use 'show 
> >         port 1'  To show all ports I use 'show port'.  I guess I could
> >         simply
> >         use split and split on \s boundaries.  for $cmdline I need to
> >         be
> >         smarter.  Some items have descriptions that can include a
> >         space and I
> >         will want to cut $cmdline into arguments. 
> >         
> >         'set system location "Buford Development"'
> >         verb = set
> >         noun = system
> >         arg[0] = location
> >         arg[1] = 'Buford Development'
> >         
> >         So I'm trying to do shell like parsing.  I bet there is a
> >         module that 
> >         does all this for me.  If not can someone point me in the best
> >         direction.
> >         
> >         Thanks,
> >         Chris
> >         
> >         
> >         _______________________________________________
> >         Ale mailing list
> >         Ale at ale.org
> >         http://www.ale.org/mailman/listinfo/ale
> > 
> > _______________________________________________
> > Ale mailing list
> > Ale at ale.org
> > http://www.ale.org/mailman/listinfo/ale
> 
> _______________________________________________
> Ale mailing list
> Ale at ale.org
> http://www.ale.org/mailman/listinfo/ale




More information about the Ale mailing list