1 |
#!/usr/bin/perl -w |
2 |
|
3 |
use strict; |
4 |
use Shell qw/rsync vzlist lvcreate mount umount lvremove/; |
5 |
|
6 |
my $vz = '/vz'; |
7 |
my $conf = '/etc/vz/conf'; |
8 |
|
9 |
my $snap_size = '100M'; |
10 |
|
11 |
my $VEID = shift @ARGV || die "Usage: $0 VEID\n\n",vzlist; |
12 |
|
13 |
my $CVEID = "10$VEID"; |
14 |
|
15 |
my $orig_conf = "/etc/vz/conf/$VEID.conf"; |
16 |
|
17 |
die "$VEID config $orig_conf doesn't exist\n" unless -e $orig_conf; |
18 |
|
19 |
print "Clone VE $VEID -> $CVEID\n"; |
20 |
|
21 |
my $vz_lv; |
22 |
|
23 |
open(my $m, '<', '/etc/fstab') || die "can't open /etc/fstab: $!"; |
24 |
while(<$m>) { |
25 |
next if m/^#/; |
26 |
my @v = split(/\s+/,$_); |
27 |
if ( $v[1] =~ m/\Q$vz\E/ ) { |
28 |
$vz_lv = $v[0]; |
29 |
warn "found lv $vz_lv for $vz\n"; |
30 |
last; |
31 |
} |
32 |
} |
33 |
|
34 |
sub copy_files { |
35 |
my ( $from, $to ) = @_; |
36 |
warn "rsync $from -> $to\n"; |
37 |
rsync('-ra', "$from/", "$to/" ); |
38 |
} |
39 |
|
40 |
if ( $vz_lv ) { |
41 |
|
42 |
my ( $vz_lv_path, $vz_lv_name ) = ( $1, $2 ) if ( $vz_lv =~ m!^(.+)/([^/]+)$! ); |
43 |
|
44 |
my $snap = $vz_lv_name . '-snap'; |
45 |
|
46 |
print "Creating $snap_size snapshot $snap from $vz_lv\n"; |
47 |
|
48 |
lvcreate( '--size', $snap_size, '--snapshot', '--name', $snap, $vz_lv ); |
49 |
|
50 |
my $snap_path = "/tmp/$snap"; |
51 |
mkdir $snap_path || die "can't create $snap_path: $!"; |
52 |
|
53 |
print "Mounting $vz_lv_path/$snap to $snap_path\n"; |
54 |
|
55 |
mount( "$vz_lv_path/$snap", $snap_path, '-o', 'noatime' ); |
56 |
|
57 |
copy_files( "$snap_path/private/$VEID", "$vz/private/$CVEID" ); |
58 |
|
59 |
print "Umount $snap_path and remove $vz_lv_path/$snap\n"; |
60 |
|
61 |
umount( $snap_path ); |
62 |
|
63 |
lvremove( '-f', "$vz_lv_path/$snap" ); |
64 |
|
65 |
} else { |
66 |
|
67 |
copy_files( "$vz/private/$VEID", "$vz/private/$CVEID" ); |
68 |
} |
69 |
|
70 |
my $note = "# modified by $0\n"; |
71 |
|
72 |
sub fix_ip { |
73 |
my $ip = shift; |
74 |
$ip =~ s/['"]//g; |
75 |
$ip =~ s/^\d+\./10./; |
76 |
warn "$CVEID new IP number: $ip\n"; |
77 |
return $note . qq{IP_ADDRESS="$ip"}; |
78 |
} |
79 |
|
80 |
sub fix_hostname { |
81 |
my $hostname = shift; |
82 |
$hostname =~ s/['"]//g; |
83 |
$hostname = "clone-$hostname"; |
84 |
warn "$CVEID new hostname: $hostname\n"; |
85 |
return $note . qq{HOSTNAME="$hostname"}; |
86 |
} |
87 |
|
88 |
open(my $o, '<', "$conf/$VEID.conf") || die "can't open $conf/$VEID.conf: $!"; |
89 |
open(my $n, '>', "$conf/$CVEID.conf") || die "can't open $conf/$CVEID.conf: $!"; |
90 |
while(<$o>) { |
91 |
s!^HOSTNAME=(.*)$!fix_hostname($1)!ie; |
92 |
s!^IP_ADDRESS=(.*)$!fix_ip($1)!ie; |
93 |
s!^(ONBOOT=).*$!# modified by $0\n$1"no"!i; |
94 |
print $n $_; |
95 |
} |
96 |
|
97 |
print "\nPlease review config file: $conf/$CVEID.conf\nStart clone of $VEID with: vzctl start $CVEID\n" |