source: trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Nethost.pm @ 2097

Last change on this file since 2097 was 2097, checked in by nanardon, 7 years ago

Add hostType and endOfWarranty attribute

File size: 9.2 KB
RevLine 
[861]1package LATMOS::Accounts::Bases::Sql::Nethost;
2
3use 5.010000;
4use strict;
5use warnings;
6
7use base qw(LATMOS::Accounts::Bases::Sql::objects);
8use LATMOS::Accounts::Log;
[1551]9use LATMOS::Accounts::I18N;
[1419]10use Net::IP;
[861]11
12our $VERSION = (q$Rev: 2104 $ =~ /^Rev: (\d+) /)[0];
13
14=head1 NAME
15
[1023]16LATMOS::Accounts::Bases::Sql::Nethost - A Network Host entry
[861]17
18=cut
19
[1014]20sub _object_table { 'nethost' }
[861]21
[2090]22sub _object_table_attributes_read { 'nethost_attributes_read' }
23
[1014]24sub _key_field { 'name' }
[861]25
[1014]26sub _has_extended_attributes { 1 }
[861]27
28sub _get_attr_schema {
29    my ($class, $base) = @_;
30
31    $class->SUPER::_get_attr_schema($base,
32        {
33            name    => { ro => 1, inline => 1, },
34            cn      => { ro => 1, inline => 1, iname => 'name' },
35            date    => { ro => 1, inline => 1, },
36            create  => { ro => 1, inline => 1, },
[1737]37            expire    => {
38                inline => 1,
39                formtype => 'DATE',
40                label => l('Expire'),
41            },
[2097]42            endOfWarranty => {
43                formtype => 'DATE',
44                label => l('End of warranty'),
45            },
[861]46            ip      => {
[1297]47                monitored => 1,
[861]48                multiple => 1,
49                uniq => 1,
50                input => sub {
[1420]51                    my $ip = $_[0] or return;
[861]52                    $ip =~ s/(\D|^)0+/$1/g;
[1419]53                    $ip =~ s:/.*$::;
[861]54                    $ip
55                },
[1419]56                checkinputformat => sub {
57                    my ($value) = @_;
[1420]58                    $value or return;
[1419]59                    my $ip = Net::IP->new($value);
60                    $ip or return;
61                    $ip->prefixlen() == ($ip->version == 4 ? 32 : 128) or do {
62                        $base->log(LA_ERR, "Wrong prefix len for IP %s: %d (ip version %d)",
63                            $ip->print, $ip->prefixlen, $ip->version);
64                        return undef;
65                    };
[1550]66                },
67                label => l('Ip'),
[861]68            },
69            ipFrom  => {
70                multiple => 1, 
71                managed => 1,
[1420]72                delayed => 1,
[861]73                can_values => sub {
74                    $base->search_objects('netzone', 'type=dhcp')
75                },
[1315]76                set => sub {
77                    my ($self, $data) = @_;
[1420]78                    my $count = 0;
[1315]79                    foreach (ref $data ? @{$data} : $data) {
80                        my $zone = $self->base->get_object('netzone', $_)
81                            or next;
82                        my @freeips = $zone->get_attributes('freeIP') or next;
83                        my $idx = rand(scalar(@freeips));
84                        $self->object->_addAttributeValue('ip', $freeips[$idx]);
85                        $self->base->log(LA_NOTICE, "Assigning ip %s to host %s",
86                            $freeips[$idx], $self->object->id);
[1420]87                        $count++;
[1315]88                    }
[1420]89                    return $count;
[1315]90                },
[1550]91                label => l('Ip from...'),
[861]92            },
93            macaddr => {
[1297]94                monitored => 1,
[861]95                multiple => 1,
96                uniq => 1,
97                input => sub {
[1420]98                    $_[0] or return;
[1685]99                    $_[0] =~ /^([0-9a-f]{2}([:-]|$)){6}$/i or return $_[0];
[1224]100                    my @elem = split(/[:-]/, $_[0]);
[1685]101                    return join(':', map { sprintf("%02x", hex($_)) || $_ } @elem);
[861]102                },
[1415]103                checkinputformat => sub {
[1420]104                    $_[0] or return;
[1329]105                    return $_[0] =~ /^([0-9a-f]{2}([:-]|$)){6}$/i ? 1 : undef;
106                },
[1550]107                label => l('Hardware address'),
[861]108            },
109            cname   => {
[1297]110                monitored => 1,
[1436]111                multiple => 1,
[1550]112                input => sub { lc($_[0]) },
113                label => l('Aliases'),
[861]114            },
[1302]115            related   => {
116                multiple => 1, uniq => 1,
117                reference => 'nethost',
[1550]118                label => l('Related'),
[1302]119            },
[1280]120            owner   => {
[1297]121                monitored => 1,
[861]122                reference => 'user',
123                delayed => 1,
[1550]124                label => l('Owner'),
[861]125            },
[920]126            user    => {
127                reference => 'user',
128                delayed => 1,
[1550]129                label => l('User'),
[920]130            },
[861]131            netZone => {
132                multiple => 1, ro => 1, managed => 1,
133                reference => 'netzone',
[1552]134                label => l('NetZones'),
[861]135            },
[1550]136            puppetClass => {
137                multiple => 1,
138                label => l('Puppet Class'),
139            },
[861]140            netZoneExclude => {
141                multiple => 1, ro => 1, managed => 1,
142                reference => 'netzone',
[1315]143                get => sub {
144                    my ($self) = @_;
145                    my $find = $self->base->db->prepare_cached(q{
146                        select name from netzone where ikey in
147                        (
148                        select netzone_attributes.okey from netzone_attributes join
149                        nethost_attributes_ips on netzone_attributes.attr='netExclude'
150                            and
151                        nethost_attributes_ips.value::inet <<=
152                        netzone_attributes.value::inet
153                        where nethost_attributes_ips.okey = $1
154                        )
155                            order by name
156                        });
157                    $find->execute($self->object->get_attributes('ikey'));
158                    my @zones;
159                    while (my $res = $find->fetchrow_hashref) {
160                        push(@zones, $res->{name});
161                    }
162                    return @zones ? [ @zones ] : undef;
163                },
[861]164            },
165            noDynamic => { 
166                formtype => 'CHECKBOX',
[1557]167                label => l('No dynamic IP'),
[861]168            },
169            exported => { formtype => 'CHECKBOX', },
[1550]170            noInheritPuppet => {
171                formtype => 'CHECKBOX',
[1557]172                label => l('No puppet'),
[1550]173            },
[861]174            otherName => {
175                multiple => 1,
176                input => sub { lc($_[0]) },
[1550]177                label => l('Other name'),
[861]178            },
[1550]179            sshfp => {
180                multiple => 1,
181                label => l('SSH finger print'),
182            },
[1374]183            ip6 => { },
[1225]184            sshfpUpdate  => {
185                managed => 1,
[1315]186                iname => 'sshfp',
187                input => sub {
188                    my ($self, $data) = @_;
[1419]189                    $data or return;
[1315]190                    open(my $h, '<', $data) or return;
191                    my @sshfps;
192                    while (my $line = <$h>) {
193                        my ($type, $mode, $key) = $line =~ /^\S+\s+IN\s+SSHFP\s+(\d)\s+(\d)\s+(\S+)/i
194                            or do {
195                            la_log(LA_ERR, "Seems to not be a ssh-keygen line: %s", $line);
196                            return;
197                        };
198                        la_log(LA_DEBUG, "found sshfp %s %s %s", $type, $mode, $key);
199                        push(@sshfps, "$type $mode $key");
200                    }
201                    close($h);
202                    \@sshfps;
203                }
[1225]204            },
[1550]205            comment => {
206                label => l('Comment'),
207            },
208            description => {
209                label => l('Description'),
210            },
[2097]211            hostType => {
212                label => l('Host\'s type'),
213            },
[1550]214            encryptKey => {
215                label => l('Encrypted key'),
216            },
217            reverse => {
218                label => l('Reverse name'),
219            },
220            serialNumber => {
221                label => l('Serial number'),
222            },
[2054]223            inventoryNumber => {
224                label => l('Inventory number'),
225            },
[861]226        }
227    )
228}
229
230sub set_fields {
231    my ($self, %data) = @_;
232
[1302]233    my $res = $self->SUPER::set_fields(%data);
234
[1315]235    # Post update related
[1302]236    if (exists $data{related}) {
237        my %exists;
238        if ($data{related}) {
239            my @related = ref $data{related} ? @{$data{related}} : $data{related};
240            foreach (@related) {
241                my $obj = $self->base->get_object('nethost', $_) or next;
242                $exists{$obj->id} = 1; 
243                my @current = grep { $_ } $obj->get_attributes('related');
244                grep { $_ eq $self->id } @current and next;
245                $obj->set_c_fields('related' => [ $self->id, @current ]);
246
247            }
248        }
249        foreach ($self->base->search_objects('nethost', 'related=' . $self->id)) {
250            my $obj = $self->base->get_object('nethost', $_) or next;
251            $exists{$_} and next;
252            my @current = grep { $_ eq $self->id } $obj->get_attributes('related');
253            $obj->set_c_fields('related' => [ @current ]);
254        }
255    }
256
257    $res
[861]258}
259
2601;
261
262__END__
263
264=head1 SEE ALSO
265
[1023]266L<LATMOS::Accounts::Bases::Sql::Netzones>, L<LATMOS::Accounts::Bases::Sql>
267
[861]268=head1 AUTHOR
269
270Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
271
272=head1 COPYRIGHT AND LICENSE
273
[1023]274Copyright (C) 2008, 2009, 2010, 2011, 2012 CNRS SA/CETP/LATMOS
[861]275
276This library is free software; you can redistribute it and/or modify
277it under the same terms as Perl itself, either Perl version 5.10.0 or,
278at your option, any later version of Perl 5 you may have available.
279
280
281=cut
Note: See TracBrowser for help on using the repository browser.