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/;
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;
-}
-
-my $cpe_faulty;
-
-my $serial2ip = {
- 'CP0636JT3SH' => '10.0.0.1',
- 'CP0644JTHJ4' => '10.0.0.2',
- 'CP0624BH55U' => '10.0.0.3',
-};
-
-my ( $last_ip, $last_serial );
-
-=head2 state2serial
-
- my $serial = state2serial( $state );
-
=cut
-sub state2serial {
- my $state = shift;
-
- my $serial = $state->{DeviceID}->{SerialNumber} || die "no DeviceID.SerialNumber in ",dump($state);
- 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 $debug = 1;
- warn "## state2serial $serial $ip\n" if $debug;
+sub all_parameters {
+ my ( $self, $store, $uid, $queue ) = @_;
- ( $last_ip, $last_serial ) = ( $ip, $serial );
+ my $stored = $store->get_state( $uid );
- return ( $serial, $ip );
-}
-
-=head2 add_triggers
-
-Install all custom triggers
-
- CWMP::Vendor->add_triggers;
-
-=cut
-
-sub add_triggers {
-
- 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}++;
-});
+ return ( 'GetParameterNames', [ 'InternetGatewayDevice.', 1 ] )
+ if ! defined $stored->{ParameterInfo};
-CWMP::Request->add_trigger( name => 'Inform', callback => sub {
- my ( $self, $state ) = @_;
+ my @params =
+ grep { m/\.$/ }
+ keys %{ $stored->{ParameterInfo} }
+ ;
- my ( $serial, $ip ) = state2serial( $state );
+ if ( @params ) {
+ warn "# GetParameterNames ", dump( @params );
+ my $first = shift @params;
+ delete $stored->{ParameterInfo}->{$first};
- 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++;
+ return;
+}
- my $target_ip = $serial2ip->{$target_serial};
+our $tried;
- if ( $ip ne $target_ip ) {
+sub vendor_config {
+ my ( $self, $store, $uid, $queue ) = @_;
- warn "CHANGE IP $ip to $target_ip for $serial\n";
+ my $stored = $store->get_state( $uid );
- return; # FIXME
+ my @refresh;
- my $q = CWMP::Queue->new({ id => $serial, debug => $debug }) || die "no queue?";
+ my $vendor = YAML::LoadFile 'vendor.yaml';
+ $vendor = $vendor->{Parameter} || die "no Parameter in vendor.yaml";
+ $stored = $stored->{Parameter} || warn "no Parameter in stored ", dump($stored);
- $q->enqueue( 'SetParameterValues', {
- 'InternetGatewayDevice.LANDevice.1.LANHostConfigManagement.IPInterface.1.IPInterfaceIPAddress' => $target_ip,
- });
+ warn "# vendor.yaml ",dump $vendor;
+ foreach my $n ( keys %$vendor ) {
+ if ( ! exists $stored->{$n} ) {
+ warn "# $uid missing $n\n";
+ push @refresh, $n;
+ } elsif ( $vendor->{$n} ne $stored->{$n} && ! $tried->{$uid}->{$n}->{set} && $tried->{$uid}->{$n}->{set} ne $vendor->{$n} ) {
+ $queue->enqueue( 'SetParameterValues', { $n => $vendor->{$n} } );
+ push @refresh, $n;
+ $tried->{$uid}->{$n}->{set} = $vendor->{$n};
+ warn "# set $uid $n $stored->{$n} -> $vendor->{$n}\n";
} else {
- warn "IP $ip of $serial ok\n";
+ warn "# ok $uid $n\n";
}
}
- warn "UNKNOWN CPE $ip $serial\nadd\t'$serial' => '$ip',\n" unless $found;
+ return ( 'GetParameterValues', [ @refresh ] ) if @refresh;
-});
+ warn "# tried ",dump $tried;
-}#add_triggers
+ return;
+}
1;