четверг, 15 мая 2014 г.

Proxmox: загрузка бэкапов через веб-интерфейс

Снова столкнулся с тем, что в достаточно широко распространенном программном продукте не работает из коробки та функция, которая по логике должна бы работать.
На этот раз речь пойдет о среде виртуализации Proxmox и загрузке бэкапов виртуальных машин через веб-интерфейс. Итак, имеем следующие входные данные: на машине свежеустановленный Proxmox версии 3.2, на нем развернуто помимо хранилища Local еще и хранилище Backup с типом контента ISO, Backups, Templates. Задача  - перенести бэкапы виртуальных машин с другого гипервизора. Естественно, руки потянулись для этой цели использовать веб-интерфейс: выбираем наше хранилище Backup, жмем Upload, выбираем тип контента VZDump backup file, выбираем нужный файл, жмем Upload, смотрим на проценты загрузки и по итогу получаем сообщение об ошибке:
 Error 400: Parameter verification failed.
content: upload content type 'backup' not allowed
Собственно, я сразу не стал разбираться, почему так, и воспользовался консолью и самбой для решения этой задачи. Примерно то же самое(пойти обходным путем) рекомендует баг-трекер Proxmox'а(use scp to copy the file to the right directory). Но обсуждение этой проблемы вывело меня на верное решение.
Открываем для редактирования следующий скрипт: /usr/share/perl5/PVE/API2/Storage/Status.pm.
Находим там следующий фрагмент:
if ($content eq 'iso') {
if ($filename !~ m![^/]+\.[Ii][Ss][Oo]$!) {
raise_param_exc({ filename => "missing '.iso' extension" });
}
$path = PVE::Storage::get_iso_dir($cfg, $param->{storage});
} elsif ($content eq 'vztmpl') {
if ($filename !~ m![^/]+\.tar\.gz$!) {
raise_param_exc({ filename => "missing '.tar.gz' extension" });
}
$path = PVE::Storage::get_vztmpl_dir($cfg, $param->{storage});
} else {
raise_param_exc({ content => "upload content type '$content' not allowed" });
}

Как видим, по дефолту доступны для загрузки только ISO образы и шаблоны, при загрузке отличного от этих типов контента получаем знакомое сообщение об ошибке.
Исправляем:

if ($content eq 'iso') {
if ($filename !~ m![^/]+\.[Ii][Ss][Oo]$!) {
raise_param_exc({ filename => "missing '.iso' extension" });
}
$path = PVE::Storage::get_iso_dir($cfg, $param->{storage});
} elsif ($content eq 'vztmpl') {
if ($filename !~ m![^/]+\.tar\.gz$!) {
raise_param_exc({ filename => "missing '.tar
.gz' extension" });
}
$path = PVE::Storage::get_vztmpl_dir($cfg, $param->{storage});
} elsif ($content eq 'backup') {
if ($filename !~ m![^/]+\.vma\.lzo$!) {
raise_param_exc({ filename => "missing '.vma.lzo' extension" });
}
$path = PVE::Storage::get_backup_dir($cfg, $param->{storage});
} else {
raise_param_exc({ content => "upload content type '$content' not allowed" });
}

Я добавил для себя проверку на расширение vma.lzo,  поскольку все мои бэкапы были сделаны именно в этом формате, но при желании можно добавить и  vma.gz, а можно и вообще отказаться от проверки на расширение.
Перезагружаем Proxmox - и таки да, загрузка бэкапов через веб-интерфейс работает. 

5 комментариев:

  1. Хотелось бы понять как такой формат загружать
    vzdump-openvz-102-2015.tar.lzo

    ОтветитьУдалить
    Ответы
    1. Для такие случаев вообще можно отказаться от проверки расширения файла, т.е. скрипт Status.pm будет выглядеть примерно так:
      if ($content eq 'iso') {
      if ($filename !~ m![^/]+\.[Ii][Ss][Oo]$!) {
      raise_param_exc({ filename => "missing '.iso' extension" });
      }
      $path = PVE::Storage::get_iso_dir($cfg, $param->{storage});
      } elsif ($content eq 'vztmpl') {
      if ($filename !~ m![^/]+\.tar\.gz$!) {
      raise_param_exc({ filename => "missing '.tar
      .gz' extension" });
      }
      $path = PVE::Storage::get_vztmpl_dir($cfg, $param->{storage});
      } elsif ($content eq 'backup') {
      $path = PVE::Storage::get_backup_dir($cfg, $param->{storage});
      } else {
      raise_param_exc({ content => "upload content type '$content' not allowed" });
      }

      Удалить
  2. А посвежее есть код на proxmox 5

    ОтветитьУдалить
    Ответы
    1. Под 5 проксмоксом с такой задачей не сталкивался, но если вопрос еще актуален, напишите, я проверю и, если получится, сделаю решение.

      Удалить
  3. Borgata Hotel Casino & Spa - MandaraHospitalityWeb
    Find out how to order food and drink at Borgata Hotel Casino & Spa 정읍 출장안마 in 동두천 출장안마 MandaraHospitalityWeb. Order, pickup, and more 김천 출장안마 from our 김포 출장샵 menu! 과천 출장안마

    ОтветитьУдалить