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

Annotation of /trunk/vz-clone.pl

Parent Directory Parent Directory | Revision Log Revision Log


Revision 21 - (hide 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 dpavlin 20 #!/usr/bin/perl -w
2    
3     use strict;
4 dpavlin 21 use Shell qw/rsync vzlist lvcreate mount umount lvremove/;
5 dpavlin 20
6     my $vz = '/vz';
7     my $conf = '/etc/vz/conf';
8    
9 dpavlin 21 my $snap_size = '100M';
10    
11 dpavlin 20 my $VEID = shift @ARGV || die "Usage: $0 VEID\n\n",vzlist;
12    
13 dpavlin 21 my $CVEID = "10$VEID";
14 dpavlin 20
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 dpavlin 21 my $vz_lv;
22 dpavlin 20
23 dpavlin 21 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 dpavlin 20 sub fix_ip {
73     my $ip = shift;
74 dpavlin 21 $ip =~ s/['"]//g;
75 dpavlin 20 $ip =~ s/^\d+\./10./;
76     warn "$CVEID new IP number: $ip\n";
77 dpavlin 21 return $note . qq{IP_ADDRESS="$ip"};
78 dpavlin 20 }
79    
80 dpavlin 21 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 dpavlin 20 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 dpavlin 21 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 dpavlin 20 print $n $_;
95     }
96    
97 dpavlin 21 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