/[pxelator]/lib/PXElator/client.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /lib/PXElator/client.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 208 - (hide annotations)
Wed Aug 12 23:59:01 2009 UTC (14 years, 9 months ago) by dpavlin
File size: 2180 byte(s)
cleanup logging a bit

1 dpavlin 156 package client;
2    
3     use warnings;
4     use strict;
5     use autodie;
6    
7     use server;
8     use File::Slurp;
9 dpavlin 168 use Net::Ping;
10 dpavlin 208 use format;
11 dpavlin 156
12 dpavlin 200 sub mac_path { $server::conf . '/mac/' . $_[0] }
13     sub ip_path { $server::conf . '/ip/' . join('/', @_) }
14    
15 dpavlin 156 sub conf {
16     my $ip = shift;
17     my $name = shift;
18     my ( $default, $value );
19     if ( $#_ == 0 ) {
20     $value = shift;
21     } elsif ( $#_ == 1 && $_[0] eq 'default' ) {
22     $default = $_[1]
23     }
24    
25 dpavlin 200 my $path = ip_path $ip;
26 dpavlin 156 mkdir $path unless -d $path;
27     $path .= '/' . $name;
28    
29     if ( defined $value ) {
30     write_file $path, $value;
31     warn "update $path = $value";
32     } elsif ( ! -e $path && defined $default ) {
33     write_file $path, $default;
34     warn "default $path = $default";
35     $value = $default;
36 dpavlin 164 } elsif ( -e $path ) {
37     if ( -l $path ) {
38     $value = readlink $path;
39     $value =~ s{.*/([^/]+)$}{$1};
40     } else {
41     $value = read_file $path;
42     }
43 dpavlin 156 }
44     return $value;
45     }
46    
47 dpavlin 165 sub mac {
48 dpavlin 208 my $ip = shift;
49     my $mac = client::conf( $ip, 'mac' ) || return '';
50     format::mac( $ip, @_ );
51 dpavlin 165 }
52    
53 dpavlin 200 sub next_ip($) {
54     my $mac = shift;
55 dpavlin 168
56     my $p = Net::Ping->new;
57    
58     my $prefix = $server::ip;
59     $prefix =~ s{\.\d+$}{.};
60     my $addr = $server::ip_from || die;
61     my $ip = $prefix . $addr;
62    
63 dpavlin 200 while ( -e ip_path($ip) || $p->ping( $ip, 0.7 ) ) {
64 dpavlin 168 $ip = $prefix . $addr++;
65     die "all addresses allocated!" if $addr == $server::ip_to;
66     warn "skip $ip\n";
67     }
68    
69     warn "next_ip $ip\n";
70 dpavlin 200
71     mkdir ip_path($ip);
72    
73     symlink ip_path($ip), mac_path($mac);
74     write_file ip_path($ip,'mac'), $mac;
75    
76 dpavlin 168 return $ip;
77    
78     }
79    
80 dpavlin 200 sub ip_from_mac($) {
81 dpavlin 194 my $mac = shift;
82    
83     $mac = lc $mac;
84     $mac =~ s{:}{}g;
85    
86 dpavlin 200 my $mac_path = mac_path $mac;
87 dpavlin 194 return unless -e $mac_path;
88    
89     my $ip;
90    
91     if ( -f $mac_path ) {
92     $ip = read_file $mac_path;
93     unlink $mac_path;
94 dpavlin 200 symlink ip_path($ip), $mac_path;
95 dpavlin 194 warn "I: upgrade to mac symlink $mac_path\n";
96     } elsif ( -l $mac_path ) {
97     $ip = readlink $mac_path;
98     $ip =~ s{^.+/([^/]+)$}{$1};
99     } else {
100     die "$mac_path not file or symlink";
101     }
102    
103     return $ip;
104     }
105    
106 dpavlin 200 sub mac_from_ip($) {
107     my $ip = shift;
108     return read_file ip_path($ip, 'mac');
109     }
110    
111     sub change_ip($$) {
112     my ($old, $new) = @_;
113     my $mac = mac_from_ip($old);
114     rename ip_path($old), ip_path($new);
115     unlink mac_path($mac);
116     symlink ip_path($new), mac_path($mac);
117     }
118    
119 dpavlin 156 1;

  ViewVC Help
Powered by ViewVC 1.1.26