7 use base qw/Class::Accessor/;
8 __PACKAGE__->mk_accessors( qw/
12 #use Carp qw/confess/;
13 use Data::Dump qw/dump/;
17 CWMP::Vendor - implement vendor specific logic into ACS server
23 my $obj = CWMP::Vendor->new({
33 my $self = $class->SUPER::new( @_ );
35 warn "created ", __PACKAGE__, "(", dump( @_ ), ") object\n" if $self->debug;
37 $debug = $self->debug;
45 'CP0636JT3SH' => '10.0.0.1',
46 'CP0644JTHJ4' => '10.0.0.2',
47 'CP0624BH55U' => '10.0.0.3',
50 my ( $last_ip, $last_serial );
54 my $serial = state2serial( $state );
61 my $serial = $state->{DeviceID}->{SerialNumber} || die "no DeviceID.SerialNumber in ",dump($state);
64 $state->{Parameter}->{'.ExternalIPAddress'} ||
65 $state->{Parameter}->{
66 # fix for firmware 5.3.3.4 which returns full path
67 ( grep { m/\.ExternalIPAddress/ } keys %{ $state->{Parameter} } )[0]
69 die "no .ExternalIPAddress in ",dump($state);
71 warn "## state2serial $serial $ip\n" if $debug;
73 ( $last_ip, $last_serial ) = ( $ip, $serial );
75 return ( $serial, $ip );
80 Install all custom triggers
82 CWMP::Vendor->add_triggers;
88 warn __PACKAGE__, "->add_triggers\n" if $debug;
90 CWMP::Request->add_trigger( name => 'Fault', callback => sub {
91 my ( $self, $state ) = @_;
92 warn "## Fault trigger state = ",dump( $self, $state ) if $debug;
93 die "can't map fault to serial!" unless $last_serial;
94 warn "ERROR: got Fault and ingoring $last_ip $last_serial\n";
95 $cpe_faulty->{$last_serial}++;
98 CWMP::Request->add_trigger( name => 'Inform', callback => sub {
99 my ( $self, $state ) = @_;
101 my ( $serial, $ip ) = state2serial( $state );
103 if ( $cpe_faulty->{$serial} ) {
104 warn "## Inform trigger from $ip $serial -- IGNORED\n" if $debug;
108 warn "## Inform trigger from $ip $serial\n" if $debug;
112 warn "### serial2ip = ",dump( $serial2ip ) if $debug;
114 foreach my $target_serial ( keys %$serial2ip ) {
116 next unless $target_serial eq $serial;
120 my $target_ip = $serial2ip->{$target_serial};
122 if ( $ip ne $target_ip ) {
124 warn "CHANGE IP $ip to $target_ip for $serial\n";
128 my $q = CWMP::Queue->new({ id => $serial, debug => $debug }) || die "no queue?";
130 $q->enqueue( 'SetParameterValues', {
131 'InternetGatewayDevice.LANDevice.1.LANHostConfigManagement.IPInterface.1.IPInterfaceIPAddress' => $target_ip,
135 warn "IP $ip of $serial ok\n";
139 warn "UNKNOWN CPE $ip $serial\nadd\t'$serial' => '$ip',\n" unless $found;