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

Contents of /trunk/lib/VZ.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 46 - (show annotations)
Sun Mar 30 12:48:18 2008 UTC (16 years ago) by dpavlin
File size: 2857 byte(s)
runscript now skips non-existent scripts
1 package VZ;
2 use Exporter 'import';
3 our @EXPORT = qw(
4 check_root
5
6 ip2hostname
7 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;
22 use strict;
23
24 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 {
45 if ( $> != 0 ) {
46 warn "WARNING: restarting as root using sudo\n";
47 exec 'sudo', $0, @ARGV;
48 }
49 }
50
51 =head2 hostname2ip
52
53 my $ip = hostname2ip('www.example.com');
54
55 =cut
56
57 sub hostname2ip {
58 my $hostname = shift || return;
59
60 my @addresses = gethostbyname($hostname)
61 or die "Can't resolve $hostname: $!\n";
62 @addresses = map { inet_ntoa($_) } @addresses[4 .. $#addresses];
63 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;

  ViewVC Help
Powered by ViewVC 1.1.26