/[vz-tools]/trunk/vz-clone.pl
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/vz-clone.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 21 - (show annotations)
Thu Oct 4 13:12:08 2007 UTC (16 years, 5 months ago) by dpavlin
File MIME type: text/plain
File size: 2263 byte(s)
prepare and use temporary lvm snapshot while coping data,
annotate changed configuration variables,
new VE will have prefix 10 and first octet of IP adress 10.
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"

Properties

Name Value
svn:executable *

  ViewVC Help
Powered by ViewVC 1.1.26