/[vz-tools]/trunk/lib/VZ.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

Diff of /trunk/lib/VZ.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 38 by dpavlin, Fri Feb 8 21:45:37 2008 UTC revision 49 by dpavlin, Thu Aug 14 22:47:54 2008 UTC
# Line 2  package VZ; Line 2  package VZ;
2  use Exporter 'import';  use Exporter 'import';
3  our @EXPORT = qw(  our @EXPORT = qw(
4  check_root  check_root
5    
6    ip2hostname
7  hostname2ip  hostname2ip
8    
9    conf_veids
10    runscript
11    
12    vzctl
13    vzlist
14    
15    $vz_root
16    $vz_conf
17    
18    dump
19  );  );
20    
21  use warnings;  use warnings;
22  use strict;  use strict;
23    
24  use Socket;  use Socket;
25    use Data::Dump qw/dump/;
26    
27    our $vz_root = '/vz';
28    our $vz_conf = '/etc/vz/conf';
29    
30    =head1 NAME
31    
32    VZ - helper functions for VZ tools
33    
34    =cut
35    
36    =head1 FUNCTIONS
37    
38    =head2 check_root
39    
40    Restart as C<root> user if needed using C<sudo>
41    
42    =cut
43    
44  sub check_root {  sub check_root {
45          if ( $> != 0 ) {          if ( $> != 0 ) {
# Line 17  sub check_root { Line 48  sub check_root {
48          }          }
49  }  }
50    
51    =head2 hostname2ip
52    
53      my $ip = hostname2ip('www.example.com');
54    
55    =cut
56    
57  sub hostname2ip {  sub hostname2ip {
58          my $hostname = shift || return;          my $hostname = shift || return;
59    
60          my @addresses = gethostbyname($hostname)   or die "Can't resolve $hostname: $!\n";          my @addresses = gethostbyname($hostname)
61                    or die "Can't resolve $hostname: $!\n";
62          @addresses = map { inet_ntoa($_) } @addresses[4 .. $#addresses];          @addresses = map { inet_ntoa($_) } @addresses[4 .. $#addresses];
63          return shift @addresses;          return shift @addresses;
64  }  }
65    
66    =head2 ip2hostname
67    
68      my $hostname = ip2hostname('192.168.0.1');
69    
70    =cut
71    
72    sub ip2hostname {
73            my $ip = shift || return;
74    
75            my $hostname = gethostbyaddr(inet_aton($ip), AF_INET)
76                    or die "Can't look up $ip: $!\n";
77            return $hostname;
78    }
79    
80    =head2 conf_veids
81    
82      my @VEIDs = conf_veids;
83    
84    =cut
85    
86    sub conf_veids {
87            my @c;
88            open( my $cfgs, 'find /etc/vz/conf -maxdepth 1 -name "*.conf" |' ) || die "can't run find: $!";
89            while(<$cfgs>) {
90                    chomp;
91                    if ( m{^.+/(\d+)\.conf$} ) {
92                            if ( -d "$vz_root/private/$1" ) {
93                                    push @c, $1;
94                            } else {
95                                    warn "WARNING: have config for $1 but no private directory\n";
96                            }
97                    } else {
98                            warn "SKIPPED: $_\n";
99                    }
100            }
101            return @c;
102    }
103    
104    =head2 runscript
105    
106      runscript( $veid, '/path/to/script' );
107    
108    =cut
109    
110    sub runscript {
111            my ( $veid, $path ) = @_;
112    
113            if ( open(my $fh, $path) ) {
114                    while(<$fh>) {
115                            chomp;
116                            next if (m/^\s*$/);
117                            if (/^#\s+(.+)$/) {
118                                    warn ">> $1\n";
119                            } else {
120                                    vzctl('exec', $veid, $_);
121                            }
122                    }
123            } else {
124                    warn "can't open $path: $!";
125            }
126    }
127                    
128    
129    =head2 vzctl
130    
131      vzctl('set','--something',42);
132    
133    =cut
134    
135    sub vzctl {
136            my @args = @_;
137            my $a = join(' ', @args);
138            # hide passwords from output
139            $a =~ s/(--userpasswd\s+\w+:)\w+/$1********/;
140            warn "## vzctl $a\n";
141            system('vzctl',@args) == 0 or die "vzctl @args failed: $?"
142    }
143    
144    =head2 vzlist
145    
146      my $output = vzlist();
147      my $hash = vzlist( hash => 1 );
148    
149    =cut
150    
151    my @vzlist_fields;
152    
153    sub vzlist {
154            die "need hash as argument" unless $#_ % 2 == 1;
155            my $args = {@_};
156    
157    
158            my $output;
159    
160            if ( ! @vzlist_fields ) {
161                    open(my $vzlist, 'vzlist -L |') || die "can't start vzlist -L: $!";
162                    while(<$vzlist>) {
163                            push @vzlist_fields, (split(/\s+/, $_, 2 ))[0];
164                    }
165            }
166    
167            open(my $vzlist, 'vzlist -a -H -o ' . join(',', @vzlist_fields) . ' |') || die "can't start vzlist: $!";
168            while(<$vzlist>) {
169                    s/^\s+//;
170                    my @data = split(/\s+/, $_);
171                    
172                    if ( defined $args->{hash} ) {
173                            my $hash;
174                            $hash->{ $vzlist_fields[$_] } = $data[$_] foreach 1 .. $#data;
175                            $output->{ $data[0] } = $hash;
176                    } else {
177                            $output .= $_;
178                    }
179            }
180    
181            return $output;
182    }
183    
184  1;  1;

Legend:
Removed from v.38  
changed lines
  Added in v.49

  ViewVC Help
Powered by ViewVC 1.1.26