package FS::svc_hardware;
+use base qw( FS::svc_Common );
use strict;
-use base qw( FS::svc_Common );
-use FS::Record qw( qsearch qsearchs );
-use FS::hardware_type;
+use vars qw( $conf );
+use FS::Record qw( qsearchs ); #qsearch qsearchs );
use FS::hardware_status;
+use FS::Conf;
+
+FS::UID->install_callback(sub { $conf = FS::Conf->new; });
=head1 NAME
=item serial - Serial number
+=item smartcard - Smartcard number, for devices that use a smartcard
+
=item statusnum - Service status (see L<FS::hardware_status>)
=item note - Installation notes: location on property, physical access, etc.
'serial' => { label => 'Serial number', %opts },
'hw_addr' => { label => 'Hardware address', %opts },
'ip_addr' => { label => 'IP address', %opts },
+ 'smartcard' => { label => 'Smartcard #', %opts },
'statusnum' => { label => 'Service status',
type => 'select',
select_table => 'hardware_status',
my ($class, $string) = @_;
my @where = ();
- my $ip = NetAddr::IP->new($string);
- if ( $ip ) {
- push @where, $class->search_sql_field('ip_addr', $ip->addr);
+ if ( $string =~ /^[\d\.:]+$/ ) {
+ # if the string isn't an IP address, this will waste several seconds
+ # attempting a DNS lookup. so try to filter those out.
+ my $ip = NetAddr::IP->new($string);
+ if ( $ip ) {
+ push @where, $class->search_sql_field('ip_addr', $ip->addr);
+ }
}
if ( $string =~ /^(\w+)$/ ) {
$hex =~ s/\W//g;
push @where, 'svc_hardware.hw_addr LIKE \'%'.$hex.'%\'';
}
- '(' . join(' OR ', @where) . ')';
+
+ if ( @where ) {
+ '(' . join(' OR ', @where) . ')';
+ } else {
+ '1 = 0'; #false
+ }
}
sub label {
my $self = shift;
- $self->serial || $self->hw_addr;
+ $self->serial || $self->display_hw_addr;
}
=item insert
sub check {
my $self = shift;
+ my $conf = FS::Conf->new;
my $x = $self->setfixed;
return $x unless ref $x;
my $hw_addr = $self->getfield('hw_addr');
- $hw_addr = join('', split(/\W/, $hw_addr));
+ $hw_addr = join('', split(/[_\W]/, $hw_addr));
+ if ( $conf->exists('svc_hardware-check_mac_addr') ) {
+ $hw_addr = uc($hw_addr);
+ $hw_addr =~ /^[0-9A-F]{12}$/
+ or return "Illegal (MAC address) '".$self->getfield('hw_addr')."'";
+ }
$self->setfield('hw_addr', $hw_addr);
my $error =
$self->ut_numbern('svcnum')
|| $self->ut_foreign_key('typenum', 'hardware_type', 'typenum')
|| $self->ut_ip46n('ip_addr')
- || $self->ut_hexn('hw_addr')
+ || $self->ut_alphan('hw_addr')
|| $self->ut_alphan('serial')
+ || $self->ut_alphan('smartcard')
|| $self->ut_foreign_keyn('statusnum', 'hardware_status', 'statusnum')
- || $self->ut_textn('note')
+ || $self->ut_anything('note')
;
return $error if $error;
Returns the L<FS::hardware_type> object associated with this installation.
-=cut
-
-sub hardware_type {
- my $self = shift;
- return qsearchs('hardware_type', { 'typenum' => $self->typenum });
-}
-
=item status_label
Returns the 'label' field of the L<FS::hardware_status> object associated
$status->label;
}
+=item display_hw_addr
+
+Returns the 'hw_addr' field, formatted as a MAC address if the
+'svc_hardware-check_mac_addr' option is enabled.
+
+=cut
+
+sub display_hw_addr {
+ my $self = shift;
+ ($conf->exists('svc_hardware-check_mac_addr') ?
+ join(':', $self->hw_addr =~ /../g) : $self->hw_addr)
+}
=back