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

Diff of /trunk/vz-clone.pl

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

revision 20 by dpavlin, Thu Oct 4 11:30:05 2007 UTC revision 21 by dpavlin, Thu Oct 4 13:12:08 2007 UTC
# Line 1  Line 1 
1  #!/usr/bin/perl -w  #!/usr/bin/perl -w
2    
3  use strict;  use strict;
4  use Shell qw/rsync vzlist/;  use Shell qw/rsync vzlist lvcreate mount umount lvremove/;
5    
6  my $vz   = '/vz';  my $vz   = '/vz';
7  my $conf = '/etc/vz/conf';  my $conf = '/etc/vz/conf';
8    
9    my $snap_size = '100M';
10    
11  my $VEID = shift @ARGV || die "Usage: $0 VEID\n\n",vzlist;  my $VEID = shift @ARGV || die "Usage: $0 VEID\n\n",vzlist;
12    
13  my $CVEID = "99$VEID";  my $CVEID = "10$VEID";
14    
15  my $orig_conf = "/etc/vz/conf/$VEID.conf";  my $orig_conf = "/etc/vz/conf/$VEID.conf";
16    
# Line 16  die "$VEID config $orig_conf doesn't exi Line 18  die "$VEID config $orig_conf doesn't exi
18    
19  print "Clone VE $VEID -> $CVEID\n";  print "Clone VE $VEID -> $CVEID\n";
20    
21  rsync('-ra', "$vz/private/$VEID", "$vz/private/$CVEID" );  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 {  sub fix_ip {
73          my $ip = shift;          my $ip = shift;
74            $ip =~ s/['"]//g;
75          $ip =~ s/^\d+\./10./;          $ip =~ s/^\d+\./10./;
76          warn "$CVEID new IP number: $ip\n";          warn "$CVEID new IP number: $ip\n";
77          return qq{IP_ADDRESS=$ip};          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: $!";  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: $!";  open(my $n, '>', "$conf/$CVEID.conf") || die "can't open $conf/$CVEID.conf: $!";
90  while(<$o>) {  while(<$o>) {
91          s!^(HOSTNAME=)(.*)$!$1clone-$2!i;          s!^HOSTNAME=(.*)$!fix_hostname($1)!ie;
92          s!^(IP_ADDRESS=.*)$!fix_up($1)!e;          s!^IP_ADDRESS=(.*)$!fix_ip($1)!ie;
93          s!^(ONBOOT=).*$!# modified by $0\n$1="no"!gi;          s!^(ONBOOT=).*$!# modified by $0\n$1"no"!i;
94          print $n $_;          print $n $_;
95  }  }
96    
97  print "Please edit config $conf/$CVEID.conf before vzctl start $CVEID\n"  print "\nPlease review config file: $conf/$CVEID.conf\nStart clone of $VEID with: vzctl start $CVEID\n"

Legend:
Removed from v.20  
changed lines
  Added in v.21

  ViewVC Help
Powered by ViewVC 1.1.26