1 package FS::part_export::broadband_nas;
4 use vars qw(%info $DEBUG);
5 use base 'FS::part_export';
6 use FS::Record qw(qsearch qsearchs);
10 use FS::part_export::sqlradius;
15 my $me = '['.__PACKAGE__.']';
17 tie my %options, 'Tie::IxHash',
18 '1' => { type => 'title', label => 'Defaults' },
19 default_shortname => { label => 'Short name' },
20 default_secret => { label => 'Shared secret' },
21 default_type => { label => 'Type' },
22 default_ports => { label => 'Ports' },
23 default_server => { label => 'Virtual server' },
24 default_community => { label => 'Community' },
25 '2' => { type => 'title', label => 'Export to' },
26 # default export_nas entries will be inserted at runtime
29 FS::UID->install_callback(
31 #creating new options based on records in a table,
32 #has to be done after initialization
33 foreach ( FS::part_export::sqlradius->all_sqlradius ) {
34 my $name = 'exportnum' . $_->exportnum;
36 { type => 'checkbox', label => $_->exportnum . ': ' . $_->label };
43 'svc' => 'svc_broadband',
44 'desc' => 'Create a NAS entry in Freeside',
45 'options' => \%options,
49 <p>Create an entry in the NAS (RADIUS client) table, inheriting the IP
50 address and description of the broadband service. This can be used
51 with 'sqlradius' or 'broadband_sqlradius' exports to maintain entries
52 in the client table on a RADIUS server.</p>
53 <p>The checkboxes at the bottom of this page correspond to RADIUS server
54 databases that Freeside knows about (i.e. 'sqlradius' or 'broadband_sqlradius'
55 exports that you have configured). Check the box for each server that you
56 want the NAS entries to be exported to. Do not create multiple broadband_nas
57 exports for the same service definition; this will fail.</p>
58 <p>Most broadband configurations should not use this, even if they use
59 RADIUS for access control.</p>
63 =item export_insert NEWSVC
65 =item export_replace NEWSVC OLDSVC
67 NEWSVC can contain pseudo-field entries for fields in nas. Those changes
68 will be applied to the attached NAS record.
74 my $svc_broadband = shift;
76 'nasname' => $svc_broadband->ip_addr,
77 'description' => $svc_broadband->description,
78 'svcnum' => $svc_broadband->svcnum,
80 foreach (FS::nas->fields) {
81 if ( length($svc_broadband->get($_)) ) {
82 $hash{$_} = $svc_broadband->get($_);
85 # if there's somehow a completely identical NAS in the table already,
87 my $nas = qsearchs('nas', \%hash);
90 # propagate the export message
91 foreach my $part_export ($nas->part_export) {
92 $error = $part_export->export_nas_insert($nas);
96 $nas = $self->default_nas( %hash );
97 $error = $nas->insert ||
98 $nas->process_m2m('link_table' => 'export_nas',
99 'target_table' => 'part_export',
100 'params' => { $self->options });
102 die $error if $error;
108 my $svc_broadband = shift;
109 my $svcnum = $svc_broadband->svcnum;
110 my $nas = qsearchs('nas', { 'svcnum' => $svcnum });
112 # we were going to delete it anyway...
113 warn "linked NAS with svcnum $svcnum not found for deletion\n";
116 my $error = $nas->delete; # will clean up export_nas records
117 die $error if $error;
123 my ($new_svc, $old_svc) = (shift, shift);
125 my $svcnum = $new_svc->svcnum;
126 my $nas = qsearchs('nas', { 'svcnum' => $svcnum });
128 warn "linked nas with svcnum $svcnum not found for update, creating new\n";
129 # then we should insert it
130 # (this happens if the nas table is wiped out, or if the broadband_nas
131 # export is newly applied to an existing svcpart)
132 return $self->export_insert($new_svc);
135 my %hash = $new_svc->hash;
136 foreach (FS::nas->fields) {
137 $nas->set($_, $hash{$_}) if exists($hash{$_});
140 $nas->nasname($new_svc->ip_addr); # this must always be true
142 my $error = $nas->replace;
143 die $error if $error;
147 =item default_nas HASH
149 Returns a new L<FS::nas> object containing the default values, plus anything
157 map( { $_ => $self->option("default_$_") }
158 qw(shortname type ports secret server community)