/[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

Annotation of /trunk/lib/VZ.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 59 - (hide annotations)
Mon Feb 2 15:10:11 2009 UTC (15 years, 2 months ago) by dpavlin
File size: 2961 byte(s)
use /var/lib/vz (Debian default) if /vz doesn't exist

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

  ViewVC Help
Powered by ViewVC 1.1.26