1 |
package CWMP::Vendor; |
2 |
|
3 |
use strict; |
4 |
use warnings; |
5 |
|
6 |
|
7 |
use base qw/Class::Accessor/; |
8 |
__PACKAGE__->mk_accessors( qw/ |
9 |
debug |
10 |
/ ); |
11 |
|
12 |
#use Carp qw/confess/; |
13 |
use Data::Dump qw/dump/; |
14 |
|
15 |
=head1 NAME |
16 |
|
17 |
CWMP::Vendor - implement vendor specific logic into ACS server |
18 |
|
19 |
=head1 METHODS |
20 |
|
21 |
=head2 new |
22 |
|
23 |
my $obj = CWMP::Vendor->new({ |
24 |
debug => 1 |
25 |
}); |
26 |
|
27 |
=cut |
28 |
|
29 |
my $debug = 0; |
30 |
|
31 |
sub new { |
32 |
my $class = shift; |
33 |
my $self = $class->SUPER::new( @_ ); |
34 |
|
35 |
warn "created ", __PACKAGE__, "(", dump( @_ ), ") object\n" if $self->debug; |
36 |
|
37 |
$debug = $self->debug; |
38 |
|
39 |
return $self; |
40 |
} |
41 |
|
42 |
my $cpe_faulty; |
43 |
|
44 |
my $serial2ip = { |
45 |
'CP0636JT3SH' => '192.168.1.242', |
46 |
'CP0644JTHJ4' => '192.168.1.253', |
47 |
}; |
48 |
|
49 |
my ( $last_ip, $last_serial ); |
50 |
|
51 |
sub state2serial { |
52 |
my $state = shift; |
53 |
|
54 |
my $serial = $state->{DeviceID}->{SerialNumber} || die "no serial?"; |
55 |
my $ip = $state->{Parameter}->{'.ExternalIPAddress'} || die "no ip?"; |
56 |
|
57 |
warn "## state2serial $serial $ip\n" if $debug; |
58 |
|
59 |
( $last_ip, $last_serial ) = ( $ip, $serial ); |
60 |
|
61 |
return ( $serial, $ip ); |
62 |
} |
63 |
|
64 |
sub add_triggers { |
65 |
|
66 |
warn __PACKAGE__, "->add_triggers\n" if $debug; |
67 |
|
68 |
CWMP::Request->add_trigger( name => 'Fault', callback => sub { |
69 |
my ( $self, $state ) = @_; |
70 |
warn "## Fault trigger state = ",dump( $self, $state ) if $debug; |
71 |
die "can't map fault to serial!" unless $last_serial; |
72 |
warn "ERROR: got Fault and ingoring $last_ip $last_serial\n"; |
73 |
$cpe_faulty->{$last_serial}++; |
74 |
}); |
75 |
|
76 |
CWMP::Request->add_trigger( name => 'Inform', callback => sub { |
77 |
my ( $self, $state ) = @_; |
78 |
|
79 |
my ( $serial, $ip ) = state2serial( $state ); |
80 |
|
81 |
if ( $cpe_faulty->{$serial} ) { |
82 |
warn "## Inform trigger from $ip $serial -- IGNORED\n" if $debug; |
83 |
return; |
84 |
} |
85 |
|
86 |
warn "## Inform trigger from $ip $serial\n" if $debug; |
87 |
|
88 |
my $found = 0; |
89 |
|
90 |
warn "### serial2ip = ",dump( $serial2ip ) if $debug; |
91 |
|
92 |
foreach my $target_serial ( keys %$serial2ip ) { |
93 |
|
94 |
next unless $target_serial eq $serial; |
95 |
|
96 |
$found++; |
97 |
|
98 |
my $target_ip = $serial2ip->{$target_serial}; |
99 |
|
100 |
if ( $ip ne $target_ip ) { |
101 |
|
102 |
warn "CHANGE IP $ip to $target_ip for $serial\n"; |
103 |
|
104 |
return; # FIXME |
105 |
|
106 |
my $q = CWMP::Queue->new({ id => $serial, debug => $debug }) || die "no queue?"; |
107 |
|
108 |
$q->enqueue( 'SetParameterValues', { |
109 |
'InternetGatewayDevice.LANDevice.1.LANHostConfigManagement.IPInterface.1.IPInterfaceIPAddress' => $target_ip, |
110 |
}); |
111 |
|
112 |
} else { |
113 |
warn "IP $ip of $serial ok\n"; |
114 |
} |
115 |
} |
116 |
|
117 |
warn "UNKNOWN CPE $ip $serial\nadd\t'$serial' => '$ip',\n" unless $found; |
118 |
|
119 |
}); |
120 |
|
121 |
}#add_triggers |
122 |
|
123 |
1; |