1 package FS::svc_IP_Mixin;
4 use base 'FS::IP_Mixin';
5 use FS::Record qw(qsearchs qsearch);
9 Returns the address block assigned to this service.
13 Returns the router assigned to this service, if there is one.
17 #addr_block and router methods provided by FS::IP_Mixin
21 Returns the address as a L<NetAddr::IP> object. Use C<$svc->NetAddr->addr>
22 to put it into canonical string form.
28 NetAddr::IP->new($self->ip_addr);
33 Wrapper for set/get on the IP address field.
39 my $ip_field = $self->table_info->{'ip_field'}
42 $self->set($ip_field, @_);
44 $self->get($ip_field);
50 Returns a list of L<FS::router> objects allowed on this service.
56 my $svcpart = $self->svcnum ? $self->cust_svc->svcpart : $self->svcpart;
57 my @r = map { $_->router }
58 qsearch('part_svc_router', { svcpart => $svcpart });
60 if ( $self->cust_main ) {
61 my $agentnum = $self->cust_main->agentnum;
62 return grep { !$_->agentnum or $_->agentnum == $agentnum } @r;
70 Wrapper for C<ip_check> which also checks the validity of the router.
76 my $error = $self->ip_check;
77 return $error if $error;
78 if ( my $router = $self->router ) {
79 if ( grep { $_->routernum eq $router->routernum } $self->allowed_routers ) {
82 return 'Router '.$router->routername.' not available for this service';
89 my ($class, $block, $exclude) = @_;
90 my $ip_field = $class->table_info->{'ip_field'}
92 # if the service doesn't have an ip_field, then it has no IP addresses
95 my %hash = ( $ip_field => { op => '!=', value => '' } );
96 $hash{'blocknum'} = $block->blocknum if $block;
97 $hash{'svcnum'} = { op => '!=', value => $exclude->svcnum } if ref $exclude;
98 map { $_->NetAddr->addr } qsearch($class->table, \%hash);
102 my ($class, $addr, $exclude) = @_;
103 my $ip_field = $class->table_info->{'ip_field'}
106 my $svc = qsearchs($class->table, { $ip_field => $addr })
109 return '' if ( ref $exclude and $exclude->svcnum == $svc->svcnum );
111 my $cust_svc = $svc->cust_svc;
113 my @label = $cust_svc->label;
114 # "svc_foo 1234 (Service Desc)"
115 # this should be enough to identify it without leaking customer
116 # names across agents
117 "$label[2] $label[3] ($label[0])";
119 join(' ', $class->table, $svc->svcnum, '(unlinked service)');