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

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

Make differences between view and table for attributes

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