X-Git-Url: http://git.rot13.org/?p=perl-cwmp.git;a=blobdiff_plain;f=lib%2FCWMP%2FVendor.pm;h=8712f0ae57727342b3a31209ff6f333d91459e33;hp=071d7cb41a3e1ab30404a01404d04380ce74b2de;hb=b3f35798ca497b3d02382bfb9f80f97247694e3f;hpb=5a913f2c18fe1894cda0144870684e9d559352d2 diff --git a/lib/CWMP/Vendor.pm b/lib/CWMP/Vendor.pm index 071d7cb..8712f0a 100644 --- a/lib/CWMP/Vendor.pm +++ b/lib/CWMP/Vendor.pm @@ -3,11 +3,7 @@ package CWMP::Vendor; use strict; use warnings; - -use base qw/Class::Accessor/; -__PACKAGE__->mk_accessors( qw/ -debug -/ ); +use YAML qw(); #use Carp qw/confess/; use Data::Dump qw/dump/; @@ -16,135 +12,85 @@ use Data::Dump qw/dump/; CWMP::Vendor - implement vendor specific logic into ACS server -=head1 METHODS - -=head2 new - - my $obj = CWMP::Vendor->new({ - debug => 1 - }); - =cut my $debug = 0; -sub new { - my $class = shift; - my $self = $class->SUPER::new( @_ ); - - warn "created ", __PACKAGE__, "(", dump( @_ ), ") object\n" if $self->debug; - - $debug = $self->debug; - - return $self; -} - -our $cpe_faulty; - -my $serial2ip = { - 'CP0636JT3SH' => '10.0.0.1', - 'CP0644JTHJ4' => '10.0.0.2', - 'CP0624BH55U' => '10.0.0.3', -}; - -my ( $last_ip, $last_serial ); +sub all_parameters { + my ( $self, $store, $uid, $queue ) = @_; -=head2 state2serial + my $stored = $store->get_state( $uid ); - my $serial = state2serial( $state ); + return ( 'GetParameterNames', [ 'InternetGatewayDevice.', 1 ] ) + if ! defined $stored->{ParameterInfo}; -=cut - -sub state2serial { - my $state = shift; - - my $serial = $state->{DeviceId}->{SerialNumber} || die "no DeviceId.SerialNumber in ",dump($state); - chomp($serial); - my $ip = - $state->{Parameter}->{'.ExternalIPAddress'} || - $state->{Parameter}->{ - # fix for firmware 5.3.3.4 which returns full path - ( grep { m/\.ExternalIPAddress/ } keys %{ $state->{Parameter} } )[0] - } || - die "no .ExternalIPAddress in ",dump($state); + my @params = + grep { m/\.$/ } + keys %{ $stored->{ParameterInfo} } + ; - warn "## state2serial $serial $ip\n" if $debug; - - ( $last_ip, $last_serial ) = ( $ip, $serial ); - - return ( $serial, $ip ); -} - -=head2 add_triggers - -Install all custom triggers - - CWMP::Vendor->add_triggers; - -=cut + if ( @params ) { + warn "# GetParameterNames ", dump( @params ); + my $first = shift @params; + delete $stored->{ParameterInfo}->{$first}; -sub add_triggers { -} - -1; - -__END__ - - warn __PACKAGE__, "->add_triggers\n" if $debug; - -CWMP::Request->add_trigger( name => 'Fault', callback => sub { - my ( $self, $state ) = @_; - warn "## Fault trigger state = ",dump( $self, $state ) if $debug; - die "can't map fault to serial!" unless $last_serial; - warn "ERROR: got Fault and ingoring $last_ip $last_serial\n"; - $cpe_faulty->{$last_serial}++; -}); - -CWMP::Request->add_trigger( name => 'Inform', callback => sub { - my ( $self, $state ) = @_; - - my ( $serial, $ip ) = state2serial( $state ); - - if ( $cpe_faulty->{$serial} ) { - warn "## Inform trigger from $ip $serial -- IGNORED\n" if $debug; - return; + foreach ( @params ) { + $queue->enqueue( 'GetParameterNames', [ $_, 1 ] ); + delete $stored->{ParameterInfo}->{ $_ }; + } + $store->set_state( $uid, $stored ); + + return ( 'GetParameterNames', [ $first, 1 ] ); + + } else { + + my @params = sort + grep { ! exists $stored->{Parameter}->{$_} } + grep { ! m/\.$/ && ! m/NumberOfEntries/ } + keys %{ $stored->{ParameterInfo} } + ; + if ( @params ) { + warn "# GetParameterValues ", dump( @params ); + my $first = shift @params; + while ( @params ) { + my @chunk = splice @params, 0, 16; # FIXME 16 seems to be max + $queue->enqueue( 'GetParameterValues', [ @chunk ] ); + } + + return ( 'GetParameterValues', [ $first ] ); + } } - warn "## Inform trigger from $ip $serial\n" if $debug; - - my $found = 0; - - warn "### serial2ip = ",dump( $serial2ip ) if $debug; - - foreach my $target_serial ( keys %$serial2ip ) { - - next unless $target_serial eq $serial; - - $found++; - - my $target_ip = $serial2ip->{$target_serial}; + return; +} - if ( $ip ne $target_ip ) { +our $set_tried; - warn "CHANGE IP $ip to $target_ip for $serial\n"; +sub vendor_config { + my ( $self, $store, $uid, $queue ) = @_; - return; # FIXME + my $stored = $store->get_state( $uid ); - my $q = CWMP::Queue->new({ id => $serial, debug => $debug }) || die "no queue?"; + my @refresh; - $q->enqueue( 'SetParameterValues', { - 'InternetGatewayDevice.LANDevice.1.LANHostConfigManagement.IPInterface.1.IPInterfaceIPAddress' => $target_ip, - }); + my $vendor = YAML::LoadFile 'vendor.yaml'; + $vendor = $vendor->{Parameter} || die "no Parameter in vendor.yaml"; - } else { - warn "IP $ip of $serial ok\n"; + foreach my $n ( keys %$vendor ) { + if ( defined $stored->{$n} && $vendor->{$n} ne $stored->{$n} ) { + next if $set_tried->{$uid}->{$n}++; + push @refresh, $n; + $queue->enqueue( 'SetParameterValues', { $n => $vendor->{$n} } ); } } - warn "UNKNOWN CPE $ip $serial\nadd\t'$serial' => '$ip',\n" unless $found; - -}); + if ( @refresh ) { + $queue->enqueue( 'GetParameterValues', [ @refresh ] ); + warn "vendor_hook $uid SetParameterValues ", dump( @refresh ); + return ( 'GetParameterValues', [ @refresh ] ); + } -}#add_triggers + return; +} 1;