summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
authorivan <ivan>2011-10-06 07:02:49 +0000
committerivan <ivan>2011-10-06 07:02:49 +0000
commit14c5096e04f0d1ac2a19a3c6c41e537a9aa0f78c (patch)
tree4b87a5eb5ec1acac9ac60c50fc79f1138de4338d /FS
parentce18f284969a1eaed7985a91123a275a57090e12 (diff)
add dsl_device to track mac addresses, RT#13656
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/ClientAPI/MyAccount.pm78
-rw-r--r--FS/FS/ClientAPI_XMLRPC.pm3
-rw-r--r--FS/FS/Record.pm36
-rw-r--r--FS/FS/dsl_device.pm2
-rw-r--r--FS/FS/svc_dsl.pm13
-rw-r--r--FS/MANIFEST2
-rw-r--r--FS/t/dsl_device.t5
7 files changed, 138 insertions, 1 deletions
diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm
index 3976ab239..e3afac14a 100644
--- a/FS/FS/ClientAPI/MyAccount.pm
+++ b/FS/FS/ClientAPI/MyAccount.pm
@@ -25,6 +25,8 @@ use FS::svc_acct;
use FS::svc_domain;
use FS::svc_phone;
use FS::svc_external;
+use FS::svc_dsl;
+use FS::dsl_device;
use FS::part_svc;
use FS::cust_main;
use FS::cust_bill;
@@ -1403,6 +1405,82 @@ sub list_svcs {
}
+sub _customer_svc_x {
+ my($custnum, $svcnum, $table) = @_;
+
+ $custnum =~ /^(\d+)$/ or die "illegal custnum";
+ my $search = " AND custnum = $1";
+ #$search .= " AND agentnum = ". $session->{'agentnum'} if $context eq 'agent';
+
+ qsearchs( {
+ 'table' => ($table || 'svc_acct'),
+ 'addl_from' => 'LEFT JOIN cust_svc USING ( svcnum ) '.
+ 'LEFT JOIN cust_pkg USING ( pkgnum ) ',#.
+ #'LEFT JOIN cust_main USING ( custnum ) ',
+ 'hashref' => { 'svcnum' => $svcnum, },
+ 'extra_sql' => $search, #important
+ } );
+
+}
+
+sub list_dsl_devices {
+ my $p = shift;
+
+ my($context, $session, $custnum) = _custoragent_session_custnum($p);
+ return { 'error' => $session } if $context eq 'error';
+
+ my $svc_dsl = _customer_svc_x( $custnum, $p->{'svcnum'}, 'svc_dsl' )
+ or return { 'error' => "Service not found" };
+
+ return {
+ 'devices' => [ map {
+ +{ 'mac_addr' => $_->mac_addr };
+ } $svc_dsl->dsl_device
+ ],
+ };
+
+}
+
+sub add_dsl_device {
+ my $p = shift;
+
+ my($context, $session, $custnum) = _custoragent_session_custnum($p);
+ return { 'error' => $session } if $context eq 'error';
+
+ my $svc_dsl = _customer_svc_x( $custnum, $p->{'svcnum'}, 'svc_dsl' )
+ or return { 'error' => "Service not found" };
+
+ return { 'error' => 'No MAC address supplied' }
+ unless length($p->{'mac_addr'});
+
+ my $dsl_device = new FS::dsl_device { 'svcnum' => $svc_dsl->svcnum,
+ 'mac_addr' => scalar($p->{'mac_addr'}),
+ };
+ my $error = $dsl_device->insert;
+ return { 'error' => $error };
+
+}
+
+sub delete_dsl_device {
+ my $p = shift;
+
+ my($context, $session, $custnum) = _custoragent_session_custnum($p);
+ return { 'error' => $session } if $context eq 'error';
+
+ my $svc_dsl = _customer_svc_x( $custnum, $p->{'svcnum'}, 'svc_dsl' )
+ or return { 'error' => "Service not found" };
+
+ my $dsl_device = qsearchs('dsl_device', { 'svcnum' => $svc_dsl->svcnum,
+ 'mac_addr' => scalar($p->{'mac_addr'}),
+ }
+ )
+ or return { 'error' => 'Unknown MAC address: '. $p->{'mac_addr'} };
+
+ my $error = $dsl_device->delete;
+ return { 'error' => $error };
+
+}
+
sub port_graph {
my $p = shift;
_usage_details( \&_port_graph, $p,
diff --git a/FS/FS/ClientAPI_XMLRPC.pm b/FS/FS/ClientAPI_XMLRPC.pm
index b077bf27a..2913ffd47 100644
--- a/FS/FS/ClientAPI_XMLRPC.pm
+++ b/FS/FS/ClientAPI_XMLRPC.pm
@@ -87,6 +87,9 @@ sub ss2clientapi {
'list_pkgs' => 'MyAccount/list_pkgs', #add to ss (added?)
'list_svcs' => 'MyAccount/list_svcs', #add to ss (added?)
'list_svc_usage' => 'MyAccount/list_svc_usage',
+ 'list_dsl_devices' => 'MyAccount/list_dsl_devices',
+ 'add_dsl_device' => 'MyAccount/add_dsl_device',
+ 'delete_dsl_device' => 'MyAccount/delete_dsl_device',
'port_graph' => 'MyAccount/port_graph',
'list_cdr_usage' => 'MyAccount/list_cdr_usage',
'list_support_usage' => 'MyAccount/list_support_usage',
diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm
index bccc8e6d4..2fec8e00f 100644
--- a/FS/FS/Record.pm
+++ b/FS/FS/Record.pm
@@ -2385,6 +2385,42 @@ sub ut_hexn {
$self->setfield($field, uc($1));
'';
}
+
+=item ut_mac_addr COLUMN
+
+Check/untaint mac addresses. May be null.
+
+=cut
+
+sub ut_mac_addr {
+ my($self, $field) = @_;
+
+ my $mac = $self->get($field);
+ $mac =~ s/\s+//g;
+ $mac =~ s/://g;
+ $self->set($field, $mac);
+
+ my $e = $self->ut_hex($field);
+ return $e if $e;
+
+ return "Illegal (mac address) $field: ". $self->getfield($field)
+ unless length($self->getfield($field)) == 12;
+
+ '';
+
+}
+
+=item ut_mac_addrn COLUMN
+
+Check/untaint mac addresses. May be null.
+
+=cut
+
+sub ut_mac_addrn {
+ my($self, $field) = @_;
+ ($self->getfield($field) eq '') ? '' : $self->ut_mac_addr($field);
+}
+
=item ut_ip COLUMN
Check/untaint ip addresses. IPv4 only for now, though ::1 is auto-translated
diff --git a/FS/FS/dsl_device.pm b/FS/FS/dsl_device.pm
index 276eedd64..2efe1f56e 100644
--- a/FS/FS/dsl_device.pm
+++ b/FS/FS/dsl_device.pm
@@ -106,7 +106,7 @@ sub check {
my $error =
$self->ut_numbern('devicenum')
|| $self->ut_foreign_key('svcnum', 'svc_dsl', 'svcnum' )
- || $self->ut_mac_addrn('mac_addr')
+ || $self->ut_mac_addr('mac_addr')
;
return $error if $error;
diff --git a/FS/FS/svc_dsl.pm b/FS/FS/svc_dsl.pm
index ce4342e27..89f1159bd 100644
--- a/FS/FS/svc_dsl.pm
+++ b/FS/FS/svc_dsl.pm
@@ -4,6 +4,7 @@ use strict;
use vars qw( @ISA $conf $DEBUG $me );
use FS::Record qw( qsearch qsearchs );
use FS::svc_Common;
+use FS::dsl_device;
use FS::dsl_note;
use FS::qual;
@@ -273,6 +274,18 @@ sub check {
$self->SUPER::check;
}
+=item dsl_device
+
+Returns the MAC addresses associated with this DSL service, as FS::dsl_device
+objects.
+
+=cut
+
+sub dsl_device {
+ my $self = shift;
+ qsearch('dsl_device', { 'svcnum' => $self->svcnum });
+}
+
sub predelete_hook_first {
my $self = shift;
my @exports = $self->part_svc->part_export_dsl_pull;
diff --git a/FS/MANIFEST b/FS/MANIFEST
index 43a1ed87e..557e61279 100644
--- a/FS/MANIFEST
+++ b/FS/MANIFEST
@@ -610,3 +610,5 @@ FS/radius_group.pm
t/radius_group.t
FS/template_content.pm
t/template_content.t
+FS/dsl_device.pm
+t/dsl_device.t
diff --git a/FS/t/dsl_device.t b/FS/t/dsl_device.t
new file mode 100644
index 000000000..2e97424b8
--- /dev/null
+++ b/FS/t/dsl_device.t
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::dsl_device;
+$loaded=1;
+print "ok 1\n";