Guest User

Untitled

a guest
Jul 19th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.88 KB | None | 0 0
  1. #!/usr/bin/perl -w
  2. use strict;
  3. use Carp;
  4. use Fcntl qw(:mode);
  5. use POSIX qw(:sys_wait_h);
  6.  
  7. use File::Spec;
  8. use IO::Dir;
  9. use VMware::VmPerl;
  10. use VMware::VmPerl::ConnectParams;
  11. use VMware::VmPerl::VM;
  12.  
  13. sub timestamp($) {
  14. my ($message) = @_;
  15. printf STDERR "%s %s\n", scalar localtime, $message;
  16. }
  17.  
  18.  
  19. sub throw($) {
  20. my ($vm) = @_;
  21. my ($err, $errstr) = $vm->get_last_error;
  22. croak "VMControl error $err: $errstr";
  23. }
  24.  
  25. sub process($$) {
  26. my ($vm, $proc) = @_;
  27. if ($vm->get_execution_state == VM_EXECUTION_STATE_ON) {
  28. my $name = $vm->get_config_file_name;
  29. timestamp "Suspending $name";
  30. $vm->suspend(VM_POWEROP_MODE_TRYSOFT) or throw $vm;
  31. &$proc;
  32. timestamp "Resuming $name";
  33. $vm->start(VM_POWEROP_MODE_TRYSOFT) or throw $vm;
  34. } else {
  35. &$proc;
  36. }
  37. }
  38.  
  39. sub backup($$) {
  40. my ($vm_dir, $backup_prefix) = @_;
  41. timestamp "Backing up $vm_dir";
  42. system '/bin/tar', 'czSf', "$backup_prefix.tar.gz", $vm_dir;
  43. }
  44.  
  45. die "usage: backup-vms vms-dir backup-dir\n" unless @ARGV == 2;
  46. my ($vms_dir, $backup_dir) = @ARGV;
  47.  
  48. timestamp 'Start of backup';
  49. tie my %vms_entries, 'IO::Dir', $vms_dir;
  50. my @vm_dirs = grep !/^\./ && $vms_entries{$_}->mode & S_IFDIR, keys %vms_entries;
  51. untie %vms_entries;
  52.  
  53. # The VmPerl classes' new subs are really broken: they don't use the first
  54. # argument as the class name, and thus you aren't supposed to use constructor
  55. # syntax with them.
  56. my $cp = VMware::VmPerl::ConnectParams::new;
  57. my $vm = VMware::VmPerl::VM::new;
  58.  
  59. for my $vm_dir (@vm_dirs) {
  60. my $full_vm_dir = File::Spec->catdir($vms_dir, $vm_dir);
  61. eval {
  62. # .vmx file assumed to be named the same as the directory
  63. $vm->connect($cp, File::Spec->catfile($full_vm_dir, "$vm_dir.vmx"))
  64. or throw $vm;
  65. process($vm, sub () {
  66. backup($full_vm_dir, File::Spec->catdir($backup_dir, $vm_dir));
  67. });
  68. $vm->disconnect;
Add Comment
Please, Sign In to add comment