use new CWMP::Parser
[perl-cwmp.git] / lib / CWMP / Vendor.pm
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 our $cpe_faulty;
43
44 my $serial2ip = {
45         'CP0636JT3SH' => '10.0.0.1',
46         'CP0644JTHJ4' => '10.0.0.2',
47         'CP0624BH55U' => '10.0.0.3',
48 };
49
50 my ( $last_ip, $last_serial );
51
52 =head2 state2serial
53
54   my $serial = state2serial( $state );
55
56 =cut
57
58 sub state2serial {
59         my $state = shift;
60
61         my $serial = $state->{DeviceId}->{SerialNumber} || die "no DeviceId.SerialNumber in ",dump($state);
62         chomp($serial);
63         my $ip =
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]
68                 } ||
69                 die "no .ExternalIPAddress in ",dump($state);
70
71         warn "## state2serial $serial $ip\n" if $debug;
72
73         ( $last_ip, $last_serial ) = ( $ip, $serial );
74
75         return ( $serial, $ip );
76 }
77
78 =head2 add_triggers
79
80 Install all custom triggers
81
82   CWMP::Vendor->add_triggers;
83
84 =cut
85
86 sub add_triggers {
87 }
88
89 1;
90
91 __END__
92
93         warn __PACKAGE__, "->add_triggers\n" if $debug;
94
95 CWMP::Request->add_trigger( name => 'Fault', callback => sub {
96         my ( $self, $state ) = @_;
97         warn "## Fault trigger state = ",dump( $self, $state ) if $debug;
98         die "can't map fault to serial!" unless $last_serial;
99         warn "ERROR: got Fault and ingoring $last_ip $last_serial\n";
100         $cpe_faulty->{$last_serial}++;
101 });
102
103 CWMP::Request->add_trigger( name => 'Inform', callback => sub {
104         my ( $self, $state ) = @_;
105
106         my ( $serial, $ip ) = state2serial( $state );
107
108         if ( $cpe_faulty->{$serial} ) {
109                 warn "## Inform trigger from $ip $serial -- IGNORED\n" if $debug;
110                 return;
111         }
112
113         warn "## Inform trigger from $ip $serial\n" if $debug;
114
115         my $found = 0;
116
117         warn "### serial2ip = ",dump( $serial2ip ) if $debug;
118
119         foreach my $target_serial ( keys %$serial2ip ) {
120
121                 next unless $target_serial eq $serial;
122
123                 $found++;
124
125                 my $target_ip = $serial2ip->{$target_serial};
126
127                 if ( $ip ne $target_ip ) {
128
129                         warn "CHANGE IP $ip to $target_ip for $serial\n";
130
131                         return; # FIXME
132
133                         my $q = CWMP::Queue->new({ id => $serial, debug => $debug }) || die "no queue?";
134
135                         $q->enqueue( 'SetParameterValues', {
136                                 'InternetGatewayDevice.LANDevice.1.LANHostConfigManagement.IPInterface.1.IPInterfaceIPAddress' => $target_ip,
137                         });
138
139                 } else {
140                         warn "IP $ip of $serial ok\n";
141                 }
142         }
143
144         warn "UNKNOWN CPE $ip $serial\nadd\t'$serial' => '$ip',\n" unless $found;
145
146 });
147
148 }#add_triggers
149
150 1;