This removes only the tool itself, and all the bits strictly needed to
not break the build.
This is now available as separate tool in its own repository:
https://github.com/libguestfs/virt-p2v
---
Makefile.am | 3 -
configure.ac | 13 -
generator/main.ml | 2 -
installcheck.sh.in | 3 -
p2v/.gitignore | 49 -
p2v/Makefile.am | 376 ---
p2v/contrib/aux-scripts/do-build.sh | 196 --
p2v/contrib/build-p2v-iso.sh | 155 --
...BLE-AUTOMATIC-REMOTE-PORT-ALLOCATION.patch | 54 -
...-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch | 34 -
p2v/contrib/test-p2v-iso.sh | 63 -
p2v/conversion.c | 668 -----
p2v/cpuid.c | 222 --
p2v/dependencies.m4 | 181 --
p2v/generate-p2v-authors.pl | 54 -
p2v/generate-p2v-config.pl | 915 -------
p2v/gui-gtk2-compat.h | 117 -
p2v/gui-gtk3-compat.h | 140 -
p2v/gui.c | 2295 -----------------
p2v/inhibit.c | 154 --
p2v/issue | 16 -
p2v/kernel-cmdline.c | 196 --
p2v/kernel.c | 158 --
p2v/kiwi-config.sh | 73 -
p2v/kiwi-config.xml.in | 92 -
p2v/launch-virt-p2v | 51 -
p2v/main.c | 583 -----
p2v/nbd.c | 840 ------
p2v/p2v.h | 136 -
p2v/p2v.ks.in | 193 --
p2v/p2v.service | 38 -
p2v/physical-xml.c | 304 ---
p2v/rtc.c | 165 --
p2v/ssh.c | 1203 ---------
p2v/test-virt-p2v-cmdline.sh | 53 -
p2v/test-virt-p2v-docs.sh | 24 -
p2v/test-virt-p2v-nbdkit.sh | 59 -
p2v/test-virt-p2v-pxe.sh | 96 -
p2v/test-virt-p2v-pxe.sshd_config.in | 43 -
p2v/test-virt-p2v-scp.sh | 62 -
p2v/test-virt-p2v-ssh.sh | 61 -
p2v/test-virt-p2v.sh | 57 -
p2v/utils.c | 256 --
p2v/virt-p2v-make-disk.in | 267 --
p2v/virt-p2v-make-disk.pod | 218 --
p2v/virt-p2v-make-kickstart.in | 241 --
p2v/virt-p2v-make-kickstart.pod | 339 ---
p2v/virt-p2v-make-kiwi.in | 233 --
p2v/virt-p2v-make-kiwi.pod | 184 --
p2v/virt-p2v.pod | 757 ------
p2v/whole-file.c | 95 -
po-docs/language.mk | 3 -
po-docs/podfiles | 5 -
53 files changed, 12795 deletions(-)
delete mode 100644 p2v/.gitignore
delete mode 100644 p2v/Makefile.am
delete mode 100644 p2v/contrib/aux-scripts/do-build.sh
delete mode 100755 p2v/contrib/build-p2v-iso.sh
delete mode 100644
p2v/contrib/patches/0001-RHEL-5-ONLY-DISABLE-AUTOMATIC-REMOTE-PORT-ALLOCATION.patch
delete mode 100644
p2v/contrib/patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch
delete mode 100755 p2v/contrib/test-p2v-iso.sh
delete mode 100644 p2v/conversion.c
delete mode 100644 p2v/cpuid.c
delete mode 100644 p2v/dependencies.m4
delete mode 100755 p2v/generate-p2v-authors.pl
delete mode 100755 p2v/generate-p2v-config.pl
delete mode 100644 p2v/gui-gtk2-compat.h
delete mode 100644 p2v/gui-gtk3-compat.h
delete mode 100644 p2v/gui.c
delete mode 100644 p2v/inhibit.c
delete mode 100644 p2v/issue
delete mode 100644 p2v/kernel-cmdline.c
delete mode 100644 p2v/kernel.c
delete mode 100755 p2v/kiwi-config.sh
delete mode 100644 p2v/kiwi-config.xml.in
delete mode 100755 p2v/launch-virt-p2v
delete mode 100644 p2v/main.c
delete mode 100644 p2v/nbd.c
delete mode 100644 p2v/p2v.h
delete mode 100644 p2v/p2v.ks.in
delete mode 100644 p2v/p2v.service
delete mode 100644 p2v/physical-xml.c
delete mode 100644 p2v/rtc.c
delete mode 100644 p2v/ssh.c
delete mode 100755 p2v/test-virt-p2v-cmdline.sh
delete mode 100755 p2v/test-virt-p2v-docs.sh
delete mode 100755 p2v/test-virt-p2v-nbdkit.sh
delete mode 100755 p2v/test-virt-p2v-pxe.sh
delete mode 100644 p2v/test-virt-p2v-pxe.sshd_config.in
delete mode 100755 p2v/test-virt-p2v-scp.sh
delete mode 100755 p2v/test-virt-p2v-ssh.sh
delete mode 100755 p2v/test-virt-p2v.sh
delete mode 100644 p2v/utils.c
delete mode 100644 p2v/virt-p2v-make-disk.in
delete mode 100644 p2v/virt-p2v-make-disk.pod
delete mode 100644 p2v/virt-p2v-make-kickstart.in
delete mode 100644 p2v/virt-p2v-make-kickstart.pod
delete mode 100644 p2v/virt-p2v-make-kiwi.in
delete mode 100644 p2v/virt-p2v-make-kiwi.pod
delete mode 100644 p2v/virt-p2v.pod
delete mode 100644 p2v/whole-file.c
diff --git a/Makefile.am b/Makefile.am
index 5d12cc2be..1b7c98319 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -110,9 +110,6 @@ SUBDIRS += fish
# virt-tools in C.
SUBDIRS += align cat diff df edit format inspector make-fs rescue
-if HAVE_P2V
-SUBDIRS += common/miniexpect p2v
-endif
# bash-completion
SUBDIRS += bash
diff --git a/configure.ac b/configure.ac
index 095ee96da..93fe063b4 100644
--- a/configure.ac
+++ b/configure.ac
@@ -213,12 +213,6 @@ AC_CONFIG_FILES([ocaml-dep.sh],
[chmod +x,-w ocaml-dep.sh])
AC_CONFIG_FILES([ocaml-link.sh],
[chmod +x,-w ocaml-link.sh])
-AC_CONFIG_FILES([p2v/virt-p2v-make-disk],
- [chmod +x,-w p2v/virt-p2v-make-disk])
-AC_CONFIG_FILES([p2v/virt-p2v-make-kickstart],
- [chmod +x,-w p2v/virt-p2v-make-kickstart])
-AC_CONFIG_FILES([p2v/virt-p2v-make-kiwi],
- [chmod +x,-w p2v/virt-p2v-make-kiwi])
AC_CONFIG_FILES([php/extension/php-for-tests.sh],
[chmod +x,-w php/extension/php-for-tests.sh])
AC_CONFIG_FILES([pick-guests.pl],
@@ -298,7 +292,6 @@ AC_CONFIG_FILES([Makefile
ocaml/META
ocaml/Makefile
ocaml/examples/Makefile
- p2v/Makefile
perl/Build.PL
perl/Makefile
perl/examples/Makefile
@@ -381,10 +374,6 @@ AC_CONFIG_FILES([Makefile
v2v/test-harness/META
website/index.html])
-if test "x$HAVE_P2V_TRUE" = "x"; then
- AC_CONFIG_COMMANDS([p2v/p2v-config.h], [${ac_srcdir}/p2v/generate-p2v-config.pl
--file=p2v-config.h --output=p2v/p2v-config.h])
-fi
-
AC_OUTPUT
dnl Produce summary.
@@ -403,8 +392,6 @@ echo "FUSE filesystem .....................
$enable_fuse"
echo "Default backend ..................... $DEFAULT_BACKEND"
AS_ECHO_N(["GNU gettext for i18n ................ "])
if test "x$HAVE_GNU_GETTEXT_TRUE" = "x"; then echo "yes";
else echo "no"; fi
-AS_ECHO_N(["virt-p2v ............................ "])
-if test "x$HAVE_P2V_TRUE" = "x"; then echo "yes"; else echo
"no"; fi
AS_ECHO_N(["OCaml bindings ...................... "])
if test "x$HAVE_OCAML_TRUE" = "x"; then echo "yes"; else
echo "no"; fi
AS_ECHO_N(["OCaml-based virt tools .............. "])
diff --git a/generator/main.ml b/generator/main.ml
index 80000b1e3..eff417536 100644
--- a/generator/main.ml
+++ b/generator/main.ml
@@ -75,8 +75,6 @@ Run it from the top source directory using the command
output_to "AUTHORS"
Authors.generate_authors;
- output_to "p2v/AUTHORS"
- Authors.generate_p2v_authors;
output_to "common/errnostring/errnostring-gperf.gperf"
Errnostring.generate_errnostring_gperf;
diff --git a/installcheck.sh.in b/installcheck.sh.in
index a4829cda6..ed744cc60 100644
--- a/installcheck.sh.in
+++ b/installcheck.sh.in
@@ -61,9 +61,6 @@ cp @bindir@/virt-get-kernel get-kernel/
cp @bindir@/virt-inspector inspector/
cp @bindir@/virt-ls cat/
cp @bindir@/virt-make-fs make-fs/
-cp @libdir(a)/virt-p2v/virt-p2v.xz p2v/
-unxz -fk p2v/virt-p2v.xz
-chmod +x p2v/virt-p2v
cp @bindir@/virt-rescue rescue/
cp @bindir@/virt-resize resize/
cp @bindir@/virt-sparsify sparsify/
diff --git a/p2v/.gitignore b/p2v/.gitignore
deleted file mode 100644
index 22ac25aed..000000000
--- a/p2v/.gitignore
+++ /dev/null
@@ -1,49 +0,0 @@
-*~
-*.log
-*.o
-*.trs
-.deps
-.libs
-Makefile
-Makefile.in
-
-/about-authors.c
-/AUTHORS
-/blank-part.img
-/config.c
-/dependencies.archlinux
-/dependencies.debian
-/dependencies.redhat
-/dependencies.suse
-/fedora.img
-/kernel-config.c
-/p2v-config.h
-/stamp-test-virt-p2v-pxe-data-files
-/stamp-test-virt-p2v-pxe-hostkey
-/stamp-test-virt-p2v-pxe-kernel
-/stamp-test-virt-p2v-pxe-userkey
-/stamp-virt-p2v.pod
-/stamp-virt-p2v-make-disk.pod
-/stamp-virt-p2v-make-kickstart.pod
-/stamp-virt-p2v-make-kiwi.pod
-/test-virt-p2v-pxe.authorized_keys
-/test-virt-p2v-pxe.id_rsa
-/test-virt-p2v-pxe.id_rsa.pub
-/test-virt-p2v-pxe.img
-/test-virt-p2v-pxe.initramfs
-/test-virt-p2v-pxe.sshd_config
-/test-virt-p2v-pxe.ssh_host_rsa_key
-/test-virt-p2v-pxe.ssh_host_rsa_key.pub
-/test-virt-p2v-pxe.vmlinuz
-/virt-p2v
-/virt-p2v.1
-/virt-p2v.i686
-/virt-p2v.img
-/virt-p2v-kernel-config.pod
-/virt-p2v-make-disk
-/virt-p2v-make-disk.1
-/virt-p2v-make-kickstart
-/virt-p2v-make-kickstart.1
-/virt-p2v-make-kiwi
-/virt-p2v-make-kiwi.1
-/virt-p2v.xz
diff --git a/p2v/Makefile.am b/p2v/Makefile.am
deleted file mode 100644
index 59846aeba..000000000
--- a/p2v/Makefile.am
+++ /dev/null
@@ -1,376 +0,0 @@
-# libguestfs virt-p2v
-# Copyright (C) 2009-2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-include $(top_srcdir)/subdir-rules.mk
-
-generator_built = \
- AUTHORS
-
-BUILT_SOURCES = \
- $(generator_built)
-
-EXTRA_DIST = \
- .gitignore \
- $(BUILT_SOURCES) \
- $(TESTS) $(APPLIANCE_TESTS) $(SLOW_TESTS) \
- contrib/aux-scripts/do-build.sh \
- contrib/build-p2v-iso.sh \
- contrib/patches/0001-RHEL-5-ONLY-DISABLE-AUTOMATIC-REMOTE-PORT-ALLOCATION.patch \
- contrib/patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch \
- contrib/test-p2v-iso.sh \
- dependencies.m4 \
- generate-p2v-authors.pl \
- generate-p2v-config.pl \
- issue \
- kiwi-config.sh \
- kiwi-config.xml.in \
- launch-virt-p2v \
- p2v.ks.in \
- p2v.service \
- test-virt-p2v-docs.sh \
- test-virt-p2v-pxe.sshd_config.in \
- test-virt-p2v-scp.sh \
- test-virt-p2v-ssh.sh \
- virt-p2v.pod \
- virt-p2v-make-disk.in \
- virt-p2v-make-disk.pod \
- virt-p2v-make-kickstart.in \
- virt-p2v-make-kickstart.pod \
- virt-p2v-make-kiwi.in \
- virt-p2v-make-kiwi.pod
-
-# Don't clean ssh_host_rsa_key{,.pub} or id_rsa{,.pub} since those
-# consume system entropy to regenerate.
-CLEANFILES += \
- $(dependencies_files) \
- $(generated_sources) \
- $(PHYSICAL_MACHINE) $(BLANK_DISK) \
- about-authors.c \
- stamp-test-virt-p2v-pxe-data-files \
- stamp-test-virt-p2v-pxe-kernel \
- test-virt-p2v-pxe.authorized_keys \
- test-virt-p2v-pxe.img \
- test-virt-p2v-pxe.vmlinuz \
- test-virt-p2v-pxe.initramfs \
- test-virt-p2v-pxe.sshd_config \
- virt-p2v.img \
- virt-p2v-kernel-config.pod \
- virt-p2v.xz
-
-# Although virt-p2v is a regular binary, it is not usually installed
-# in /usr/bin since it only functions when contained in an ISO or PXE
-# image which is used to boot the physical machine (since otherwise
-# virt-p2v would not be able to get a consistent snapshot of the
-# physical disks). Also we don't want the naked binary to appear on
-# the host, which would cause various Gtk dependencies to be pulled
-# in, so it must be compressed.
-virtp2vlibdir = $(libdir)/virt-p2v
-virtp2vlib_DATA = virt-p2v.xz
-
-virt-p2v.xz: virt-p2v
- rm -f $@ $@-t
- xz --best --keep --stdout $< > $@-t
- mv $@-t $@
-
-noinst_PROGRAMS = virt-p2v
-
-virt_p2v_SOURCES = \
- conversion.c \
- cpuid.c \
- gui.c \
- gui-gtk2-compat.h \
- gui-gtk3-compat.h \
- inhibit.c \
- kernel.c \
- kernel-cmdline.c \
- main.c \
- nbd.c \
- p2v.h \
- p2v-config.h \
- physical-xml.c \
- rtc.c \
- ssh.c \
- utils.c \
- whole-file.c
-
-generated_sources = \
- config.c \
- kernel-config.c \
- p2v-config.h
-
-nodist_virt_p2v_SOURCES = \
- $(generated_sources) \
- about-authors.c
-
-virt_p2v_CPPFLAGS = \
- -DLOCALEBASEDIR=\""$(datadir)/locale"\" \
- -DGTK_DISABLE_DEPRECATED \
- -I$(top_srcdir)/common/utils -I$(top_builddir)/common/utils \
- -I$(top_srcdir)/lib -I$(top_builddir)/lib \
- -I$(top_srcdir)/common/miniexpect -I$(top_builddir)/common/miniexpect \
- -I$(srcdir)/../gnulib/lib -I../gnulib/lib
-
-virt_p2v_CFLAGS = \
- -pthread \
- $(WARN_CFLAGS) $(WERROR_CFLAGS) \
- $(PCRE_CFLAGS) \
- $(LIBXML2_CFLAGS) \
- $(GTK_CFLAGS) \
- $(DBUS_CFLAGS)
-
-virt_p2v_LDADD = \
- $(top_builddir)/common/utils/libutils.la \
- $(top_builddir)/common/miniexpect/libminiexpect.la \
- $(PCRE_LIBS) \
- $(LIBXML2_LIBS) \
- $(GTK_LIBS) \
- $(DBUS_LIBS) \
- ../gnulib/lib/libgnu.la \
- -lm
-
-$(generated_sources) virt-p2v-kernel-config.pod: $(srcdir)/generate-p2v-config.pl
- $(AM_V_GEN)rm -f $@ $@-t && $(PERL) $(<) --file=$@ --output=$@-t &&
mv $@-t $@
-
-about-authors.c: $(srcdir)/generate-p2v-authors.pl $(srcdir)/AUTHORS
- $(AM_V_GEN)rm -f $@ $@-t && $(PERL) $(<) $(srcdir)/AUTHORS > $@-t
&& mv $@-t $@
-
-# Scripts to build the disk image, USB key, or kickstart.
-bin_SCRIPTS = virt-p2v-make-disk virt-p2v-make-kickstart virt-p2v-make-kiwi
-
-dependencies_files = \
- dependencies.archlinux \
- dependencies.debian \
- dependencies.redhat \
- dependencies.suse
-
-$(dependencies_files): dependencies.m4 ../config.status
- define=`echo $@ | $(SED)
's/dependencies.//;y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`; \
- m4 -D$$define=1 -DGTK_VERSION=$(GTK_VERSION) $< > $@-t
- mv $@-t $@
-
-# Support files needed by the virt-p2v-make-* scripts.
-virtp2vdatadir = $(datadir)/virt-p2v
-
-virtp2vdata_DATA = \
- $(dependencies_files) \
- issue \
- kiwi-config.sh \
- kiwi-config.xml.in \
- launch-virt-p2v \
- p2v.ks.in \
- p2v.service
-
-# Manual pages and HTML files for the website.
-man_MANS = \
- virt-p2v.1 \
- virt-p2v-make-disk.1 \
- virt-p2v-make-kickstart.1 \
- virt-p2v-make-kiwi.1
-
-noinst_DATA = \
- $(top_builddir)/website/virt-p2v.1.html \
- $(top_builddir)/website/virt-p2v-make-disk.1.html \
- $(top_builddir)/website/virt-p2v-make-kickstart.1.html \
- $(top_builddir)/website/virt-p2v-make-kiwi.1.html
-
-virt-p2v.1 $(top_builddir)/website/virt-p2v.1.html: stamp-virt-p2v.pod
-
-stamp-virt-p2v.pod: virt-p2v.pod virt-p2v-kernel-config.pod
- $(PODWRAPPER) \
- --man virt-p2v.1 \
- --html $(top_builddir)/website/virt-p2v.1.html \
- --insert virt-p2v-kernel-config.pod:__KERNEL_CONFIG__ \
- --license GPLv2+ \
- --warning safe \
- $<
- touch $@
-
-virt-p2v-make-disk.1 $(top_builddir)/website/virt-p2v-make-disk.1.html:
stamp-virt-p2v-make-disk.pod
-
-stamp-virt-p2v-make-disk.pod: virt-p2v-make-disk.pod
- $(PODWRAPPER) \
- --man virt-p2v-make-disk.1 \
- --html $(top_builddir)/website/virt-p2v-make-disk.1.html \
- --license GPLv2+ \
- --warning safe \
- $<
- touch $@
-
-virt-p2v-make-kickstart.1 $(top_builddir)/website/virt-p2v-make-kickstart.1.html:
stamp-virt-p2v-make-kickstart.pod
-
-stamp-virt-p2v-make-kickstart.pod: virt-p2v-make-kickstart.pod
- $(PODWRAPPER) \
- --man virt-p2v-make-kickstart.1 \
- --html $(top_builddir)/website/virt-p2v-make-kickstart.1.html \
- --license GPLv2+ \
- --warning safe \
- $<
- touch $@
-
-virt-p2v-make-kiwi.1 $(top_builddir)/website/virt-p2v-make-kiwi.1.html:
stamp-virt-p2v-make-kiwi.pod
-
-stamp-virt-p2v-make-kiwi.pod: virt-p2v-make-kiwi.pod
- $(PODWRAPPER) \
- --man virt-p2v-make-kiwi.1 \
- --html $(top_builddir)/website/virt-p2v-make-kiwi.1.html \
- --license GPLv2+ \
- --warning safe \
- $<
- touch $@
-
-# Run virt-p2v locally either directly or in a VM.
-# See guestfs-hacking(1) section "Running virt-p2v"
-
-PHYSICAL_MACHINE = $(abs_builddir)/fedora.img
-BLANK_DISK = blank-part.img
-
-check_DATA = \
- $(PHYSICAL_MACHINE) \
- $(BLANK_DISK)
-
-run-virt-p2v-directly: $(PHYSICAL_MACHINE)
- $(top_builddir)/run virt-p2v --test-disk=$(PHYSICAL_MACHINE)
-
-run-virt-p2v-in-a-vm: virt-p2v.img $(PHYSICAL_MACHINE)
- $(QEMU) \
- -M pc,accel=kvm:tcg \
- -cpu host \
- -m 1024 \
- -drive id=hd0,file=$(PHYSICAL_MACHINE),format=raw,if=ide \
- -device piix3-usb-uhci \
- -drive id=usb0,file=$<,format=raw,snapshot=on,if=none \
- -device usb-storage,bootindex=1,drive=usb0 \
- -boot menu=on \
- -netdev user,id=net0,net=169.254.0.0/16 \
- -device virtio-net-pci,netdev=net0 \
- -netdev user,id=net1 \
- -device rtl8139,netdev=net1 \
- -netdev user,id=net2 \
- -device e1000,netdev=net2 \
- $(QEMU_OPTIONS) \
- &
-
-run-virt-p2v-non-gui-conversion: stamp-test-virt-p2v-pxe-data-files
- SLOW=1 $(top_builddir)/run ./test-virt-p2v-pxe.sh
-
-$(PHYSICAL_MACHINE):
- $(top_builddir)/run virt-builder --format raw -o $@ fedora-30
-
-$(BLANK_DISK):
- $(top_builddir)/run guestfish -N $@=part exit
-
-virt-p2v.img: \
- dependencies.m4 \
- issue \
- launch-virt-p2v \
- p2v.service \
- virt-p2v \
- virt-p2v-make-disk
- $(top_builddir)/run virt-p2v-make-disk -o $@
-
-# Tests.
-
-TESTS_ENVIRONMENT = $(top_builddir)/run --test
-
-TESTS = \
- test-virt-p2v-cmdline.sh \
- test-virt-p2v-docs.sh
-
-APPLIANCE_TESTS = \
- test-virt-p2v.sh \
- test-virt-p2v-nbdkit.sh
-
-if ENABLE_APPLIANCE
-TESTS += \
- $(APPLIANCE_TESTS) \
- $(SLOW_TESTS)
-endif ENABLE_APPLIANCE
-
-check-valgrind:
- make VG="@VG@" check
-
-SLOW_TESTS = \
- test-virt-p2v-pxe.sh
-
-check-slow: stamp-test-virt-p2v-pxe-data-files
- $(MAKE) check TESTS="$(SLOW_TESTS)" SLOW=1
-
-stamp-test-virt-p2v-pxe-data-files: \
- test-virt-p2v-pxe.authorized_keys \
- test-virt-p2v-pxe.img \
- test-virt-p2v-pxe.vmlinuz test-virt-p2v-pxe.initramfs \
- test-virt-p2v-pxe.sshd_config \
- test-virt-p2v-pxe.ssh_host_rsa_key \
- test-virt-p2v-pxe.ssh_host_rsa_key.pub \
- test-virt-p2v-pxe.id_rsa test-virt-p2v-pxe.id_rsa.pub
- touch $@
-
-test-virt-p2v-pxe.img: \
- dependencies.m4 \
- issue \
- launch-virt-p2v \
- p2v.service \
- test-virt-p2v-pxe.id_rsa \
- virt-p2v \
- virt-p2v-make-disk
- $(top_builddir)/run virt-p2v-make-disk \
- --inject-ssh-identity=test-virt-p2v-pxe.id_rsa \
- -o $@-t
- mv $@-t $@
-
-test-virt-p2v-pxe.vmlinuz test-virt-p2v-pxe.initramfs: stamp-test-virt-p2v-pxe-kernel
-
-stamp-test-virt-p2v-pxe-kernel: test-virt-p2v-pxe.img
- rm -f $@ vmlinuz initramfs test-virt-p2v-pxe.vmlinuz test-virt-p2v-pxe.initramfs
- $(top_builddir)/run virt-get-kernel --unversioned-names -a $<
- mv vmlinuz test-virt-p2v-pxe.vmlinuz
- mv initramfs test-virt-p2v-pxe.initramfs
- touch $@
-
-test-virt-p2v-pxe.sshd_config: test-virt-p2v-pxe.sshd_config.in
- rm -f $@ $@-t
- @AWK@ \
- -v "abs_builddir=$(abs_builddir)" \
- '{ \
- gsub (/__RANDOM_PORT__/, 10000 + int (1000 * rand())); \
- gsub (/__abs_builddir__/, abs_builddir); \
- print; \
- }' < $< > $@-t
- chmod 0444 $@-t
- mv $@-t $@
-
-test-virt-p2v-pxe.authorized_keys: test-virt-p2v-pxe.id_rsa.pub $(top_builddir)/run
- rm -f $@ $@-t
- $(top_builddir)/run sh -c 'echo -n
environment=\"PATH=$$PATH\",environment=\"LD_LIBRARY_PATH=$(abs_top_builddir)/lib/.libs\",environment=\"LIBGUESTFS_PATH=$(abs_top_builddir)/appliance\",environment=\"LIBGUESTFS_CACHEDIR=$(abs_top_builddir)/tmp\"\
' > $@-t
- cat $< >> $@-t
- mv $@-t $@
-
-test-virt-p2v-pxe.ssh_host_rsa_key test-virt-p2v-pxe.ssh_host_rsa_key.pub:
stamp-test-virt-p2v-pxe-hostkey
-
-stamp-test-virt-p2v-pxe-hostkey:
- rm -f test-virt-p2v-pxe.ssh_host_rsa_key
- rm -f test-virt-p2v-pxe.ssh_host_rsa_key.pub
- ssh-keygen -t rsa -f test-virt-p2v-pxe.ssh_host_rsa_key -N ''
- touch $@
-
-test-virt-p2v-pxe.id_rsa test-virt-p2v-pxe.id_rsa.pub: stamp-test-virt-p2v-pxe-userkey
-
-stamp-test-virt-p2v-pxe-userkey:
- rm -f test-virt-p2v-pxe.id_rsa
- rm -f test-virt-p2v-pxe.id_rsa.pub
- ssh-keygen -t rsa -f test-virt-p2v-pxe.id_rsa -N ''
- touch $@
diff --git a/p2v/contrib/aux-scripts/do-build.sh b/p2v/contrib/aux-scripts/do-build.sh
deleted file mode 100644
index dd6424bb4..000000000
--- a/p2v/contrib/aux-scripts/do-build.sh
+++ /dev/null
@@ -1,196 +0,0 @@
-#!/bin/bash -
-# Auxiliary script for building virt-p2v ISO.
-# Copyright (C) 2017 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# See build-p2v-iso.sh
-
-set -e
-set -x
-
-# Make sure we're in the virtual environment, and refuse to run otherwise.
-if [ ! -f /var/tmp/livecd ]; then
- echo "$0: do not run this script directly"
- exit 1
-fi
-
-# If the script exits for any reason (including success) reboot. This
-# in fact powers off the virtual machine because we are using
-# qemu -no-reboot.
-trap reboot INT QUIT TERM EXIT ERR
-
-cd /var/tmp
-
-osversion=`cat osversion`
-livecd=`cat livecd`
-source ./proxy
-prefix=`rpm --eval '%_prefix'`
-libdir=`rpm --eval '%_libdir'`
-sysconfdir=`rpm --eval '%_sysconfdir'`
-
-# Build virt-p2v from libguestfs sources.
-# We have to start from a tarball because at least RHEL 5 autotools
-# isn't sufficiently new to run autoreconf.
-zcat libguestfs.tar.gz | tar xf -
-pushd libguestfs-*
-
-# Various hacks for different versions of RHEL.
-case $osversion in
- rhel-5.*|centos-5.*)
- # This just forces configure to ignore these missing dependencies.
- export LIBTINFO_CFLAGS=-D_GNU_SOURCE
- export LIBTINFO_LIBS=-lncurses
- export JANSSON_CFLAGS=-D_GNU_SOURCE
- export JANSSON_LIBS=-ljansson
- # Remove some unsupported flags that the configure script hard codes.
- sed -i -e 's/-fno-strict-overflow//' configure
- sed -i -e 's/-Wno-strict-overflow//' configure
- # Apply some RHEL 5 only patches.
- patch -p1 <
../patches/0001-RHEL-5-ONLY-DISABLE-AUTOMATIC-REMOTE-PORT-ALLOCATION.patch
- patch -p1 < ../patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch
- ;;
- rhel-6.*|centos-6.*)
- # This just forces configure to ignore these missing dependencies.
- export LIBTINFO_CFLAGS=-D_GNU_SOURCE
- export LIBTINFO_LIBS=-lncurses
- export JANSSON_CFLAGS=-D_GNU_SOURCE
- export JANSSON_LIBS=-ljansson
- ;;
-esac
-
-export vmchannel_test=no
-./configure \
- --prefix $prefix \
- --libdir $libdir \
- --sysconfdir $sysconfdir \
- --disable-static \
- --disable-appliance \
- --disable-daemon \
- --disable-lua \
- --disable-ocaml \
- --disable-perl \
- --disable-php \
- --disable-python \
- --disable-ruby \
- --with-qemu=no
-# We only need to build a handful of directories to get virt-p2v.
-make -C generator
-make -C gnulib/lib
-make -C common/utils
-make -C common/miniexpect
-make -C p2v virt-p2v virt-p2v.xz dependencies.redhat
-make run
-
-# Check virt-p2v was built and runs.
-./run ./p2v/virt-p2v --version
-./run ./p2v/virt-p2v-make-kickstart --version
-
-# Create the kickstart file.
-if [ "x$http_proxy" != "x" ]; then
proxy="--proxy=$http_proxy"; fi
-./run ./p2v/virt-p2v-make-kickstart -o /var/tmp/p2v.ks $osversion $proxy
-
-popd
-
-# More hacks for different versions of RHEL.
-case $osversion in
- rhel-5.*|centos-5.*)
- # RHEL 5 livecd-tools is broken with syslinux, this fixes it:
- sed -i -e 's,/usr/lib/syslinux/,/usr/share/syslinux/,g'\
- /usr/lib/python2.4/site-packages/imgcreate/live.py
- # livecd-tools cannot parse certain aspects of the kickstart:
- sed -i \
- -e 's/--plaintext//g' \
- -e 's/^firewall.*//g' \
- -e 's/^%end.*//g' \
- p2v.ks
- # Remove some packages which don't exist on RHEL 5:
- sed -i \
- -e 's,^dracut-live.*,,g' \
- -e 's,^dejavu-.*,,g' \
- -e 's,^mesa-dri-drivers.*,,g' \
- -e 's,^network-manager-applet.*,,g' \
- -e 's,^nm-connection-editor.*,,g' \
- -e 's,^/usr/bin/qemu-nbd.*,,g' \
- -e '/^net-tools/a syslinux' \
- p2v.ks
- # Remove systemctl lines, doesn't exist on RHEL 5.
- sed -i \
- -e 's/^\(systemctl.*\)/#\1/g' \
- p2v.ks
- ;;
- rhel-6.*|centos-6.*)
- # Remove some packages which don't exist on RHEL 6:
- sed -i \
- -e 's,^dracut-live.*,,g' \
- -e 's,^firewalld.*,,g' \
- -e 's,^network-manager-applet.*,,g' \
- -e 's,^nm-connection-editor.*,,g' \
- -e 's,^/usr/bin/qemu-nbd.*,,g' \
- p2v.ks
- # Remove systemctl lines, doesn't exist on RHEL 5.
- sed -i \
- -e 's/^\(systemctl.*\)/#\1/g' \
- p2v.ks
- ;;
-esac
-
-# Build nbdkit
-zcat nbdkit.tar.gz | tar xf -
-pushd nbdkit-*
-./configure \
- CFLAGS="-D_GNU_SOURCE" \
- --prefix $prefix \
- --libdir $libdir \
- --sysconfdir $sysconfdir \
- --without-liblzma
-make
-cp src/nbdkit ..
-cp plugins/file/.libs/nbdkit-file-plugin.so ..
-popd
-gzip -c nbdkit > nbdkit.gz
-gzip -c nbdkit-file-plugin.so > nbdkit-file-plugin.so.gz
-base64 nbdkit.gz > nbdkit.gz.b64
-base64 nbdkit-file-plugin.so.gz > nbdkit-file-plugin.so.gz.b64
-
-# Add nbdkit binaries to the kickstart.
-echo > fragment.ks
-echo '#' `md5sum nbdkit` >> fragment.ks
-echo 'base64 -d -i <<EOF | gzip -cd > /usr/bin/nbdkit' >>
fragment.ks
-cat nbdkit.gz.b64 >> fragment.ks
-echo >> fragment.ks
-echo EOF >> fragment.ks
-echo 'chmod 0755 /usr/bin/nbdkit' >> fragment.ks
-echo >> fragment.ks
-
-echo '#' `md5sum nbdkit-file-plugin.so` >> fragment.ks
-echo 'mkdir -p' $libdir/nbdkit/plugins >> fragment.ks
-echo 'base64 -d -i <<EOF | gzip -cd >'
$libdir/nbdkit/plugins/nbdkit-file-plugin.so >> fragment.ks
-cat nbdkit-file-plugin.so.gz.b64 >> fragment.ks
-echo >> fragment.ks
-echo EOF >> fragment.ks
-echo 'chmod 0755' $libdir/nbdkit/plugins/nbdkit-file-plugin.so >>
fragment.ks
-echo >> fragment.ks
-
-sed -i -e '/^chmod.*\/usr\/bin\/virt-p2v$/ r fragment.ks' p2v.ks
-
-# Run livecd-creator to make the live CD. The strange redirect works
-# around a bug in RHEL 5's livecd-tools: "/sbin/mksquashfs: invalid
-# option" is printed if the output is redirected to a file
-# (
https://bugs.centos.org/bug_view_page.php?bug_id=3738)
-livecd-creator -c p2v.ks > `tty` 2>&1
-
-# Move the live CD to the final filename.
-mv livecd-*.iso $livecd
diff --git a/p2v/contrib/build-p2v-iso.sh b/p2v/contrib/build-p2v-iso.sh
deleted file mode 100755
index 2c6bd105b..000000000
--- a/p2v/contrib/build-p2v-iso.sh
+++ /dev/null
@@ -1,155 +0,0 @@
-#!/bin/bash -
-# Build virt-p2v ISO for RHEL 5/6/7.
-# Copyright (C) 2017 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# This script is used to build the virt-p2v ISO on RHEL 5/6/7,
-# for 32 bit (i686) and 64 bit (x86-64).
-#
-# This script is *not* used to build the official RHEL 7 virt-p2v ISO
-# for Red Hat customers. However it is used to build alternate ISOs
-# which can optionally be used by customers who need older RHEL
-# (eg. for proprietary FakeRAID drivers), or have 32 bit physical
-# machines that they wish to virtualize.
-#
-# The virt-p2v ISOs built by this script are hosted at:
-#
http://oirase.annexia.org/virt-p2v/
-
-set -e
-
-usage ()
-{
- echo ' libguestfs and nbdkit tarballs'
- echo ' (http URLs may also be used here)'
- echo ' |'
- echo './build-p2v-iso.sh file:///path/to/libguestfs-1.XX.YY.tar.gz \'
- echo ' file:///path/to/nbdkit-1.XX.YY.tar.gz \'
- echo ' rhel-5.11 i686'
- echo ' | |'
- echo ' | `--- architecture (i686 or x86_64)'
- echo ' `---- version of RHEL (5.x or 6.x tested)'
- echo
- echo 'Note this downloads the libguestfs tarball from upstream, it'
- echo 'does not use libguestfs from the current directory.'
- echo
- echo 'Minimum versions of: libguestfs = 1.35.22'
- echo ' nbdkit = 1.1.13'
- echo
- echo 'You should run the script on a Fedora (or recent Linux) host.'
- echo 'It uses virt-builder to create the RHEL environment'
- exit 0
-}
-
-if [ $# -ne 4 ]; then
- usage
-fi
-
-tmpdir="$(mktemp -d)"
-cleanup ()
-{
- rm -rf "$tmpdir"
-}
-trap cleanup INT QUIT TERM EXIT ERR
-
-libguestfs_tarball=$1
-nbdkit_tarball=$2
-osversion=$3
-arch=$4
-
-# Get the path to the auxiliary script.
-d="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd
)"
-if [ ! -d "$d/aux-scripts" ]; then
- echo "$0: error: cannot locate auxiliary scripts"
- exit 1
-fi
-
-# Build the list of packages needed for the build environment.
-pkgs=augeas-devel,bison,coreutils,cpio,file-devel,flex,gcc,gperf,gtk2-devel,libxml2-devel,livecd-tools,mkisofs,ncurses-devel,patch,perl-Pod-Man,perl-Pod-Simple,pcre-devel,/usr/bin/pod2text,syslinux,syslinux-extlinux,xz,xz-devel
-
-for f in `cat $d/../../p2v/dependencies.redhat`; do
- pkgs="$pkgs,$f"
-done
-
-# Various hacks for different versions of RHEL.
-if=virtio
-netdev=virtio-net-pci
-declare -a epel
-case $osversion in
- rhel-5.*|centos-5.*)
- if=ide
- netdev=rtl8139
- # RHEL 5 yum cannot download a package.
- curl -o $tmpdir/epel-release.rpm
https://dl.fedoraproject.org/pub/epel/epel-release-latest-5.noarch.rpm
- epel[0]="--upload"
- epel[1]="$tmpdir/epel-release.rpm:/var/tmp"
- # RHEL 5 i686 template has a broken RPM DB, so rebuild it.
- epel[2]="--run-command"
- epel[3]="rm -f /var/lib/rpm/__db*; rpm -vv --rebuilddb"
- epel[4]="--run-command"
- epel[5]="yum install -y --nogpgcheck /var/tmp/epel-release.rpm"
- ;;
- rhel-6.*|centos-6.*)
- epel[0]="--run-command"
- epel[1]="yum install -y --nogpgcheck
https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm"
- pkgs="$pkgs,jansson-devel"
- ;;
- rhel-7.*|centos-7.*)
- epel[0]="--run-command"
- epel[1]="yum install -y --nogpgcheck
https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm"
- pkgs="$pkgs,jansson-devel"
- ;;
-esac
-
-# Download libguestfs and nbdkit sources.
-curl -o $tmpdir/libguestfs.tar.gz $libguestfs_tarball
-curl -o $tmpdir/nbdkit.tar.gz $nbdkit_tarball
-
-# Write a proxy file for the guest environment.
-echo "export http_proxy=$http_proxy" >> $tmpdir/proxy
-echo "export https_proxy=$https_proxy" >> $tmpdir/proxy
-echo "export ftp_proxy=$ftp_proxy" >> $tmpdir/proxy
-
-# Build the temporary guest RHEL environment.
-disk=$tmpdir/tmp-$osversion.img
-livecd=virt-p2v-livecd-$osversion-$arch-`date +"%Y%m%d%H%M"`.iso
-virt-builder $osversion --arch $arch \
- --size 20G --output $disk \
- "${epel[@]}" \
- --install "$pkgs" \
- --upload $tmpdir/libguestfs.tar.gz:/var/tmp \
- --upload $tmpdir/nbdkit.tar.gz:/var/tmp \
- --copy-in $d/patches:/var/tmp \
- --write /var/tmp/osversion:$osversion \
- --write /var/tmp/livecd:$livecd \
- --upload $tmpdir/proxy:/var/tmp/proxy \
- --firstboot $d/aux-scripts/do-build.sh \
- --selinux-relabel
-
-# Run the guest.
-qemu-system-x86_64 -no-user-config -nodefaults -nographic \
- -no-reboot \
- -machine accel=kvm:tcg \
- -cpu host \
- -m 4096 \
- -drive file=$disk,format=raw,if=$if \
- -netdev user,id=usernet,net=169.254.0.0/16 \
- -device $netdev,netdev=usernet \
- -serial stdio
-
-# Did we get any output from the auxiliary script?
-# (This command will fail if not)
-guestfish --ro -a $disk -i download /var/tmp/$livecd $livecd
-ls -lh $livecd
diff --git
a/p2v/contrib/patches/0001-RHEL-5-ONLY-DISABLE-AUTOMATIC-REMOTE-PORT-ALLOCATION.patch
b/p2v/contrib/patches/0001-RHEL-5-ONLY-DISABLE-AUTOMATIC-REMOTE-PORT-ALLOCATION.patch
deleted file mode 100644
index a4efb38bf..000000000
--- a/p2v/contrib/patches/0001-RHEL-5-ONLY-DISABLE-AUTOMATIC-REMOTE-PORT-ALLOCATION.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From 28dd464c8e78f241622d142671a61a75bf5d758e Mon Sep 17 00:00:00 2001
-From: "Richard W.M. Jones" <rjones(a)redhat.com>
-Date: Sat, 21 Jan 2017 05:30:40 -0500
-Subject: [PATCH 1/2] RHEL 5 ONLY DISABLE AUTOMATIC REMOTE PORT ALLOCATION
-
----
- p2v/ssh.c | 15 ++++++++++++++-
- 1 file changed, 14 insertions(+), 1 deletion(-)
-
-diff --git a/p2v/ssh.c b/p2v/ssh.c
-index 8beaf74..919f2df 100644
---- a/p2v/ssh.c
-+++ b/p2v/ssh.c
-@@ -1044,16 +1044,28 @@ open_data_connection (struct config *config,
- "-N",
- NULL
- };
-+#if 0
- CLEANUP_FREE char *port_str = NULL;
- const int ovecsize = 12;
- int ovector[ovecsize];
-+#endif
-
-- snprintf (remote_arg, sizeof remote_arg, "0:%s:%d", local_ipaddr,
local_port);
-+ /* RHEL 5 hack: ssh does not print the "Allocated port ..." string,
-+ * so we cannot find the remotely allocated port. Instead just
-+ * assign a random port and hope for the best.
-+ */
-+ static int next_remote_port = 58123;
-+
-+ snprintf (remote_arg, sizeof remote_arg, "%d:%s:%d",
-+ next_remote_port, local_ipaddr, local_port);
-+ *remote_port = next_remote_port;
-+ next_remote_port++;
-
- h = start_ssh (0, config, (char **) extra_args, 0);
- if (h == NULL)
- return NULL;
-
-+#if 0
- switch (mexp_expect (h,
- (mexp_regexp[]) {
- { 100, .re = portfwd_re },
-@@ -1094,6 +1106,7 @@ open_data_connection (struct config *config,
- mexp_close (h);
- return NULL;
- }
-+#endif
-
- return h;
- }
---
-1.8.2.3
-
diff --git a/p2v/contrib/patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch
b/p2v/contrib/patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch
deleted file mode 100644
index d0bc2cfc9..000000000
--- a/p2v/contrib/patches/0002-RHEL-5-ONLY-QEMU-NBD-1.4-HAS-NO-f-OPTION.patch
+++ /dev/null
@@ -1,34 +0,0 @@
-From 3ccd25c981431426038d7952f5b0b86118d92c23 Mon Sep 17 00:00:00 2001
-From: "Richard W.M. Jones" <rjones(a)redhat.com>
-Date: Sat, 21 Jan 2017 05:57:17 -0500
-Subject: [PATCH 2/2] RHEL 5 ONLY QEMU-NBD 1.4 HAS NO -f OPTION
-
----
- p2v/nbd.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/p2v/nbd.c b/p2v/nbd.c
-index b1caf2f..2232b08 100644
---- a/p2v/nbd.c
-+++ b/p2v/nbd.c
-@@ -409,7 +409,7 @@ start_qemu_nbd (const char *device,
- "-r", /* readonly (vital!) */
- "-p", port_str, /* listening port */
- "-t", /* persistent */
-- "-f", "raw", /* force raw format */
-+ //"-f", "raw", /* force raw format */
- "-b", ipaddr, /* listen only on loopback interface */
- "--cache=unsafe", /* use unsafe caching for speed */
- device, /* a device like /dev/sda */
-@@ -424,7 +424,7 @@ start_qemu_nbd (const char *device,
- "qemu-nbd",
- "-r", /* readonly (vital!) */
- "-t", /* persistent */
-- "-f", "raw", /* force raw format */
-+ //"-f", "raw", /* force raw format */
- "--cache=unsafe", /* use unsafe caching for speed */
- device, /* a device like /dev/sda */
- NULL);
---
-1.8.2.3
-
diff --git a/p2v/contrib/test-p2v-iso.sh b/p2v/contrib/test-p2v-iso.sh
deleted file mode 100755
index ff6453b79..000000000
--- a/p2v/contrib/test-p2v-iso.sh
+++ /dev/null
@@ -1,63 +0,0 @@
-#!/bin/bash -
-# Test virt-p2v ISO for RHEL 5/6/7.
-# Copyright (C) 2017 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# Once you have built a virt-p2v ISO (see build-p2v-iso.sh), you
-# can interactively test it using this script.
-
-set -e
-
-usage ()
-{
- echo './test-p2v-iso.sh virt-p2v-livecd-....iso'
- exit 0
-}
-
-if [ $# -ne 1 ]; then
- usage
-fi
-
-tmpdir="$(mktemp -d)"
-cleanup ()
-{
- rm -rf "$tmpdir"
-}
-trap cleanup INT QUIT TERM EXIT ERR
-
-iso=$1
-if [ ! -f "$iso" ]; then
- echo "$iso: file not found"
- exit 1
-fi
-
-# Build a temporary guest to test.
-disk=$tmpdir/guest.img
-virt-builder rhel-6.8 --output $disk
-
-# Boot the guest as if running with virt-p2v ISO in the CD drive.
-qemu-system-x86_64 -no-user-config -nodefaults \
- -no-reboot \
- -machine accel=kvm:tcg \
- -cpu host \
- -m 4096 \
- -display gtk \
- -vga std \
- -drive file=$disk,format=raw,if=ide \
- -cdrom $iso \
- -netdev user,id=usernet,net=169.254.0.0/16 \
- -device rtl8139,netdev=usernet \
- -boot d
diff --git a/p2v/conversion.c b/p2v/conversion.c
deleted file mode 100644
index 7dd201a0d..000000000
--- a/p2v/conversion.c
+++ /dev/null
@@ -1,668 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2009-2019 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * This file manages the p2v conversion.
- *
- * The conversion is actually done by L<virt-v2v(1)> running on the
- * remote conversion server. This file manages running the remote
- * command and provides callbacks for displaying the output.
- *
- * When virt-p2v operates in GUI mode, this code runs in a separate
- * thread. When virt-p2v operates in kernel mode, this runs
- * synchronously in the main thread.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include <fcntl.h>
-#include <inttypes.h>
-#include <unistd.h>
-#include <time.h>
-#include <errno.h>
-#include <error.h>
-#include <locale.h>
-#include <libintl.h>
-#include <netdb.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include <pthread.h>
-
-#include "ignore-value.h"
-#include "getprogname.h"
-
-#include "miniexpect.h"
-#include "p2v.h"
-
-static void cleanup_data_conns (struct data_conn *data_conns, size_t nr);
-static void generate_name (struct config *, const char *filename);
-static void generate_wrapper_script (struct config *, const char *remote_dir, const char
*filename);
-static void generate_system_data (const char *dmesg_file, const char *lscpu_file, const
char *lspci_file, const char *lsscsi_file, const char *lsusb_file);
-static void generate_p2v_version_file (const char *p2v_version_file);
-static void print_quoted (FILE *fp, const char *s);
-
-static char *conversion_error;
-
-static void set_conversion_error (const char *fs, ...)
- __attribute__((format(printf,1,2)));
-
-static void
-set_conversion_error (const char *fs, ...)
-{
- va_list args;
- char *msg;
- int len;
-
- va_start (args, fs);
- len = vasprintf (&msg, fs, args);
- va_end (args);
-
- if (len < 0)
- error (EXIT_FAILURE, errno,
- "vasprintf (original error format string: %s)", fs);
-
- free (conversion_error);
- conversion_error = msg;
-}
-
-const char *
-get_conversion_error (void)
-{
- return conversion_error;
-}
-
-static pthread_mutex_t running_mutex = PTHREAD_MUTEX_INITIALIZER;
-static int running = 0;
-static pthread_mutex_t cancel_requested_mutex = PTHREAD_MUTEX_INITIALIZER;
-static int cancel_requested = 0;
-static mexp_h *control_h = NULL;
-
-static int
-is_running (void)
-{
- int r;
- pthread_mutex_lock (&running_mutex);
- r = running;
- pthread_mutex_unlock (&running_mutex);
- return r;
-}
-
-static void
-set_running (int r)
-{
- pthread_mutex_lock (&running_mutex);
- running = r;
- pthread_mutex_unlock (&running_mutex);
-}
-
-static int
-is_cancel_requested (void)
-{
- int r;
- pthread_mutex_lock (&cancel_requested_mutex);
- r = cancel_requested;
- pthread_mutex_unlock (&cancel_requested_mutex);
- return r;
-}
-
-static void
-set_cancel_requested (int r)
-{
- pthread_mutex_lock (&cancel_requested_mutex);
- cancel_requested = r;
-
- /* Send ^C to the remote so that virt-v2v "knows" the connection has
- * been cancelled. mexp_send_interrupt is a single write(2) call.
- */
- if (r && control_h)
- ignore_value (mexp_send_interrupt (control_h));
-
- pthread_mutex_unlock (&cancel_requested_mutex);
-}
-
-static void
-set_control_h (mexp_h *new_h)
-{
- pthread_mutex_lock (&cancel_requested_mutex);
- control_h = new_h;
- pthread_mutex_unlock (&cancel_requested_mutex);
-}
-
-#pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn"
-int
-start_conversion (struct config *config,
- void (*notify_ui) (int type, const char *data))
-{
- int ret = -1;
- int status;
- size_t i, len;
- const size_t nr_disks = guestfs_int_count_strings (config->disks);
- time_t now;
- struct tm tm;
- CLEANUP_FREE struct data_conn *data_conns = NULL;
- CLEANUP_FREE char *remote_dir = NULL;
- char tmpdir[] = "/tmp/p2v.XXXXXX";
- char name_file[] = "/tmp/p2v.XXXXXX/name";
- char physical_xml_file[] = "/tmp/p2v.XXXXXX/physical.xml";
- char wrapper_script[] = "/tmp/p2v.XXXXXX/virt-v2v-wrapper.sh";
- char dmesg_file[] = "/tmp/p2v.XXXXXX/dmesg";
- char lscpu_file[] = "/tmp/p2v.XXXXXX/lscpu";
- char lspci_file[] = "/tmp/p2v.XXXXXX/lspci";
- char lsscsi_file[] = "/tmp/p2v.XXXXXX/lsscsi";
- char lsusb_file[] = "/tmp/p2v.XXXXXX/lsusb";
- char p2v_version_file[] = "/tmp/p2v.XXXXXX/p2v-version";
- int inhibit_fd = -1;
-
-#if DEBUG_STDERR
- print_config (config, stderr);
- fprintf (stderr, "\n");
-#endif
-
- set_control_h (NULL);
- set_running (1);
- set_cancel_requested (0);
-
- inhibit_fd = inhibit_power_saving ();
-#ifdef DEBUG_STDERR
- if (inhibit_fd == -1)
- fprintf (stderr, "warning: virt-p2v cannot inhibit power saving during
conversion.\n");
-#endif
-
- data_conns = malloc (sizeof (struct data_conn) * nr_disks);
- if (data_conns == NULL)
- error (EXIT_FAILURE, errno, "malloc");
-
- for (i = 0; config->disks[i] != NULL; ++i) {
- data_conns[i].h = NULL;
- data_conns[i].nbd_pid = 0;
- data_conns[i].nbd_remote_port = -1;
- }
-
- /* Start the data connections and NBD server processes, one per disk. */
- for (i = 0; config->disks[i] != NULL; ++i) {
- const char *nbd_local_ipaddr;
- int nbd_local_port;
- CLEANUP_FREE char *device = NULL;
-
- if (config->disks[i][0] == '/') {
- device = strdup (config->disks[i]);
- if (!device) {
- perror ("strdup");
- cleanup_data_conns (data_conns, nr_disks);
- exit (EXIT_FAILURE);
- }
- }
- else if (asprintf (&device, "/dev/%s", config->disks[i]) == -1) {
- perror ("asprintf");
- cleanup_data_conns (data_conns, nr_disks);
- exit (EXIT_FAILURE);
- }
-
- if (notify_ui) {
- CLEANUP_FREE char *msg;
- if (asprintf (&msg,
- _("Starting local NBD server for %s ..."),
- config->disks[i]) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- notify_ui (NOTIFY_STATUS, msg);
- }
-
- /* Start NBD server listening on the given port number. */
- data_conns[i].nbd_pid =
- start_nbd_server (&nbd_local_ipaddr, &nbd_local_port, device);
- if (data_conns[i].nbd_pid == 0) {
- set_conversion_error ("NBD server error: %s", get_nbd_error ());
- goto out;
- }
-
- /* Wait for NBD server to start up and listen. */
- if (wait_for_nbd_server_to_start (nbd_local_ipaddr, nbd_local_port) == -1) {
- set_conversion_error ("NBD server error: %s", get_nbd_error ());
- goto out;
- }
-
- if (notify_ui) {
- CLEANUP_FREE char *msg;
- if (asprintf (&msg,
- _("Opening data connection for %s ..."),
- config->disks[i]) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- notify_ui (NOTIFY_STATUS, msg);
- }
-
- /* Open the SSH data connection, with reverse port forwarding
- * back to the NBD server.
- */
- data_conns[i].h = open_data_connection (config,
- nbd_local_ipaddr, nbd_local_port,
- &data_conns[i].nbd_remote_port);
- if (data_conns[i].h == NULL) {
- const char *err = get_ssh_error ();
-
- set_conversion_error ("could not open data connection over SSH to the
conversion server: %s", err);
- goto out;
- }
-
-#if DEBUG_STDERR
- fprintf (stderr,
- "%s: data connection for %s: SSH remote port %d, local port
%s:%d\n",
- getprogname (), device,
- data_conns[i].nbd_remote_port,
- nbd_local_ipaddr, nbd_local_port);
-#endif
- }
-
- /* Create a remote directory name which will be used for libvirt
- * XML, log files and other stuff. We don't delete this directory
- * after the run because (a) it's useful for debugging and (b) it
- * only contains small files.
- *
- * NB: This path MUST NOT require shell quoting.
- */
- time (&now);
- gmtime_r (&now, &tm);
- if (asprintf (&remote_dir,
- "/tmp/virt-p2v-%04d%02d%02d-XXXXXXXX",
- tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday) == -1) {
- perror ("asprintf");
- cleanup_data_conns (data_conns, nr_disks);
- exit (EXIT_FAILURE);
- }
- len = strlen (remote_dir);
- guestfs_int_random_string (&remote_dir[len-8], 8);
- if (notify_ui)
- notify_ui (NOTIFY_LOG_DIR, remote_dir);
-
- /* Generate the local temporary directory. */
- if (mkdtemp (tmpdir) == NULL) {
- perror ("mkdtemp");
- cleanup_data_conns (data_conns, nr_disks);
- exit (EXIT_FAILURE);
- }
- memcpy (name_file, tmpdir, strlen (tmpdir));
- memcpy (physical_xml_file, tmpdir, strlen (tmpdir));
- memcpy (wrapper_script, tmpdir, strlen (tmpdir));
- memcpy (dmesg_file, tmpdir, strlen (tmpdir));
- memcpy (lscpu_file, tmpdir, strlen (tmpdir));
- memcpy (lspci_file, tmpdir, strlen (tmpdir));
- memcpy (lsscsi_file, tmpdir, strlen (tmpdir));
- memcpy (lsusb_file, tmpdir, strlen (tmpdir));
- memcpy (p2v_version_file, tmpdir, strlen (tmpdir));
-
- /* Generate the static files. */
- generate_name (config, name_file);
- generate_physical_xml (config, data_conns, physical_xml_file);
- generate_wrapper_script (config, remote_dir, wrapper_script);
- generate_system_data (dmesg_file,
- lscpu_file, lspci_file, lsscsi_file, lsusb_file);
- generate_p2v_version_file (p2v_version_file);
-
- /* Open the control connection. This also creates remote_dir. */
- if (notify_ui)
- notify_ui (NOTIFY_STATUS, _("Setting up the control connection ..."));
-
- set_control_h (start_remote_connection (config, remote_dir));
- if (control_h == NULL) {
- set_conversion_error ("could not open control connection over SSH to the
conversion server: %s",
- get_ssh_error ());
- goto out;
- }
-
- /* Copy the static files to the remote dir. */
-
- /* These three files must not fail, so check for errors here. */
- if (scp_file (config, remote_dir,
- name_file, physical_xml_file, wrapper_script, NULL) == -1) {
- set_conversion_error ("scp: %s: %s",
- remote_dir, get_ssh_error ());
- goto out;
- }
-
- /* It's not essential that these files are copied, so ignore errors. */
- ignore_value (scp_file (config, remote_dir,
- dmesg_file, lscpu_file, lspci_file, lsscsi_file,
- lsusb_file, p2v_version_file, NULL));
-
- /* Do the conversion. This runs until virt-v2v exits. */
- if (notify_ui)
- notify_ui (NOTIFY_STATUS, _("Doing conversion ..."));
-
- if (mexp_printf (control_h,
- /* To simplify things in the wrapper script, it
- * writes virt-v2v's exit status to
- * /remote_dir/status, and here we read that and
- * exit the ssh shell with the same status.
- */
- "%s/virt-v2v-wrapper.sh; "
- "exit $(< %s/status)\n",
- remote_dir, remote_dir) == -1) {
- set_conversion_error ("mexp_printf: virt-v2v: %m");
- goto out;
- }
-
- /* Read output from the virt-v2v process and echo it through the
- * notify function, until virt-v2v closes the connection.
- */
- while (!is_cancel_requested ()) {
- char buf[257];
- ssize_t r;
-
- r = read (mexp_get_fd (control_h), buf, sizeof buf - 1);
- if (r == -1) {
- /* See comment about this in miniexpect.c. */
- if (errno == EIO)
- break; /* EOF */
- set_conversion_error ("read: %m");
- goto out;
- }
- if (r == 0)
- break; /* EOF */
- buf[r] = '\0';
- if (notify_ui)
- notify_ui (NOTIFY_REMOTE_MESSAGE, buf);
- }
-
- if (is_cancel_requested ()) {
- set_conversion_error ("cancelled by user");
- if (notify_ui)
- notify_ui (NOTIFY_STATUS, _("Conversion cancelled by user."));
- goto out;
- }
-
- if (notify_ui)
- notify_ui (NOTIFY_STATUS, _("Control connection closed by remote."));
-
- ret = 0;
- out:
- if (control_h) {
- mexp_h *h = control_h;
- set_control_h (NULL);
- status = mexp_close (h);
-
- if (status == -1) {
- set_conversion_error ("mexp_close: %m");
- ret = -1;
- }
- else if (ret == 0 &&
- WIFEXITED (status) &&
- WEXITSTATUS (status) != 0) {
- set_conversion_error ("virt-v2v exited with status %d",
- WEXITSTATUS (status));
- ret = -1;
- }
- }
- cleanup_data_conns (data_conns, nr_disks);
-
- if (inhibit_fd >= 0)
- close (inhibit_fd);
-
- set_running (0);
-
- return ret;
-}
-
-int
-conversion_is_running (void)
-{
- return is_running ();
-}
-
-void
-cancel_conversion (void)
-{
- set_cancel_requested (1);
-}
-
-static void
-cleanup_data_conns (struct data_conn *data_conns, size_t nr)
-{
- size_t i;
-
- for (i = 0; i < nr; ++i) {
- if (data_conns[i].h != NULL) {
- /* Because there is no SSH prompt (ssh -N), the only way to kill
- * these ssh connections is to send a signal. Just closing the
- * pipe doesn't do anything.
- */
- kill (mexp_get_pid (data_conns[i].h), SIGHUP);
- mexp_close (data_conns[i].h);
- }
-
- if (data_conns[i].nbd_pid > 0) {
- /* Kill NBD process and clean up. */
- kill (data_conns[i].nbd_pid, SIGTERM);
- waitpid (data_conns[i].nbd_pid, NULL, 0);
- }
- }
-}
-
-/**
- * Write the guest name into C<filename>.
- */
-static void
-generate_name (struct config *config, const char *filename)
-{
- FILE *fp;
-
- fp = fopen (filename, "w");
- if (fp == NULL)
- error (EXIT_FAILURE, errno, "fopen: %s", filename);
- fprintf (fp, "%s\n", config->guestname);
- fclose (fp);
-}
-
-/**
- * Construct the virt-v2v wrapper script.
- *
- * This will be sent to the remote server, and is easier than trying
- * to "type" a long and complex single command line into the ssh
- * connection when we start the conversion.
- */
-static void
-generate_wrapper_script (struct config *config, const char *remote_dir,
- const char *filename)
-{
- FILE *fp;
-
- fp = fopen (filename, "w");
- if (fp == NULL)
- error (EXIT_FAILURE, errno, "fopen: %s", filename);
-
- fprintf (fp, "#!/bin/bash -\n");
- fprintf (fp, "\n");
-
- fprintf (fp, "cd %s\n", remote_dir);
- fprintf (fp, "\n");
-
- /* The virt-v2v command, as a shell function called "v2v". */
- fprintf (fp, "v2v ()\n");
- fprintf (fp, "{\n");
- if (config->auth.sudo)
- fprintf (fp, "sudo -n ");
- fprintf (fp, "virt-v2v -v -x");
- if (feature_colours_option)
- fprintf (fp, " --colours");
- fprintf (fp, " -i libvirtxml");
-
- if (config->output.type) { /* -o */
- fprintf (fp, " -o ");
- print_quoted (fp, config->output.type);
- }
-
- switch (config->output.allocation) { /* -oa */
- case OUTPUT_ALLOCATION_NONE:
- /* nothing */
- break;
- case OUTPUT_ALLOCATION_SPARSE:
- fprintf (fp, " -oa sparse");
- break;
- case OUTPUT_ALLOCATION_PREALLOCATED:
- fprintf (fp, " -oa preallocated");
- break;
- default:
- abort ();
- }
-
- if (config->output.format) { /* -of */
- fprintf (fp, " -of ");
- print_quoted (fp, config->output.format);
- }
-
- if (config->output.storage) { /* -os */
- fprintf (fp, " -os ");
- print_quoted (fp, config->output.storage);
- }
-
- fprintf (fp, " --root first");
- fprintf (fp, " physical.xml");
- fprintf (fp, " </dev/null"); /* no stdin */
- fprintf (fp, "\n");
- fprintf (fp,
- "# Save the exit code of virt-v2v into the 'status'
file.\n");
- fprintf (fp, "echo $? > status\n");
- fprintf (fp, "}\n");
- fprintf (fp, "\n");
-
- fprintf (fp,
- "# Write a pre-emptive error status, in case the virt-v2v\n"
- "# command doesn't get to run at all. This will be\n"
- "# overwritten with the true exit code when virt-v2v runs.\n");
- fprintf (fp, "echo 99 > status\n");
- fprintf (fp, "\n");
-
- fprintf (fp, "log=virt-v2v-conversion-log.txt\n");
- fprintf (fp, "rm -f $log\n");
- fprintf (fp, "\n");
-
- fprintf (fp,
- "# Log the environment where virt-v2v will run.\n");
- fprintf (fp, "printenv > environment\n");
- fprintf (fp, "\n");
-
- fprintf (fp,
- "# Log the version of virt-v2v (for information only).\n");
- if (config->auth.sudo)
- fprintf (fp, "sudo -n ");
- fprintf (fp, "virt-v2v --version > v2v-version\n");
- fprintf (fp, "\n");
-
- fprintf (fp,
- "# Run virt-v2v. Send stdout back to virt-p2v. Send stdout\n"
- "# and stderr (debugging info) to the log file.\n");
- fprintf (fp, "v2v 2>> $log | tee -a $log\n");
- fprintf (fp, "\n");
-
- fprintf (fp,
- "# If virt-v2v failed then the error message (sent to stderr)\n"
- "# will not be seen in virt-p2v. Send the last few lines of\n"
- "# the log back to virt-p2v in this case.\n");
- fprintf (fp,
- "if [ \"$(< status)\" -ne 0 ]; then\n"
- " echo\n"
- " echo\n"
- " echo\n"
- " echo -ne '\\e[1;31m'\n"
- " echo '***' virt-v2v command failed '***'\n"
- " echo\n"
- " echo The full log is available on the conversion server in:\n"
- " echo ' ' %s/$log\n"
- " echo Only the last 50 lines are shown below.\n"
- " echo -ne '\\e[0m'\n"
- " echo\n"
- " echo\n"
- " echo\n"
- " tail -50 $log\n"
- "fi\n",
- remote_dir);
-
- fprintf (fp, "\n");
- fprintf (fp, "# EOF\n");
- fclose (fp);
-
- if (chmod (filename, 0755) == -1)
- error (EXIT_FAILURE, errno, "chmod: %s", filename);
-}
-
-/**
- * Print a shell-quoted string on C<fp>.
- */
-static void
-print_quoted (FILE *fp, const char *s)
-{
- fprintf (fp, "\"");
- while (*s) {
- if (*s == '$' || *s == '`' || *s == '\\' || *s ==
'"')
- fprintf (fp, "\\");
- fprintf (fp, "%c", *s);
- ++s;
- }
- fprintf (fp, "\"");
-}
-
-/**
- * Collect data about the system running virt-p2v such as the dmesg
- * output and lists of PCI devices. This is useful for diagnosis when
- * things go wrong.
- *
- * If any command fails, this is non-fatal.
- */
-static void
-generate_system_data (const char *dmesg_file,
- const char *lscpu_file,
- const char *lspci_file,
- const char *lsscsi_file,
- const char *lsusb_file)
-{
- CLEANUP_FREE char *cmd = NULL;
-
- if (asprintf (&cmd,
- "dmesg >%s 2>&1; "
- "lscpu >%s 2>&1; "
- "lspci -vvv >%s 2>&1; "
- "lsscsi -v >%s 2>&1; "
- "lsusb -v >%s 2>&1",
- dmesg_file, lscpu_file, lspci_file, lsscsi_file, lsusb_file)
- == -1)
- error (EXIT_FAILURE, errno, "asprintf");
-
- ignore_value (system (cmd));
-}
-
-/**
- * Generate a file containing the version of virt-p2v.
- *
- * The version of virt-v2v is contained in the conversion log.
- */
-static void
-generate_p2v_version_file (const char *p2v_version_file)
-{
- FILE *fp = fopen (p2v_version_file, "w");
- if (fp == NULL) {
- perror (p2v_version_file);
- return; /* non-fatal */
- }
- fprintf (fp, "%s %s\n",
- getprogname (), PACKAGE_VERSION_FULL);
- fclose (fp);
-}
diff --git a/p2v/cpuid.c b/p2v/cpuid.c
deleted file mode 100644
index ef3574deb..000000000
--- a/p2v/cpuid.c
+++ /dev/null
@@ -1,222 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2009-2019 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * Find CPU vendor, topology and some CPU flags.
- *
- * lscpu (from util-linux) provides CPU vendor, topology and flags.
- *
- * ACPI can be read by seeing if F</sys/firmware/acpi> exists.
- *
- * CPU model is essentially impossible to get without using libvirt,
- * but we cannot use libvirt for the reasons outlined in this message:
- *
https://www.redhat.com/archives/libvirt-users/2017-March/msg00071.html
- *
- * Note that #vCPUs and amount of RAM is handled by F<main.c>.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <errno.h>
-#include <error.h>
-#include <libintl.h>
-
-#include "c-ctype.h"
-#include "getprogname.h"
-#include "ignore-value.h"
-
-#include "p2v.h"
-
-static void
-free_cpu_config (struct cpu_config *cpu)
-{
- if (cpu->vendor)
- free (cpu->vendor);
- if (cpu->model)
- free (cpu->model);
- memset (cpu, 0, sizeof *cpu);
-}
-
-/**
- * Get the output of lscpu as a list of (key, value) pairs (as a
- * flattened list of strings).
- */
-static char **
-get_lscpu (void)
-{
- const char *cmd;
- CLEANUP_PCLOSE FILE *fp = NULL;
- CLEANUP_FREE char *line = NULL;
- ssize_t len;
- size_t buflen = 0;
- char **ret = NULL;
- size_t ret_size = 0;
-
- cmd = "lscpu";
-
- fp = popen (cmd, "re");
- if (fp == NULL) {
- perror (cmd);
- return NULL;
- }
-
- ret = malloc (sizeof (char *));
- if (ret == NULL) error (EXIT_FAILURE, errno, "malloc");
- ret[0] = NULL;
-
- while (errno = 0, (len = getline (&line, &buflen, fp)) != -1) {
- char *p;
- char *key, *value;
-
- if (len > 0 && line[len-1] == '\n')
- line[len-1] = '\0';
-
- /* Split the line at the first ':' character. */
- p = strchr (line, ':');
- if (p == NULL)
- continue;
-
- *p = '\0';
- key = strdup (line);
- /* Skip leading whitespace in the value. */
- for (++p; *p && c_isspace (*p); ++p)
- ;
- value = strdup (p);
-
- /* Add key and value to the list, and trailing NULL pointer. */
- ret_size += 2;
- ret = realloc (ret, (ret_size + 1) * sizeof (char *));
- if (ret == NULL) error (EXIT_FAILURE, errno, "realloc");
- ret[ret_size-2] = key;
- ret[ret_size-1] = value;
- ret[ret_size] = NULL;
- }
-
- if (errno) {
- perror (cmd);
- guestfs_int_free_string_list (ret);
- return NULL;
- }
-
- return ret;
-}
-
-/**
- * Read a single field from lscpu output.
- *
- * If the field does not exist, returns C<NULL>.
- */
-static const char *
-get_field (char **lscpu, const char *key)
-{
- size_t i;
-
- for (i = 0; lscpu[i] != NULL; i += 2) {
- if (STREQ (lscpu[i], key))
- return lscpu[i+1];
- }
-
- return NULL;
-}
-
-/**
- * Read the CPU vendor from lscpu output.
- */
-static void
-get_vendor (char **lscpu, struct cpu_config *cpu)
-{
- const char *vendor = get_field (lscpu, "Vendor ID");
-
- if (vendor) {
- /* Note this mapping comes from /usr/share/libvirt/cpu_map.xml */
- if (STREQ (vendor, "GenuineIntel"))
- cpu->vendor = strdup ("Intel");
- else if (STREQ (vendor, "AuthenticAMD"))
- cpu->vendor = strdup ("AMD");
- /* Currently aarch64 lscpu has no Vendor ID XXX. */
- }
-}
-
-/**
- * Read the CPU topology from lscpu output.
- */
-static void
-get_topology (char **lscpu, struct cpu_config *cpu)
-{
- const char *v;
-
- v = get_field (lscpu, "Socket(s)");
- if (v)
- ignore_value (sscanf (v, "%u", &cpu->sockets));
- v = get_field (lscpu, "Core(s) per socket");
- if (v)
- ignore_value (sscanf (v, "%u", &cpu->cores));
- v = get_field (lscpu, "Thread(s) per core");
- if (v)
- ignore_value (sscanf (v, "%u", &cpu->threads));
-}
-
-/**
- * Read some important flags from lscpu output.
- */
-static void
-get_flags (char **lscpu, struct cpu_config *cpu)
-{
- const char *flags;
-
- flags = get_field (lscpu, "Flags");
- if (flags) {
- cpu->apic = strstr (flags, " apic ") != NULL;
- cpu->pae = strstr (flags, " pae ") != NULL;
-
- /* aarch64 /proc/cpuinfo has a "Features" field, but lscpu does
- * not expose it. However aarch64 Features does not contain any
- * of the interesting flags above.
- */
- }
-}
-
-/**
- * Find out if the system uses ACPI.
- */
-static void
-get_acpi (struct cpu_config *cpu)
-{
- cpu->acpi = access ("/sys/firmware/acpi", F_OK) == 0;
-}
-
-void
-get_cpu_config (struct cpu_config *cpu)
-{
- CLEANUP_FREE_STRING_LIST char **lscpu = NULL;
-
- free_cpu_config (cpu);
-
- lscpu = get_lscpu ();
- if (lscpu != NULL) {
- get_vendor (lscpu, cpu);
- get_topology (lscpu, cpu);
- get_flags (lscpu, cpu);
- }
-
- get_acpi (cpu);
-}
diff --git a/p2v/dependencies.m4 b/p2v/dependencies.m4
deleted file mode 100644
index 40b3786cb..000000000
--- a/p2v/dependencies.m4
+++ /dev/null
@@ -1,181 +0,0 @@
-dnl This is the list of distro packages which are required by
-dnl virt-p2v.
-dnl
-dnl This file is processed by m4 with only one of the following
-dnl symbols defined (depending on the target distro):
-dnl
-dnl REDHAT=1 Fedora, RHEL, CentOS, SL and workalikes
-dnl DEBIAN=1 Debian and Ubuntu
-dnl ARCHLINUX=1 Arch Linux
-dnl SUSE=1 SUSE, OpenSUSE
-dnl OPENMANDRIVA=1 OpenMandriva
-dnl
-dnl NB 1: Must be one package name per line. Blank lines are ignored.
-dnl
-dnl NB 2: This works differently from appliance/packagelist.in
-dnl because we don't care about the current DISTRO (the one on
-dnl which libguestfs is being compiled), since we can "cross-build"
-dnl the virt-p2v ISO to any other Linux distro.
-dnl
-dnl NB 3: libguestfs is not a dependency of virt-p2v. libguestfs
-dnl only runs on the virt-v2v conversion server.
-
-ifelse(REDHAT,1,
- dnl Used by the virt-p2v binary.
- pcre
- libxml2
- gtk`'GTK_VERSION
- dbus-libs
-
- dnl Run as external programs by the p2v binary.
- /usr/bin/ssh
- /usr/bin/qemu-nbd
- which
-
- dnl Generally useful tools to use within xterm
- vim-minimal
-
- dnl Useful disk and diagnostic utilities.
- iscsi-initiator-utils
-
- dnl X11 environment
- /usr/bin/xinit
- /usr/bin/Xorg
- xorg-x11-drivers
- xorg-x11-fonts-Type1
- dejavu-sans-fonts
- dejavu-sans-mono-fonts
- mesa-dri-drivers
- metacity
-
- NetworkManager
- nm-connection-editor
- network-manager-applet
- dnl dbus is required by nm-applet, but not a dependency in Fedora
- dbus-x11
- dnl sysadmins prefer ifconfig
- net-tools
-
- dnl RHBZ#1157679
- @hardware-support
-)
-
-ifelse(DEBIAN,1,
- libpcre3
- libxml2
-
ifelse(GTK_VERSION,2,libgtk`'GTK_VERSION`'.0-0,libgtk-`'GTK_VERSION`'-0)
- libdbus-1-3
- openssh-client
- qemu-utils
- debianutils
- vim-tiny
- open-iscsi
- xorg
- xserver-xorg-video-all
- fonts-dejavu
- metacity
- network-manager
- network-manager-gnome
- dbus-x11
- net-tools
-)
-
-ifelse(ARCHLINUX,1,
- pcre
- libxml2
- gtk`'GTK_VERSION
- dbus
- openssh
- qemu
- which
- vim-tiny
- open-iscsi
- xorg-xinit
- xorg-server
- xf86-video-*
- ttf-dejavu
- metacity
- NetworkManager
- nm-connection-editor
- network-manager-applet
- dbus-x11
- net-tools
-)
-
-ifelse(SUSE,1,
- pcre
- libxml2
- gtk`'GTK_VERSION
- libdbus-1-3
- qemu-tools
- openssh
- dnl /usr/bin/which is in util-linux on SUSE
- vim
- open-iscsi
- xinit
- xorg-x11-server
- xf86-video-*
- dejavu-fonts
- NetworkManager
- xf86-input-*
- icewm-lite
- dbus-1-x11
- yast2-network
- libyui-qt
- SuSEfirewall2
-)
-
-ifelse(OPENMANDRIVA,1,
- dnl Used by the virt-p2v binary.
- pcre
- libxml2
- gtk`'GTK_VERSION
- dbus-libs
-
- dnl Run as external programs by the p2v binary.
- /usr/bin/ssh
- /usr/bin/qemu-nbd
- which
-
- dnl Generally useful tools to use within xterm
- vim-enhanced
-
- dnl X11 environment
- /usr/bin/xinit
- /usr/bin/Xorg
- xorg-x11-drivers
- xorg-x11-fonts-Type1
- dejavu-sans-fonts
- dejavu-sans-mono-fonts
- mesa-dri-drivers
- kwin_x11
-
- NetworkManager
- nm-connection-editor
- network-manager-applet
- dnl dbus is required by nm-applet, but not a dependency in Fedora
- dbus-x11
- dnl sysadmins prefer ifconfig
- net-tools
-)
-
-dnl Run as external programs by the p2v binary.
-curl
-ethtool
-gawk
-lsscsi
-pciutils
-usbutils
-util-linux
-xterm
-
-dnl Generally useful tools to use within xterm
-less
-
-dnl The hwdata package contains PCI IDs, used by virt-p2v to display
-dnl network vendor information (RHBZ#855059).
-hwdata
-
-dnl Useful disk and diagnostic utilities.
-hdparm
-smartmontools
diff --git a/p2v/generate-p2v-authors.pl b/p2v/generate-p2v-authors.pl
deleted file mode 100755
index 18a825bd7..000000000
--- a/p2v/generate-p2v-authors.pl
+++ /dev/null
@@ -1,54 +0,0 @@
-#!/usr/bin/env perl
-# Copyright (C) 2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-use strict;
-use warnings;
-
-# Clean up the program name.
-my $progname = $0;
-$progname =~ s{.*/}{};
-
-my $filename = shift or die "$progname: missing filename";
-
-open(my $fh, '<', $filename) or die "Unable to open file
'$filename': $!";
-
-print <<"EOF";
-/* libguestfs generated file
- * WARNING: THIS FILE IS GENERATED FROM THE FOLLOWING FILES:
- * $filename
- * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
- */
-
-#include <config.h>
-
-#include "p2v.h"
-
-/* Authors involved with virt-v2v and virt-p2v directly. */
-const char *authors[] = {
-EOF
-
-while (<$fh>) {
- chomp $_;
- printf " \"%s\",\n", $_;
-}
-
-print <<"EOF";
- NULL
-};
-EOF
-
-close($fh);
diff --git a/p2v/generate-p2v-config.pl b/p2v/generate-p2v-config.pl
deleted file mode 100755
index 01387e04b..000000000
--- a/p2v/generate-p2v-config.pl
+++ /dev/null
@@ -1,915 +0,0 @@
-#!/usr/bin/env perl
-# Copyright (C) 2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-use strict;
-use warnings;
-
-use Class::Struct;
-use Getopt::Long;
-use List::Util qw(any);
-
-struct ConfigSection =>
-{
- name => '$',
- elements => '@',
-};
-
-struct ConfigString =>
-{
- name => '$',
-};
-
-struct ConfigInt =>
-{
- name => '$',
- value => '$',
-};
-
-struct ConfigBool =>
-{
- name => '$',
-};
-
-struct ConfigUInt64 =>
-{
- name => '$',
-};
-
-struct ConfigUnsigned =>
-{
- name => '$',
-};
-
-struct ConfigEnum =>
-{
- name => '$',
- enum => '$',
-};
-
-struct ConfigStringList =>
-{
- name => '$',
-};
-
-struct manual_entry =>
-{
- shortopt => '$',
- description => '$',
-};
-
-# Enums.
-my @enums = (
- ["basis", (
- ["BASIS_UNKNOWN", "unknown", "RTC could not be
read"],
- ["BASIS_UTC", "utc", "RTC is either UTC or an
offset from UTC"],
- ["BASIS_LOCALTIME", "localtime", "RTC is localtime"],
- )],
- ["output_allocation", (
- ["OUTPUT_ALLOCATION_NONE", "none", "output
allocation not set"],
- ["OUTPUT_ALLOCATION_SPARSE", "sparse",
"sparse"],
- ["OUTPUT_ALLOCATION_PREALLOCATED", "preallocated",
"preallocated"],
- )],
-);
-
-# Configuration fields.
-my @fields = [
- ConfigSection->new(
- name => 'remote',
- elements => [
- ConfigString->new(name => 'server'),
- ConfigInt->new(name => 'port', value => 22),
- ],
- ),
- ConfigSection->new(
- name => 'auth',
- elements => [
- ConfigString->new(name => 'username'),
- ConfigString->new(name => 'password'),
- ConfigSection->new(
- name => 'identity',
- elements => [
- ConfigString->new(name => 'url'),
- ConfigString->new(name => 'file'),
- ConfigBool->new(name => 'file_needs_update'),
- ],
- ),
- ConfigBool->new(name => 'sudo'),
- ],
- ),
- ConfigString->new(name => 'guestname'),
- ConfigInt->new(name => 'vcpus', value => 0),
- ConfigUInt64->new(name => 'memory'),
- ConfigSection->new(
- name => 'cpu',
- elements => [
- ConfigString->new(name => 'vendor'),
- ConfigString->new(name => 'model'),
- ConfigUnsigned->new(name => 'sockets'),
- ConfigUnsigned->new(name => 'cores'),
- ConfigUnsigned->new(name => 'threads'),
- ConfigBool->new(name => 'acpi'),
- ConfigBool->new(name => 'apic'),
- ConfigBool->new(name => 'pae'),
- ],
- ),
- ConfigSection->new(
- name => 'rtc',
- elements => [
- ConfigEnum->new(name => 'basis', enum => 'basis'),
- ConfigInt->new(name => 'offset', value => 0),
- ],
- ),
- ConfigStringList->new(name => 'disks'),
- ConfigStringList->new(name => 'removable'),
- ConfigStringList->new(name => 'interfaces'),
- ConfigStringList->new(name => 'network_map'),
- ConfigSection->new(
- name => 'output',
- elements => [
- ConfigString->new(name => 'type'),
- ConfigEnum->new(name => 'allocation', enum =>
'output_allocation'),
- ConfigString->new(name => 'connection'),
- ConfigString->new(name => 'format'),
- ConfigString->new(name => 'storage'),
- ],
- ),
-];
-
-# Some /proc/cmdline p2v.* options were renamed when we introduced
-# the generator. This map creates backwards compatibility mappings
-# for these.
-my @cmdline_aliases = (
- ["p2v.remote.server", "p2v.server"],
- ["p2v.remote.port", "p2v.port"],
- ["p2v.auth.username", "p2v.username"],
- ["p2v.auth.password", "p2v.password"],
- ["p2v.auth.identity.url", "p2v.identity"],
- ["p2v.auth.sudo", "p2v.sudo"],
- ["p2v.guestname", "p2v.name"],
- ["p2v.network_map", "p2v.network"],
- ["p2v.output.type", "p2v.o"],
- ["p2v.output.allocation", "p2v.oa"],
- ["p2v.output.connection", "p2v.oc"],
- ["p2v.output.format", "p2v.of"],
- ["p2v.output.storage", "p2v.os"],
-);
-
-# Some config entries are not exposed on the kernel command line.
-my @cmdline_ignore = (
- "p2v.auth.identity.file",
- "p2v.auth.identity.file_needs_update",
-);
-
-# Man page snippets for each kernel command line setting.
-my %cmdline_manual = (
- "p2v.remote.server" => manual_entry->new(
- shortopt => "SERVER",
- description => "
-The name or IP address of the conversion server.
-
-This is always required if you are using the kernel configuration
-method. If virt-p2v does not find this on the kernel command line
-then it switches to the GUI (interactive) configuration method.",
- ),
- "p2v.remote.port" => manual_entry->new(
- shortopt => "PORT",
- description => "
-The SSH port number on the conversion server (default: C<22>).",
- ),
- "p2v.auth.username" => manual_entry->new(
- shortopt => "USERNAME",
- description => "
-The SSH username that we log in as on the conversion server
-(default: C<root>).",
- ),
- "p2v.auth.password" => manual_entry->new(
- shortopt => "PASSWORD",
- description => "
-The SSH password that we use to log in to the conversion server.
-
-The default is to try with no password. If this fails then virt-p2v
-will ask the user to type the password (probably several times during
-conversion).
-
-This setting is ignored if C<p2v.auth.identity.url> is present.",
- ),
- "p2v.auth.identity.url" => manual_entry->new(
- shortopt => "URL",
- description => "
-Provide a URL pointing to an SSH identity (private key) file. The URL
-is interpreted by L<curl(1)> so any URL that curl supports can be used
-here, including C<https://> and C<file://>. For more information on
-using SSH identities, see L</SSH IDENTITIES> below.
-
-If C<p2v.auth.identity.url> is present, it overrides C<p2v.auth.password>.
-There is no fallback.",
- ),
- "p2v.auth.sudo" => manual_entry->new(
- shortopt => "", # ignored for booleans
- description => "
-Use C<p2v.sudo> to tell virt-p2v to use L<sudo(8)> to gain root
-privileges on the conversion server after logging in as a non-root
-user (default: do not use sudo).",
- ),
- "p2v.guestname" => manual_entry->new(
- shortopt => "GUESTNAME",
- description => "
-The name of the guest that is created. The default is to try to
-derive a name from the physical machine’s hostname (if possible) else
-use a randomly generated name.",
- ),
- "p2v.vcpus" => manual_entry->new(
- shortopt => "N",
- description => "
-The number of virtual CPUs to give to the guest. The default is to
-use the same as the number of physical CPUs.",
- ),
- "p2v.memory" => manual_entry->new(
- shortopt => "n(M|G)",
- description => "
-The size of the guest memory. You must specify the unit such as
-megabytes or gigabytes by using for example C<p2v.memory=1024M> or
-C<p2v.memory=1G>.
-
-The default is to use the same amount of RAM as on the physical
-machine.",
- ),
- "p2v.cpu.vendor" => manual_entry->new(
- shortopt => "VENDOR",
- description => "
-The vCPU vendor, eg. \"Intel\" or \"AMD\". The default is to use
-the same CPU vendor as the physical machine.",
- ),
- "p2v.cpu.model" => manual_entry->new(
- shortopt => "MODEL",
- description => "
-The vCPU model, eg. \"IvyBridge\". The default is to use the same
-CPU model as the physical machine.",
- ),
- "p2v.cpu.sockets" => manual_entry->new(
- shortopt => "N",
- description => "
-Number of vCPU sockets to use. The default is to use the same as the
-physical machine.",
- ),
- "p2v.cpu.cores" => manual_entry->new(
- shortopt => "N",
- description => "
-Number of vCPU cores to use. The default is to use the same as the
-physical machine.",
- ),
- "p2v.cpu.threads" => manual_entry->new(
- shortopt => "N",
- description => "
-Number of vCPU hyperthreads to use. The default is to use the same
-as the physical machine.",
- ),
- "p2v.cpu.acpi" => manual_entry->new(
- shortopt => "", # ignored for booleans
- description => "
-Whether to enable ACPI in the remote virtual machine. The default is
-to use the same as the physical machine.",
- ),
- "p2v.cpu.apic" => manual_entry->new(
- shortopt => "", # ignored for booleans
- description => "
-Whether to enable APIC in the remote virtual machine. The default is
-to use the same as the physical machine.",
- ),
- "p2v.cpu.pae" => manual_entry->new(
- shortopt => "", # ignored for booleans
- description => "
-Whether to enable PAE in the remote virtual machine. The default is
-to use the same as the physical machine.",
- ),
- "p2v.rtc.basis" => manual_entry->new(
- shortopt => "", # ignored for enums
- description => "
-Set the basis of the Real Time Clock in the virtual machine. The
-default is to try to detect this setting from the physical machine.",
- ),
- "p2v.rtc.offset" => manual_entry->new(
- shortopt => "[+|-]HOURS",
- description => "
-The offset of the Real Time Clock from UTC. The default is to try
-to detect this setting from the physical machine.",
- ),
- "p2v.disks" => manual_entry->new(
- shortopt => "sda,sdb,...",
- description => "
-A list of physical hard disks to convert, for example:
-
- p2v.disks=sda,sdc
-
-The default is to convert all local hard disks that are found.",
- ),
- "p2v.removable" => manual_entry->new(
- shortopt => "sra,srb,...",
- description => "
-A list of removable media to convert. The default is to create
-virtual removable devices for every physical removable device found.
-Note that the content of removable media is never copied over.",
- ),
- "p2v.interfaces" => manual_entry->new(
- shortopt => "em1,...",
- description => "
-A list of network interfaces to convert. The default is to create
-virtual network interfaces for every physical network interface found.",
- ),
- "p2v.network_map" => manual_entry->new(
- shortopt => "interface:target,...",
- description => "
-Controls how network interfaces are connected to virtual networks on
-the target hypervisor. The default is to connect all network
-interfaces to the target C<default> network.
-
-You give a comma-separated list of C<interface:target> pairs, plus
-optionally a default target. For example:
-
- p2v.network=em1:ovirtmgmt
-
-maps interface C<em1> to target network C<ovirtmgmt>.
-
- p2v.network=em1:ovirtmgmt,em2:management,other
-
-maps interface C<em1> to C<ovirtmgmt>, and C<em2> to
C<management>,
-and any other interface that is found to C<other>.",
- ),
- "p2v.output.type" => manual_entry->new(
- shortopt => "(libvirt|local|...)",
- description => "
-Set the output mode. This is the same as the virt-v2v I<-o> option.
-See L<virt-v2v(1)/OPTIONS>.
-
-If not specified, the default is C<local>, and the converted guest is
-written to F</var/tmp>.",
- ),
- "p2v.output.allocation" => manual_entry->new(
- shortopt => "", # ignored for enums
- description => "
-Set the output allocation mode. This is the same as the virt-v2v
-I<-oa> option. See L<virt-v2v(1)/OPTIONS>.",
- ),
- "p2v.output.connection" => manual_entry->new(
- shortopt => "URI",
- description => "
-Set the output connection libvirt URI. This is the same as the
-virt-v2v I<-oc> option. See L<virt-v2v(1)/OPTIONS> and
-L<http://libvirt.org/uri.html>",
- ),
- "p2v.output.format" => manual_entry->new(
- shortopt => "(raw|qcow2|...)",
- description => "
-Set the output format. This is the same as the virt-v2v I<-of>
-option. See L<virt-v2v(1)/OPTIONS>.",
- ),
- "p2v.output.storage" => manual_entry->new(
- shortopt => "STORAGE",
- description => "
-Set the output storage. This is the same as the virt-v2v I<-os>
-option. See L<virt-v2v(1)/OPTIONS>.
-
-If not specified, the default is F</var/tmp> (on the conversion server).",
- ),
-);
-
-# Clean up the program name.
-my $progname = $0;
-$progname =~ s{.*/}{};
-
-my $filename;
-my $output;
-
-GetOptions(
- 'file=s' => \$filename,
- 'output=s' => \$output,
- 'help' => sub { pod2usage(1); },
-) or pod2usage(2);
-die "$progname: Option --file not specified.\n" unless $filename;
-# die "$progname: Option --output not specified.\n" unless $output;
-
-sub print_generated_header {
- my $fh = shift;
- print $fh <<"EOF";
-/* libguestfs generated file
- * WARNING: THIS FILE IS GENERATED FROM THE FOLLOWING FILES:
- * $filename
- * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
- */
-
-EOF
-}
-
-sub generate_config_struct {
- my ($fh, $name, $fields) = @_;
- # If there are any ConfigSection (sub-structs) in any of the
- # fields then output those first.
- foreach my $field (@$fields) {
- if (ref($field) eq 'ConfigSection') {
- generate_config_struct($fh, $field->name . "_config",
$field->elements);
- }
- }
-
- # Now generate this struct.
- print $fh "struct $name {\n";
- foreach my $field (@$fields) {
- my $type = ref($field);
- if ($type eq 'ConfigSection') {
- printf $fh " struct %s_config %s;\n", $field->name, $field->name;
- } elsif ($type eq 'ConfigString') {
- printf $fh " char *%s;\n", $field->name;
- } elsif ($type eq 'ConfigInt') {
- printf $fh " int %s;\n", $field->name;
- } elsif ($type eq 'ConfigBool') {
- printf $fh " bool %s;\n", $field->name;
- } elsif ($type eq 'ConfigUInt64') {
- printf $fh " uint64_t %s;\n", $field->name;
- } elsif ($type eq 'ConfigUnsigned') {
- printf $fh " unsigned %s;\n", $field->name;
- } elsif ($type eq 'ConfigEnum') {
- printf $fh " enum %s %s;\n", $field->enum, $field->name;
- } elsif ($type eq 'ConfigStringList') {
- printf $fh " char **%s;\n", $field->name;
- }
- }
- print $fh "};\n";
- print $fh "\n"
-}
-
-sub generate_p2v_config_h {
- my $fh = shift;
- print_generated_header($fh);
- print $fh <<"EOF";
-#ifndef GUESTFS_P2V_CONFIG_H
-#define GUESTFS_P2V_CONFIG_H
-
-#include <stdbool.h>
-#include <stdint.h>
-
-EOF
-
- # Generate enums.
- foreach my $enum (@enums) {
- my $name = shift @$enum;
- print $fh "enum $name {\n";
- foreach my $items (@$enum) {
- my ($n, $foo, $comment) = @$items;
- printf $fh " %-25s /* %s */\n", ($n . ","), $comment;
- }
- print $fh "};\n";
- print $fh "\n"
- }
-
- # Generate struct config.
- generate_config_struct($fh, "config", @fields);
-
- print $fh <<'EOF';
-extern struct config *new_config (void);
-extern struct config *copy_config (struct config *);
-extern void free_config (struct config *);
-extern void print_config (struct config *, FILE *);
-
-#endif /* GUESTFS_P2V_CONFIG_H */
-EOF
-}
-
-sub generate_field_initialization {
- my ($fh, $v, $fields) = @_;
- foreach my $field (@$fields) {
- my $type = ref($field);
- if ($type eq 'ConfigSection') {
- my $lv = $v . $field->name . '.';
- generate_field_initialization($fh, $lv, $field->elements);
- } elsif ($type eq 'ConfigInt') {
- if ($field->value > 0) {
- printf $fh " %s%s = %d;\n", $v, $field->name, $field->value;
- }
- }
- }
-}
-
-sub generate_field_copy {
- my ($fh, $v, $fields) = @_;
- foreach my $field (@$fields) {
- my $type = ref($field);
- if ($type eq 'ConfigSection') {
- my $lv = $v . $field->name . '.';
- generate_field_copy($fh, $lv, $field->elements);
- } elsif ($type eq 'ConfigString') {
- printf $fh " if (%s%s) {\n", $v, $field->name;
- printf $fh " %s%s = strdup (%s%s);\n", $v, $field->name, $v,
$field->name;
- printf $fh " if (%s%s == NULL)\n", $v, $field->name;
- printf $fh " error (EXIT_FAILURE, errno, \"strdup: %%s\",
\"%s\");\n", $field->name;
- printf $fh " }\n";
- } elsif ($type eq 'ConfigStringList') {
- printf $fh " if (%s%s) {\n", $v, $field->name;
- printf $fh " %s%s = guestfs_int_copy_string_list (%s%s);\n", $v,
$field->name, $v, $field->name;
- printf $fh " if (%s%s == NULL)\n", $v, $field->name;
- printf $fh " error (EXIT_FAILURE, errno, \"copy string list:
%%s\", \"%s\");\n", $field->name;
- printf $fh " }\n";
- }
- }
-}
-
-sub generate_field_free {
- my ($fh, $v, $fields) = @_;
- foreach my $field (@$fields) {
- my $type = ref($field);
- if ($type eq 'ConfigSection') {
- my $lv = $v . $field->name . '.';
- generate_field_free($fh, $lv, $field->elements);
- } elsif ($type eq 'ConfigString') {
- printf $fh " free (%s%s);\n", $v, $field->name;
- } elsif ($type eq 'ConfigStringList') {
- printf $fh " guestfs_int_free_string_list (%s%s);\n", $v,
$field->name;
- }
- }
-}
-
-sub generate_field_print {
- my ($fh, $prefix, $v, $fields) = @_;
- foreach my $field (@$fields) {
- my $type = ref($field);
- my $printable_name = defined($prefix)
- ? $prefix . '.' . $field->name
- : $field->name;
- if ($type eq 'ConfigSection') {
- my $lv = $v . $field->name . '.';
- generate_field_print($fh, $printable_name, $lv, $field->elements);
- } elsif ($type eq 'ConfigString') {
- print $fh " fprintf (fp, \"%-20s %s\\n\",\n";
- printf $fh " \"%s\", %s%s ? %s%s :
\"(none)\");\n",
- $printable_name, $v, $field->name, $v, $field->name;
- } elsif ($type eq 'ConfigInt') {
- print $fh " fprintf (fp, \"%-20s %d\\n\",\n";
- printf $fh " \"%s\", %s%s);\n", $printable_name, $v,
$field->name;
- } elsif ($type eq 'ConfigBool') {
- print $fh " fprintf (fp, \"%-20s %s\\n\",\n";
- printf $fh " \"%s\", %s%s ? \"true\" :
\"false\");\n",
- $printable_name, $v, $field->name;
- } elsif ($type eq 'ConfigUInt64') {
- print $fh " fprintf (fp, \"%-20s %\" PRIu64
\"\\n\",\n";
- printf $fh " \"%s\", %s%s);\n", $printable_name, $v,
$field->name;
- } elsif ($type eq 'ConfigUnsigned') {
- print $fh " fprintf (fp, \"%-20s %u\\n\",\n";
- printf $fh " \"%s\", %s%s);\n", $printable_name, $v,
$field->name;
- } elsif ($type eq 'ConfigEnum') {
- printf $fh " fprintf (fp, \"%%-20s \", \"%s\");\n",
$printable_name;
- printf $fh " print_%s (%s%s, fp);\n", $field->enum, $v,
$field->name;
- print $fh " fprintf (fp, \"\\n\");\n";
- } elsif ($type eq 'ConfigStringList') {
- printf $fh " fprintf (fp, \"%%-20s\", \"%s\");\n",
$printable_name;
- printf $fh " if (%s%s) {\n", $v, $field->name;
- printf $fh " for (i = 0; %s%s[i] != NULL; ++i)\n", $v,
$field->name;
- printf $fh " fprintf (fp, \" %%s\", %s%s[i]);\n", $v,
$field->name;
- print $fh " }\n";
- print $fh " else\n";
- print $fh " fprintf (fp, \" (none)\\n\");\n";
- print $fh " fprintf (fp, \"\\n\");\n";
- }
- }
-}
-
-sub generate_p2v_config_c {
- my $fh = shift;
- print_generated_header($fh);
- print $fh <<"EOF";
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include <stdbool.h>
-#include <inttypes.h>
-#include <errno.h>
-#include <error.h>
-
-#include "p2v.h"
-#include "p2v-config.h"
-
-/**
- * Allocate a new config struct.
- */
-struct config *
-new_config (void)
-{
- struct config *c;
-
- c = calloc (1, sizeof *c);
- if (c == NULL)
- error (EXIT_FAILURE, errno, "calloc");
-
-EOF
-
- generate_field_initialization($fh, "c->", @fields);
-
- print $fh <<"EOF";
-
- return c;
-}
-
-/**
- * Copy a config struct.
- */
-struct config *
-copy_config (struct config *old)
-{
- struct config *c = new_config ();
-
- memcpy (c, old, sizeof *c);
-
- /* Need to deep copy strings and string lists. */
-EOF
-
- generate_field_copy($fh, "c->", @fields);
-
- print $fh <<"EOF";
-
- return c;
-}
-
-/**
- * Free a config struct.
- */
-void
-free_config (struct config *c)
-{
- if (c == NULL)
- return;
-
-EOF
-
- generate_field_free($fh, "c->", @fields);
-
- print $fh <<"EOF";
-}
-
-EOF
-
- foreach my $enum (@enums) {
- my $name = shift @$enum;
- print $fh "static void\n";
- printf $fh "print_%s (enum %s v, FILE *fp)\n", $name, $name;
- print $fh "{\n";
- printf $fh " switch (v) {\n";
- foreach my $items (@$enum) {
- my ($n, $cmdline, $foo) = @$items;
- printf $fh " case %s:\n", $n;
- printf $fh " fprintf (fp, \"%s\");\n", $cmdline;
- print $fh " break;\n";
- }
- print $fh " }\n";
- print $fh "}\n";
- print $fh "\n"
- }
-
- print $fh <<"EOF";
-/**
- * Print the conversion parameters and other important information.
- */
-void
-print_config (struct config *c, FILE *fp)
-{
- size_t i;
-
- fprintf (fp, \"%-20s %s\\n\", \"local version\",
PACKAGE_VERSION_FULL);
- fprintf (fp, \"%-20s %s\\n\", \"remote version\",
- v2v_version ? v2v_version : \"unknown\");
-EOF
-
- generate_field_print($fh, undef, "c->", @fields);
-
- print $fh <<"EOF";
-}
-EOF
-}
-
-sub find_alias {
- my $name = shift;
- foreach my $alias (@cmdline_aliases) {
- if ($name eq @$alias[0]) {
- return @$alias[1];
- }
- }
- return;
-}
-
-sub find_enum {
- my $name = shift;
- foreach my $enum (@enums) {
- my $n = shift @$enum;
- if ($n eq $name) {
- return @$enum;
- }
- }
- return;
-}
-
-sub generate_field_config {
- my ($fh, $prefix, $v, $fields) = @_;
-
- foreach my $field (@$fields) {
- my $type = ref($field);
- if ($type eq 'ConfigSection') {
- my $lprefix = $prefix . '.' . $field->name;
- my $lv = $v . $field->name . '.';
- generate_field_config($fh, $lprefix, $lv, $field->elements);
- } else {
- my $key = $prefix . '.' . $field->name;
-
- if (not (any { $_ eq $key } @cmdline_ignore)) {
- # Is there an alias for this field?
- my $alias = find_alias($key);
-
- printf $fh " if ((p = get_cmdline_key (cmdline, \"%s\")) !=
NULL", $key;
- if (defined($alias)) {
- print $fh " ||\n";
- printf $fh " (p = get_cmdline_key (cmdline, \"%s\")) !=
NULL", $alias;
- }
- print $fh ") {\n";
-
- # Parse the field.
- if ($type eq 'ConfigString') {
- printf $fh " free (%s%s);\n", $v, $field->name;
- printf $fh " %s%s = strdup (p);\n", $v, $field->name;
- printf $fh " if (%s%s == NULL)\n", $v, $field->name;
- print $fh " error (EXIT_FAILURE, errno,
\"strdup\");\n";
- } elsif ($type eq 'ConfigInt') {
- printf $fh " if (sscanf (p, \"%%d\", &%s%s) !=
1)\n", $v, $field->name;
- print $fh " error (EXIT_FAILURE, errno,\n";
- print $fh " \"cannot parse %s=%s from the kernel command
line\",\n";
- printf $fh " \"%s\", p);\n", $key;
- } elsif ($type eq 'ConfigBool') {
- printf $fh " %s%s = guestfs_int_is_true (p) || STREQ (p,
\"\");\n", $v, $field->name;
- } elsif ($type eq 'ConfigUInt64') {
- print $fh " xerr = xstrtoull (p, NULL, 0, &ull,
\"0kKMGTPEZY\");\n";
- print $fh " if (xerr != LONGINT_OK)\n";
- print $fh " error (EXIT_FAILURE, 0,\n";
- print $fh " \"cannot parse %s=%s from the kernel command
line\",\n";
- printf $fh " \"%s\", p);\n", $key;
- printf $fh " %s%s = ull;\n", $v, $field->name;
- } elsif ($type eq 'ConfigUnsigned') {
- printf $fh " if (sscanf (p, \"%%u\", &%s%s) !=
1)\n", $v, $field->name;
- print $fh " error (EXIT_FAILURE, errno,\n";
- print $fh " \"cannot parse %s=%s from the kernel command
line\",\n";
- printf $fh " \"%s\", p);\n", $key;
- } elsif ($type eq 'ConfigEnum') {
- my @enum_choices = find_enum($field->enum) or die "cannot find
ConfigEnum $field->enum";
- printf $fh " ";
- foreach my $items (@enum_choices) {
- my ($n, $cmdline, $foo) = @$items;
- printf $fh "if (STREQ (p, \"%s\"))\n", $cmdline;
- printf $fh " %s%s = %s;\n", $v, $field->name, $n;
- print $fh " else ";
- }
- print $fh "{\n";
- print $fh " error (EXIT_FAILURE, 0,\n";
- print $fh " \"invalid value %s=%s from the kernel command
line\",\n";
- printf $fh " \"%s\", p);\n", $key;
- print $fh " }\n";
- } elsif ($type eq 'ConfigStringList') {
- printf $fh " guestfs_int_free_string_list (%s%s);\n", $v,
$field->name;
- printf $fh " %s%s = guestfs_int_split_string (',', p);\n",
$v, $field->name;
- printf $fh " if (%s%s == NULL)\n", $v, $field->name;
- print $fh " error (EXIT_FAILURE, errno,
\"strdup\");\n";
- }
-
- print $fh " }\n";
- print $fh "\n";
- }
- }
- }
-}
-
-sub generate_p2v_kernel_config_c {
- my $fh = shift;
- print_generated_header($fh);
- print $fh <<"EOF";
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <inttypes.h>
-#include <unistd.h>
-#include <errno.h>
-#include <error.h>
-
-#include "xstrtol.h"
-
-#include "p2v.h"
-#include "p2v-config.h"
-
-/**
- * Read the kernel command line and parse out any C<p2v.*> fields that
- * we understand into the config struct.
- */
-void
-update_config_from_kernel_cmdline (struct config *c, char **cmdline)
-{
- const char *p;
- strtol_error xerr;
- unsigned long long ull;
-
-EOF
-
- generate_field_config($fh, "p2v", "c->", @fields);
-
- print $fh <<"EOF";
- if (c->auth.identity.url != NULL)
- c->auth.identity.file_needs_update = 1;
-
- /* Undocumented command line parameter used for testing command line
- * parsing.
- */
- p = get_cmdline_key (cmdline, "p2v.dump_config_and_exit");
- if (p) {
- print_config (c, stdout);
- exit (EXIT_SUCCESS);
- }
-}
-EOF
-}
-
-sub generate_field_config_pod {
- my ($fh, $prefix, $fields) = @_;
-
- foreach my $field (@$fields) {
- my $type = ref($field);
- if ($type eq 'ConfigSection') {
- my $lprefix = $prefix . '.' . $field->name;
- generate_field_config_pod($fh, $lprefix, $field->elements);
- } else {
- my $key = $prefix . '.' . $field->name;
-
- if (not (any { $_ eq $key } @cmdline_ignore)) {
- # Is there an alias for this field?
- my $manual_entry = $cmdline_manual{$key} or die "missing manual entry for
$key";
-
- # For booleans there is no shortopt field. For enums
- # we generate it.
- my $shortopt;
- if ($type eq 'ConfigBool') {
- die "non-empty shortopt for $field->name" if
$manual_entry->shortopt ne '';
- $shortopt = '';
- } elsif ($type eq 'ConfigEnum') {
- die "non-empty shortopt for $field->name" if
$manual_entry->shortopt ne '';
- my @enum_choices = find_enum($field->enum) or die "cannot find
ConfigEnum $field->enum";
- $shortopt = "=(" . join('|', map { $_->[1] }
@enum_choices) . ")";
- } else {
- $shortopt = "=" . $manual_entry->shortopt;
- }
-
- # The description must not end with \n
- die "description of $key must not end with \\n" if
$manual_entry->description =~ /\n\z/;
-
- # Is there an alias for this field?
- my $alias = find_alias($key);
- printf $fh "=item B<%s%s>\n\n", $key, $shortopt;
- if (defined($alias)) {
- printf $fh "=item B<%s%s>\n\n", $alias, $shortopt;
- }
-
- printf $fh "%s\n\n", $manual_entry->description;
- }
- }
- }
-}
-
-sub write_to {
- my $fn = shift;
- if (defined($output)) {
- open(my $fh, '>', $output) or die "Could not open file
'$output': $!";
- $fn->($fh, @_);
- close($fh);
- } else {
- $fn->(*STDOUT, @_);
- }
-}
-
-if ($filename eq 'config.c') {
- write_to(\&generate_p2v_config_c);
-} elsif ($filename eq 'kernel-config.c') {
- write_to(\&generate_p2v_kernel_config_c);
-} elsif ($filename eq 'p2v-config.h') {
- write_to(\&generate_p2v_config_h);
-} elsif ($filename eq 'virt-p2v-kernel-config.pod') {
- write_to(\&generate_field_config_pod, "p2v", @fields);
-} else {
- die "$progname: unrecognized output file '$filename'\n";
-}
diff --git a/p2v/gui-gtk2-compat.h b/p2v/gui-gtk2-compat.h
deleted file mode 100644
index 65569ddbe..000000000
--- a/p2v/gui-gtk2-compat.h
+++ /dev/null
@@ -1,117 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2009-2019 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/* Backwards compatibility for ancient RHEL 5 Gtk 2.10. */
-#ifndef GTK_COMBO_BOX_TEXT
-#define GTK_COMBO_BOX_TEXT GTK_COMBO_BOX
-#define gtk_combo_box_text_new() gtk_combo_box_new_text()
-#define gtk_combo_box_text_append_text(combo, text) \
- gtk_combo_box_append_text((combo), (text))
-#define gtk_combo_box_text_get_active_text(combo) \
- gtk_combo_box_get_active_text((combo))
-#endif
-
-#if !GTK_CHECK_VERSION(2,12,0) /* gtk < 2.12 */
-#define gtk_widget_set_tooltip_markup(widget, text) /* nothing */
-#endif
-
-#if !GTK_CHECK_VERSION(2,14,0) /* gtk < 2.14 */
-#define gtk_dialog_get_content_area(dlg) ((dlg)->vbox)
-#endif
-
-#if !GTK_CHECK_VERSION(2,18,0) /* gtk < 2.18 */
-static void
-gtk_cell_renderer_set_alignment (GtkCellRenderer *cell,
- gfloat xalign, gfloat yalign)
-{
- if ((xalign != cell->xalign) || (yalign != cell->yalign)) {
- g_object_freeze_notify (G_OBJECT (cell));
-
- if (xalign != cell->xalign) {
- cell->xalign = xalign;
- g_object_notify (G_OBJECT (cell), "xalign");
- }
-
- if (yalign != cell->yalign) {
- cell->yalign = yalign;
- g_object_notify (G_OBJECT (cell), "yalign");
- }
-
- g_object_thaw_notify (G_OBJECT (cell));
- }
-}
-#endif
-
-#if !GTK_CHECK_VERSION(2,20,0) /* gtk < 2.20 */
-typedef struct _ResponseData ResponseData;
-
-struct _ResponseData
-{
- gint response_id;
-};
-
-static void
-response_data_free (gpointer data)
-{
- g_slice_free (ResponseData, data);
-}
-
-static ResponseData *
-get_response_data (GtkWidget *widget, gboolean create)
-{
- ResponseData *ad = g_object_get_data (G_OBJECT (widget),
- "gtk-dialog-response-data");
-
- if (ad == NULL && create) {
- ad = g_slice_new (ResponseData);
-
- g_object_set_data_full (G_OBJECT (widget),
- g_intern_static_string ("gtk-dialog-response-data"),
- ad,
- response_data_free);
- }
-
- return ad;
-}
-
-static GtkWidget *
-gtk_dialog_get_widget_for_response (GtkDialog *dialog, gint response_id)
-{
- GList *children;
- GList *tmp_list;
-
- children = gtk_container_get_children (GTK_CONTAINER (dialog->action_area));
-
- tmp_list = children;
- while (tmp_list != NULL) {
- GtkWidget *widget = tmp_list->data;
- ResponseData *rd = get_response_data (widget, FALSE);
-
- if (rd && rd->response_id == response_id) {
- g_list_free (children);
- return widget;
- }
-
- tmp_list = tmp_list->next;
- }
-
- g_list_free (children);
-
- return NULL;
-}
-#endif /* gtk < 2.20 */
diff --git a/p2v/gui-gtk3-compat.h b/p2v/gui-gtk3-compat.h
deleted file mode 100644
index 212c3af28..000000000
--- a/p2v/gui-gtk3-compat.h
+++ /dev/null
@@ -1,140 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2009-2019 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/* Backwards compatibility for some deprecated functions in Gtk 3. */
-#if !GTK_CHECK_VERSION(3,2,0) /* gtk < 3.2 */
-static gboolean
-gdk_event_get_button (const GdkEvent *event, guint *button)
-{
- if (event->type != GDK_BUTTON_PRESS)
- return FALSE;
-
- *button = ((const GdkEventButton *) event)->button;
- return TRUE;
-}
-#endif
-
-#if GTK_CHECK_VERSION(3,2,0) /* gtk >= 3.2 */
-#define hbox_new(box, homogeneous, spacing) \
- do { \
- (box) = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, spacing); \
- if (homogeneous) \
- gtk_box_set_homogeneous (GTK_BOX (box), TRUE); \
- } while (0)
-#define vbox_new(box, homogeneous, spacing) \
- do { \
- (box) = gtk_box_new (GTK_ORIENTATION_VERTICAL, spacing); \
- if (homogeneous) \
- gtk_box_set_homogeneous (GTK_BOX (box), TRUE); \
- } while (0)
-#else /* gtk < 3.2 */
-#define hbox_new(box, homogeneous, spacing) \
- (box) = gtk_hbox_new ((homogeneous), (spacing))
-#define vbox_new(box, homogeneous, spacing) \
- (box) = gtk_vbox_new ((homogeneous), (spacing))
-#endif
-
-#if GTK_CHECK_VERSION(3,4,0) /* gtk >= 3.4 */
-/* Copy this enum from GtkTable, as when building without deprecated
- * functions this is not automatically pulled in.
- */
-typedef enum
-{
- GTK_EXPAND = 1 << 0,
- GTK_SHRINK = 1 << 1,
- GTK_FILL = 1 << 2
-} GtkAttachOptions;
-/* GtkGrid is sufficiently similar to GtkTable that we can just
- * redefine these functions.
- */
-#define table_new(grid, rows, columns) \
- (grid) = gtk_grid_new ()
-#define table_attach(grid, child, left, right, top, bottom, xoptions, yoptions, xpadding,
ypadding) \
- do { \
- if (((xoptions) & GTK_EXPAND) != 0) \
- gtk_widget_set_hexpand ((child), TRUE); \
- if (((xoptions) & GTK_FILL) != 0) \
- gtk_widget_set_halign ((child), GTK_ALIGN_FILL); \
- if (((yoptions) & GTK_EXPAND) != 0) \
- gtk_widget_set_vexpand ((child), TRUE); \
- if (((yoptions) & GTK_FILL) != 0) \
- gtk_widget_set_valign ((child), GTK_ALIGN_FILL); \
- set_padding ((child), (xpadding), (ypadding)); \
- gtk_grid_attach (GTK_GRID (grid), (child), \
- (left), (top), (right)-(left), (bottom)-(top)); \
- } while (0)
-#else
-#define table_new(table, rows, columns) \
- (table) = gtk_table_new ((rows), (columns), FALSE)
-#define table_attach(table, child, left, right,top, bottom, xoptions, yoptions, xpadding,
ypadding) \
- gtk_table_attach (GTK_TABLE (table), (child), \
- (left), (right), (top), (bottom), \
- (xoptions), (yoptions), (xpadding), (ypadding))
-#endif
-
-#if GTK_CHECK_VERSION(3,8,0) /* gtk >= 3.8 */
-#define scrolled_window_add_with_viewport(container, child) \
- gtk_container_add (GTK_CONTAINER (container), child)
-#else
-#define scrolled_window_add_with_viewport(container, child) \
- gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (container), child)
-#endif
-
-#if !GTK_CHECK_VERSION(3,10,0) /* gtk < 3.10 */
-#define gdk_event_get_event_type(event) ((event)->type)
-#endif
-
-#if GTK_CHECK_VERSION(3,10,0) /* gtk >= 3.10 */
-#undef GTK_STOCK_DIALOG_WARNING
-#define GTK_STOCK_DIALOG_WARNING "dialog-warning"
-#define gtk_image_new_from_stock gtk_image_new_from_icon_name
-#endif
-
-#if GTK_CHECK_VERSION(3,14,0) /* gtk >= 3.14 */
-#define set_padding(widget, xpad, ypad) \
- do { \
- if ((xpad) != 0) { \
- gtk_widget_set_margin_start ((widget), (xpad)); \
- gtk_widget_set_margin_end ((widget), (xpad)); \
- } \
- if ((ypad) != 0) { \
- gtk_widget_set_margin_top ((widget), (ypad)); \
- gtk_widget_set_margin_bottom ((widget), (ypad)); \
- } \
- } while (0)
-#define set_alignment(widget, xalign, yalign) \
- do { \
- if ((xalign) == 0.) \
- gtk_widget_set_halign ((widget), GTK_ALIGN_START); \
- else if ((xalign) == 1.) \
- gtk_widget_set_halign ((widget), GTK_ALIGN_END); \
- else \
- gtk_widget_set_halign ((widget), GTK_ALIGN_CENTER); \
- if ((yalign) == 0.) \
- gtk_widget_set_valign ((widget), GTK_ALIGN_START); \
- else if ((xalign) == 1.) \
- gtk_widget_set_valign ((widget), GTK_ALIGN_END); \
- else \
- gtk_widget_set_valign ((widget), GTK_ALIGN_CENTER); \
- } while (0)
-#else /* gtk < 3.14 */
-#define set_padding(widget, xpad, ypad) \
- gtk_misc_set_padding(GTK_MISC(widget),(xpad),(ypad))
-#define set_alignment(widget, xalign, yalign) \
- gtk_misc_set_alignment(GTK_MISC(widget),(xalign),(yalign))
-#endif
diff --git a/p2v/gui.c b/p2v/gui.c
deleted file mode 100644
index 32c56dda7..000000000
--- a/p2v/gui.c
+++ /dev/null
@@ -1,2295 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2009-2019 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * This file implements almost all of the virt-p2v graphical user
- * interface (GUI).
- *
- * The GUI has three main dialogs:
- *
- * =over 4
- *
- * =item Connection dialog
- *
- * The connection dialog is the one shown initially. It asks the user
- * to type in the login details for the remote conversion server and
- * invites the user to test the ssh connection.
- *
- * =item Conversion dialog
- *
- * The conversion dialog asks for information about the target VM
- * (eg. the number of vCPUs required), and about what to convert
- * (eg. which network interfaces should be copied and which should be
- * ignored).
- *
- * =item Running dialog
- *
- * The running dialog is displayed when the P2V process is underway.
- * It mainly displays the virt-v2v debug messages.
- *
- * =back
- *
- * Note that the other major dialog (C<"Configure network ...">) is
- * handled entirely by NetworkManager's L<nm-connection-editor(1)>
- * program and has nothing to do with this code.
- *
- * This file is written in a kind of "pseudo-Gtk" which is backwards
- * compatible from Gtk 2.10 (RHEL 5) through at least Gtk 3.22. This
- * is done using a few macros to implement old C<gtk_*> functions or
- * map them to newer functions. Supporting ancient Gtk is important
- * because we want to provide a virt-p2v binary that can run on very
- * old kernels, to support 32 bit and proprietary SCSI drivers.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <inttypes.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <error.h>
-#include <locale.h>
-#include <assert.h>
-#include <libintl.h>
-
-#include <pthread.h>
-
-/* errors in <gtk.h> */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wstrict-prototypes"
-#if defined(__GNUC__) && __GNUC__ >= 6 /* gcc >= 6 */
-#pragma GCC diagnostic ignored "-Wshift-overflow"
-#endif
-#include <gtk/gtk.h>
-#pragma GCC diagnostic pop
-
-#include "ignore-value.h"
-#include "getprogname.h"
-
-#include "p2v.h"
-
-/* See note about "pseudo-Gtk" above. */
-#include "gui-gtk2-compat.h"
-#include "gui-gtk3-compat.h"
-
-/* Maximum vCPUs and guest memory that we will allow users to set.
- * These limits come from
- *
https://access.redhat.com/articles/rhel-kvm-limits
- */
-#define MAX_SUPPORTED_VCPUS 160
-#define MAX_SUPPORTED_MEMORY_MB (UINT64_C (4000 * 1024))
-
-#if GLIB_CHECK_VERSION(2,32,0) && GTK_CHECK_VERSION(3,12,0) /* glib >= 2.32
&& gtk >= 3.12 */
-#define USE_POPOVERS
-#endif
-
-static void create_connection_dialog (struct config *);
-static void create_conversion_dialog (struct config *);
-static void create_running_dialog (void);
-static void show_connection_dialog (void);
-static void show_conversion_dialog (void);
-static void show_running_dialog (void);
-
-static void set_info_label (void);
-
-/* The connection dialog. */
-static GtkWidget *conn_dlg,
- *server_entry, *port_entry,
- *username_entry, *password_entry, *identity_entry, *sudo_button,
- *spinner_hbox,
-#ifdef GTK_SPINNER
- *spinner,
-#endif
- *spinner_message, *next_button;
-
-/* The conversion dialog. */
-static GtkWidget *conv_dlg,
- *guestname_entry, *vcpus_entry, *memory_entry,
- *vcpus_warning, *memory_warning, *target_warning_label,
- *o_combo, *oc_entry, *os_entry, *of_entry, *oa_combo,
- *info_label,
- *disks_list, *removable_list, *interfaces_list,
- *start_button;
-
-/* The running dialog which is displayed when virt-v2v is running. */
-static GtkWidget *run_dlg,
- *v2v_output_sw, *v2v_output, *log_label, *status_label,
- *cancel_button, *shutdown_button;
-
-/* Colour tags used in the v2v_output GtkTextBuffer. */
-static GtkTextTag *v2v_output_tags[16];
-
-#if !GTK_CHECK_VERSION(3,0,0) /* gtk < 3 */
-/* The license of virt-p2v, for the About dialog. */
-static const char gplv2plus[] =
- "This program is free software; you can redistribute it and/or modify\n"
- "it under the terms of the GNU General Public License as published by\n"
- "the Free Software Foundation; either version 2 of the License, or\n"
- "(at your option) any later version.\n"
- "\n"
- "This program is distributed in the hope that it will be useful,\n"
- "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
- "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
- "GNU General Public License for more details.\n"
- "\n"
- "You should have received a copy of the GNU General Public License\n"
- "along with this program; if not, write to the Free Software\n"
- "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301
USA.\n";
-#endif
-
-/**
- * The entry point from the main program.
- *
- * Note that C<gtk_init> etc have already been called in C<main>.
- */
-void
-gui_conversion (struct config *config)
-{
- /* Create the dialogs. */
- create_connection_dialog (config);
- create_conversion_dialog (config);
- create_running_dialog ();
-
- /* Start by displaying the connection dialog. */
- show_connection_dialog ();
-
- gtk_main ();
-}
-
-/*----------------------------------------------------------------------*/
-/* Connection dialog. */
-
-static void username_changed_callback (GtkWidget *w, gpointer data);
-static void password_or_identity_changed_callback (GtkWidget *w, gpointer data);
-static void test_connection_clicked (GtkWidget *w, gpointer data);
-static void *test_connection_thread (void *data);
-static gboolean start_spinner (gpointer user_data);
-static gboolean stop_spinner (gpointer user_data);
-static gboolean test_connection_error (gpointer user_data);
-static gboolean test_connection_ok (gpointer user_data);
-static void configure_network_button_clicked (GtkWidget *w, gpointer data);
-static void xterm_button_clicked (GtkWidget *w, gpointer data);
-static void about_button_clicked (GtkWidget *w, gpointer data);
-static void connection_next_clicked (GtkWidget *w, gpointer data);
-static void repopulate_output_combo (struct config *config);
-
-/**
- * Create the connection dialog.
- *
- * This creates the dialog, but it is not displayed. See
- * C<show_connection_dialog>.
- */
-static void
-create_connection_dialog (struct config *config)
-{
- GtkWidget *intro, *table;
- GtkWidget *server_label;
- GtkWidget *server_hbox;
- GtkWidget *port_colon_label;
- GtkWidget *username_label;
- GtkWidget *password_label;
- GtkWidget *identity_label;
- GtkWidget *test_hbox, *test;
- GtkWidget *about;
- GtkWidget *configure_network;
- GtkWidget *xterm;
- char port_str[64];
-
- conn_dlg = gtk_dialog_new ();
- gtk_window_set_title (GTK_WINDOW (conn_dlg), getprogname ());
- gtk_window_set_resizable (GTK_WINDOW (conn_dlg), FALSE);
-
- /* The main dialog area. */
- intro = gtk_label_new (_("Connect to a virt-v2v conversion server over
SSH:"));
- gtk_label_set_line_wrap (GTK_LABEL (intro), TRUE);
- set_padding (intro, 10, 10);
-
- table_new (table, 5, 2);
- server_label = gtk_label_new_with_mnemonic (_("Conversion _server:"));
- table_attach (table, server_label,
- 0, 1, 0, 1, GTK_FILL, GTK_FILL, 4, 4);
- set_alignment (server_label, 1., 0.5);
-
- hbox_new (server_hbox, FALSE, 4);
- server_entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (server_label), server_entry);
- if (config->remote.server != NULL)
- gtk_entry_set_text (GTK_ENTRY (server_entry), config->remote.server);
- port_colon_label = gtk_label_new (":");
- port_entry = gtk_entry_new ();
- gtk_entry_set_width_chars (GTK_ENTRY (port_entry), 6);
- snprintf (port_str, sizeof port_str, "%d", config->remote.port);
- gtk_entry_set_text (GTK_ENTRY (port_entry), port_str);
- gtk_box_pack_start (GTK_BOX (server_hbox), server_entry, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (server_hbox), port_colon_label, FALSE, FALSE, 0);
- gtk_box_pack_start (GTK_BOX (server_hbox), port_entry, FALSE, FALSE, 0);
- table_attach (table, server_hbox,
- 1, 2, 0, 1, GTK_EXPAND|GTK_FILL, GTK_FILL, 4, 4);
-
- username_label = gtk_label_new_with_mnemonic (_("_User name:"));
- table_attach (table, username_label,
- 0, 1, 1, 2, GTK_FILL, GTK_FILL, 4, 4);
- set_alignment (username_label, 1., 0.5);
- username_entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (username_label), username_entry);
- if (config->auth.username != NULL)
- gtk_entry_set_text (GTK_ENTRY (username_entry), config->auth.username);
- else
- gtk_entry_set_text (GTK_ENTRY (username_entry), "root");
- table_attach (table, username_entry,
- 1, 2, 1, 2, GTK_EXPAND|GTK_FILL, GTK_FILL, 4, 4);
-
- password_label = gtk_label_new_with_mnemonic (_("_Password:"));
- table_attach (table, password_label,
- 0, 1, 2, 3, GTK_FILL, GTK_FILL, 4, 4);
- set_alignment (password_label, 1., 0.5);
- password_entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (password_label), password_entry);
- gtk_entry_set_visibility (GTK_ENTRY (password_entry), FALSE);
-#ifdef GTK_INPUT_PURPOSE_PASSWORD
- gtk_entry_set_input_purpose (GTK_ENTRY (password_entry),
- GTK_INPUT_PURPOSE_PASSWORD);
-#endif
- if (config->auth.password != NULL)
- gtk_entry_set_text (GTK_ENTRY (password_entry), config->auth.password);
- table_attach (table, password_entry,
- 1, 2, 2, 3, GTK_EXPAND|GTK_FILL, GTK_FILL, 4, 4);
-
- identity_label = gtk_label_new_with_mnemonic (_("SSH _Identity URL:"));
- table_attach (table, identity_label,
- 0, 1, 3, 4, GTK_FILL, GTK_FILL, 4, 4);
- set_alignment (identity_label, 1., 0.5);
- identity_entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (identity_label), identity_entry);
- if (config->auth.identity.url != NULL)
- gtk_entry_set_text (GTK_ENTRY (identity_entry), config->auth.identity.url);
- table_attach (table, identity_entry,
- 1, 2, 3, 4, GTK_EXPAND|GTK_FILL, GTK_FILL, 4, 4);
-
- sudo_button =
- gtk_check_button_new_with_mnemonic (_("Use su_do when running virt-v2v"));
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sudo_button),
- config->auth.sudo);
- table_attach (table, sudo_button,
- 1, 2, 4, 5, GTK_FILL, GTK_FILL, 4, 4);
-
- hbox_new (test_hbox, FALSE, 0);
- test = gtk_button_new_with_mnemonic (_("_Test connection"));
- gtk_box_pack_start (GTK_BOX (test_hbox), test, TRUE, FALSE, 0);
-
- hbox_new (spinner_hbox, FALSE, 10);
-#ifdef GTK_SPINNER
- spinner = gtk_spinner_new ();
- gtk_box_pack_start (GTK_BOX (spinner_hbox), spinner, FALSE, FALSE, 0);
-#endif
- spinner_message = gtk_label_new (NULL);
- gtk_label_set_line_wrap (GTK_LABEL (spinner_message), TRUE);
- set_padding (spinner_message, 10, 10);
- gtk_box_pack_start (GTK_BOX (spinner_hbox), spinner_message, TRUE, TRUE, 0);
-
- gtk_box_pack_start
- (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (conn_dlg))),
- intro, TRUE, TRUE, 0);
- gtk_box_pack_start
- (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (conn_dlg))),
- table, TRUE, TRUE, 0);
- gtk_box_pack_start
- (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (conn_dlg))),
- test_hbox, FALSE, FALSE, 0);
- gtk_box_pack_start
- (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (conn_dlg))),
- spinner_hbox, TRUE, TRUE, 0);
-
- /* Buttons. */
- gtk_dialog_add_buttons (GTK_DIALOG (conn_dlg),
- _("_Configure network ..."), 1,
- _("_XTerm ..."), 2,
- _("_About virt-p2v " PACKAGE_VERSION "
..."), 3,
- _("_Next"), 4,
- NULL);
-
- next_button = gtk_dialog_get_widget_for_response (GTK_DIALOG (conn_dlg), 4);
- gtk_widget_set_sensitive (next_button, FALSE);
-
- configure_network =
- gtk_dialog_get_widget_for_response (GTK_DIALOG (conn_dlg), 1);
- xterm = gtk_dialog_get_widget_for_response (GTK_DIALOG (conn_dlg), 2);
- about = gtk_dialog_get_widget_for_response (GTK_DIALOG (conn_dlg), 3);
-
- /* Signals. */
- g_signal_connect_swapped (G_OBJECT (conn_dlg), "destroy",
- G_CALLBACK (gtk_main_quit), NULL);
- g_signal_connect (G_OBJECT (test), "clicked",
- G_CALLBACK (test_connection_clicked), config);
- g_signal_connect (G_OBJECT (configure_network), "clicked",
- G_CALLBACK (configure_network_button_clicked), NULL);
- g_signal_connect (G_OBJECT (xterm), "clicked",
- G_CALLBACK (xterm_button_clicked), NULL);
- g_signal_connect (G_OBJECT (about), "clicked",
- G_CALLBACK (about_button_clicked), NULL);
- g_signal_connect (G_OBJECT (next_button), "clicked",
- G_CALLBACK (connection_next_clicked), NULL);
- g_signal_connect (G_OBJECT (username_entry), "changed",
- G_CALLBACK (username_changed_callback), NULL);
- g_signal_connect (G_OBJECT (password_entry), "changed",
- G_CALLBACK (password_or_identity_changed_callback), NULL);
- g_signal_connect (G_OBJECT (identity_entry), "changed",
- G_CALLBACK (password_or_identity_changed_callback), NULL);
-
- /* Call this signal to initialize the sensitivity of the sudo
- * button correctly.
- */
- username_changed_callback (NULL, NULL);
-}
-
-/**
- * If the username is "root", disable the sudo button.
- */
-static void
-username_changed_callback (GtkWidget *w, gpointer data)
-{
- const char *str;
- int username_is_root;
- int sudo_is_set;
-
- str = gtk_entry_get_text (GTK_ENTRY (username_entry));
- username_is_root = str != NULL && STREQ (str, "root");
- sudo_is_set = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (sudo_button));
-
- /* The sudo button is sensitive if:
- * - The username is not "root", or
- * - The button is not already checked (to allow the user to uncheck it)
- */
- gtk_widget_set_sensitive (sudo_button, !username_is_root || sudo_is_set);
-}
-
-/**
- * The password or SSH identity URL entries are mutually exclusive, so
- * if one contains text then disable the other. This function is
- * called when the "changed" signal is received on either.
- */
-static void
-password_or_identity_changed_callback (GtkWidget *w, gpointer data)
-{
- const char *str;
- int password_set;
- int identity_set;
-
- str = gtk_entry_get_text (GTK_ENTRY (password_entry));
- password_set = str != NULL && STRNEQ (str, "");
- str = gtk_entry_get_text (GTK_ENTRY (identity_entry));
- identity_set = str != NULL && STRNEQ (str, "");
-
- if (!password_set && !identity_set) {
- gtk_widget_set_sensitive (password_entry, TRUE);
- gtk_widget_set_sensitive (identity_entry, TRUE);
- }
- else if (identity_set)
- gtk_widget_set_sensitive (password_entry, FALSE);
- else if (password_set)
- gtk_widget_set_sensitive (identity_entry, FALSE);
-}
-
-/**
- * Hide all other dialogs and show the connection dialog.
- */
-static void
-show_connection_dialog (void)
-{
- /* Hide the other dialogs. */
- gtk_widget_hide (conv_dlg);
- gtk_widget_hide (run_dlg);
-
- /* Show everything except the spinner. */
- gtk_widget_show_all (conn_dlg);
- gtk_widget_hide (spinner_hbox);
-}
-
-/**
- * Callback from the C<Test connection> button.
- *
- * This initiates a background thread which actually does the ssh to
- * the conversion server and the rest of the testing (see
- * C<test_connection_thread>).
- */
-static void
-test_connection_clicked (GtkWidget *w, gpointer data)
-{
- struct config *config = data;
- const gchar *port_str;
- const gchar *identity_str;
- size_t errors = 0;
- struct config *copy;
- int err;
- pthread_t tid;
- pthread_attr_t attr;
-
- gtk_label_set_text (GTK_LABEL (spinner_message), "");
- gtk_widget_show_all (spinner_hbox);
-#ifdef GTK_SPINNER
- gtk_widget_hide (spinner);
-#endif
-
- /* Get the fields from the various widgets. */
- free (config->remote.server);
- config->remote.server = strdup (gtk_entry_get_text (GTK_ENTRY (server_entry)));
- if (STREQ (config->remote.server, "")) {
- gtk_label_set_text (GTK_LABEL (spinner_message),
- _("error: No conversion server given."));
- gtk_widget_grab_focus (server_entry);
- errors++;
- }
- port_str = gtk_entry_get_text (GTK_ENTRY (port_entry));
- if (sscanf (port_str, "%d", &config->remote.port) != 1 ||
- config->remote.port <= 0 || config->remote.port >= 65536) {
- gtk_label_set_text (GTK_LABEL (spinner_message),
- _("error: Invalid port number. If in doubt, use
\"22\"."));
- gtk_widget_grab_focus (port_entry);
- errors++;
- }
- free (config->auth.username);
- config->auth.username = strdup (gtk_entry_get_text (GTK_ENTRY (username_entry)));
- if (STREQ (config->auth.username, "")) {
- gtk_label_set_text (GTK_LABEL (spinner_message),
- _("error: No user name. If in doubt, use
\"root\"."));
- gtk_widget_grab_focus (username_entry);
- errors++;
- }
- free (config->auth.password);
- config->auth.password = strdup (gtk_entry_get_text (GTK_ENTRY (password_entry)));
-
- free (config->auth.identity.url);
- identity_str = gtk_entry_get_text (GTK_ENTRY (identity_entry));
- if (identity_str && STRNEQ (identity_str, ""))
- config->auth.identity.url = strdup (identity_str);
- else
- config->auth.identity.url = NULL;
- config->auth.identity.file_needs_update = 1;
-
- config->auth.sudo = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (sudo_button));
-
- if (errors)
- return;
-
- /* Give the testing thread its own copy of the config in case we
- * update the config in the main thread.
- */
- copy = copy_config (config);
-
- /* No errors so far, so test the connection in a background thread. */
- pthread_attr_init (&attr);
- pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
- err = pthread_create (&tid, &attr, test_connection_thread, copy);
- if (err != 0)
- error (EXIT_FAILURE, err, "pthread_create");
- pthread_attr_destroy (&attr);
-}
-
-/**
- * Run C<test_connection> (in a detached background thread). Once it
- * finishes stop the spinner and set the spinner message
- * appropriately. If the test is successful then we enable the
- * C<Next> button. If unsuccessful, an error is shown in the
- * connection dialog.
- */
-static void *
-test_connection_thread (void *data)
-{
- struct config *copy = data;
- int r;
-
- g_idle_add (start_spinner, NULL);
-
- wait_network_online (copy);
- r = test_connection (copy);
- free_config (copy);
-
- g_idle_add (stop_spinner, NULL);
-
- if (r == -1)
- g_idle_add (test_connection_error, NULL);
- else
- g_idle_add (test_connection_ok, NULL);
-
- /* Thread is detached anyway, so no one is waiting for the status. */
- return NULL;
-}
-
-/**
- * Idle task called from C<test_connection_thread> (but run on the
- * main thread) to start the spinner in the connection dialog.
- */
-static gboolean
-start_spinner (gpointer user_data)
-{
- gtk_label_set_text (GTK_LABEL (spinner_message),
- _("Testing the connection to the conversion server
..."));
-#ifdef GTK_SPINNER
- gtk_widget_show (spinner);
- gtk_spinner_start (GTK_SPINNER (spinner));
-#endif
- return FALSE;
-}
-
-/**
- * Idle task called from C<test_connection_thread> (but run on the
- * main thread) to stop the spinner in the connection dialog.
- */
-static gboolean
-stop_spinner (gpointer user_data)
-{
-#ifdef GTK_SPINNER
- gtk_spinner_stop (GTK_SPINNER (spinner));
- gtk_widget_hide (spinner);
-#endif
- return FALSE;
-}
-
-/**
- * Idle task called from C<test_connection_thread> (but run on the
- * main thread) when there is an error. Display the error message and
- * disable the C<Next> button so the user is forced to correct it.
- */
-static gboolean
-test_connection_error (gpointer user_data)
-{
- const char *err = get_ssh_error ();
-
- gtk_label_set_text (GTK_LABEL (spinner_message), err);
- /* Disable the Next button. */
- gtk_widget_set_sensitive (next_button, FALSE);
-
- return FALSE;
-}
-
-/**
- * Idle task called from C<test_connection_thread> (but run on the
- * main thread) when the connection test was successful.
- */
-static gboolean
-test_connection_ok (gpointer user_data)
-{
- gtk_label_set_text
- (GTK_LABEL (spinner_message),
- _("Connected to the conversion server.\n"
- "Press the \"Next\" button to configure the conversion
process."));
-
- /* Enable the Next button. */
- gtk_widget_set_sensitive (next_button, TRUE);
- gtk_widget_grab_focus (next_button);
-
- /* Update the information in the conversion dialog. */
- set_info_label ();
-
- return FALSE;
-}
-
-/**
- * Callback from the C<Configure network ...> button. This dialog is
- * handled entirely by an external program which is part of
- * NetworkManager.
- */
-static void
-configure_network_button_clicked (GtkWidget *w, gpointer data)
-{
- if (access ("/sbin/yast2", X_OK) >= 0)
- ignore_value (system ("yast2 lan &"));
- else
- ignore_value (system ("nm-connection-editor &"));
-}
-
-/**
- * Callback from the C<XTerm ...> button.
- */
-static void
-xterm_button_clicked (GtkWidget *w, gpointer data)
-{
- ignore_value (system ("xterm &"));
-}
-
-/**
- * Callback from the C<About virt-p2v ...> button.
- *
- * See also F<p2v/about-authors.c> and F<p2v/about-license.c>.
- */
-static void
-about_button_clicked (GtkWidget *w, gpointer data)
-{
- GtkWidget *dialog;
- GtkWidget *parent = conn_dlg;
-
- dialog = gtk_about_dialog_new ();
-
- g_object_set (G_OBJECT (dialog),
- "program-name", getprogname (),
- "version", PACKAGE_VERSION_FULL " (" host_cpu
")",
- "copyright", "\u00A9 2009-2019 Red Hat Inc.",
- "comments",
- _("Virtualize a physical machine to run on KVM"),
-#if GTK_CHECK_VERSION(3,0,0) /* gtk >= 3 */
- "license-type", GTK_LICENSE_GPL_2_0,
-#else
- "license", gplv2plus,
-#endif
- "website", "http://libguestfs.org/",
- "authors", authors,
- NULL);
-
- gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
- gtk_window_set_transient_for (GTK_WINDOW (dialog), GTK_WINDOW (parent));
- gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog), TRUE);
-
- gtk_dialog_run (GTK_DIALOG (dialog));
- gtk_widget_destroy (dialog);
-}
-
-/**
- * Callback when the connection dialog C<Next> button has been
- * clicked.
- */
-static void
-connection_next_clicked (GtkWidget *w, gpointer data)
-{
- /* Switch to the conversion dialog. */
- show_conversion_dialog ();
-}
-
-/*----------------------------------------------------------------------*/
-/* Conversion dialog. */
-
-static void populate_disks (GtkTreeView *disks_list);
-static void populate_removable (GtkTreeView *removable_list);
-static void populate_interfaces (GtkTreeView *interfaces_list);
-static void toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer data);
-static void network_edited_callback (GtkCellRendererToggle *cell, gchar *path_str, gchar
*new_text, gpointer data);
-static gboolean maybe_identify_click (GtkWidget *interfaces_list, GdkEventButton *event,
gpointer data);
-static void set_disks_from_ui (struct config *);
-static void set_removable_from_ui (struct config *);
-static void set_interfaces_from_ui (struct config *);
-static void conversion_back_clicked (GtkWidget *w, gpointer data);
-static void start_conversion_clicked (GtkWidget *w, gpointer data);
-static void vcpus_or_memory_check_callback (GtkWidget *w, gpointer data);
-static void notify_ui_callback (int type, const char *data);
-static int get_vcpus_from_conv_dlg (void);
-static uint64_t get_memory_from_conv_dlg (void);
-
-enum {
- DISKS_COL_CONVERT = 0,
- DISKS_COL_DEVICE,
- NUM_DISKS_COLS,
-};
-
-enum {
- REMOVABLE_COL_CONVERT = 0,
- REMOVABLE_COL_DEVICE,
- NUM_REMOVABLE_COLS,
-};
-
-enum {
- INTERFACES_COL_CONVERT = 0,
- INTERFACES_COL_DEVICE,
- INTERFACES_COL_NETWORK,
- NUM_INTERFACES_COLS,
-};
-
-/**
- * Create the conversion dialog.
- *
- * This creates the dialog, but it is not displayed. See
- * C<show_conversion_dialog>.
- */
-static void
-create_conversion_dialog (struct config *config)
-{
- GtkWidget *back;
- GtkWidget *hbox, *left_vbox, *right_vbox;
- GtkWidget *target_frame, *target_vbox, *target_tbl;
- GtkWidget *guestname_label, *vcpus_label, *memory_label;
- GtkWidget *output_frame, *output_vbox, *output_tbl;
- GtkWidget *o_label, *oa_label, *oc_label, *of_label, *os_label;
- GtkWidget *info_frame;
- GtkWidget *disks_frame, *disks_sw;
- GtkWidget *removable_frame, *removable_sw;
- GtkWidget *interfaces_frame, *interfaces_sw;
- char vcpus_str[64];
- char memory_str[64];
-
- conv_dlg = gtk_dialog_new ();
- gtk_window_set_title (GTK_WINDOW (conv_dlg), getprogname ());
- gtk_window_set_resizable (GTK_WINDOW (conv_dlg), FALSE);
- /* XXX It would be nice not to have to set this explicitly, but
- * if we don't then Gtk chooses a very small window.
- */
- gtk_widget_set_size_request (conv_dlg, 900, 600);
-
- /* The main dialog area. */
- hbox_new (hbox, TRUE, 1);
- vbox_new (left_vbox, FALSE, 1);
- vbox_new (right_vbox, TRUE, 1);
-
- /* The left column: target properties and output options. */
- target_frame = gtk_frame_new (_("Target properties"));
- gtk_container_set_border_width (GTK_CONTAINER (target_frame), 4);
-
- vbox_new (target_vbox, FALSE, 1);
-
- table_new (target_tbl, 3, 3);
- guestname_label = gtk_label_new_with_mnemonic (_("_Name:"));
- table_attach (target_tbl, guestname_label,
- 0, 1, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
- set_alignment (guestname_label, 1., 0.5);
- guestname_entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (guestname_label), guestname_entry);
- if (config->guestname != NULL)
- gtk_entry_set_text (GTK_ENTRY (guestname_entry), config->guestname);
- table_attach (target_tbl, guestname_entry,
- 1, 2, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
-
- vcpus_label = gtk_label_new_with_mnemonic (_("# _vCPUs:"));
- table_attach (target_tbl, vcpus_label,
- 0, 1, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
- set_alignment (vcpus_label, 1., 0.5);
- vcpus_entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (vcpus_label), vcpus_entry);
- snprintf (vcpus_str, sizeof vcpus_str, "%d", config->vcpus);
- gtk_entry_set_text (GTK_ENTRY (vcpus_entry), vcpus_str);
- table_attach (target_tbl, vcpus_entry,
- 1, 2, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
- vcpus_warning = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
- GTK_ICON_SIZE_BUTTON);
- table_attach (target_tbl, vcpus_warning,
- 2, 3, 1, 2, 0, 0, 1, 1);
-
- memory_label = gtk_label_new_with_mnemonic (_("_Memory (MB):"));
- table_attach (target_tbl, memory_label,
- 0, 1, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
- set_alignment (memory_label, 1., 0.5);
- memory_entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (memory_label), memory_entry);
- snprintf (memory_str, sizeof memory_str, "%" PRIu64,
- config->memory / 1024 / 1024);
- gtk_entry_set_text (GTK_ENTRY (memory_entry), memory_str);
- table_attach (target_tbl, memory_entry,
- 1, 2, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
- memory_warning = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
- GTK_ICON_SIZE_BUTTON);
- table_attach (target_tbl, memory_warning,
- 2, 3, 2, 3, 0, 0, 1, 1);
-
- gtk_box_pack_start (GTK_BOX (target_vbox), target_tbl, TRUE, TRUE, 0);
-
- target_warning_label = gtk_label_new ("");
- gtk_label_set_line_wrap (GTK_LABEL (target_warning_label), TRUE);
- gtk_label_set_line_wrap_mode (GTK_LABEL (target_warning_label),
- PANGO_WRAP_WORD);
- gtk_widget_set_size_request (target_warning_label, -1, 7 * 16);
- gtk_box_pack_end (GTK_BOX (target_vbox), target_warning_label, TRUE, TRUE, 0);
-
- gtk_container_add (GTK_CONTAINER (target_frame), target_vbox);
-
- output_frame = gtk_frame_new (_("Virt-v2v output options"));
- gtk_container_set_border_width (GTK_CONTAINER (output_frame), 4);
-
- vbox_new (output_vbox, FALSE, 1);
-
- table_new (output_tbl, 5, 2);
- o_label = gtk_label_new_with_mnemonic (_("Output _to (-o):"));
- table_attach (output_tbl, o_label,
- 0, 1, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
- set_alignment (o_label, 1., 0.5);
- o_combo = gtk_combo_box_text_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (o_label), o_combo);
- gtk_widget_set_tooltip_markup (o_combo, _("<b>libvirt</b> means send
the converted guest to libvirt-managed KVM on the conversion server.
<b>local</b> means put it in a directory on the conversion server.
<b>rhv</b> means write it to RHV-M/oVirt. <b>glance</b> means
write it to OpenStack Glance. See the virt-v2v(1) manual page for more information about
output options."));
- repopulate_output_combo (config);
- table_attach (output_tbl, o_combo,
- 1, 2, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
-
- oc_label = gtk_label_new_with_mnemonic (_("_Output conn. (-oc):"));
- table_attach (output_tbl, oc_label,
- 0, 1, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
- set_alignment (oc_label, 1., 0.5);
- oc_entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (oc_label), oc_entry);
- gtk_widget_set_tooltip_markup (oc_entry, _("For <b>libvirt</b> only,
the libvirt connection URI, or leave blank to add the guest to the default libvirt
instance on the conversion server. For others, leave this field blank."));
- if (config->output.connection != NULL)
- gtk_entry_set_text (GTK_ENTRY (oc_entry), config->output.connection);
- table_attach (output_tbl, oc_entry,
- 1, 2, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
-
- os_label = gtk_label_new_with_mnemonic (_("Output _storage (-os):"));
- table_attach (output_tbl, os_label,
- 0, 1, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
- set_alignment (os_label, 1., 0.5);
- os_entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (os_label), os_entry);
- gtk_widget_set_tooltip_markup (os_entry, _("For <b>local</b>, put the
directory name on the conversion server. For <b>rhv</b>, put the Export
Storage Domain (server:/mountpoint). For others, leave this field blank."));
- if (config->output.storage != NULL)
- gtk_entry_set_text (GTK_ENTRY (os_entry), config->output.storage);
- table_attach (output_tbl, os_entry,
- 1, 2, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
-
- of_label = gtk_label_new_with_mnemonic (_("Output _format (-of):"));
- table_attach (output_tbl, of_label,
- 0, 1, 3, 4, GTK_FILL, GTK_FILL, 1, 1);
- set_alignment (of_label, 1., 0.5);
- of_entry = gtk_entry_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (of_label), of_entry);
- gtk_widget_set_tooltip_markup (of_entry, _("The output disk format, typically
<b>raw</b> or <b>qcow2</b>. If blank, defaults to
<b>raw</b>."));
- if (config->output.format != NULL)
- gtk_entry_set_text (GTK_ENTRY (of_entry), config->output.format);
- table_attach (output_tbl, of_entry,
- 1, 2, 3, 4, GTK_FILL, GTK_FILL, 1, 1);
-
- oa_label = gtk_label_new_with_mnemonic (_("Output _allocation (-oa):"));
- table_attach (output_tbl, oa_label,
- 0, 1, 4, 5, GTK_FILL, GTK_FILL, 1, 1);
- set_alignment (oa_label, 1., 0.5);
- oa_combo = gtk_combo_box_text_new ();
- gtk_label_set_mnemonic_widget (GTK_LABEL (oa_label), oa_combo);
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (oa_combo),
- "sparse");
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (oa_combo),
- "preallocated");
- switch (config->output.allocation) {
- case OUTPUT_ALLOCATION_PREALLOCATED:
- gtk_combo_box_set_active (GTK_COMBO_BOX (oa_combo), 1);
- break;
- default:
- gtk_combo_box_set_active (GTK_COMBO_BOX (oa_combo), 0);
- break;
- }
- table_attach (output_tbl, oa_combo,
- 1, 2, 4, 5, GTK_FILL, GTK_FILL, 1, 1);
-
- gtk_box_pack_start (GTK_BOX (output_vbox), output_tbl, TRUE, TRUE, 0);
- gtk_container_add (GTK_CONTAINER (output_frame), output_vbox);
-
- info_frame = gtk_frame_new (_("Information"));
- gtk_container_set_border_width (GTK_CONTAINER (info_frame), 4);
- info_label = gtk_label_new (NULL);
- set_alignment (info_label, 0.1, 0.5);
- set_info_label ();
- gtk_container_add (GTK_CONTAINER (info_frame), info_label);
-
- /* The right column: select devices to be converted. */
- disks_frame = gtk_frame_new (_("Fixed hard disks"));
- gtk_container_set_border_width (GTK_CONTAINER (disks_frame), 4);
- disks_sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_set_border_width (GTK_CONTAINER (disks_sw), 8);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (disks_sw),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- disks_list = gtk_tree_view_new ();
- populate_disks (GTK_TREE_VIEW (disks_list));
- scrolled_window_add_with_viewport (disks_sw, disks_list);
- gtk_container_add (GTK_CONTAINER (disks_frame), disks_sw);
-
- removable_frame = gtk_frame_new (_("Removable media"));
- gtk_container_set_border_width (GTK_CONTAINER (removable_frame), 4);
- removable_sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_set_border_width (GTK_CONTAINER (removable_sw), 8);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (removable_sw),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- removable_list = gtk_tree_view_new ();
- populate_removable (GTK_TREE_VIEW (removable_list));
- scrolled_window_add_with_viewport (removable_sw, removable_list);
- gtk_container_add (GTK_CONTAINER (removable_frame), removable_sw);
-
- interfaces_frame = gtk_frame_new (_("Network interfaces"));
- gtk_container_set_border_width (GTK_CONTAINER (interfaces_frame), 4);
- interfaces_sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_container_set_border_width (GTK_CONTAINER (interfaces_sw), 8);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (interfaces_sw),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- interfaces_list = gtk_tree_view_new ();
- /* See maybe_identify_click below for what we're doing. */
- g_signal_connect (interfaces_list, "button-press-event",
- G_CALLBACK (maybe_identify_click), NULL);
- gtk_widget_set_tooltip_markup (interfaces_list, _("Left click on an interface name
to flash the light on the physical interface."));
- populate_interfaces (GTK_TREE_VIEW (interfaces_list));
- scrolled_window_add_with_viewport (interfaces_sw, interfaces_list);
- gtk_container_add (GTK_CONTAINER (interfaces_frame), interfaces_sw);
-
- /* Pack the top level dialog. */
- gtk_box_pack_start (GTK_BOX (left_vbox), target_frame, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (left_vbox), output_frame, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (left_vbox), info_frame, TRUE, TRUE, 0);
-
- gtk_box_pack_start (GTK_BOX (right_vbox), disks_frame, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (right_vbox), removable_frame, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (right_vbox), interfaces_frame, TRUE, TRUE, 0);
-
- gtk_box_pack_start (GTK_BOX (hbox), left_vbox, TRUE, TRUE, 0);
- gtk_box_pack_start (GTK_BOX (hbox), right_vbox, TRUE, TRUE, 0);
- gtk_box_pack_start
- (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (conv_dlg))),
- hbox, TRUE, TRUE, 0);
-
- /* Buttons. */
- gtk_dialog_add_buttons (GTK_DIALOG (conv_dlg),
- _("_Back"), 1,
- _("Start _conversion"), 2,
- NULL);
- back = gtk_dialog_get_widget_for_response (GTK_DIALOG (conv_dlg), 1);
- start_button = gtk_dialog_get_widget_for_response (GTK_DIALOG (conv_dlg), 2);
-
- /* Signals. */
- g_signal_connect_swapped (G_OBJECT (conv_dlg), "destroy",
- G_CALLBACK (gtk_main_quit), NULL);
- g_signal_connect (G_OBJECT (back), "clicked",
- G_CALLBACK (conversion_back_clicked), NULL);
- g_signal_connect (G_OBJECT (start_button), "clicked",
- G_CALLBACK (start_conversion_clicked), config);
- g_signal_connect (G_OBJECT (vcpus_entry), "changed",
- G_CALLBACK (vcpus_or_memory_check_callback), NULL);
- g_signal_connect (G_OBJECT (memory_entry), "changed",
- G_CALLBACK (vcpus_or_memory_check_callback), NULL);
-}
-
-/**
- * Hide all other dialogs and show the conversion dialog.
- */
-static void
-show_conversion_dialog (void)
-{
- /* Hide the other dialogs. */
- gtk_widget_hide (conn_dlg);
- gtk_widget_hide (run_dlg);
-
- /* Show the conversion dialog. */
- gtk_widget_show_all (conv_dlg);
- gtk_widget_hide (vcpus_warning);
- gtk_widget_hide (memory_warning);
-
- /* output_drivers may have been updated, so repopulate o_combo. */
- repopulate_output_combo (NULL);
-}
-
-/**
- * Update the C<Information> section in the conversion dialog.
- *
- * Note that C<v2v_version> (the remote virt-v2v version) is read from
- * the remote virt-v2v in the C<test_connection> function.
- */
-static void
-set_info_label (void)
-{
- CLEANUP_FREE char *text;
- int r;
-
- if (!v2v_version)
- r = asprintf (&text, _("virt-p2v (client):\n%s"), PACKAGE_VERSION);
- else
- r = asprintf (&text,
- _("virt-p2v (client):\n"
- "%s\n"
- "virt-v2v (conversion server):\n"
- "%s"),
- PACKAGE_VERSION_FULL, v2v_version);
- if (r == -1) {
- perror ("asprintf");
- return;
- }
-
- gtk_label_set_text (GTK_LABEL (info_label), text);
-}
-
-/**
- * Repopulate the list of output drivers in the C<Output to (-o)>
- * combo. The list of drivers is read from the remote virt-v2v
- * instance in C<test_connection>.
- */
-static void
-repopulate_output_combo (struct config *config)
-{
- GtkTreeModel *model;
- CLEANUP_FREE char *output;
- size_t i;
-
- /* Which driver is currently selected? */
- if (config && config->output.type)
- output = strdup (config->output.type);
- else
- output = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (o_combo));
-
- /* Remove existing rows in o_combo. */
- model = gtk_combo_box_get_model (GTK_COMBO_BOX (o_combo));
- gtk_list_store_clear (GTK_LIST_STORE (model));
-
- /* List of output_drivers from virt-v2v not read yet, so present
- * a standard set of drivers.
- */
- if (output_drivers == NULL) {
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (o_combo), "libvirt");
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (o_combo), "local");
- /* Use rhev instead of rhv here so we can work with old virt-v2v. */
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (o_combo), "rhev");
- if (output == NULL || STREQ (output, "libvirt"))
- gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 0);
- else if (STREQ (output, "local"))
- gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 1);
- else if (STREQ (output, "rhev"))
- gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 2);
- }
- /* List of -o options read from remote virt-v2v --machine-readable. */
- else {
- for (i = 0; output_drivers[i] != NULL; ++i)
- gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (o_combo),
- output_drivers[i]);
- if (output) {
- for (i = 0; output_drivers[i] != NULL; ++i)
- if (STREQ (output, output_drivers[i]))
- gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), i);
- }
- else
- gtk_combo_box_set_active (GTK_COMBO_BOX (o_combo), 0);
- }
-}
-
-/**
- * Populate the C<Fixed hard disks> treeview.
- */
-static void
-populate_disks (GtkTreeView *disks_list)
-{
- GtkListStore *disks_store;
- GtkCellRenderer *disks_col_convert, *disks_col_device;
- GtkTreeIter iter;
- size_t i;
-
- disks_store = gtk_list_store_new (NUM_DISKS_COLS,
- G_TYPE_BOOLEAN, G_TYPE_STRING);
- if (all_disks != NULL) {
- for (i = 0; all_disks[i] != NULL; ++i) {
- uint64_t size;
- CLEANUP_FREE char *size_gb = NULL;
- CLEANUP_FREE char *model = NULL;
- CLEANUP_FREE char *serial = NULL;
- CLEANUP_FREE char *device_descr = NULL;
-
- if (all_disks[i][0] != '/') { /* not using --test-disk */
- size = get_blockdev_size (all_disks[i]);
- if (asprintf (&size_gb, "%" PRIu64 "G", size) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- model = get_blockdev_model (all_disks[i]);
- serial = get_blockdev_serial (all_disks[i]);
- }
-
- if (asprintf (&device_descr,
- "<b>%s</b>\n"
- "<small>"
- "%s %s\n"
- "%s%s"
- "</small>",
- all_disks[i],
- size_gb ? size_gb : "", model ? model : "",
- serial ? "s/n " : "", serial ? serial :
"") == -1)
- error (EXIT_FAILURE, errno, "asprintf");
-
- gtk_list_store_append (disks_store, &iter);
- gtk_list_store_set (disks_store, &iter,
- DISKS_COL_CONVERT, TRUE,
- DISKS_COL_DEVICE, device_descr,
- -1);
- }
- }
- gtk_tree_view_set_model (disks_list,
- GTK_TREE_MODEL (disks_store));
- gtk_tree_view_set_headers_visible (disks_list, TRUE);
- disks_col_convert = gtk_cell_renderer_toggle_new ();
- gtk_tree_view_insert_column_with_attributes (disks_list,
- -1,
- _("Convert"),
- disks_col_convert,
- "active", DISKS_COL_CONVERT,
- NULL);
- gtk_cell_renderer_set_alignment (disks_col_convert, 0.5, 0.0);
- disks_col_device = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes (disks_list,
- -1,
- _("Device"),
- disks_col_device,
- "markup", DISKS_COL_DEVICE,
- NULL);
- gtk_cell_renderer_set_alignment (disks_col_device, 0.0, 0.0);
-
- g_signal_connect (disks_col_convert, "toggled",
- G_CALLBACK (toggled), disks_store);
-}
-
-/**
- * Populate the C<Removable media> treeview.
- */
-static void
-populate_removable (GtkTreeView *removable_list)
-{
- GtkListStore *removable_store;
- GtkCellRenderer *removable_col_convert, *removable_col_device;
- GtkTreeIter iter;
- size_t i;
-
- removable_store = gtk_list_store_new (NUM_REMOVABLE_COLS,
- G_TYPE_BOOLEAN, G_TYPE_STRING);
- if (all_removable != NULL) {
- for (i = 0; all_removable[i] != NULL; ++i) {
- CLEANUP_FREE char *device_descr = NULL;
-
- if (asprintf (&device_descr, "<b>%s</b>\n",
all_removable[i]) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
-
- gtk_list_store_append (removable_store, &iter);
- gtk_list_store_set (removable_store, &iter,
- REMOVABLE_COL_CONVERT, TRUE,
- REMOVABLE_COL_DEVICE, device_descr,
- -1);
- }
- }
- gtk_tree_view_set_model (removable_list,
- GTK_TREE_MODEL (removable_store));
- gtk_tree_view_set_headers_visible (removable_list, TRUE);
- removable_col_convert = gtk_cell_renderer_toggle_new ();
- gtk_tree_view_insert_column_with_attributes (removable_list,
- -1,
- _("Convert"),
- removable_col_convert,
- "active",
REMOVABLE_COL_CONVERT,
- NULL);
- gtk_cell_renderer_set_alignment (removable_col_convert, 0.5, 0.0);
- removable_col_device = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes (removable_list,
- -1,
- _("Device"),
- removable_col_device,
- "markup", REMOVABLE_COL_DEVICE,
- NULL);
- gtk_cell_renderer_set_alignment (removable_col_device, 0.0, 0.0);
-
- g_signal_connect (removable_col_convert, "toggled",
- G_CALLBACK (toggled), removable_store);
-}
-
-/**
- * Populate the C<Network interfaces> treeview.
- */
-static void
-populate_interfaces (GtkTreeView *interfaces_list)
-{
- GtkListStore *interfaces_store;
- GtkCellRenderer *interfaces_col_convert, *interfaces_col_device,
- *interfaces_col_network;
- GtkTreeIter iter;
- size_t i;
-
- interfaces_store = gtk_list_store_new (NUM_INTERFACES_COLS,
- G_TYPE_BOOLEAN, G_TYPE_STRING,
- G_TYPE_STRING);
- if (all_interfaces) {
- for (i = 0; all_interfaces[i] != NULL; ++i) {
- const char *if_name = all_interfaces[i];
- CLEANUP_FREE char *device_descr = NULL;
- CLEANUP_FREE char *if_addr = get_if_addr (if_name);
- CLEANUP_FREE char *if_vendor = get_if_vendor (if_name, 40);
-
- if (asprintf (&device_descr,
- "<b>%s</b>\n"
- "<small>"
- "%s\n"
- "%s"
- "</small>\n"
- "<small><u><span
foreground=\"blue\">Identify
interface</span></u></small>",
- if_name,
- if_addr ? : _("Unknown"),
- if_vendor ? : _("Unknown")) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
-
- gtk_list_store_append (interfaces_store, &iter);
- gtk_list_store_set (interfaces_store, &iter,
- /* Only convert the first interface. As
- * they are sorted, this is usually the
- * physical interface.
- */
- INTERFACES_COL_CONVERT, i == 0,
- INTERFACES_COL_DEVICE, device_descr,
- INTERFACES_COL_NETWORK, "default",
- -1);
- }
- }
- gtk_tree_view_set_model (interfaces_list,
- GTK_TREE_MODEL (interfaces_store));
- gtk_tree_view_set_headers_visible (interfaces_list, TRUE);
- interfaces_col_convert = gtk_cell_renderer_toggle_new ();
- gtk_tree_view_insert_column_with_attributes (interfaces_list,
- -1,
- _("Convert"),
- interfaces_col_convert,
- "active",
INTERFACES_COL_CONVERT,
- NULL);
- gtk_cell_renderer_set_alignment (interfaces_col_convert, 0.5, 0.0);
- interfaces_col_device = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes (interfaces_list,
- -1,
- _("Device"),
- interfaces_col_device,
- "markup",
INTERFACES_COL_DEVICE,
- NULL);
- gtk_cell_renderer_set_alignment (interfaces_col_device, 0.0, 0.0);
- interfaces_col_network = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes (interfaces_list,
- -1,
- _("Connect to virtual
network"),
- interfaces_col_network,
- "text", INTERFACES_COL_NETWORK,
- NULL);
- gtk_cell_renderer_set_alignment (interfaces_col_network, 0.0, 0.0);
-
- g_signal_connect (interfaces_col_convert, "toggled",
- G_CALLBACK (toggled), interfaces_store);
-
- g_object_set (interfaces_col_network, "editable", TRUE, NULL);
- g_signal_connect (interfaces_col_network, "edited",
- G_CALLBACK (network_edited_callback), interfaces_store);
-}
-
-static void
-toggled (GtkCellRendererToggle *cell, gchar *path_str, gpointer data)
-{
- GtkTreeModel *model = data;
- GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
- GtkTreeIter iter;
- gboolean v;
-
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_tree_model_get (model, &iter, 0 /* CONVERT */, &v, -1);
- v ^= 1;
- gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0 /* CONVERT */, v, -1);
- gtk_tree_path_free (path);
-}
-
-static void
-network_edited_callback (GtkCellRendererToggle *cell, gchar *path_str,
- gchar *new_text, gpointer data)
-{
- GtkTreeModel *model = data;
- GtkTreePath *path;
- GtkTreeIter iter;
-
- if (new_text == NULL || STREQ (new_text, ""))
- return;
-
- path = gtk_tree_path_new_from_string (path_str);
-
- gtk_tree_model_get_iter (model, &iter, path);
- gtk_list_store_set (GTK_LIST_STORE (model), &iter,
- INTERFACES_COL_NETWORK, new_text, -1);
- gtk_tree_path_free (path);
-}
-
-/**
- * When the user clicks on the interface name on the list of
- * interfaces, we want to run C<ethtool --identify>, which usually
- * makes some lights flash on the physical interface.
- *
- * We cannot catch clicks on the cell itself, so we have to go via a
- * more obscure route. See
L<http://stackoverflow.com/a/27207433> and
- *
L<https://en.wikibooks.org/wiki/GTK%2B_By_Example/Tree_View/Events>
- */
-static gboolean
-maybe_identify_click (GtkWidget *interfaces_list, GdkEventButton *event,
- gpointer data)
-{
- gboolean ret = FALSE; /* Did we handle this event? */
- guint button;
-
- /* Single left click only. */
- if (gdk_event_get_event_type ((const GdkEvent *) event) == GDK_BUTTON_PRESS &&
- gdk_event_get_button ((const GdkEvent *) event, &button) &&
- button == 1) {
- GtkTreePath *path;
- GtkTreeViewColumn *column;
- gdouble event_x, event_y;
-
- if (gdk_event_get_coords ((const GdkEvent *) event, &event_x, &event_y)
- && gtk_tree_view_get_path_at_pos (GTK_TREE_VIEW (interfaces_list),
- event_x, event_y,
- &path, &column, NULL, NULL)) {
- GList *cols;
- gint column_index;
-
- /* Get column index. */
- cols = gtk_tree_view_get_columns (GTK_TREE_VIEW (interfaces_list));
- column_index = g_list_index (cols, (gpointer) column);
- g_list_free (cols);
-
- if (column_index == INTERFACES_COL_DEVICE) {
- const gint *indices;
- gint row_index;
- const char *if_name;
- char *cmd;
-
- /* Get the row index. */
- indices = gtk_tree_path_get_indices (path);
- row_index = indices[0];
-
- /* And the interface name. */
- if_name = all_interfaces[row_index];
-
- /* Issue the ethtool command in the background. */
- if (asprintf (&cmd, "ethtool --identify '%s' 10 &",
if_name) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- printf ("%s\n", cmd);
- ignore_value (system (cmd));
-
- free (cmd);
-
- ret = TRUE; /* We handled this event. */
- }
-
- gtk_tree_path_free (path);
- }
- }
-
- return ret;
-}
-
-static void
-set_from_ui_generic (char **all, char ***ret, GtkTreeView *list)
-{
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean b, v;
- size_t i, j;
-
- if (all == NULL) {
- guestfs_int_free_string_list (*ret);
- *ret = NULL;
- return;
- }
-
- model = gtk_tree_view_get_model (list);
-
- guestfs_int_free_string_list (*ret);
- *ret = malloc ((1 + guestfs_int_count_strings (all)) * sizeof (char *));
- if (*ret == NULL)
- error (EXIT_FAILURE, errno, "malloc");
- i = j = 0;
-
- b = gtk_tree_model_get_iter_first (model, &iter);
- while (b) {
- gtk_tree_model_get (model, &iter, 0 /* CONVERT */, &v, -1);
- if (v) {
- assert (all[i] != NULL);
- (*ret)[j++] = strdup (all[i]);
- }
- b = gtk_tree_model_iter_next (model, &iter);
- ++i;
- }
-
- (*ret)[j] = NULL;
-}
-
-static void
-set_disks_from_ui (struct config *config)
-{
- set_from_ui_generic (all_disks, &config->disks,
- GTK_TREE_VIEW (disks_list));
-}
-
-static void
-set_removable_from_ui (struct config *config)
-{
- set_from_ui_generic (all_removable, &config->removable,
- GTK_TREE_VIEW (removable_list));
-}
-
-static void
-set_interfaces_from_ui (struct config *config)
-{
- set_from_ui_generic (all_interfaces, &config->interfaces,
- GTK_TREE_VIEW (interfaces_list));
-}
-
-static void
-set_network_map_from_ui (struct config *config)
-{
- GtkTreeView *list;
- GtkTreeModel *model;
- GtkTreeIter iter;
- gboolean b;
- const char *s;
- size_t i, j;
-
- if (all_interfaces == NULL) {
- guestfs_int_free_string_list (config->network_map);
- config->network_map = NULL;
- return;
- }
-
- list = GTK_TREE_VIEW (interfaces_list);
- model = gtk_tree_view_get_model (list);
-
- guestfs_int_free_string_list (config->network_map);
- config->network_map =
- malloc ((1 + guestfs_int_count_strings (all_interfaces))
- * sizeof (char *));
- if (config->network_map == NULL)
- error (EXIT_FAILURE, errno, "malloc");
- i = j = 0;
-
- b = gtk_tree_model_get_iter_first (model, &iter);
- while (b) {
- gtk_tree_model_get (model, &iter, INTERFACES_COL_NETWORK, &s, -1);
- if (s) {
- assert (all_interfaces[i] != NULL);
- if (asprintf (&config->network_map[j], "%s:%s",
- all_interfaces[i], s) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- ++j;
- }
- b = gtk_tree_model_iter_next (model, &iter);
- ++i;
- }
-
- config->network_map[j] = NULL;
-}
-
-/**
- * The conversion dialog C<Back> button has been clicked.
- */
-static void
-conversion_back_clicked (GtkWidget *w, gpointer data)
-{
- /* Switch to the connection dialog. */
- show_connection_dialog ();
-
- /* Better disable the Next button so the user is forced to
- * do "Test connection" again.
- */
- gtk_widget_set_sensitive (next_button, FALSE);
-}
-
-static char *concat_warning (char *warning, const char *fs, ...)
- __attribute__((format (printf,2,3)));
-
-static char *
-concat_warning (char *warning, const char *fs, ...)
-{
- va_list args;
- char *msg;
- size_t len, len2;
- int r;
-
- if (warning == NULL) {
- warning = strdup ("");
- if (warning == NULL)
- malloc_fail:
- error (EXIT_FAILURE, errno, "malloc");
- }
-
- len = strlen (warning);
- if (len > 0 && warning[len-1] != '\n' && fs[0] !=
'\n') {
- warning = concat_warning (warning, "\n");
- len = strlen (warning);
- }
-
- va_start (args, fs);
- r = vasprintf (&msg, fs, args);
- va_end (args);
- if (r == -1) goto malloc_fail;
-
- len2 = strlen (msg);
- warning = realloc (warning, len + len2 + 1);
- if (warning == NULL) goto malloc_fail;
- memcpy (&warning[len], msg, len2 + 1);
- free (msg);
-
- return warning;
-}
-
-/**
- * Display a warning if the vCPUs or memory is outside the supported
- * range (
L<https://bugzilla.redhat.com/823758>).
- */
-static void
-vcpus_or_memory_check_callback (GtkWidget *w, gpointer data)
-{
- int vcpus;
- uint64_t memory;
- CLEANUP_FREE char *warning = NULL;
-
- vcpus = get_vcpus_from_conv_dlg ();
- memory = get_memory_from_conv_dlg ();
-
- if (vcpus > MAX_SUPPORTED_VCPUS) {
- gtk_widget_show (vcpus_warning);
-
- warning = concat_warning (warning,
- _("Number of virtual CPUs is larger than what is
supported for KVM (max: %d)."),
- MAX_SUPPORTED_VCPUS);
- }
- else
- gtk_widget_hide (vcpus_warning);
-
- if (memory > MAX_SUPPORTED_MEMORY_MB * 1024 * 1024) {
- gtk_widget_show (memory_warning);
-
- warning = concat_warning (warning,
- _("Memory size is larger than what is supported for
KVM (max: %" PRIu64 ")."),
- MAX_SUPPORTED_MEMORY_MB);
- }
- else
- gtk_widget_hide (memory_warning);
-
- if (warning != NULL) {
- warning = concat_warning (warning,
- _("If you ignore this warning, conversion can still
succeed, but the guest may not work or may not be supported on the target."));
- gtk_label_set_text (GTK_LABEL (target_warning_label), warning);
- }
- else
- gtk_label_set_text (GTK_LABEL (target_warning_label), "");
-}
-
-static int
-get_vcpus_from_conv_dlg (void)
-{
- const char *str;
- int i;
-
- str = gtk_entry_get_text (GTK_ENTRY (vcpus_entry));
- if (sscanf (str, "%d", &i) == 1 && i > 0)
- return i;
- else
- return 1;
-}
-
-static uint64_t
-get_memory_from_conv_dlg (void)
-{
- const char *str;
- uint64_t i;
-
- str = gtk_entry_get_text (GTK_ENTRY (memory_entry));
- if (sscanf (str, "%" SCNu64, &i) == 1 && i >= 256)
- return i * 1024 * 1024;
- else
- return UINT64_C (1024) * 1024 * 1024;
-}
-
-/*----------------------------------------------------------------------*/
-/* Running dialog. */
-
-static gboolean set_log_dir (gpointer remote_dir);
-static gboolean set_status (gpointer msg);
-static gboolean add_v2v_output (gpointer msg);
-static void *start_conversion_thread (void *data);
-static gboolean conversion_error (gpointer user_data);
-static gboolean conversion_finished (gpointer user_data);
-static void cancel_conversion_dialog (GtkWidget *w, gpointer data);
-#ifdef USE_POPOVERS
-static void activate_action (GSimpleAction *action, GVariant *parameter, gpointer
user_data);
-#else
-static void shutdown_button_clicked (GtkToolButton *w, gpointer data);
-#endif
-static void shutdown_clicked (GtkWidget *w, gpointer data);
-static void reboot_clicked (GtkWidget *w, gpointer data);
-static gboolean close_running_dialog (GtkWidget *w, GdkEvent *event, gpointer data);
-
-#ifdef USE_POPOVERS
-static const GActionEntry shutdown_actions[] = {
- { "shutdown", activate_action, NULL, NULL, NULL },
- { "reboot", activate_action, NULL, NULL, NULL },
-};
-#endif
-
-/**
- * Create the running dialog.
- *
- * This creates the dialog, but it is not displayed. See
- * C<show_running_dialog>.
- */
-static void
-create_running_dialog (void)
-{
- size_t i;
- static const char *tags[16] =
- { "black", "maroon", "green", "olive",
"navy", "purple", "teal", "silver",
- "gray", "red", "lime", "yellow",
"blue", "fuchsia", "cyan", "white" };
- GtkTextBuffer *buf;
-#ifdef USE_POPOVERS
- GMenu *shutdown_menu;
- GSimpleActionGroup *shutdown_group;
-#else
- GtkWidget *shutdown_menu;
- GtkWidget *shutdown_menu_item;
- GtkWidget *reboot_menu_item;
-#endif
-
- run_dlg = gtk_dialog_new ();
- gtk_window_set_title (GTK_WINDOW (run_dlg), getprogname ());
- gtk_window_set_resizable (GTK_WINDOW (run_dlg), FALSE);
-
- /* The main dialog area. */
- v2v_output_sw = gtk_scrolled_window_new (NULL, NULL);
- gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (v2v_output_sw),
- GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
- gtk_widget_set_size_request (v2v_output_sw, 700, 400);
-
- v2v_output = gtk_text_view_new ();
- gtk_text_view_set_editable (GTK_TEXT_VIEW (v2v_output), FALSE);
- gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (v2v_output), GTK_WRAP_CHAR);
-
- buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (v2v_output));
- for (i = 0; i < 16; ++i) {
- CLEANUP_FREE char *tag_name;
-
- if (asprintf (&tag_name, "tag_%s", tags[i]) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- v2v_output_tags[i] =
- gtk_text_buffer_create_tag (buf, tag_name, "foreground", tags[i], NULL);
- }
-
-#if GTK_CHECK_VERSION(3,16,0) /* gtk >= 3.16 */
- /* XXX This only sets the "CSS" style. It's not clear how to set
- * the particular font. However (by accident) this does at least
- * set the widget to use a monospace font.
- */
- GtkStyleContext *context = gtk_widget_get_style_context (v2v_output);
- gtk_style_context_add_class (context, "monospace");
-#else
- PangoFontDescription *font;
- font = pango_font_description_from_string ("Monospace 11");
-#if GTK_CHECK_VERSION(3,0,0) /* gtk >= 3 */
- gtk_widget_override_font (v2v_output, font);
-#else
- gtk_widget_modify_font (v2v_output, font);
-#endif
- pango_font_description_free (font);
-#endif
-
- log_label = gtk_label_new (NULL);
- set_alignment (log_label, 0., 0.5);
- set_padding (log_label, 10, 10);
- set_log_dir (NULL);
- status_label = gtk_label_new (NULL);
- set_alignment (status_label, 0., 0.5);
- set_padding (status_label, 10, 10);
-
- gtk_container_add (GTK_CONTAINER (v2v_output_sw), v2v_output);
-
- gtk_box_pack_start
- (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (run_dlg))),
- v2v_output_sw, TRUE, TRUE, 0);
- gtk_box_pack_start
- (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (run_dlg))),
- log_label, TRUE, TRUE, 0);
- gtk_box_pack_start
- (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (run_dlg))),
- status_label, TRUE, TRUE, 0);
-
- /* Shutdown popup menu. */
-#ifdef USE_POPOVERS
- shutdown_menu = g_menu_new ();
- g_menu_append (shutdown_menu, _("_Shutdown"),
"shutdown.shutdown");
- g_menu_append (shutdown_menu, _("_Reboot"), "shutdown.reboot");
-
- shutdown_group = g_simple_action_group_new ();
- g_action_map_add_action_entries (G_ACTION_MAP (shutdown_group),
- shutdown_actions,
- G_N_ELEMENTS (shutdown_actions), NULL);
-#else
- shutdown_menu = gtk_menu_new ();
- shutdown_menu_item = gtk_menu_item_new_with_mnemonic (_("_Shutdown"));
- gtk_menu_shell_append (GTK_MENU_SHELL (shutdown_menu), shutdown_menu_item);
- gtk_widget_show (shutdown_menu_item);
- reboot_menu_item = gtk_menu_item_new_with_mnemonic (_("_Reboot"));
- gtk_menu_shell_append (GTK_MENU_SHELL (shutdown_menu), reboot_menu_item);
- gtk_widget_show (reboot_menu_item);
-#endif
-
- /* Buttons. */
- gtk_dialog_add_buttons (GTK_DIALOG (run_dlg),
- _("_Cancel conversion ..."), 1,
- NULL);
- cancel_button = gtk_dialog_get_widget_for_response (GTK_DIALOG (run_dlg), 1);
- gtk_widget_set_sensitive (cancel_button, FALSE);
-#ifdef USE_POPOVERS
- shutdown_button = gtk_menu_button_new ();
- gtk_button_set_use_underline (GTK_BUTTON (shutdown_button), TRUE);
- gtk_button_set_label (GTK_BUTTON (shutdown_button), _("_Shutdown ..."));
- gtk_button_set_always_show_image (GTK_BUTTON (shutdown_button), TRUE);
- gtk_widget_insert_action_group (shutdown_button, "shutdown",
- G_ACTION_GROUP (shutdown_group));
- gtk_menu_button_set_use_popover (GTK_MENU_BUTTON (shutdown_button), TRUE);
- gtk_menu_button_set_menu_model (GTK_MENU_BUTTON (shutdown_button),
- G_MENU_MODEL (shutdown_menu));
-#else
- shutdown_button = GTK_WIDGET (gtk_menu_tool_button_new (NULL,
- _("_Shutdown
...")));
- gtk_tool_button_set_use_underline (GTK_TOOL_BUTTON (shutdown_button), TRUE);
- gtk_menu_tool_button_set_menu (GTK_MENU_TOOL_BUTTON (shutdown_button),
- shutdown_menu);
-#endif
- gtk_widget_set_sensitive (shutdown_button, FALSE);
- gtk_dialog_add_action_widget (GTK_DIALOG (run_dlg), shutdown_button, 2);
-
- /* Signals. */
- g_signal_connect_swapped (G_OBJECT (run_dlg), "delete_event",
- G_CALLBACK (close_running_dialog), NULL);
- g_signal_connect_swapped (G_OBJECT (run_dlg), "destroy",
- G_CALLBACK (gtk_main_quit), NULL);
- g_signal_connect (G_OBJECT (cancel_button), "clicked",
- G_CALLBACK (cancel_conversion_dialog), NULL);
-#ifndef USE_POPOVERS
- g_signal_connect (G_OBJECT (shutdown_button), "clicked",
- G_CALLBACK (shutdown_button_clicked), shutdown_menu);
- g_signal_connect (G_OBJECT (shutdown_menu_item), "activate",
- G_CALLBACK (shutdown_clicked), NULL);
- g_signal_connect (G_OBJECT (reboot_menu_item), "activate",
- G_CALLBACK (reboot_clicked), NULL);
-#endif
-}
-
-/**
- * Hide all other dialogs and show the running dialog.
- */
-static void
-show_running_dialog (void)
-{
- /* Hide the other dialogs. */
- gtk_widget_hide (conn_dlg);
- gtk_widget_hide (conv_dlg);
-
- /* Show the running dialog. */
- gtk_widget_show_all (run_dlg);
- gtk_widget_set_sensitive (cancel_button, TRUE);
- if (is_iso_environment)
- gtk_widget_set_sensitive (shutdown_button, FALSE);
-}
-
-/**
- * Display the remote log directory in the running dialog.
- *
- * If this isn't called from the main thread, then you must only
- * call it via an idle task (C<g_idle_add>).
- *
- * B<NB:> This frees the remote_dir (C<user_data> pointer) which was
- * strdup'd in C<notify_ui_callback>.
- */
-static gboolean
-set_log_dir (gpointer user_data)
-{
- CLEANUP_FREE const char *remote_dir = user_data;
- CLEANUP_FREE char *msg;
-
- if (asprintf (&msg,
- _("Debug information and log files "
- "are saved to this directory "
- "on the conversion server:\n"
- "%s"),
- remote_dir ? remote_dir : "") == -1)
- error (EXIT_FAILURE, errno, "asprintf");
-
- gtk_label_set_text (GTK_LABEL (log_label), msg);
-
- return FALSE;
-}
-
-/**
- * Display the conversion status in the running dialog.
- *
- * If this isn't called from the main thread, then you must only
- * call it via an idle task (C<g_idle_add>).
- *
- * B<NB:> This frees the message (C<user_data> pointer) which was
- * strdup'd in C<notify_ui_callback>.
- */
-static gboolean
-set_status (gpointer user_data)
-{
- CLEANUP_FREE const char *msg = user_data;
-
- gtk_label_set_text (GTK_LABEL (status_label), msg);
-
- return FALSE;
-}
-
-/**
- * Append output from the virt-v2v process to the buffer, and scroll
- * to ensure it is visible.
- *
- * This function is able to parse ANSI colour sequences and more.
- *
- * If this isn't called from the main thread, then you must only
- * call it via an idle task (C<g_idle_add>).
- *
- * B<NB:> This frees the message (C<user_data> pointer) which was
- * strdup'd in C<notify_ui_callback>.
- */
-static gboolean
-add_v2v_output (gpointer user_data)
-{
- CLEANUP_FREE const char *msg = user_data;
- const char *p;
- static size_t linelen = 0;
- static enum {
- state_normal,
- state_escape1, /* seen ESC, expecting [ */
- state_escape2, /* seen ESC [, expecting 0 or 1 */
- state_escape3, /* seen ESC [ 0/1, expecting ; or m */
- state_escape4, /* seen ESC [ 0/1 ;, expecting 3 */
- state_escape5, /* seen ESC [ 0/1 ; 3, expecting 1/2/4/5 */
- state_escape6, /* seen ESC [ 0/1 ; 3 1/2/5/5, expecting m */
- state_cr, /* seen CR */
- state_truncating, /* truncating line until next \n */
- } state = state_normal;
- static int colour = 0;
- static GtkTextTag *tag = NULL;
- GtkTextBuffer *buf = gtk_text_view_get_buffer (GTK_TEXT_VIEW (v2v_output));
- GtkTextIter iter, iter2;
- const char *dots = " [...]";
-
- for (p = msg; *p != '\0'; ++p) {
- char c = *p;
-
- switch (state) {
- case state_normal:
- if (c == '\r') /* Start of possible CRLF sequence. */
- state = state_cr;
- else if (c == '\x1b') { /* Start of an escape sequence. */
- state = state_escape1;
- colour = 0;
- }
- else if (c != '\n' && linelen >= 256) {
- /* Gtk2 (in ~ Fedora 23) has a regression where it takes much
- * longer to display long lines, to the point where the
- * virt-p2v UI would still be slowly displaying kernel modules
- * while the conversion had finished. For this reason,
- * arbitrarily truncate very long lines.
- */
- gtk_text_buffer_get_end_iter (buf, &iter);
- gtk_text_buffer_insert_with_tags (buf, &iter,
- dots, strlen (dots), tag, NULL);
- state = state_truncating;
- colour = 0;
- tag = NULL;
- }
- else { /* Treat everything else as a normal char. */
- if (c != '\n') linelen++; else linelen = 0;
- gtk_text_buffer_get_end_iter (buf, &iter);
- gtk_text_buffer_insert_with_tags (buf, &iter, &c, 1, tag, NULL);
- }
- break;
-
- case state_escape1:
- if (c == '[')
- state = state_escape2;
- else
- state = state_normal;
- break;
-
- case state_escape2:
- if (c == '0')
- state = state_escape3;
- else if (c == '1') {
- state = state_escape3;
- colour += 8;
- }
- else
- state = state_normal;
- break;
-
- case state_escape3:
- if (c == ';')
- state = state_escape4;
- else if (c == 'm') {
- tag = NULL; /* restore text colour */
- state = state_normal;
- }
- else
- state = state_normal;
- break;
-
- case state_escape4:
- if (c == '3')
- state = state_escape5;
- else
- state = state_normal;
- break;
-
- case state_escape5:
- if (c >= '0' && c <= '7') {
- state = state_escape6;
- colour += c - '0';
- }
- else
- state = state_normal;
- break;
-
- case state_escape6:
- if (c == 'm') {
- assert (colour >= 0 && colour <= 15);
- tag = v2v_output_tags[colour]; /* set colour tag */
- }
- state = state_normal;
- break;
-
- case state_cr:
- if (c == '\n')
- /* Process CRLF as single a newline character. */
- p--;
- else { /* Delete current (== last) line. */
- linelen = 0;
- gtk_text_buffer_get_end_iter (buf, &iter);
- iter2 = iter;
- gtk_text_iter_set_line_offset (&iter, 0);
- /* Delete from iter..iter2 */
- gtk_text_buffer_delete (buf, &iter, &iter2);
- }
- state = state_normal;
- break;
-
- case state_truncating:
- if (c == '\n') {
- p--;
- state = state_normal;
- }
- break;
- } /* switch (state) */
- } /* for */
-
- /* Scroll to the end of the buffer. */
- gtk_text_buffer_get_end_iter (buf, &iter);
- gtk_text_view_scroll_to_iter (GTK_TEXT_VIEW (v2v_output), &iter,
- 0, FALSE, 0., 1.);
-
- return FALSE;
-}
-
-/**
- * Callback when the C<Start conversion> button is clicked.
- */
-static void
-start_conversion_clicked (GtkWidget *w, gpointer data)
-{
- struct config *config = data;
- const char *str;
- char *str2;
- GtkWidget *dlg;
- struct config *copy;
- int err;
- pthread_t tid;
- pthread_attr_t attr;
-
- /* Unpack dialog fields and check them. */
- free (config->guestname);
- config->guestname = strdup (gtk_entry_get_text (GTK_ENTRY (guestname_entry)));
-
- if (STREQ (config->guestname, "")) {
- dlg = gtk_message_dialog_new (GTK_WINDOW (conv_dlg),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- _("The guest \"Name\" field is
empty."));
- gtk_window_set_title (GTK_WINDOW (dlg), _("Error"));
- gtk_dialog_run (GTK_DIALOG (dlg));
- gtk_widget_destroy (dlg);
- gtk_widget_grab_focus (guestname_entry);
- return;
- }
-
- config->vcpus = get_vcpus_from_conv_dlg ();
- config->memory = get_memory_from_conv_dlg ();
-
- /* Get the list of disks to be converted. */
- set_disks_from_ui (config);
-
- /* The list of disks must be non-empty. */
- if (config->disks == NULL || guestfs_int_count_strings (config->disks) == 0) {
- dlg = gtk_message_dialog_new (GTK_WINDOW (conv_dlg),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- _("No disks were selected for conversion.\n"
- "At least one fixed hard disk must be
selected.\n"));
- gtk_window_set_title (GTK_WINDOW (dlg), _("Error"));
- gtk_dialog_run (GTK_DIALOG (dlg));
- gtk_widget_destroy (dlg);
- return;
- }
-
- /* List of removable media and network interfaces. */
- set_removable_from_ui (config);
- set_interfaces_from_ui (config);
- set_network_map_from_ui (config);
-
- /* Output selection. */
- free (config->output.type);
- config->output.type =
- gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (o_combo));
-
- config->output.allocation = OUTPUT_ALLOCATION_NONE;
- str2 = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (oa_combo));
- if (str2) {
- if (STREQ (str2, "sparse"))
- config->output.allocation = OUTPUT_ALLOCATION_SPARSE;
- else if (STREQ (str2, "preallocated"))
- config->output.allocation = OUTPUT_ALLOCATION_PREALLOCATED;
- free (str2);
- }
-
- free (config->output.connection);
- str = gtk_entry_get_text (GTK_ENTRY (oc_entry));
- if (str && STRNEQ (str, ""))
- config->output.connection = strdup (str);
- else
- config->output.connection = NULL;
-
- free (config->output.format);
- str = gtk_entry_get_text (GTK_ENTRY (of_entry));
- if (str && STRNEQ (str, ""))
- config->output.format = strdup (str);
- else
- config->output.format = NULL;
-
- free (config->output.storage);
- str = gtk_entry_get_text (GTK_ENTRY (os_entry));
- if (str && STRNEQ (str, ""))
- config->output.storage = strdup (str);
- else
- config->output.storage = NULL;
-
- /* Display the UI for conversion. */
- show_running_dialog ();
-
- /* Do the conversion, in a background thread. */
-
- /* Give the conversion (background) thread its own copy of the
- * config in case we update the config in the main thread.
- */
- copy = copy_config (config);
-
- pthread_attr_init (&attr);
- pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
- err = pthread_create (&tid, &attr, start_conversion_thread, copy);
- if (err != 0)
- error (EXIT_FAILURE, err, "pthread_create");
- pthread_attr_destroy (&attr);
-}
-
-/**
- * This is the background thread which performs the conversion.
- */
-static void *
-start_conversion_thread (void *data)
-{
- struct config *copy = data;
- int r;
-
- r = start_conversion (copy, notify_ui_callback);
- free_config (copy);
-
- if (r == -1)
- g_idle_add (conversion_error, NULL);
- else
- g_idle_add (conversion_finished, NULL);
-
- /* Thread is detached anyway, so no one is waiting for the status. */
- return NULL;
-}
-
-/**
- * Idle task called from C<start_conversion_thread> (but run on the
- * main thread) when there was an error during the conversion.
- */
-static gboolean
-conversion_error (gpointer user_data)
-{
- const char *err = get_conversion_error ();
- GtkWidget *dlg;
-
- dlg = gtk_message_dialog_new (GTK_WINDOW (run_dlg),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_ERROR,
- GTK_BUTTONS_OK,
- _("Conversion failed: %s"), err);
- gtk_window_set_title (GTK_WINDOW (dlg), _("Conversion failed"));
- gtk_dialog_run (GTK_DIALOG (dlg));
- gtk_widget_destroy (dlg);
-
- /* Disable the cancel button. */
- gtk_widget_set_sensitive (cancel_button, FALSE);
-
- /* Enable the shutdown button. */
- if (is_iso_environment)
- gtk_widget_set_sensitive (shutdown_button, TRUE);
-
- return FALSE;
-}
-
-/**
- * Idle task called from C<start_conversion_thread> (but run on the
- * main thread) when the conversion completed without errors.
- */
-static gboolean
-conversion_finished (gpointer user_data)
-{
- GtkWidget *dlg;
-
- dlg = gtk_message_dialog_new (GTK_WINDOW (run_dlg),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_INFO,
- GTK_BUTTONS_OK,
- _("The conversion was successful."));
- gtk_window_set_title (GTK_WINDOW (dlg), _("Conversion was successful"));
- gtk_dialog_run (GTK_DIALOG (dlg));
- gtk_widget_destroy (dlg);
-
- /* Disable the cancel button. */
- gtk_widget_set_sensitive (cancel_button, FALSE);
-
- /* Enable the shutdown button. */
- if (is_iso_environment)
- gtk_widget_set_sensitive (shutdown_button, TRUE);
-
- return FALSE;
-}
-
-/**
- * This is called from F<conversion.c>:C<start_conversion>
- * when there is a status change or a log message.
- */
-static void
-notify_ui_callback (int type, const char *data)
-{
- /* Because we call the functions as idle callbacks which run
- * in the main thread some time later, we must duplicate the
- * 'data' parameter (which is always a \0-terminated string).
- *
- * This is freed by the idle task function.
- */
- char *copy = strdup (data);
-
- switch (type) {
- case NOTIFY_LOG_DIR:
- g_idle_add (set_log_dir, (gpointer) copy);
- break;
-
- case NOTIFY_REMOTE_MESSAGE:
- g_idle_add (add_v2v_output, (gpointer) copy);
- break;
-
- case NOTIFY_STATUS:
- g_idle_add (set_status, (gpointer) copy);
- break;
-
- default:
- fprintf (stderr,
- "%s: unknown message during conversion: type=%d data=%s\n",
- getprogname (), type, data);
- free (copy);
- }
-}
-
-static gboolean
-close_running_dialog (GtkWidget *w, GdkEvent *event, gpointer data)
-{
- /* This function is called if the user tries to close the running
- * dialog. This is the same as cancelling the conversion.
- */
- if (conversion_is_running ()) {
- cancel_conversion ();
- return TRUE;
- }
- else
- /* Conversion is not running, so this will delete the dialog. */
- return FALSE;
-}
-
-/**
- * This is called when the user clicks on the "Cancel conversion"
- * button. Since conversions can run for a long time, and cancelling
- * the conversion is non-recoverable, this function displays a
- * confirmation dialog before cancelling the conversion.
- */
-static void
-cancel_conversion_dialog (GtkWidget *w, gpointer data)
-{
- GtkWidget *dlg;
-
- if (!conversion_is_running ())
- return;
-
- dlg = gtk_message_dialog_new (GTK_WINDOW (run_dlg),
- GTK_DIALOG_DESTROY_WITH_PARENT,
- GTK_MESSAGE_QUESTION,
- GTK_BUTTONS_YES_NO,
- _("Really cancel the conversion? "
- "To convert this machine you will need to "
- "re-run the conversion from the
beginning."));
- gtk_window_set_title (GTK_WINDOW (dlg), _("Cancel the conversion"));
- if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_YES)
- /* This makes start_conversion return an error (eventually). */
- cancel_conversion ();
-
- gtk_widget_destroy (dlg);
-}
-
-#ifdef USE_POPOVERS
-static void
-activate_action (GSimpleAction *action, GVariant *parameter, gpointer user_data)
-{
- const char *action_name = g_action_get_name (G_ACTION (action));
- if (STREQ (action_name, "shutdown"))
- shutdown_clicked (NULL, user_data);
- else if (STREQ (action_name, "reboot"))
- reboot_clicked (NULL, user_data);
-}
-#else
-static void
-shutdown_button_clicked (GtkToolButton *w, gpointer data)
-{
- GtkMenu *menu = data;
-
- gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 1,
- gtk_get_current_event_time ());
-}
-#endif
-
-static void
-shutdown_clicked (GtkWidget *w, gpointer data)
-{
- if (!is_iso_environment)
- return;
-
- sync ();
- sleep (2);
- ignore_value (system ("/sbin/poweroff"));
-}
-
-static void
-reboot_clicked (GtkWidget *w, gpointer data)
-{
- if (!is_iso_environment)
- return;
-
- sync ();
- sleep (2);
- ignore_value (system ("/sbin/reboot"));
-}
diff --git a/p2v/inhibit.c b/p2v/inhibit.c
deleted file mode 100644
index 7615d65f9..000000000
--- a/p2v/inhibit.c
+++ /dev/null
@@ -1,154 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2016 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * This file is used to inhibit power saving, sleep, suspend etc during
- * the conversion.
- *
- * The method it uses is to send a D-Bus message to logind, as
- * described here:
- *
- *
https://www.freedesktop.org/wiki/Software/systemd/inhibit/
- *
- * If virt-p2v is compiled without D-Bus support then this does nothing.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
-#if defined(HAVE_DBUS)
-#include <dbus/dbus.h>
-#endif
-
-#include "p2v.h"
-
-/**
- * Inhibit all forms of power saving. A file descriptor is returned,
- * and when the file descriptor is closed the inhibit is stopped.
- *
- * If the function returns C<-1> then C<Inhibit> operation could not
- * be performed (eg. if we are compiled without D-Bus support, or there
- * is some error contacting logind). This is not usually fatal from
- * the point of view of the caller, conversion can continue.
- */
-int
-inhibit_power_saving (void)
-{
-#if defined(HAVE_DBUS) && defined(DBUS_TYPE_UNIX_FD)
- DBusError err;
- DBusConnection *conn = NULL;
- DBusMessage *msg = NULL;
- DBusMessageIter args;
- DBusPendingCall *pending = NULL;
- const char *what = "shutdown:sleep:idle";
- const char *who = "virt-p2v";
- const char *why = "virt-p2v conversion is running";
- const char *mode = "block";
- int fd = -1;
-
- dbus_error_init (&err);
-
- conn = dbus_bus_get (DBUS_BUS_SYSTEM, &err);
- if (dbus_error_is_set (&err)) {
- fprintf (stderr, "inhibit_power_saving: dbus: cannot connect to system bus:
%s\n", err.message);
- goto out;
- }
- if (conn == NULL)
- goto out;
-
- msg = dbus_message_new_method_call ("org.freedesktop.login1",
- "/org/freedesktop/login1",
- "org.freedesktop.login1.Manager",
- "Inhibit");
- if (msg == NULL) {
- fprintf (stderr, "inhibit_power_saving: dbus: cannot create message\n");
- goto out;
- }
-
- dbus_message_iter_init_append (msg, &args);
- if (!dbus_message_iter_append_basic (&args, DBUS_TYPE_STRING, &what) ||
- !dbus_message_iter_append_basic (&args, DBUS_TYPE_STRING, &who) ||
- !dbus_message_iter_append_basic (&args, DBUS_TYPE_STRING, &why) ||
- !dbus_message_iter_append_basic (&args, DBUS_TYPE_STRING, &mode)) {
- fprintf (stderr, "inhibit_power_saving: dbus: cannot add message
arguments\n");
- goto out;
- }
-
- if (!dbus_connection_send_with_reply (conn, msg, &pending, -1)) {
- fprintf (stderr, "inhibit_power_saving: dbus: cannot send Inhibit message to
logind\n");
- goto out;
- }
- if (pending == NULL)
- goto out;
- dbus_connection_flush (conn);
-
- dbus_message_unref (msg);
- msg = NULL;
-
- dbus_pending_call_block (pending);
- msg = dbus_pending_call_steal_reply (pending);
- if (msg == NULL) {
- fprintf (stderr, "inhibit_power_saving: dbus: could not read message
reply\n");
- goto out;
- }
-
- dbus_pending_call_unref (pending);
- pending = NULL;
-
- if (!dbus_message_iter_init (msg, &args)) {
- fprintf (stderr, "inhibit_power_saving: dbus: message reply has no return
value\n");
- goto out;
- }
-
- if (dbus_message_iter_get_arg_type (&args) != DBUS_TYPE_UNIX_FD) {
- fprintf (stderr, "inhibit_power_saving: dbus: message reply is not a file
descriptor\n");
- goto out;
- }
-
- dbus_message_iter_get_basic (&args, &fd);
-
-#ifdef DEBUG_STDERR
- fprintf (stderr, "inhibit_power_saving: dbus: Inhibit() call returned file
descriptor %d\n", fd);
-#endif
-
-out:
- if (pending != NULL)
- dbus_pending_call_unref (pending);
- if (msg != NULL)
- dbus_message_unref (msg);
-
- /* This is the system bus connection, so unref-ing it does not
- * actually close it.
- */
- if (conn != NULL)
- dbus_connection_unref (conn);
-
- dbus_error_free (&err);
-
- return fd;
-
-#else /* !dbus */
-#ifdef DEBUG_STDERR
- fprintf (stderr, "warning: virt-p2v compiled without D-Bus support.\n");
-#endif
- return -1;
-#endif
-}
diff --git a/p2v/issue b/p2v/issue
deleted file mode 100644
index 9896b6b75..000000000
--- a/p2v/issue
+++ /dev/null
@@ -1,16 +0,0 @@
-virt-p2v - Convert a physical machine to use KVM.
-
-***
-The root password is "p2v" (without quotes).
-
-To see the status of virt-p2v, do:
-
- systemctl status p2v -l
-
-Virt-p2v may take some time to start up. If virt-p2v is not running
-after a few minutes, you can start it by typing:
-
- launch-virt-p2v
-
-***
-
diff --git a/p2v/kernel-cmdline.c b/p2v/kernel-cmdline.c
deleted file mode 100644
index c53b9783b..000000000
--- a/p2v/kernel-cmdline.c
+++ /dev/null
@@ -1,196 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2015 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * Mini library to read and parse C</proc/cmdline>.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
-#include <errno.h>
-#include <error.h>
-
-#include "getprogname.h"
-
-#include "p2v.h"
-
-static void
-add_null (char ***argv, size_t *lenp)
-{
- (*lenp)++;
- *argv = realloc (*argv, *lenp * sizeof (char *));
- if (*argv == NULL)
- error (EXIT_FAILURE, errno, "realloc");
- (*argv)[(*lenp)-1] = NULL;
-}
-
-static void
-add_string (char ***argv, size_t *lenp, const char *str, size_t len)
-{
- add_null (argv, lenp);
- (*argv)[(*lenp)-1] = strndup (str, len);
- if ((*argv)[(*lenp)-1] == NULL)
- error (EXIT_FAILURE, errno, "strndup");
-}
-
-/**
- * Read and parse C</proc/cmdline>.
- *
- * We only support double quoting, consistent with the Linux
- * documentation.
- *
L<https://www.kernel.org/doc/Documentation/kernel-parameters.txt>
- *
- * systemd supports single and double quoting and single character
- * escaping, but we don't support all that.
- *
- * Returns a list of key, value pairs, terminated by C<NULL>.
- */
-char **
-parse_cmdline_string (const char *cmdline)
-{
- char **ret = NULL;
- size_t len = 0;
- const char *p, *key = NULL, *value = NULL;
- enum {
- KEY_START = 0,
- KEY,
- VALUE_START,
- VALUE,
- VALUE_QUOTED
- } state = 0;
-
- for (p = cmdline; *p; p++) {
- switch (state) {
- case KEY_START: /* looking for the start of a key */
- if (*p == ' ') continue;
- key = p;
- state = KEY;
- break;
-
- case KEY: /* reading key */
- if (*p == ' ') {
- add_string (&ret, &len, key, p-key);
- add_string (&ret, &len, "", 0);
- state = KEY_START;
- }
- else if (*p == '=') {
- add_string (&ret, &len, key, p-key);
- state = VALUE_START;
- }
- break;
-
- case VALUE_START: /* looking for the start of a value */
- if (*p == ' ') {
- add_string (&ret, &len, "", 0);
- state = KEY_START;
- }
- else if (*p == '"') {
- value = p+1;
- state = VALUE_QUOTED;
- }
- else {
- value = p;
- state = VALUE;
- }
- break;
-
- case VALUE: /* reading unquoted value */
- if (*p == ' ') {
- add_string (&ret, &len, value, p-value);
- state = KEY_START;
- }
- break;
-
- case VALUE_QUOTED: /* reading quoted value */
- if (*p == '"') {
- add_string (&ret, &len, value, p-value);
- state = KEY_START;
- }
- break;
- }
- }
-
- switch (state) {
- case KEY_START: break;
- case KEY: /* key followed by end of string */
- add_string (&ret, &len, key, p-key);
- add_string (&ret, &len, "", 0);
- break;
- case VALUE_START: /* key= followed by end of string */
- add_string (&ret, &len, "", 0);
- break;
- case VALUE: /* key=value followed by end of string */
- add_string (&ret, &len, value, p-value);
- break;
- case VALUE_QUOTED: /* unterminated key="value" */
- fprintf (stderr, "%s: warning: unterminated quoted string on kernel command
line\n",
- getprogname ());
- add_string (&ret, &len, value, p-value);
- }
-
- add_null (&ret, &len);
-
- return ret;
-}
-
-char **
-parse_proc_cmdline (void)
-{
- CLEANUP_FCLOSE FILE *fp = NULL;
- CLEANUP_FREE char *cmdline = NULL;
- size_t len = 0;
-
- fp = fopen ("/proc/cmdline", "re");
- if (fp == NULL) {
- perror ("/proc/cmdline");
- return NULL;
- }
-
- if (getline (&cmdline, &len, fp) == -1) {
- perror ("getline");
- return NULL;
- }
-
- /* 'len' is not the length of the string, but the length of the
- * buffer. We need to chomp the string.
- */
- len = strlen (cmdline);
-
- if (len >= 1 && cmdline[len-1] == '\n')
- cmdline[len-1] = '\0';
-
- return parse_cmdline_string (cmdline);
-}
-
-const char *
-get_cmdline_key (char **argv, const char *key)
-{
- size_t i;
-
- for (i = 0; argv[i] != NULL; i += 2) {
- if (STREQ (argv[i], key))
- return argv[i+1];
- }
-
- /* Not found. */
- return NULL;
-}
diff --git a/p2v/kernel.c b/p2v/kernel.c
deleted file mode 100644
index e9a0630ae..000000000
--- a/p2v/kernel.c
+++ /dev/null
@@ -1,158 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2009-2019 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * Kernel-driven, non-interactive configuration of virt-p2v.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <inttypes.h>
-#include <unistd.h>
-#include <errno.h>
-#include <error.h>
-#include <assert.h>
-#include <locale.h>
-#include <libintl.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include "getprogname.h"
-
-#include "p2v.h"
-
-static void notify_ui_callback (int type, const char *data);
-static void run_command (const char *stage, const char *command);
-
-/* Perform conversion using the kernel method. */
-void
-kernel_conversion (struct config *config, char **cmdline, int cmdline_source)
-{
- const char *p;
-
- /* Pre-conversion command. */
- p = get_cmdline_key (cmdline, "p2v.pre");
- if (p)
- run_command ("p2v.pre", p);
-
- /* Connect to and interrogate virt-v2v on the conversion server. */
- p = get_cmdline_key (cmdline, "p2v.skip_test_connection");
- if (!p) {
- wait_network_online (config);
- if (test_connection (config) == -1) {
- const char *err = get_ssh_error ();
-
- error (EXIT_FAILURE, 0,
- "error opening control connection to %s:%d: %s",
- config->remote.server, config->remote.port, err);
- }
- }
-
- /* Some disks must have been specified for conversion. */
- if (config->disks == NULL || guestfs_int_count_strings (config->disks) == 0)
- error (EXIT_FAILURE, 0,
- "no non-removable disks were discovered on this machine.\n"
- "virt-p2v looked in /sys/block and in p2v.disks on the kernel command
line.\n"
- "This is a fatal error and virt-p2v cannot continue.");
-
- /* Perform the conversion in text mode. */
- if (start_conversion (config, notify_ui_callback) == -1) {
- const char *err = get_conversion_error ();
-
- fprintf (stderr, "%s: error during conversion: %s\n",
- getprogname (), err);
-
- p = get_cmdline_key (cmdline, "p2v.fail");
- if (p)
- run_command ("p2v.fail", p);
-
- exit (EXIT_FAILURE);
- }
-
- ansi_green (stdout);
- printf ("Conversion finished successfully.");
- ansi_restore (stdout);
- putchar ('\n');
-
- p = get_cmdline_key (cmdline, "p2v.post");
- if (!p) {
- if (geteuid () == 0 && cmdline_source == CMDLINE_SOURCE_PROC_CMDLINE)
- p = "poweroff";
- }
- if (p)
- run_command ("p2v.post", p);
-}
-
-static void
-notify_ui_callback (int type, const char *data)
-{
- switch (type) {
- case NOTIFY_LOG_DIR:
- ansi_magenta (stdout);
- printf ("%s: remote log directory location: ", getprogname ());
- ansi_red (stdout);
- fputs (data, stdout);
- ansi_restore (stdout);
- putchar ('\n');
- break;
-
- case NOTIFY_REMOTE_MESSAGE:
- printf ("%s", data);
- break;
-
- case NOTIFY_STATUS:
- ansi_magenta (stdout);
- printf ("%s: %s", getprogname (), data);
- ansi_restore (stdout);
- putchar ('\n');
- break;
-
- default:
- ansi_red (stdout);
- printf ("%s: unknown message during conversion: type=%d data=%s",
- getprogname (), type, data);
- ansi_restore (stdout);
- putchar ('\n');
- }
-
- fflush (stdout);
-}
-
-static void
-run_command (const char *stage, const char *command)
-{
- int r;
-
- if (STREQ (command, ""))
- return;
-
-#if DEBUG_STDERR
- fprintf (stderr, "%s\n", command);
- fflush (stderr);
-#endif
-
- r = system (command);
- if (r == -1)
- error (EXIT_FAILURE, errno, "system: %s", command);
- if ((WIFEXITED (r) && WEXITSTATUS (r) != 0) || !WIFEXITED (r))
- error (EXIT_FAILURE, 0,
- "%s: unexpected failure of external command", stage);
-}
diff --git a/p2v/kiwi-config.sh b/p2v/kiwi-config.sh
deleted file mode 100755
index b24fd3bad..000000000
--- a/p2v/kiwi-config.sh
+++ /dev/null
@@ -1,73 +0,0 @@
-#!/bin/bash
-#================
-# FILE : config.sh
-#----------------
-# PROJECT : OpenSuSE KIWI Image System
-# COPYRIGHT : (c) 2006 SUSE LINUX Products GmbH. All rights reserved
-# :
-# AUTHOR : Marcus Schaefer <ms(a)suse.de>
-#======================================
-# Functions...
-#--------------------------------------
-test -f /.kconfig && . /.kconfig
-test -f /.profile && . /.profile
-
-#======================================
-# Greeting...
-#--------------------------------------
-echo "Configure image: [$kiwi_iname]..."
-
-#======================================
-# Mount system filesystems
-#--------------------------------------
-baseMount
-
-#======================================
-# Setup baseproduct link
-#--------------------------------------
-suseSetupProduct
-
-#======================================
-# Add missing gpg keys to rpm
-#--------------------------------------
-suseImportBuildKey
-
-#======================================
-# Activate services
-#--------------------------------------
-suseInsertService p2v
-
-#======================================
-# Setup default target, multi-user
-#--------------------------------------
-baseSetRunlevel 3
-
-#==========================================
-# remove package docs
-#------------------------------------------
-rm -rf /usr/share/doc/packages/*
-rm -rf /usr/share/doc/manual/*
-rm -rf /opt/kde*
-
-# Update the default getty target to login automatically as root without
-# prompting for a password
-sed -i 's/^ExecStart=\(.*\)/ExecStart=\1 -a root/' \
- /usr/lib/systemd/system/getty@.service
-
-# Reserve tty1 as a getty so we can document it clearly
-echo ReserveVT=1 >> /etc/systemd/logind.conf
-
-sed -i 's/^ROOT_USES_LANG=.*$/ROOT_USES_LANG="yes"/' \
- /etc/sysconfig/language
-
-#======================================
-# SuSEconfig
-#--------------------------------------
-suseConfig
-
-#======================================
-# Umount kernel filesystems
-#--------------------------------------
-baseCleanMount
-
-exit 0
diff --git a/p2v/kiwi-config.xml.in b/p2v/kiwi-config.xml.in
deleted file mode 100644
index 680076b20..000000000
--- a/p2v/kiwi-config.xml.in
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<image schemaversion="6.2" name="p2v-__KIWI_BOOT__"
displayname="p2v___PACKAGE_VERSION_____KIWI_BOOT__">
- <description type="system">
- <author>Marcus Schäfer</author>
- <contact>ms(a)suse.com</contact>
- <specification>P2V __PACKAGE_VERSION__</specification>
- </description>
- <profiles>
- <profile name="vmxFlavour" description="VMX with default
kernel" import="true"/>
- <profile name="netboot" description="compressed rootfs image for
pxe"/>
- </profiles>
- <preferences>
- <type image="iso" primary="true"
boot="isoboot/suse-__KIWI_BOOT__" flags="overlay"
hybrid="true" firmware="uefi" kernelcmdline="splash"/>
- <version>__PACKAGE_VERSION__</version>
- <packagemanager>zypper</packagemanager>
- <locale>en_US</locale>
- <keytable>us.map.gz</keytable>
- <hwclock>utc</hwclock>
- <bootloader-theme>__BRANDING__</bootloader-theme>
- <bootsplash-theme>__BRANDING__</bootsplash-theme>
- <rpm-excludedocs>true</rpm-excludedocs>
- <rpm-check-signatures>false</rpm-check-signatures>
- </preferences>
- <preferences profiles="netboot">
- <type image="pxe" filesystem="overlayfs"
boot="netboot/suse-__KIWI_BOOT__">
- <pxedeploy server="192.168.100.2" blocksize="4096">
- <partitions device="/dev/sda">
- <partition type="swap" number="1"
size="5"/>
- <partition type="L" number="2" size="image"
mountpoint="/" target="true"/>
- <partition type="L" number="3"
target="false"/>
- </partitions>
- <union ro="/dev/sda2" rw="/dev/sda3"
type="overlayfs"/>
- </pxedeploy>
- </type>
- </preferences>
- <preferences profiles="vmxFlavour">
- <type image="vmx" filesystem="ext3"
boot="vmxboot/suse-__KIWI_BOOT__" format="vmdk"
bootloader="grub2" firmware="uefi" kernelcmdline="splash"
bootpartition="false">
- <systemdisk name="systemVG"/>
- <machine memory="512" guestOS="suse"
HWversion="4">
- <vmdisk id="0" controller="ide"/>
- <vmnic driver="e1000" interface="0"
mode="bridged"/>
- </machine>
- </type>
- </preferences>
- <users group="root">
- <user password="p2v" pwdformat="plain" home="/root"
name="root"/>
- </users>
- <!--__REPOS__-->
- <packages type="image" patternType="onlyRequired">
- <package name="__BASE_PATTERN__"/>
- <package name="plymouth-branding-__BRANDING__"
bootinclude="true"/>
- <package name="grub2-branding-__BRANDING__"
bootinclude="true"/>
- <package name="iputils"/>
- <package name="grub2"/>
- <package name="grub2-x86_64-efi"/>
- <package name="syslinux"/>
- <package name="lvm2"/>
- <package name="plymouth"/>
- <package name="fontconfig"/>
- <package name="fonts-config"/>
- <package name="tar"/>
- <package name="systemd"/>
- <package name="systemd-sysvinit"/>
- <package name="dracut"/>
- <package name="wicked"/>
- <package name="iproute2"/>
- <package name="sudo"/>
- <package name="dhcp-client"/>
- <package name="which"/>
- <!-- virt-p2v dependencies from dependencies.suse -->
-<!--__DEPENDENCIES__-->
- </packages>
- <packages type="iso">
- <package name="gfxboot-branding-__BRANDING__"
bootinclude="true" bootdelete="true"/>
- </packages>
- <packages type="image" profiles="vmxFlavour">
- <package name="kernel-default" replaces="kernel-xen"/>
- <package name="kernel-default"
replaces="xen-kmp-default"/>
- <package name="kernel-default" replaces="xen-libs"/>
- <package name="kernel-default" replaces="xen-tools"/>
- <package name="kernel-default" replaces="xen"/>
- <package name="gfxboot-branding-__BRANDING__"
bootinclude="true" bootdelete="true"/>
- </packages>
- <packages type="bootstrap">
- <package name="udev"/>
- <package name="filesystem"/>
- <package name="glibc-locale"/>
- <package name="cracklib-dict-full"/>
- <package name="ca-certificates"/>
- <package name="__RELEASE_PKG__"/>
- </packages>
-</image>
diff --git a/p2v/launch-virt-p2v b/p2v/launch-virt-p2v
deleted file mode 100755
index 925aa6d6a..000000000
--- a/p2v/launch-virt-p2v
+++ /dev/null
@@ -1,51 +0,0 @@
-#!/bin/bash -
-# (C) Copyright 2014-2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-# This normally runs from systemd which deals with logging.
-
-# Are we running in GUI or non-GUI mode? This is controlled by the
-# presence of "p2v.server" on the kernel command line.
-cmdline=$(</proc/cmdline)
-if [[ $cmdline == *p2v.server=* ]]; then
- # Non-GUI mode, don't run X. Just run virt-p2v directly.
- exec /usr/bin/virt-p2v --iso --colours
-
-else
- # GUI mode. Run xinit to start X. To save one script, we invoke
- # self again to run the window manager and virt-p2v.
- if [ "$1" = "run" ]; then
- cd /
-
- ID=
- if test -f /etc/os-release; then
- . /etc/os-release
- fi
-
- case "$ID" in
- sles|opensuse)
- # not all versions of SLE / openSUSE ship metacity and nm-applet
- icewm &
- ;;
- *)
- metacity &
- nm-applet &
- esac
- exec /usr/bin/virt-p2v --iso --colours
- else
- xinit "$0" run
- fi
-fi
diff --git a/p2v/main.c b/p2v/main.c
deleted file mode 100644
index 424bccfb3..000000000
--- a/p2v/main.c
+++ /dev/null
@@ -1,583 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2009-2019 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <inttypes.h>
-#include <unistd.h>
-#include <getopt.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <error.h>
-#include <dirent.h>
-#include <locale.h>
-#include <libintl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#if MAJOR_IN_MKDEV
-#include <sys/mkdev.h>
-#elif MAJOR_IN_SYSMACROS
-#include <sys/sysmacros.h>
-/* else it's in sys/types.h, included above */
-#endif
-
-/* errors in <gtk.h> */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wstrict-prototypes"
-#if defined(__GNUC__) && __GNUC__ >= 6 /* gcc >= 6 */
-#pragma GCC diagnostic ignored "-Wshift-overflow"
-#endif
-#include <gtk/gtk.h>
-#pragma GCC diagnostic pop
-
-#include "ignore-value.h"
-#include "getprogname.h"
-#include "p2v.h"
-
-char **all_disks;
-char **all_removable;
-char **all_interfaces;
-int is_iso_environment = 0;
-int feature_colours_option = 0;
-int force_colour = 0;
-static const char *test_disk = NULL;
-
-static void udevadm_settle (void);
-static void set_config_defaults (struct config *config);
-static void find_all_disks (void);
-static void find_all_interfaces (void);
-
-enum { HELP_OPTION = CHAR_MAX + 1 };
-static const char options[] = "Vv";
-static const struct option long_options[] = {
- { "help", 0, 0, HELP_OPTION },
- { "cmdline", 1, 0, 0 },
- { "color", 0, 0, 0 },
- { "colors", 0, 0, 0 },
- { "colour", 0, 0, 0 },
- { "colours", 0, 0, 0 },
- { "iso", 0, 0, 0 },
- { "nbd", 1, 0, 0 },
- { "long-options", 0, 0, 0 },
- { "short-options", 0, 0, 0 },
- { "test-disk", 1, 0, 0 },
- { "verbose", 0, 0, 'v' },
- { "version", 0, 0, 'V' },
- { 0, 0, 0, 0 }
-};
-
-static void __attribute__((noreturn))
-usage (int status)
-{
- if (status != EXIT_SUCCESS)
- fprintf (stderr, _("Try ‘%s --help’ for more information.\n"),
- getprogname ());
- else {
- printf (_("%s: Convert a physical machine to use KVM\n"
- "Copyright (C) 2009-2019 Red Hat Inc.\n"
- "Usage:\n"
- " %s [--options]\n"
- "Options:\n"
- " --help Display brief help\n"
- " --cmdline=CMDLINE Used to debug command line parsing\n"
- " --colors|--colours Use ANSI colour sequences even if not
tty\n"
- " --iso Running in the ISO environment\n"
- " --nbd=qemu-nbd,nbdkit Search order for NBD servers\n"
- " --test-disk=DISK.IMG For testing, use disk as /dev/sda\n"
- " -v|--verbose Verbose messages\n"
- " -V|--version Display version and exit\n"
- "For more information, see the manpage %s(1).\n"),
- getprogname (), getprogname (),
- getprogname ());
- }
- exit (status);
-}
-
-/* XXX Copied from fish/options.c. */
-static void
-display_short_options (const char *format)
-{
- while (*format) {
- if (*format != ':')
- printf ("-%c\n", *format);
- ++format;
- }
- exit (EXIT_SUCCESS);
-}
-
-static void
-display_long_options (const struct option *long_options)
-{
- while (long_options->name) {
- if (STRNEQ (long_options->name, "long-options") && STRNEQ
(long_options->name, "short-options"))
- printf ("--%s\n", long_options->name);
- long_options++;
- }
- exit (EXIT_SUCCESS);
-}
-
-int
-main (int argc, char *argv[])
-{
- gboolean gui_possible;
- int c;
- int option_index;
- char **cmdline = NULL;
- int cmdline_source = 0;
- struct config *config = new_config ();
-
- setlocale (LC_ALL, "");
- bindtextdomain (PACKAGE, LOCALEBASEDIR);
- textdomain (PACKAGE);
-
- /* We may use random(3) in this program. */
- srandom (time (NULL) + getpid ());
-
- /* There is some raciness between slow devices being discovered by
- * the kernel and udev and virt-p2v running. This is a partial
- * workaround, but a real fix involves handling hotplug events
- * (possible in GUI mode, not easy in kernel mode).
- */
- udevadm_settle ();
-
- gui_possible = gtk_init_check (&argc, &argv);
-
- for (;;) {
- c = getopt_long (argc, argv, options, long_options, &option_index);
- if (c == -1) break;
-
- switch (c) {
- case 0: /* options which are long only */
- if (STREQ (long_options[option_index].name, "long-options")) {
- display_long_options (long_options);
- }
- else if (STREQ (long_options[option_index].name, "short-options")) {
- display_short_options (options);
- }
- else if (STREQ (long_options[option_index].name, "cmdline")) {
- cmdline = parse_cmdline_string (optarg);
- cmdline_source = CMDLINE_SOURCE_COMMAND_LINE;
- }
- else if (STREQ (long_options[option_index].name, "color") ||
- STREQ (long_options[option_index].name, "colour") ||
- STREQ (long_options[option_index].name, "colors") ||
- STREQ (long_options[option_index].name, "colours")) {
- force_colour = 1;
- }
- else if (STREQ (long_options[option_index].name, "iso")) {
- is_iso_environment = 1;
- }
- else if (STREQ (long_options[option_index].name, "nbd")) {
- set_nbd_option (optarg); /* in nbd.c */
- }
- else if (STREQ (long_options[option_index].name, "test-disk")) {
- if (test_disk != NULL)
- error (EXIT_FAILURE, 0,
- _("only a single --test-disk option can be used"));
- if (optarg[0] != '/')
- error (EXIT_FAILURE, 0,
- _("--test-disk must be an absolute path"));
- test_disk = optarg;
- }
- else
- error (EXIT_FAILURE, 0,
- _("unknown long option: %s (%d)"),
- long_options[option_index].name, option_index);
- break;
-
- case 'v':
- /* This option does nothing since 1.33.41. Verbose is always
- * enabled.
- */
- break;
-
- case 'V':
- printf ("%s %s\n", getprogname (), PACKAGE_VERSION_FULL);
- exit (EXIT_SUCCESS);
-
- case HELP_OPTION:
- usage (EXIT_SUCCESS);
-
- default:
- usage (EXIT_FAILURE);
- }
- }
-
- if (optind != argc) {
- fprintf (stderr, _("%s: unused arguments on the command line\n"),
- getprogname ());
- usage (EXIT_FAILURE);
- }
-
- test_nbd_servers ();
-
- set_config_defaults (config);
-
- /* Parse /proc/cmdline (if it exists) or use the --cmdline parameter
- * to initialize the configuration. This allows defaults to be pass
- * using the kernel command line, with additional GUI configuration
- * later.
- */
- if (cmdline == NULL) {
- cmdline = parse_proc_cmdline ();
- if (cmdline != NULL)
- cmdline_source = CMDLINE_SOURCE_PROC_CMDLINE;
- }
-
- if (cmdline)
- update_config_from_kernel_cmdline (config, cmdline);
-
- /* If p2v.server exists, then we use the non-interactive kernel
- * conversion. Otherwise we run the GUI.
- */
- if (config->remote.server != NULL)
- kernel_conversion (config, cmdline, cmdline_source);
- else {
- if (!gui_possible)
- error (EXIT_FAILURE, 0,
- _("gtk_init_check returned false, indicating that\n"
- "a GUI is not possible on this host. Check X11, $DISPLAY
etc."));
- gui_conversion (config);
- }
-
- guestfs_int_free_string_list (cmdline);
- free_config (config);
-
- exit (EXIT_SUCCESS);
-}
-
-static void
-udevadm_settle (void)
-{
- ignore_value (system ("udevadm settle"));
-}
-
-static void
-set_config_defaults (struct config *config)
-{
- long i;
- char hostname[257];
-
- /* Default guest name is derived from the source hostname. If we
- * assume that the p2v ISO gets its IP address and hostname from
- * DHCP, then there is at better than average chance that
- * gethostname will return the real hostname here. It's better than
- * trying to fish around in the guest filesystem anyway.
- */
- if (gethostname (hostname, sizeof hostname) == -1) {
- perror ("gethostname");
- /* Generate a simple random name. */
- if (guestfs_int_random_string (hostname, 8) == -1)
- error (EXIT_FAILURE, errno, "guestfs_int_random_string");
- } else {
- char *p;
-
- /* If the hostname is an FQDN, truncate before the first dot. */
- p = strchr (hostname, '.');
- if (p && p > hostname)
- *p = '\0';
- }
- config->guestname = strdup (hostname);
-
- /* Defaults for #vcpus and memory are taken from the physical machine. */
- i = sysconf (_SC_NPROCESSORS_ONLN);
- if (i == -1) {
- perror ("sysconf: _SC_NPROCESSORS_ONLN");
- config->vcpus = 1;
- }
- else if (i == 0)
- config->vcpus = 1;
- else
- config->vcpus = i;
-
- i = sysconf (_SC_PHYS_PAGES);
- if (i == -1) {
- perror ("sysconf: _SC_PHYS_PAGES");
- config->memory = 1024 * 1024 * 1024;
- }
- else
- config->memory = i;
-
- i = sysconf (_SC_PAGESIZE);
- if (i == -1) {
- perror ("sysconf: _SC_PAGESIZE");
- config->memory *= 4096;
- }
- else
- config->memory *= i;
-
- /* Round up the default memory to a power of 2, since the kernel
- * memory is not included in the total physical pages returned
- * above.
- *
http://graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2
- */
- config->memory--;
- config->memory |= config->memory >> 1;
- config->memory |= config->memory >> 2;
- config->memory |= config->memory >> 4;
- config->memory |= config->memory >> 8;
- config->memory |= config->memory >> 16;
- config->memory |= config->memory >> 32;
- config->memory++;
-
- get_cpu_config (&config->cpu);
- get_rtc_config (&config->rtc);
-
- /* Find all block devices in the system. */
- if (!test_disk)
- find_all_disks ();
- else {
- /* For testing and debugging purposes, you can use
- * --test-disk=/path/to/disk.img
- */
- all_disks = malloc (2 * sizeof (char *));
- if (all_disks == NULL)
- error (EXIT_FAILURE, errno, "realloc");
- all_disks[0] = strdup (test_disk);
- if (all_disks[0] == NULL)
- error (EXIT_FAILURE, errno, "strdup");
- all_disks[1] = NULL;
- }
- if (all_disks)
- config->disks = guestfs_int_copy_string_list (all_disks);
-
- /* Find all removable devices in the system. */
- if (all_removable)
- config->removable = guestfs_int_copy_string_list (all_removable);
-
- /* Find all network interfaces in the system. */
- find_all_interfaces ();
- if (all_interfaces)
- config->interfaces = guestfs_int_copy_string_list (all_interfaces);
-
- /* Default output drops the guest onto /var/tmp on the conversion
- * server, a hopefully safe default.
- */
- config->output.type = strdup ("local");
- config->output.storage = strdup ("/var/tmp");
-}
-
-static int
-compare (const void *vp1, const void *vp2)
-{
- char * const *p1 = (char * const *) vp1;
- char * const *p2 = (char * const *) vp2;
- return strcmp (*p1, *p2);
-}
-
-/**
- * Get parent device of a partition.
- *
- * Returns C<0> if no parent device could be found.
- */
-static dev_t
-partition_parent (dev_t part_dev)
-{
- CLEANUP_FCLOSE FILE *fp = NULL;
- CLEANUP_FREE char *path = NULL, *content = NULL;
- size_t len = 0;
- unsigned parent_major, parent_minor;
-
- if (asprintf (&path, "/sys/dev/block/%ju:%ju/../dev",
- (uintmax_t) major (part_dev),
- (uintmax_t) minor (part_dev)) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
-
- fp = fopen (path, "r");
- if (fp == NULL)
- return 0;
-
- if (getline (&content, &len, fp) == -1)
- error (EXIT_FAILURE, errno, "getline");
-
- if (sscanf (content, "%u:%u", &parent_major, &parent_minor) != 2)
- return 0;
-
- return makedev (parent_major, parent_minor);
-}
-
-/**
- * Return true if the named device (eg. C<dev == "sda">) contains the
- * root filesystem. C<root_device> is the major:minor of the root
- * filesystem (eg. C<8:1> if the root filesystem was F</dev/sda1>).
- *
- * This doesn't work for LVs and so on. However we only really care
- * if this test works on the P2V ISO where the root device is a
- * regular partition.
- */
-static int
-device_contains (const char *dev, dev_t root_device)
-{
- struct stat statbuf;
- CLEANUP_FREE char *dev_name = NULL;
- dev_t root_device_parent;
-
- if (asprintf (&dev_name, "/dev/%s", dev) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
-
- if (stat (dev_name, &statbuf) == -1)
- return 0;
-
- /* See if dev is the root_device. */
- if (statbuf.st_rdev == root_device)
- return 1;
-
- /* See if dev is the parent device of the root_device. */
- root_device_parent = partition_parent (root_device);
- if (root_device_parent == 0)
- return 0;
- if (statbuf.st_rdev == root_device_parent)
- return 1;
-
- return 0;
-}
-
-/**
- * Enumerate all disks in F</sys/block> and add them to the global
- * C<all_disks> and C<all_removable> arrays.
- */
-static void
-find_all_disks (void)
-{
- DIR *dir;
- struct dirent *d;
- size_t nr_disks = 0, nr_removable = 0;
- dev_t root_device = 0;
- struct stat statbuf;
-
- if (stat ("/", &statbuf) == 0)
- root_device = statbuf.st_dev;
-
- /* The default list of disks is everything in /sys/block which
- * matches the common patterns for disk names.
- */
- dir = opendir ("/sys/block");
- if (!dir)
- error (EXIT_FAILURE, errno, "opendir");
-
- for (;;) {
- errno = 0;
- d = readdir (dir);
- if (!d) break;
-
- if (STRPREFIX (d->d_name, "cciss!") ||
- STRPREFIX (d->d_name, "hd") ||
- STRPREFIX (d->d_name, "sd") ||
- STRPREFIX (d->d_name, "ubd") ||
- STRPREFIX (d->d_name, "vd")) {
- char *p;
-
- /* Skip the device containing the root filesystem. */
- if (device_contains (d->d_name, root_device))
- continue;
-
- nr_disks++;
- all_disks = realloc (all_disks, sizeof (char *) * (nr_disks + 1));
- if (!all_disks)
- error (EXIT_FAILURE, errno, "realloc");
-
- all_disks[nr_disks-1] = strdup (d->d_name);
-
- /* cciss device /dev/cciss/c0d0 will be /sys/block/cciss!c0d0 */
- p = strchr (all_disks[nr_disks-1], '!');
- if (p) *p = '/';
-
- all_disks[nr_disks] = NULL;
- }
- else if (STRPREFIX (d->d_name, "sr")) {
- nr_removable++;
- all_removable = realloc (all_removable,
- sizeof (char *) * (nr_removable + 1));
- if (!all_removable)
- error (EXIT_FAILURE, errno, "realloc");
- all_removable[nr_removable-1] = strdup (d->d_name);
- all_removable[nr_removable] = NULL;
- }
- }
-
- /* Check readdir didn't fail */
- if (errno != 0)
- error (EXIT_FAILURE, errno, "readdir: %s", "/sys/block");
-
- /* Close the directory handle */
- if (closedir (dir) == -1)
- error (EXIT_FAILURE, errno, "closedir: %s", "/sys/block");
-
- if (all_disks)
- qsort (all_disks, nr_disks, sizeof (char *), compare);
- if (all_removable)
- qsort (all_removable, nr_removable, sizeof (char *), compare);
-}
-
-/**
- * Enumerate all network interfaces in F</sys/class/net> and add them
- * to the global C<all_interfaces> array.
- */
-static void
-find_all_interfaces (void)
-{
- DIR *dir;
- struct dirent *d;
- size_t nr_interfaces = 0;
-
- /* The default list of network interfaces is everything in
- * /sys/class/net which matches some common patterns.
- */
- dir = opendir ("/sys/class/net");
- if (!dir)
- error (EXIT_FAILURE, errno, "opendir: %s", "/sys/class/net");
-
- for (;;) {
- errno = 0;
- d = readdir (dir);
- if (!d) break;
-
- /* For systemd predictable names, see:
- *
http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-ne...
- * biosdevname is also a possibility here.
- * Ignore PPP, SLIP, WWAN, bridges, etc.
- */
- if (STRPREFIX (d->d_name, "em") ||
- STRPREFIX (d->d_name, "en") ||
- STRPREFIX (d->d_name, "eth") ||
- STRPREFIX (d->d_name, "wl")) {
- nr_interfaces++;
- all_interfaces =
- realloc (all_interfaces, sizeof (char *) * (nr_interfaces + 1));
- if (!all_interfaces)
- error (EXIT_FAILURE, errno, "realloc");
- all_interfaces[nr_interfaces-1] = strdup (d->d_name);
- all_interfaces[nr_interfaces] = NULL;
- }
- }
-
- /* Check readdir didn't fail */
- if (errno != 0)
- error (EXIT_FAILURE, errno, "readdir: %s", "/sys/class/net");
-
- /* Close the directory handle */
- if (closedir (dir) == -1)
- error (EXIT_FAILURE, errno, "closedir: %s", "/sys/class/net");
-
- if (all_interfaces)
- qsort (all_interfaces, nr_interfaces, sizeof (char *), compare);
-}
diff --git a/p2v/nbd.c b/p2v/nbd.c
deleted file mode 100644
index 8b80803da..000000000
--- a/p2v/nbd.c
+++ /dev/null
@@ -1,840 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2009-2019 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * This file handles the virt-p2v I<--nbd> command line option
- * and running either L<qemu-nbd(8)> or L<nbdkit(1)>.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <inttypes.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <time.h>
-#include <netdb.h>
-#include <errno.h>
-#include <error.h>
-#include <libintl.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <assert.h>
-
-#include "getprogname.h"
-
-#include "p2v.h"
-
-/* How long to wait for the NBD server to start (seconds). */
-#define WAIT_NBD_TIMEOUT 10
-
-/* The local port that the NBD server listens on (incremented for
- * each server which is started).
- */
-static int nbd_local_port;
-
-/* List of servers specified by the --nbd option. */
-enum nbd_server {
- /* 0 is reserved for "end of list" */
- QEMU_NBD = 1,
- QEMU_NBD_NO_SA = 2,
- NBDKIT = 3,
- NBDKIT_NO_SA = 4,
-};
-static enum nbd_server *cmdline_servers = NULL;
-
-static const char *
-nbd_server_string (enum nbd_server s)
-{
- const char *ret = NULL;
-
- switch (s) {
- case QEMU_NBD: ret = "qemu-nbd"; break;
- case QEMU_NBD_NO_SA: ret = "qemu-nbd-no-sa"; break;
- case NBDKIT: ret = "nbdkit"; break;
- case NBDKIT_NO_SA: ret = "nbdkit-no-sa"; break;
- }
-
- if (ret == NULL)
- abort ();
-
- return ret;
-}
-
-/* If no --nbd option is passed, we use this standard list instead.
- * Must match the documentation in virt-p2v(1).
- */
-static const enum nbd_server standard_servers[] =
- { QEMU_NBD, QEMU_NBD_NO_SA, NBDKIT, NBDKIT_NO_SA, 0 };
-
-/* After testing the list of servers passed by the user, this is
- * server we decide to use.
- */
-static enum nbd_server use_server;
-
-static pid_t start_qemu_nbd (const char *device, const char *ipaddr, int port, int *fds,
size_t nr_fds);
-static pid_t start_nbdkit (const char *device, const char *ipaddr, int port, int *fds,
size_t nr_fds);
-static int get_local_port (void);
-static int open_listening_socket (const char *ipaddr, int **fds, size_t *nr_fds);
-static int bind_tcpip_socket (const char *ipaddr, const char *port, int **fds, size_t
*nr_fds);
-static int connect_with_source_port (const char *hostname, int dest_port, int
source_port);
-static int bind_source_port (int sockfd, int family, int source_port);
-
-static char *nbd_error;
-
-static void set_nbd_error (const char *fs, ...)
- __attribute__((format(printf,1,2)));
-
-static void
-set_nbd_error (const char *fs, ...)
-{
- va_list args;
- char *msg;
- int len;
-
- va_start (args, fs);
- len = vasprintf (&msg, fs, args);
- va_end (args);
-
- if (len < 0)
- error (EXIT_FAILURE, errno,
- "vasprintf (original error format string: %s)", fs);
-
- free (nbd_error);
- nbd_error = msg;
-}
-
-const char *
-get_nbd_error (void)
-{
- return nbd_error;
-}
-
-/**
- * The main program calls this to set the I<--nbd> option.
- */
-void
-set_nbd_option (const char *opt)
-{
- size_t i, len;
- CLEANUP_FREE_STRING_LIST char **strs = NULL;
-
- if (cmdline_servers != NULL)
- error (EXIT_FAILURE, 0, _("--nbd option appears multiple times"));
-
- strs = guestfs_int_split_string (',', opt);
-
- if (strs == NULL)
- error (EXIT_FAILURE, errno, _("malloc"));
-
- len = guestfs_int_count_strings (strs);
- if (len == 0)
- error (EXIT_FAILURE, 0, _("--nbd option cannot be empty"));
-
- cmdline_servers = malloc (sizeof (enum nbd_server) * (len + 1));
- if (cmdline_servers == NULL)
- error (EXIT_FAILURE, errno, _("malloc"));
-
- for (i = 0; strs[i] != NULL; ++i) {
- if (STREQ (strs[i], "qemu-nbd") || STREQ (strs[i], "qemu"))
- cmdline_servers[i] = QEMU_NBD;
- else if (STREQ (strs[i], "qemu-nbd-no-sa") || STREQ (strs[i],
"qemu-no-sa"))
- cmdline_servers[i] = QEMU_NBD_NO_SA;
- else if (STREQ (strs[i], "nbdkit"))
- cmdline_servers[i] = NBDKIT;
- else if (STREQ (strs[i], "nbdkit-no-sa"))
- cmdline_servers[i] = NBDKIT_NO_SA;
- else
- error (EXIT_FAILURE, 0, _("--nbd: unknown server: %s"), strs[i]);
- }
-
- assert (i == len);
- cmdline_servers[i] = 0; /* marks the end of the list */
-}
-
-/**
- * Test the I<--nbd> option (or built-in default list) to see which
- * servers are actually installed and appear to be working.
- *
- * Set the C<use_server> global accordingly.
- */
-void
-test_nbd_servers (void)
-{
- size_t i;
- int r;
- const enum nbd_server *servers;
-
- /* Initialize nbd_local_port. */
- if (is_iso_environment)
- /* The p2v ISO should allow us to open up just about any port, so
- * we can fix a port number in that case. Using a predictable
- * port number in this case should avoid rare errors if the port
- * colides with another (ie. it'll either always fail or never
- * fail).
- */
- nbd_local_port = 50123;
- else
- /* When testing on the local machine, choose a random port. */
- nbd_local_port = 50000 + (random () % 10000);
-
- if (cmdline_servers != NULL)
- servers = cmdline_servers;
- else
- servers = standard_servers;
-
- use_server = 0;
-
- for (i = 0; servers[i] != 0; ++i) {
-#if DEBUG_STDERR
- fprintf (stderr, "checking for %s ...\n", nbd_server_string (servers[i]));
-#endif
-
- switch (servers[i]) {
- case QEMU_NBD: /* with socket activation */
- r = system ("qemu-nbd --version"
-#ifndef DEBUG_STDERR
- " >/dev/null 2>&1"
-#endif
- " && grep -sq LISTEN_PID `which qemu-nbd`"
- );
- if (r == 0) {
- use_server = servers[i];
- goto finish;
- }
- break;
-
- case QEMU_NBD_NO_SA:
- r = system ("qemu-nbd --version"
-#ifndef DEBUG_STDERR
- " >/dev/null 2>&1"
-#endif
- );
- if (r == 0) {
- use_server = servers[i];
- goto finish;
- }
- break;
-
- case NBDKIT: /* with socket activation */
- r = system ("nbdkit file --version"
-#ifndef DEBUG_STDERR
- " >/dev/null 2>&1"
-#endif
- " && grep -sq LISTEN_PID `which nbdkit`"
- );
- if (r == 0) {
- use_server = servers[i];
- goto finish;
- }
- break;
-
- case NBDKIT_NO_SA:
- r = system ("nbdkit file --version"
-#ifndef DEBUG_STDERR
- " >/dev/null 2>&1"
-#endif
- );
- if (r == 0) {
- use_server = servers[i];
- goto finish;
- }
- break;
-
- default:
- abort ();
- }
- }
-
- finish:
- if (use_server == 0) {
- fprintf (stderr,
- _("%s: no working NBD server was found, cannot continue.\n"
- "Please check the --nbd option in the virt-p2v(1) man
page.\n"),
- getprogname ());
- exit (EXIT_FAILURE);
- }
-
- /* Release memory used by the --nbd option. */
- free (cmdline_servers);
- cmdline_servers = NULL;
-
-#if DEBUG_STDERR
- fprintf (stderr, "picked %s\n", nbd_server_string (use_server));
-#endif
-}
-
-/**
- * Start the NBD server.
- *
- * We previously tested all NBD servers (see C<test_nbd_servers>) and
- * hopefully found one which will work.
- *
- * Returns the process ID (E<gt> 0) or C<0> if there is an error.
- */
-pid_t
-start_nbd_server (const char **ipaddr, int *port, const char *device)
-{
- int *fds = NULL;
- size_t i, nr_fds;
- pid_t pid;
-
- switch (use_server) {
- case QEMU_NBD: /* qemu-nbd with socket activation */
- /* Ideally we would bind this socket to "localhost", but that
- * requires two listening FDs, and qemu-nbd currently cannot
- * support socket activation with two FDs. So we only bind to the
- * IPv4 address.
- */
- *ipaddr = "127.0.0.1";
- *port = open_listening_socket (*ipaddr, &fds, &nr_fds);
- if (*port == -1) return -1;
- pid = start_qemu_nbd (device, *ipaddr, *port, fds, nr_fds);
- for (i = 0; i < nr_fds; ++i)
- close (fds[i]);
- free (fds);
- return pid;
-
- case QEMU_NBD_NO_SA: /* qemu-nbd without socket activation */
- *ipaddr = "localhost";
- *port = get_local_port ();
- if (*port == -1) return -1;
- return start_qemu_nbd (device, *ipaddr, *port, NULL, 0);
-
- case NBDKIT: /* nbdkit with socket activation */
- *ipaddr = "localhost";
- *port = open_listening_socket (*ipaddr, &fds, &nr_fds);
- if (*port == -1) return -1;
- pid = start_nbdkit (device, *ipaddr, *port, fds, nr_fds);
- for (i = 0; i < nr_fds; ++i)
- close (fds[i]);
- free (fds);
- return pid;
-
- case NBDKIT_NO_SA: /* nbdkit without socket activation */
- *ipaddr = "localhost";
- *port = get_local_port ();
- if (*port == -1) return -1;
- return start_nbdkit (device, *ipaddr, *port, NULL, 0);
- }
-
- abort ();
-}
-
-#define FIRST_SOCKET_ACTIVATION_FD 3
-
-/**
- * Set up file descriptors and environment variables for
- * socket activation.
- *
- * Note this function runs in the child between fork and exec.
- */
-static inline void
-socket_activation (int *fds, size_t nr_fds)
-{
- size_t i;
- char nr_fds_str[16];
- char pid_str[16];
-
- if (fds == NULL) return;
-
- for (i = 0; i < nr_fds; ++i) {
- int fd = FIRST_SOCKET_ACTIVATION_FD + i;
- if (fds[i] != fd) {
- dup2 (fds[i], fd);
- close (fds[i]);
- }
- }
-
- snprintf (nr_fds_str, sizeof nr_fds_str, "%zu", nr_fds);
- setenv ("LISTEN_FDS", nr_fds_str, 1);
- snprintf (pid_str, sizeof pid_str, "%d", (int) getpid ());
- setenv ("LISTEN_PID", pid_str, 1);
-}
-
-/**
- * Start a local L<qemu-nbd(1)> process.
- *
- * If we are using socket activation, C<fds> and C<nr_fds> will
- * contain the locally pre-opened file descriptors for this.
- * Otherwise if C<fds == NULL> we pass the port number.
- *
- * Returns the process ID (E<gt> 0) or C<0> if there is an error.
- */
-static pid_t
-start_qemu_nbd (const char *device,
- const char *ipaddr, int port, int *fds, size_t nr_fds)
-{
- pid_t pid;
- char port_str[64];
-
-#if DEBUG_STDERR
- fprintf (stderr, "starting qemu-nbd for %s on %s:%d%s\n",
- device, ipaddr, port,
- fds == NULL ? "" : " using socket activation");
-#endif
-
- snprintf (port_str, sizeof port_str, "%d", port);
-
- pid = fork ();
- if (pid == -1) {
- set_nbd_error ("fork: %m");
- return 0;
- }
-
- if (pid == 0) { /* Child. */
- close (0);
- if (open ("/dev/null", O_RDONLY) == -1) {
- perror ("open: /dev/null");
- _exit (EXIT_FAILURE);
- }
-
- if (fds == NULL) { /* without socket activation */
- execlp ("qemu-nbd",
- "qemu-nbd",
- "-r", /* readonly (vital!) */
- "-p", port_str, /* listening port */
- "-t", /* persistent */
- "-f", "raw", /* force raw format */
- "-b", ipaddr, /* listen only on loopback interface */
- "--cache=unsafe", /* use unsafe caching for speed */
- device, /* a device like /dev/sda */
- NULL);
- perror ("qemu-nbd");
- _exit (EXIT_FAILURE);
- }
- else { /* socket activation */
- socket_activation (fds, nr_fds);
-
- execlp ("qemu-nbd",
- "qemu-nbd",
- "-r", /* readonly (vital!) */
- "-t", /* persistent */
- "-f", "raw", /* force raw format */
- "--cache=unsafe", /* use unsafe caching for speed */
- device, /* a device like /dev/sda */
- NULL);
- perror ("qemu-nbd");
- _exit (EXIT_FAILURE);
- }
- }
-
- /* Parent. */
- return pid;
-}
-
-/**
- * Start a local L<nbdkit(1)> process using the
- * L<nbdkit-file-plugin(1)>.
- *
- * If we are using socket activation, C<fds> and C<nr_fds> will
- * contain the locally pre-opened file descriptors for this.
- * Otherwise if C<fds == NULL> we pass the port number.
- *
- * Returns the process ID (E<gt> 0) or C<0> if there is an error.
- */
-static pid_t
-start_nbdkit (const char *device,
- const char *ipaddr, int port, int *fds, size_t nr_fds)
-{
- pid_t pid;
- char port_str[64];
- CLEANUP_FREE char *file_str = NULL;
-
-#if DEBUG_STDERR
- fprintf (stderr, "starting nbdkit for %s on %s:%d%s\n",
- device, ipaddr, port,
- fds == NULL ? "" : " using socket activation");
-#endif
-
- snprintf (port_str, sizeof port_str, "%d", port);
-
- if (asprintf (&file_str, "file=%s", device) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
-
- pid = fork ();
- if (pid == -1) {
- set_nbd_error ("fork: %m");
- return 0;
- }
-
- if (pid == 0) { /* Child. */
- close (0);
- if (open ("/dev/null", O_RDONLY) == -1) {
- perror ("open: /dev/null");
- _exit (EXIT_FAILURE);
- }
-
- if (fds == NULL) { /* without socket activation */
- execlp ("nbdkit",
- "nbdkit",
- "-r", /* readonly (vital!) */
- "-p", port_str, /* listening port */
- "-i", ipaddr, /* listen only on loopback interface */
- "-f", /* don't fork */
- "file", /* file plugin */
- file_str, /* a device like file=/dev/sda */
- NULL);
- perror ("nbdkit");
- _exit (EXIT_FAILURE);
- }
- else { /* socket activation */
- socket_activation (fds, nr_fds);
-
- execlp ("nbdkit",
- "nbdkit",
- "-r", /* readonly (vital!) */
- "-f", /* don't fork */
- "file", /* file plugin */
- file_str, /* a device like file=/dev/sda */
- NULL);
- perror ("nbdkit");
- _exit (EXIT_FAILURE);
- }
- }
-
- /* Parent. */
- return pid;
-}
-
-/**
- * This is used when we are starting an NBD server that does not
- * support socket activation. We have to pass the '-p' option to
- * the NBD server, but there's no good way to choose a free port,
- * so we have to just guess.
- *
- * Returns the port number on success or C<-1> on error.
- */
-static int
-get_local_port (void)
-{
- int port = nbd_local_port;
- nbd_local_port++;
- return port;
-}
-
-/**
- * This is used when we are starting an NBD server which supports
- * socket activation. We can open a listening socket on an unused
- * local port and return it.
- *
- * Returns the port number on success or C<-1> on error.
- *
- * The file descriptor(s) bound are returned in the array *fds, *nr_fds.
- * The caller must free the array.
- */
-static int
-open_listening_socket (const char *ipaddr, int **fds, size_t *nr_fds)
-{
- int port;
- char port_str[16];
-
- /* This just ensures we don't try the port we previously bound to. */
- port = nbd_local_port;
-
- /* Search for a free port. */
- for (; port < 60000; ++port) {
- snprintf (port_str, sizeof port_str, "%d", port);
- if (bind_tcpip_socket (ipaddr, port_str, fds, nr_fds) == 0) {
- /* See above. */
- nbd_local_port = port + 1;
- return port;
- }
- }
-
- set_nbd_error ("cannot find a free local port");
- return -1;
-}
-
-static int
-bind_tcpip_socket (const char *ipaddr, const char *port,
- int **fds_rtn, size_t *nr_fds_rtn)
-{
- struct addrinfo *ai = NULL;
- struct addrinfo hints;
- struct addrinfo *a;
- int err;
- int *fds = NULL;
- size_t nr_fds;
- int addr_in_use = 0;
-
- memset (&hints, 0, sizeof hints);
- hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG;
- hints.ai_socktype = SOCK_STREAM;
-
- err = getaddrinfo (ipaddr, port, &hints, &ai);
- if (err != 0) {
-#if DEBUG_STDERR
- fprintf (stderr, "%s: getaddrinfo: %s: %s: %s",
- getprogname (), ipaddr ? ipaddr : "<any>", port,
- gai_strerror (err));
-#endif
- return -1;
- }
-
- nr_fds = 0;
-
- for (a = ai; a != NULL; a = a->ai_next) {
- int sock, opt;
-
- sock = socket (a->ai_family, a->ai_socktype, a->ai_protocol);
- if (sock == -1)
- error (EXIT_FAILURE, errno, "socket");
-
- opt = 1;
- if (setsockopt (sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt) == -1)
- perror ("setsockopt: SO_REUSEADDR");
-
-#ifdef IPV6_V6ONLY
- if (a->ai_family == PF_INET6) {
- if (setsockopt (sock, IPPROTO_IPV6, IPV6_V6ONLY, &opt, sizeof opt) == -1)
- perror ("setsockopt: IPv6 only");
- }
-#endif
-
- if (bind (sock, a->ai_addr, a->ai_addrlen) == -1) {
- if (errno == EADDRINUSE) {
- addr_in_use = 1;
- close (sock);
- continue;
- }
- perror ("bind");
- close (sock);
- continue;
- }
-
- if (listen (sock, SOMAXCONN) == -1) {
- perror ("listen");
- close (sock);
- continue;
- }
-
- nr_fds++;
- fds = realloc (fds, sizeof (int) * nr_fds);
- if (!fds)
- error (EXIT_FAILURE, errno, "realloc");
- fds[nr_fds-1] = sock;
- }
-
- freeaddrinfo (ai);
-
- if (nr_fds == 0 && addr_in_use) {
-#if DEBUG_STDERR
- fprintf (stderr, "%s: unable to bind to %s:%s: %s\n",
- getprogname (), ipaddr ? ipaddr : "<any>", port,
- strerror (EADDRINUSE));
-#endif
- return -1;
- }
-
-#if DEBUG_STDERR
- fprintf (stderr, "%s: bound to IP address %s:%s (%zu socket(s))\n",
- getprogname (), ipaddr ? ipaddr : "<any>", port, nr_fds);
-#endif
-
- *fds_rtn = fds;
- *nr_fds_rtn = nr_fds;
- return 0;
-}
-
-/**
- * Wait for a local NBD server to start and be listening for
- * connections.
- */
-int
-wait_for_nbd_server_to_start (const char *ipaddr, int port)
-{
- int sockfd = -1;
- int result = -1;
- time_t start_t, now_t;
- struct timespec half_sec = { .tv_sec = 0, .tv_nsec = 500000000 };
- struct timeval timeout = { .tv_usec = 0 };
- char magic[8]; /* NBDMAGIC */
- size_t bytes_read = 0;
- ssize_t recvd;
-
- time (&start_t);
-
- for (;;) {
- time (&now_t);
-
- if (now_t - start_t >= WAIT_NBD_TIMEOUT) {
- set_nbd_error ("timed out waiting for NBD server to start");
- goto cleanup;
- }
-
- /* Source port for probing NBD server should be one greater than
- * port. It's not guaranteed to always bind to this port, but it
- * will hint the kernel to start there and try incrementally
- * higher ports if needed. This avoids the case where the kernel
- * selects port as our source port, and we immediately connect to
- * ourself. See:
- *
https://bugzilla.redhat.com/show_bug.cgi?id=1167774#c9
- */
- sockfd = connect_with_source_port (ipaddr, port, port+1);
- if (sockfd >= 0)
- break;
-
- nanosleep (&half_sec, NULL);
- }
-
- time (&now_t);
- timeout.tv_sec = (start_t + WAIT_NBD_TIMEOUT) - now_t;
- if (setsockopt (sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof timeout) == -1)
{
- set_nbd_error ("waiting for NBD server to start: "
- "setsockopt(SO_RCVTIMEO): %m");
- goto cleanup;
- }
-
- do {
- recvd = recv (sockfd, magic, sizeof magic - bytes_read, 0);
-
- if (recvd == -1) {
- set_nbd_error ("waiting for NBD server to start: recv: %m");
- goto cleanup;
- }
-
- bytes_read += recvd;
- } while (bytes_read < sizeof magic);
-
- if (memcmp (magic, "NBDMAGIC", sizeof magic) != 0) {
- set_nbd_error ("waiting for NBD server to start: "
- "'NBDMAGIC' was not received from NBD server");
- goto cleanup;
- }
-
- result = 0;
- cleanup:
- if (sockfd >= 0)
- close (sockfd);
-
- return result;
-}
-
-/**
- * Connect to C<hostname:dest_port>, resolving the address using
- * L<getaddrinfo(3)>.
- *
- * This also sets the source port of the connection to the first free
- * port number E<ge> C<source_port>.
- *
- * This may involve multiple connections - to IPv4 and IPv6 for
- * instance.
- */
-static int
-connect_with_source_port (const char *hostname, int dest_port, int source_port)
-{
- struct addrinfo hints;
- struct addrinfo *results, *rp;
- char dest_port_str[16];
- int r, sockfd = -1;
- int reuseaddr = 1;
-
- snprintf (dest_port_str, sizeof dest_port_str, "%d", dest_port);
-
- memset (&hints, 0, sizeof hints);
- hints.ai_family = AF_UNSPEC; /* allow IPv4 or IPv6 */
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_NUMERICSERV; /* numeric dest port number */
- hints.ai_protocol = 0; /* any protocol */
-
- r = getaddrinfo (hostname, dest_port_str, &hints, &results);
- if (r != 0) {
- set_nbd_error ("getaddrinfo: %s/%s: %s",
- hostname, dest_port_str, gai_strerror (r));
- return -1;
- }
-
- for (rp = results; rp != NULL; rp = rp->ai_next) {
- sockfd = socket (rp->ai_family, rp->ai_socktype, rp->ai_protocol);
- if (sockfd == -1)
- continue;
-
- /* If we run p2v repeatedly (say, running the tests in a loop),
- * there's a decent chance we'll end up trying to bind() to a port
- * that is in TIME_WAIT from a prior run. Handle that gracefully
- * with SO_REUSEADDR.
- */
- if (setsockopt (sockfd, SOL_SOCKET, SO_REUSEADDR,
- &reuseaddr, sizeof reuseaddr) == -1)
- perror ("warning: setsockopt");
-
- /* Need to bind the source port. */
- if (bind_source_port (sockfd, rp->ai_family, source_port) == -1) {
- close (sockfd);
- sockfd = -1;
- continue;
- }
-
- /* Connect. */
- if (connect (sockfd, rp->ai_addr, rp->ai_addrlen) == -1) {
- set_nbd_error ("waiting for NBD server to start: "
- "connect to %s/%s: %m",
- hostname, dest_port_str);
- close (sockfd);
- sockfd = -1;
- continue;
- }
-
- break;
- }
-
- freeaddrinfo (results);
- return sockfd;
-}
-
-static int
-bind_source_port (int sockfd, int family, int source_port)
-{
- struct addrinfo hints;
- struct addrinfo *results, *rp;
- char source_port_str[16];
- int r;
-
- snprintf (source_port_str, sizeof source_port_str, "%d", source_port);
-
- memset (&hints, 0, sizeof (hints));
- hints.ai_family = family;
- hints.ai_socktype = SOCK_STREAM;
- hints.ai_flags = AI_PASSIVE | AI_NUMERICSERV; /* numeric port number */
- hints.ai_protocol = 0; /* any protocol */
-
- r = getaddrinfo ("localhost", source_port_str, &hints, &results);
- if (r != 0) {
- set_nbd_error ("getaddrinfo (bind): localhost/%s: %s",
- source_port_str, gai_strerror (r));
- return -1;
- }
-
- for (rp = results; rp != NULL; rp = rp->ai_next) {
- if (bind (sockfd, rp->ai_addr, rp->ai_addrlen) == 0)
- goto bound;
- }
-
- set_nbd_error ("waiting for NBD server to start: "
- "bind to source port %d: %m",
- source_port);
- freeaddrinfo (results);
- return -1;
-
- bound:
- freeaddrinfo (results);
- return 0;
-}
diff --git a/p2v/p2v.h b/p2v/p2v.h
deleted file mode 100644
index 66c245eda..000000000
--- a/p2v/p2v.h
+++ /dev/null
@@ -1,136 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2009-2019 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef P2V_H
-#define P2V_H
-
-#include <stdio.h>
-#include <stdbool.h>
-
-/* Send various debug information to stderr. Harmless and useful, so
- * can be left enabled in production builds.
- */
-#define DEBUG_STDERR 1
-
-#include "miniexpect.h"
-#include "p2v-config.h"
-
-#include "guestfs-utils.h"
-
-/* All disks / removable media / network interfaces discovered
- * when the program started. Do not change these.
- */
-extern char **all_disks;
-extern char **all_removable;
-extern char **all_interfaces;
-
-/* True if running inside the virt-p2v ISO environment. Various
- * dangerous functions such as the "Reboot" button are disabled if
- * this is false.
- */
-extern int is_iso_environment;
-
-/* True if virt-v2v supports the --colours option. */
-extern int feature_colours_option;
-
-/* virt-p2v --colours option (used by ansi_* macros). */
-extern int force_colour;
-
-/* cpuid.c */
-extern void get_cpu_config (struct cpu_config *);
-
-/* rtc.c */
-extern void get_rtc_config (struct rtc_config *);
-
-/* kernel-cmdline.c */
-extern char **parse_cmdline_string (const char *cmdline);
-extern char **parse_proc_cmdline (void);
-extern const char *get_cmdline_key (char **cmdline, const char *key);
-
-#define CMDLINE_SOURCE_COMMAND_LINE 1 /* --cmdline */
-#define CMDLINE_SOURCE_PROC_CMDLINE 2 /* /proc/cmdline */
-
-/* kernel-config.c */
-extern void update_config_from_kernel_cmdline (struct config *config, char **cmdline);
-
-/* kernel.c */
-extern void kernel_conversion (struct config *, char **cmdline, int cmdline_source);
-
-/* gui.c */
-extern void gui_conversion (struct config *);
-
-/* conversion.c */
-struct data_conn { /* Data per NBD connection / physical disk. */
- mexp_h *h; /* miniexpect handle to ssh */
- pid_t nbd_pid; /* NBD server PID */
- int nbd_remote_port; /* remote NBD port on conversion server */
-};
-
-extern int start_conversion (struct config *, void (*notify_ui) (int type, const char
*data));
-#define NOTIFY_LOG_DIR 1 /* location of remote log directory */
-#define NOTIFY_REMOTE_MESSAGE 2 /* log message from remote virt-v2v */
-#define NOTIFY_STATUS 3 /* stage in conversion process */
-extern const char *get_conversion_error (void);
-extern void cancel_conversion (void);
-extern int conversion_is_running (void);
-
-/* physical-xml.c */
-extern void generate_physical_xml (struct config *, struct data_conn *, const char
*filename);
-
-/* inhibit.c */
-extern int inhibit_power_saving (void);
-
-/* ssh.c */
-extern int test_connection (struct config *);
-extern mexp_h *open_data_connection (struct config *, const char *local_ipaddr, int
local_port, int *remote_port);
-extern mexp_h *start_remote_connection (struct config *, const char *remote_dir);
-extern const char *get_ssh_error (void);
-extern int scp_file (struct config *config, const char *target, const char *local, ...)
__attribute__((sentinel));
-
-/* nbd.c */
-extern void set_nbd_option (const char *opt);
-extern void test_nbd_servers (void);
-extern pid_t start_nbd_server (const char **ipaddr, int *port, const char *device);
-extern int wait_for_nbd_server_to_start (const char *ipaddr, int port);
-const char *get_nbd_error (void);
-
-/* utils.c */
-extern uint64_t get_blockdev_size (const char *dev);
-extern char *get_blockdev_model (const char *dev);
-extern char *get_blockdev_serial (const char *dev);
-extern char *get_if_addr (const char *if_name);
-extern char *get_if_vendor (const char *if_name, int truncate);
-extern void wait_network_online (const struct config *);
-
-/* whole-file.c */
-extern int read_whole_file (const char *filename, char **data_r, size_t *size_r);
-
-/* virt-v2v version and features (read from remote). */
-extern char *v2v_version;
-
-/* input and output drivers (read from remote). */
-extern char **input_drivers;
-extern char **output_drivers;
-
-/* about-authors.c */
-extern const char *authors[];
-extern const char *qa[];
-extern const char *documenters[];
-extern const char *others[];
-
-#endif /* P2V_H */
diff --git a/p2v/p2v.ks.in b/p2v/p2v.ks.in
deleted file mode 100644
index 32f3665f0..000000000
--- a/p2v/p2v.ks.in
+++ /dev/null
@@ -1,193 +0,0 @@
-# Kickstart file for creating the virt-p2v ISO.
-# (C) Copyright 2014-2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-# Generated by virt-p2v-make-kickstart __PACKAGE_VERSION_FULL__
-
-lang en_US.UTF-8
-keyboard us
-timezone --utc GMT
-
-rootpw --plaintext p2v
-
-selinux --enforcing
-firewall --enabled
-
-# Make sure that systemd doesn't rename the network device. We have
-# to tell Anaconda we're using eth0, *and* we have to pass
-# net.ifnames=0 on the kernel command line.
-network --bootproto=dhcp --device=eth0
-bootloader --location=mbr --append="console=tty0 console=ttyS0,115200 rd_NO_PLYMOUTH
net.ifnames=0"
-
-zerombr
-clearpart --all --initlabel
-part / --size 3000 --fstype ext4
-
-reboot
-
-# Repository lines:
-__REPOS__
-
-# Packages to install in the ISO. For dependencies, see
-# p2v/Makefile.am. Note that libguestfs is NOT required by virt-p2v.
-
-%packages
-
-@core
-
-# rpm must be installed, else you'll hit RHBZ#1089566.
-rpm
-
-# Note you must have a kernel, else the boot menu won't work:
-kernel
-
-# This is required in order for RHEL to set the root password.
-passwd
-
-# RHEL needs this in order to get networking.
-NetworkManager
-
-# Required to run firewall --enabled kickstart command:
-firewalld
-
-# Needed by post script to unpack the blobs.
-/usr/bin/base64
-/usr/bin/gzip
-
-# Work around
https://bugzilla.redhat.com/show_bug.cgi?id=1182362
-tar
-
-#
https://bugzilla.redhat.com/show_bug.cgi?id=1168223
-dracut-live
-
-# The dependencies of virt-p2v.
-__DEPENDENCIES__
-
-# Extra packages requested by the user via the virt-p2v-make-kickstart
-# --install option (if any).
-__EXTRA_PACKAGES__
-
-%end
-
-# Post-install configuration.
-
-%post
-
-# Base64-decoding of SSH Identity.
-
-base64 -d -i > /var/tmp/id_rsa << EOF
-__BASE64_SSH_IDENTITY__
-EOF
-if test -s /var/tmp/id_rsa; then
- chmod 0600 /var/tmp/id_rsa
-else
- rm /var/tmp/id_rsa
-fi
-
-# Base64-decoding of /etc/issue
-
-base64 -d -i > /etc/issue << EOF
-__BASE64_ISSUE__
-EOF
-
-cp /etc/issue /etc/issue.net
-
-# Base64-decoding of launch-virt-p2v
-
-base64 -d -i > /usr/bin/launch-virt-p2v <<EOF
-__BASE64_LAUNCH_VIRT_P2V__
-EOF
-
-chmod 0755 /usr/bin/launch-virt-p2v
-
-# Base64-decoding of p2v.service unit file
-
-base64 -d -i > /etc/systemd/system/p2v.service <<EOF
-__BASE64_P2V_SERVICE__
-EOF
-
-# Base64-decoding of virt-p2v binary
-# md5(virt-p2v) = __MD5SUM_VIRT_P2V__
-
-base64 -d -i <<EOF | gzip -cd > /usr/bin/virt-p2v
-__BASE64_VIRT_P2V__
-EOF
-
-chmod 0755 /usr/bin/virt-p2v
-
-# Update the default getty target to login automatically as root without
-# prompting for a password
-sed -i 's/^ExecStart=\(.*\)/ExecStart=\1 -a root/' \
- /usr/lib/systemd/system/getty@.service
-
-# Reserve tty1 as a getty so we can document it clearly
-echo ReserveVT=1 >> /etc/systemd/logind.conf
-
-# Force text mode
-systemctl set-default multi-user.target
-
-# Start p2v service
-systemctl enable p2v.service
-
-# Disable ssh service (RHBZ#1248678)
-systemctl disable sshd.service
-
-%end
-
-%post --nochroot
-
-PRODUCT='Virt P2V'
-PRODUCT_SHORT='virt-p2v'
-PACKAGE='__PACKAGE_NAME__'
-VERSION='__PACKAGE_VERSION__'
-
-echo "Customizing boot menu"
-sed -i -e '
-# Put product information at the top of the file
-1 {
- i '"say $PRODUCT $VERSION"'
- i '"menu title $PRODUCT_SHORT $VERSION"'
-}
-
-# Remove any existing menu title
-/^menu title .*/d
-
-# Set the default timeout to 60 seconds
-s/^timeout .*/timeout 600/
-' $LIVE_ROOT/isolinux/isolinux.cfg
-
-# store image version info in the ISO
-cat > $LIVE_ROOT/isolinux/version <<EOF
-PRODUCT='$PRODUCT'
-PRODUCT_SHORT='${PRODUCT_SHORT}'
-#PRODUCT_CODE=$PRODUCT_CODE
-#RECIPE_SHA256=$RECIPE_SHA256
-#RECIPE_RPM=$RECIPE_RPM
-PACKAGE=$PACKAGE
-VERSION=$VERSION
-EOF
-
-# overwrite user visible banners with the image versioning info
-cat > $INSTALL_ROOT/etc/$PACKAGE-release <<EOF
-$PRODUCT release $VERSION
-EOF
-
-# replace initramfs if regenerated
-if [ -f "$INSTALL_ROOT/initrd0.img" ]; then
- mv -v "$INSTALL_ROOT/initrd0.img"
"$LIVE_ROOT/isolinux/initrd0.img"
-fi
-
-%end
diff --git a/p2v/p2v.service b/p2v/p2v.service
deleted file mode 100644
index 7096eb175..000000000
--- a/p2v/p2v.service
+++ /dev/null
@@ -1,38 +0,0 @@
-# libguestfs virt-p2v ISO
-# Copyright (C) 2009-2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# NB: This cannot be called "virt-p2v.service" because on Fedora the
-# virt- prefix will cause it to get the wrong SELinux label.
-
-[Unit]
-Description=p2v service
-# For the GUI, we cannot necessarily wait for the network to come
-# online, since that may require the "Configure Network" dialog. For
-# the command line, we would like the network to be online, but we
-# test that within virt-p2v itself. Therefore use network.target
-# here, not network-online.target.
-After=network.target
-
-[Service]
-Type=oneshot
-ExecStart=/usr/bin/launch-virt-p2v
-RemainAfterExit=yes
-StandardOutput=journal+console
-StandardError=inherit
-
-[Install]
-WantedBy=multi-user.target
diff --git a/p2v/physical-xml.c b/p2v/physical-xml.c
deleted file mode 100644
index 08f443014..000000000
--- a/p2v/physical-xml.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2009-2019 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * Create the F<physical.xml> file, which is a piece of phony libvirt
- * XML used to communicate the metadata of the physical machine to
- * virt-v2v.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <stdarg.h>
-#include <string.h>
-#include <inttypes.h>
-#include <errno.h>
-#include <error.h>
-
-#include <libxml/xmlwriter.h>
-
-#include <glib.h>
-
-#include "getprogname.h"
-
-#include "libxml2-writer-macros.h"
-
-#include "p2v.h"
-
-/* This macro is used by the macros in "libxml2-writer-macros.h"
- * when an error occurs.
- */
-#define xml_error(fn) \
- error (EXIT_FAILURE, errno, \
- "%s:%d: error constructing XML near call to \"%s\"", \
- __FILE__, __LINE__, (fn));
-
-static const char *map_interface_to_network (struct config *, const char *interface);
-
-/**
- * Write the libvirt XML for this physical machine.
- *
- * Note this is not actually input for libvirt. It's input for
- * virt-v2v on the conversion server. Virt-v2v will (if necessary)
- * generate the final libvirt XML.
- */
-void
-generate_physical_xml (struct config *config, struct data_conn *data_conns,
- const char *filename)
-{
- uint64_t memkb;
- CLEANUP_XMLFREETEXTWRITER xmlTextWriterPtr xo = NULL;
- size_t i;
-
- xo = xmlNewTextWriterFilename (filename, 0);
- if (xo == NULL)
- error (EXIT_FAILURE, errno, "xmlNewTextWriterFilename");
-
- if (xmlTextWriterSetIndent (xo, 1) == -1 ||
- xmlTextWriterSetIndentString (xo, BAD_CAST " ") == -1)
- error (EXIT_FAILURE, errno, "could not set XML indent");
- if (xmlTextWriterStartDocument (xo, NULL, NULL, NULL) == -1)
- error (EXIT_FAILURE, errno, "xmlTextWriterStartDocument");
-
- memkb = config->memory / 1024;
-
- comment (" %s %s ", getprogname (), PACKAGE_VERSION_FULL);
-
- comment
- (" NOTE!\n"
- "\n"
- " This libvirt XML is generated by the virt-p2v front end, in\n"
- " order to communicate with the backend virt-v2v process running\n"
- " on the conversion server. It is a minimal description of the\n"
- " physical machine. If the target of the conversion is libvirt,\n"
- " then virt-v2v will generate the real target libvirt XML, which\n"
- " has only a little to do with the XML in this file.\n"
- "\n"
- " TL;DR: Don't try to load this XML into libvirt. ");
-
- start_element ("domain") {
- attribute ("type", "physical");
-
- single_element ("name", config->guestname);
-
- start_element ("memory") {
- attribute ("unit", "KiB");
- string_format ("%" PRIu64, memkb);
- } end_element ();
-
- start_element ("currentMemory") {
- attribute ("unit", "KiB");
- string_format ("%" PRIu64, memkb);
- } end_element ();
-
- single_element_format ("vcpu", "%d", config->vcpus);
-
- if (config->cpu.vendor || config->cpu.model ||
- config->cpu.sockets || config->cpu.cores || config->cpu.threads) {
- /*
https://libvirt.org/formatdomain.html#elementsCPU */
- start_element ("cpu") {
- attribute ("match", "minimum");
- if (config->cpu.vendor)
- single_element ("vendor", config->cpu.vendor);
- if (config->cpu.model) {
- start_element ("model") {
- attribute ("fallback", "allow");
- string (config->cpu.model);
- } end_element ();
- }
- if (config->cpu.sockets || config->cpu.cores || config->cpu.threads) {
- start_element ("topology") {
- if (config->cpu.sockets)
- attribute_format ("sockets", "%u",
config->cpu.sockets);
- if (config->cpu.cores)
- attribute_format ("cores", "%u",
config->cpu.cores);
- if (config->cpu.threads)
- attribute_format ("threads", "%u",
config->cpu.threads);
- } end_element ();
- }
- } end_element ();
- }
-
- switch (config->rtc.basis) {
- case BASIS_UNKNOWN:
- /* Don't emit any <clock> element. */
- break;
- case BASIS_UTC:
- start_element ("clock") {
- if (config->rtc.offset == 0)
- attribute ("offset", "utc");
- else {
- attribute ("offset", "variable");
- attribute ("basis", "utc");
- attribute_format ("adjustment", "%d",
config->rtc.offset);
- }
- } end_element ();
- break;
- case BASIS_LOCALTIME:
- start_element ("clock") {
- attribute ("offset", "localtime");
- /* config->rtc.offset is always 0 in this case */
- } end_element ();
- break;
- }
-
- start_element ("os") {
- start_element ("type") {
- attribute ("arch", host_cpu);
- string ("hvm");
- } end_element ();
- } end_element ();
-
- start_element ("features") {
- if (config->cpu.acpi) empty_element ("acpi");
- if (config->cpu.apic) empty_element ("apic");
- if (config->cpu.pae) empty_element ("pae");
- } end_element ();
-
- start_element ("devices") {
-
- for (i = 0; config->disks[i] != NULL; ++i) {
- char target_dev[64];
-
- if (config->disks[i][0] == '/') {
- target_sd:
- memcpy (target_dev, "sd", 2);
- guestfs_int_drive_name (i, &target_dev[2]);
- } else {
- if (strlen (config->disks[i]) <= sizeof (target_dev) - 1)
- strcpy (target_dev, config->disks[i]);
- else
- goto target_sd;
- }
-
- start_element ("disk") {
- attribute ("type", "network");
- attribute ("device", "disk");
- start_element ("driver") {
- attribute ("name", "qemu");
- attribute ("type", "raw");
- } end_element ();
- start_element ("source") {
- attribute ("protocol", "nbd");
- start_element ("host") {
- attribute ("name", "localhost");
- attribute_format ("port", "%d",
data_conns[i].nbd_remote_port);
- } end_element ();
- } end_element ();
- start_element ("target") {
- attribute ("dev", target_dev);
- /* XXX Need to set bus to "ide" or "scsi" here. */
- } end_element ();
- } end_element ();
- }
-
- if (config->removable) {
- for (i = 0; config->removable[i] != NULL; ++i) {
- start_element ("disk") {
- attribute ("type", "network");
- attribute ("device", "cdrom");
- start_element ("driver") {
- attribute ("name", "qemu");
- attribute ("type", "raw");
- } end_element ();
- start_element ("target") {
- attribute ("dev", config->removable[i]);
- } end_element ();
- } end_element ();
- }
- }
-
- if (config->interfaces) {
- for (i = 0; config->interfaces[i] != NULL; ++i) {
- const char *target_network;
- CLEANUP_FREE char *mac_filename = NULL;
- CLEANUP_FREE char *mac = NULL;
-
- target_network =
- map_interface_to_network (config, config->interfaces[i]);
-
- if (asprintf (&mac_filename, "/sys/class/net/%s/address",
- config->interfaces[i]) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- if (g_file_get_contents (mac_filename, &mac, NULL, NULL)) {
- const size_t len = strlen (mac);
-
- if (len > 0 && mac[len-1] == '\n')
- mac[len-1] = '\0';
- }
-
- start_element ("interface") {
- attribute ("type", "network");
- start_element ("source") {
- attribute ("network", target_network);
- } end_element ();
- start_element ("target") {
- attribute ("dev", config->interfaces[i]);
- } end_element ();
- if (mac) {
- start_element ("mac") {
- attribute ("address", mac);
- } end_element ();
- }
- } end_element ();
- }
- }
-
- } end_element (); /* </devices> */
-
- } end_element (); /* </domain> */
-
- if (xmlTextWriterEndDocument (xo) == -1)
- error (EXIT_FAILURE, errno, "xmlTextWriterEndDocument");
-}
-
-/**
- * Using C<config-E<gt>network_map>, map the interface to a target
- * network name. If no map is found, return C<default>. See
- * L<virt-p2v(1)> documentation of C<"p2v.network"> for how the
- * network map works.
- *
- * Note this returns a static string which is only valid as long as
- * C<config-E<gt>network_map> is not freed.
- */
-static const char *
-map_interface_to_network (struct config *config, const char *interface)
-{
- size_t i, len;
-
- if (config->network_map == NULL)
- return "default";
-
- for (i = 0; config->network_map[i] != NULL; ++i) {
- /* The default map maps everything. */
- if (strchr (config->network_map[i], ':') == NULL)
- return config->network_map[i];
-
- /* interface: ? */
- len = strlen (interface);
- if (STRPREFIX (config->network_map[i], interface) &&
- config->network_map[i][len] == ':')
- return &config->network_map[i][len+1];
- }
-
- /* No mapping found. */
- return "default";
-}
diff --git a/p2v/rtc.c b/p2v/rtc.c
deleted file mode 100644
index 28884fcc0..000000000
--- a/p2v/rtc.c
+++ /dev/null
@@ -1,165 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2017 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * Try to calculate Real Time Clock (RTC) offset from UTC in seconds.
- * For example if the RTC is 1 hour ahead of UTC, this will return
- * C<3600>. This is stored in C<config-E<gt>rtc_offset>.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <libintl.h>
-#include <time.h>
-#include <sys/ioctl.h>
-
-#include <math.h>
-
-#ifdef HAVE_LINUX_RTC_H
-#include <linux/rtc.h>
-#endif
-
-#include "getprogname.h"
-#include "ignore-value.h"
-
-#include "p2v.h"
-
-#ifndef HAVE_LINUX_RTC_H
-void
-get_rtc_config (struct rtc_config *rtc)
-{
- fprintf (stderr, "%s: RTC: compiled without support for /dev/rtc\n",
- getprogname ());
-
- rtc->offset = 0;
- rtc->basis = BASIS_UTC;
-}
-
-#else /* HAVE_LINUX_RTC_H */
-
-/**
- * Return RTC offset from UTC in seconds, positive numbers meaning
- * that the RTC is running ahead of UTC.
- *
- * In the error case, C<rtcE<gt>offset> is updated with 0 and
- * C<rtcE<gt>basis> is set to C<BASIS_UNKNOWN>.
- */
-void
-get_rtc_config (struct rtc_config *rtc)
-{
- int fd;
- struct rtc_time rtm;
- struct tm tm;
- time_t rtc_time;
- time_t system_time;
- double rf;
-
- rtc->basis = BASIS_UNKNOWN;
- rtc->offset = 0;
-
- fd = open ("/dev/rtc", O_RDONLY);
- if (fd == -1) {
- perror ("/dev/rtc");
- return;
- }
-
- if (ioctl (fd, RTC_RD_TIME, &rtm) == -1) {
- perror ("ioctl: RTC_RD_TIME");
- close (fd);
- return;
- }
-
- close (fd);
-
-#ifdef DEBUG_STDERR
- fprintf (stderr, "%s: RTC: %04d-%02d-%02d %02d:%02d:%02d\n",
- getprogname (),
- rtm.tm_year + 1900, rtm.tm_mon + 1, rtm.tm_mday,
- rtm.tm_hour, rtm.tm_min, rtm.tm_sec);
-#endif
-
- /* Convert this to seconds since the epoch. */
- tm.tm_sec = rtm.tm_sec;
- tm.tm_min = rtm.tm_min;
- tm.tm_hour = rtm.tm_hour;
- tm.tm_mday = rtm.tm_mday;
- tm.tm_mon = rtm.tm_mon;
- tm.tm_year = rtm.tm_year;
- tm.tm_isdst = 0; /* Ignore DST when calculating. */
- rtc_time = timegm (&tm);
- if (rtc_time == -1)
- return; /* Not representable as a Unix time. */
-
- /* Get system time in UTC. */
- system_time = time (NULL);
-
- /* Calculate the difference, rounded to the nearest 15 minutes. */
- rf = rtc_time - system_time;
-
-#ifdef DEBUG_STDERR
- fprintf (stderr, "%s: RTC: %ld system time: %ld difference: %g\n",
- getprogname (),
- (long) rtc_time, (long) system_time, rf);
-#endif
-
- rf /= 15*60;
- rf = round (rf);
- rf *= 15*60;
-
- /* If it's obviously out of range then print an error and return. */
- if (rf < -12*60*60 || rf > 14*60*60) {
- fprintf (stderr,
- "%s: RTC: offset of RTC from UTC is out of range (%g).\n",
- getprogname (), rf);
- return;
- }
-
- rtc->offset = (int) rf;
-
-#ifdef DEBUG_STDERR
- fprintf (stderr, "%s: RTC: offset of RTC from UTC = %d secs\n",
- getprogname (), rtc->offset);
-#endif
-
- /* Is the hardware clock set to localtime?
- *
- * Unfortunately it's not possible to distinguish between UTC and
- * localtime in timezones that lie along the Greenwich Meridian
- * (obviously including the UK), when daylight savings time is not
- * in effect. In that case, prefer UTC.
- */
- localtime_r (&system_time, &tm);
- if (tm.tm_gmtoff != 0 && tm.tm_gmtoff != rtc->offset)
- rtc->basis = BASIS_UTC;
- else {
- rtc->basis = BASIS_LOCALTIME;
- rtc->offset = 0;
-#ifdef DEBUG_STDERR
- fprintf (stderr, "%s: RTC time is localtime\n", getprogname ());
-#endif
- }
-
- return;
-}
-
-#endif /* HAVE_LINUX_RTC_H */
diff --git a/p2v/ssh.c b/p2v/ssh.c
deleted file mode 100644
index c8528033d..000000000
--- a/p2v/ssh.c
+++ /dev/null
@@ -1,1203 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2009-2019 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-/**
- * This file handles the ssh connections to the conversion server.
- *
- * virt-p2v will open several connections over the lifetime of
- * the conversion process.
- *
- * In C<test_connection>, it will first open a connection (to check it
- * is possible) and query virt-v2v on the server to ensure it exists,
- * it is the right version, and so on. This connection is then
- * closed, because in the GUI case we don't want to deal with keeping
- * it alive in case the administrator has set up an autologout.
- *
- * Once we start conversion, we will open a control connection to send
- * the libvirt configuration data and to start up virt-v2v, and we
- * will open up one data connection per local hard disk. The data
- * connection(s) have a reverse port forward to the local NBD server
- * which is serving the content of that hard disk. The remote port
- * for each data connection is assigned by ssh. See
- * C<open_data_connection> and C<start_remote_conversion>.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <string.h>
-#include <inttypes.h>
-#include <unistd.h>
-#include <errno.h>
-#include <error.h>
-#include <locale.h>
-#include <assert.h>
-#include <libintl.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include "ignore-value.h"
-#include "getprogname.h"
-
-#include "miniexpect.h"
-#include "p2v.h"
-
-#define SSH_TIMEOUT 60 /* seconds */
-
-char *v2v_version = NULL;
-char **input_drivers = NULL;
-char **output_drivers = NULL;
-
-static char *ssh_error;
-
-static void set_ssh_error (const char *fs, ...)
- __attribute__((format(printf,1,2)));
-
-static void
-set_ssh_error (const char *fs, ...)
-{
- va_list args;
- char *msg;
- int len;
-
- va_start (args, fs);
- len = vasprintf (&msg, fs, args);
- va_end (args);
-
- if (len < 0)
- error (EXIT_FAILURE, errno,
- "vasprintf (original error format string: %s)", fs);
-
- free (ssh_error);
- ssh_error = msg;
-}
-
-const char *
-get_ssh_error (void)
-{
- return ssh_error;
-}
-
-/* Like set_ssh_error, but for errors that aren't supposed to happen. */
-#define set_ssh_internal_error(fs, ...) \
- set_ssh_error ("%s:%d: internal error: " fs, __FILE__, __LINE__, \
- ##__VA_ARGS__)
-#define set_ssh_mexp_error(fn) \
- set_ssh_internal_error ("%s: %m", fn)
-#define set_ssh_pcre_error() \
- set_ssh_internal_error ("pcre error: %d\n", mexp_get_pcre_error (h))
-
-#define set_ssh_unexpected_eof(fs, ...) \
- set_ssh_error ("remote server closed the connection unexpectedly, " \
- "waiting for: " fs, ##__VA_ARGS__)
-#define set_ssh_unexpected_timeout(fs, ...) \
- set_ssh_error ("remote server timed out unexpectedly, " \
- "waiting for: " fs, ##__VA_ARGS__)
-
-static void compile_regexps (void) __attribute__((constructor));
-static void free_regexps (void) __attribute__((destructor));
-
-static pcre *password_re;
-static pcre *ssh_message_re;
-static pcre *sudo_password_re;
-static pcre *prompt_re;
-static pcre *version_re;
-static pcre *feature_libguestfs_rewrite_re;
-static pcre *feature_colours_option_re;
-static pcre *feature_input_re;
-static pcre *feature_output_re;
-static pcre *portfwd_re;
-
-static void
-compile_regexps (void)
-{
- const char *err;
- int offset;
- int p;
-
- /* These regexps are always used for partial matching. In pcre < 8
- * there were limitations on the regexps possible for partial
- * matching, so fail if that is true here. In pcre >= 8, all
- * regexps can be used in a partial match.
- */
-#ifdef PCRE_INFO_OKPARTIAL
-#define CHECK_PARTIAL_OK(pattern, re) \
- do { \
- pcre_fullinfo ((re), NULL, PCRE_INFO_OKPARTIAL, &p); \
- if (p != 1) { \
- fprintf (stderr, "%s: %s:%d: internal error: pattern '%s' cannot be
used for partial matching\n", \
- getprogname (), \
- __FILE__, __LINE__, (pattern)); \
- abort (); \
- } \
- } while (0)
-#else
-#define CHECK_PARTIAL_OK(pattern, re) /* skip check */
-#endif
-
-#define COMPILE(re,pattern,options) \
- do { \
- re = pcre_compile ((pattern), (options), &err, &offset, NULL); \
- if (re == NULL) { \
- ignore_value (write (2, err, strlen (err))); \
- abort (); \
- } \
- CHECK_PARTIAL_OK ((pattern), re); \
- } while (0)
-
- COMPILE (password_re, "password:", 0);
- /* Note that (?:.)* is required in order to work around a problem
- * with partial matching and PCRE in RHEL 5.
- */
- COMPILE (ssh_message_re, "(ssh: (?:.)*)", 0);
- COMPILE (sudo_password_re, "sudo: a password is required", 0);
- /* The magic synchronization strings all match this expression. See
- * start_ssh function below.
- */
- COMPILE (prompt_re,
- "###((?:[0123456789abcdefghijklmnopqrstuvwxyz]){8})### ", 0);
- /* Note that (?:.)* is required in order to work around a problem
- * with partial matching and PCRE in RHEL 5.
- */
- COMPILE (version_re,
- "virt-v2v ([1-9](?:.)*)",
- 0);
- COMPILE (feature_libguestfs_rewrite_re, "libguestfs-rewrite", 0);
- COMPILE (feature_colours_option_re, "colours-option", 0);
- /* The input and output regexps must match the same pattern in
- * v2v/modules_list.ml.
- */
- COMPILE (feature_input_re, "input:((?:[-\\w])+)", 0);
- COMPILE (feature_output_re, "output:((?:[-\\w])+)", 0);
- COMPILE (portfwd_re, "Allocated port ((?:\\d)+) for remote forward", 0);
-}
-
-static void
-free_regexps (void)
-{
- pcre_free (password_re);
- pcre_free (ssh_message_re);
- pcre_free (sudo_password_re);
- pcre_free (prompt_re);
- pcre_free (version_re);
- pcre_free (feature_libguestfs_rewrite_re);
- pcre_free (feature_colours_option_re);
- pcre_free (feature_input_re);
- pcre_free (feature_output_re);
- pcre_free (portfwd_re);
-}
-
-/**
- * Download URL to local file using the external 'curl' command.
- */
-static int
-curl_download (const char *url, const char *local_file)
-{
- char curl_config_file[] = "/tmp/curl.XXXXXX";
- char error_file[] = "/tmp/curlerr.XXXXXX";
- CLEANUP_FREE char *error_message = NULL;
- int fd, r;
- size_t i, len;
- FILE *fp;
- CLEANUP_FREE char *curl_cmd = NULL;
-
- fd = mkstemp (error_file);
- if (fd == -1)
- error (EXIT_FAILURE, errno, "mkstemp: %s", error_file);
- close (fd);
-
- /* Use a secure curl config file because escaping is easier. */
- fd = mkstemp (curl_config_file);
- if (fd == -1)
- error (EXIT_FAILURE, errno, "mkstemp: %s", curl_config_file);
- fp = fdopen (fd, "w");
- if (fp == NULL)
- error (EXIT_FAILURE, errno, "fdopen: %s", curl_config_file);
- fprintf (fp, "url = \"");
- len = strlen (url);
- for (i = 0; i < len; ++i) {
- switch (url[i]) {
- case '\\': fprintf (fp, "\\\\"); break;
- case '"': fprintf (fp, "\\\""); break;
- case '\t': fprintf (fp, "\\t"); break;
- case '\n': fprintf (fp, "\\n"); break;
- case '\r': fprintf (fp, "\\r"); break;
- case '\v': fprintf (fp, "\\v"); break;
- default: fputc (url[i], fp);
- }
- }
- fprintf (fp, "\"\n");
- fclose (fp);
-
- /* Run curl to download the URL to a file. */
- if (asprintf (&curl_cmd, "curl -f -s -S -o %s -K %s 2>%s",
- local_file, curl_config_file, error_file) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
-
- r = system (curl_cmd);
- /* unlink (curl_config_file); - useful for debugging */
- if (r == -1)
- error (EXIT_FAILURE, errno, "system: %s", curl_cmd);
-
- /* Did curl subprocess fail? */
- if (WIFEXITED (r) && WEXITSTATUS (r) != 0) {
- if (read_whole_file (error_file, &error_message, NULL) == 0)
- set_ssh_error ("%s: %s", url, error_message);
- else
- set_ssh_error ("%s: curl error %d", url, WEXITSTATUS (r));
- unlink (error_file);
- return -1;
- }
- else if (!WIFEXITED (r)) {
- set_ssh_internal_error ("curl subprocess got a signal (%d)", r);
- unlink (error_file);
- return -1;
- }
-
- unlink (error_file);
- return 0;
-}
-
-/**
- * Re-cache the C<config-E<gt>identity.url> if needed.
- */
-static int
-cache_ssh_identity (struct config *config)
-{
- int fd;
-
- /* If it doesn't need downloading, return. */
- if (config->auth.identity.url == NULL ||
- !config->auth.identity.file_needs_update)
- return 0;
-
- /* Generate a random filename. */
- free (config->auth.identity.file);
- config->auth.identity.file = strdup ("/tmp/id.XXXXXX");
- if (config->auth.identity.file == NULL)
- error (EXIT_FAILURE, errno, "strdup");
- fd = mkstemp (config->auth.identity.file);
- if (fd == -1)
- error (EXIT_FAILURE, errno, "mkstemp");
- close (fd);
-
- /* Curl download URL to file. */
- if (curl_download (config->auth.identity.url, config->auth.identity.file) == -1)
{
- free (config->auth.identity.file);
- config->auth.identity.file = NULL;
- config->auth.identity.file_needs_update = 1;
- return -1;
- }
-
- return 0;
-}
-
-/* GCC complains about the argv array in the next function which it
- * thinks might grow to an unbounded size. Since we control
- * extra_args, this is not in fact a problem.
- */
-#if defined(__GNUC__) && GUESTFS_GCC_VERSION >= 40800 /* gcc >= 4.8.0 */
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wstack-usage="
-#endif
-
-/**
- * Start ssh subprocess with the standard arguments and possibly some
- * optional arguments. Also handles authentication.
- */
-static mexp_h *
-start_ssh (unsigned spawn_flags, struct config *config,
- char **extra_args, int wait_prompt)
-{
- size_t i = 0;
- const size_t MAX_ARGS =
- 64 + (extra_args != NULL ? guestfs_int_count_strings (extra_args) : 0);
- const char *argv[MAX_ARGS];
- char port_str[64];
- char connect_timeout_str[128];
- mexp_h *h;
- const int ovecsize = 12;
- int ovector[ovecsize];
- int saved_timeout;
- int using_password_auth;
- size_t count;
-
- if (cache_ssh_identity (config) == -1)
- return NULL;
-
- /* Are we using password or identity authentication? */
- using_password_auth = config->auth.identity.file == NULL;
-
- ADD_ARG (argv, i, "ssh");
- ADD_ARG (argv, i, "-p"); /* Port. */
- snprintf (port_str, sizeof port_str, "%d", config->remote.port);
- ADD_ARG (argv, i, port_str);
- ADD_ARG (argv, i, "-l"); /* Username. */
- ADD_ARG (argv, i, config->auth.username ? config->auth.username :
"root");
- ADD_ARG (argv, i, "-o"); /* Host key will always be novel. */
- ADD_ARG (argv, i, "StrictHostKeyChecking=no");
- ADD_ARG (argv, i, "-o"); /* ConnectTimeout */
- snprintf (connect_timeout_str, sizeof connect_timeout_str,
- "ConnectTimeout=%d", SSH_TIMEOUT);
- ADD_ARG (argv, i, connect_timeout_str);
- ADD_ARG (argv, i, "-o"); /* Send ping packets every 5 mins to sshd. */
- ADD_ARG (argv, i, "ServerAliveInterval=300");
- ADD_ARG (argv, i, "-o");
- ADD_ARG (argv, i, "ServerAliveCountMax=6");
- if (using_password_auth) {
- /* Only use password authentication. */
- ADD_ARG (argv, i, "-o");
- ADD_ARG (argv, i,
"PreferredAuthentications=keyboard-interactive,password");
- }
- else {
- /* Use identity file (private key). */
- ADD_ARG (argv, i, "-o");
- ADD_ARG (argv, i, "PreferredAuthentications=publickey");
- ADD_ARG (argv, i, "-i");
- ADD_ARG (argv, i, config->auth.identity.file);
- }
- if (extra_args != NULL) {
- for (size_t j = 0; extra_args[j] != NULL; ++j)
- ADD_ARG (argv, i, extra_args[j]);
- }
- ADD_ARG (argv, i, config->remote.server); /* Conversion server. */
- ADD_ARG (argv, i, NULL);
-
-#if DEBUG_STDERR
- fputs ("ssh command: ", stderr);
- for (i = 0; argv[i] != NULL; ++i) {
- if (i > 0) fputc (' ', stderr);
- fputs (argv[i], stderr);
- }
- fputc ('\n', stderr);
-#endif
-
- /* Create the miniexpect handle. */
- h = mexp_spawnvf (spawn_flags, "ssh", (char **) argv);
- if (h == NULL) {
- set_ssh_internal_error ("ssh: mexp_spawnvf: %m");
- return NULL;
- }
-#if DEBUG_STDERR
- mexp_set_debug_file (h, stderr);
-#endif
-
- /* We want the ssh ConnectTimeout to be less than the miniexpect
- * timeout, so that if the server is completely unresponsive we
- * still see the error from ssh, not a timeout from miniexpect. The
- * obvious solution to this is to set ConnectTimeout (above) and to
- * set the miniexpect timeout to be a little bit larger.
- */
- mexp_set_timeout (h, SSH_TIMEOUT + 20);
-
- if (using_password_auth &&
- config->auth.password && strlen (config->auth.password) > 0) {
- CLEANUP_FREE char *ssh_message = NULL;
-
- /* Wait for the password prompt. */
- wait_password_again:
- switch (mexp_expect (h,
- (mexp_regexp[]) {
- { 100, .re = password_re },
- { 101, .re = ssh_message_re },
- { 0 }
- }, ovector, ovecsize)) {
- case 100: /* Got password prompt. */
- if (mexp_printf_password (h, "%s", config->auth.password) == -1 ||
- mexp_printf (h, "\n") == -1) {
- set_ssh_mexp_error ("mexp_printf");
- mexp_close (h);
- return NULL;
- }
- break;
-
- case 101:
- free (ssh_message);
- ssh_message = strndup (&h->buffer[ovector[2]], ovector[3]-ovector[2]);
- goto wait_password_again;
-
- case MEXP_EOF:
- /* This is where we get to if the user enters an incorrect or
- * impossible hostname or port number. Hopefully ssh printed an
- * error message, and we picked it up and put it in
- * 'ssh_message' in case 101 above. If not we have to print a
- * generic error instead.
- */
- if (ssh_message)
- set_ssh_error ("%s", ssh_message);
- else
- set_ssh_error ("ssh closed the connection without printing an
error.");
- mexp_close (h);
- return NULL;
-
- case MEXP_TIMEOUT:
- set_ssh_unexpected_timeout ("password prompt");
- mexp_close (h);
- return NULL;
-
- case MEXP_ERROR:
- set_ssh_mexp_error ("mexp_expect");
- mexp_close (h);
- return NULL;
-
- case MEXP_PCRE_ERROR:
- set_ssh_pcre_error ();
- mexp_close (h);
- return NULL;
- }
- }
-
- if (!wait_prompt)
- return h;
-
- /* Ensure we are running bash, set environment variables, and
- * synchronize with the command prompt and set it to a known
- * string. There are multiple issues being solved here:
- *
- * We cannot control the initial shell prompt. It would involve
- * changing the remote SSH configuration (AcceptEnv). However what
- * we can do is to repeatedly send 'export PS1=<magic>' commands
- * until we synchronize with the remote shell.
- *
- * Since we parse error messages, we must set LANG=C.
- *
- * We don't know if the user is using a Bourne-like shell (eg sh,
- * bash) or csh/tcsh. Setting environment variables works
- * differently.
- *
- * We don't know how command line editing is set up
- * (
https://bugzilla.redhat.com/1314244#c9).
- */
- if (mexp_printf (h, "exec bash --noediting --noprofile\n") == -1) {
- set_ssh_mexp_error ("mexp_printf");
- mexp_close (h);
- return NULL;
- }
-
- saved_timeout = mexp_get_timeout_ms (h);
- mexp_set_timeout (h, 2);
-
- for (count = 0; count < 30; ++count) {
- char magic[9];
- const char *matched;
- int r;
-
- if (guestfs_int_random_string (magic, 8) == -1) {
- set_ssh_internal_error ("random_string: %m");
- mexp_close (h);
- return NULL;
- }
-
- /* The purpose of the '' inside the string is to ensure we don't
- * mistake the command echo for the prompt.
- */
- if (mexp_printf (h, "export LANG=C PS1='###''%s''###
'\n", magic) == -1) {
- set_ssh_mexp_error ("mexp_printf");
- mexp_close (h);
- return NULL;
- }
-
- /* Wait for the prompt. */
- wait_again:
- switch (mexp_expect (h,
- (mexp_regexp[]) {
- { 100, .re = password_re },
- { 101, .re = prompt_re },
- { 0 }
- }, ovector, ovecsize)) {
- case 100: /* Got password prompt unexpectedly. */
- set_ssh_error ("Login failed. Probably the username and/or password is
wrong.");
- mexp_close (h);
- return NULL;
-
- case 101:
- /* Got a prompt. However it might be an earlier prompt. If it
- * doesn't match the PS1 string we sent, then repeat the expect.
- */
- r = pcre_get_substring (h->buffer, ovector,
- mexp_get_pcre_error (h), 1, &matched);
- if (r < 0)
- error (EXIT_FAILURE, 0, "pcre error reading substring (%d)", r);
- r = STREQ (magic, matched);
- pcre_free_substring (matched);
- if (!r)
- goto wait_again;
- goto got_prompt;
-
- case MEXP_EOF:
- set_ssh_unexpected_eof ("the command prompt");
- mexp_close (h);
- return NULL;
-
- case MEXP_TIMEOUT:
- /* Timeout here is not an error, since ssh may "eat" commands that
- * we send before the shell at the other end is ready. Just loop.
- */
- break;
-
- case MEXP_ERROR:
- set_ssh_mexp_error ("mexp_expect");
- mexp_close (h);
- return NULL;
-
- case MEXP_PCRE_ERROR:
- set_ssh_pcre_error ();
- mexp_close (h);
- return NULL;
- }
- }
-
- set_ssh_error ("Failed to synchronize with remote shell after 60 seconds.");
- mexp_close (h);
- return NULL;
-
- got_prompt:
- mexp_set_timeout_ms (h, saved_timeout);
-
- return h;
-}
-
-#if defined(__GNUC__) && GUESTFS_GCC_VERSION >= 40800 /* gcc >= 4.8.0 */
-#pragma GCC diagnostic pop
-#endif
-
-/**
- * Upload file(s) to remote using L<scp(1)>.
- *
- * Note that the target (directory or file) comes before the list of
- * local files, because the list of local files is a varargs list.
- *
- * This is a simplified version of L</start_ssh> above.
- */
-int
-scp_file (struct config *config, const char *target, const char *local, ...)
-{
- size_t i = 0;
- va_list args;
- const size_t MAX_ARGS = 64;
- const char *argv[MAX_ARGS];
- char port_str[64];
- char connect_timeout_str[128];
- CLEANUP_FREE char *remote = NULL;
- mexp_h *h;
- const int ovecsize = 12;
- int ovector[ovecsize];
- int using_password_auth;
-
- if (cache_ssh_identity (config) == -1)
- return -1;
-
- /* Are we using password or identity authentication? */
- using_password_auth = config->auth.identity.file == NULL;
-
- ADD_ARG (argv, i, "scp");
- ADD_ARG (argv, i, "-P"); /* Port. */
- snprintf (port_str, sizeof port_str, "%d", config->remote.port);
- ADD_ARG (argv, i, port_str);
- ADD_ARG (argv, i, "-o"); /* Host key will always be novel. */
- ADD_ARG (argv, i, "StrictHostKeyChecking=no");
- ADD_ARG (argv, i, "-o"); /* ConnectTimeout */
- snprintf (connect_timeout_str, sizeof connect_timeout_str,
- "ConnectTimeout=%d", SSH_TIMEOUT);
- ADD_ARG (argv, i, connect_timeout_str);
- if (using_password_auth) {
- /* Only use password authentication. */
- ADD_ARG (argv, i, "-o");
- ADD_ARG (argv, i,
"PreferredAuthentications=keyboard-interactive,password");
- }
- else {
- /* Use identity file (private key). */
- ADD_ARG (argv, i, "-o");
- ADD_ARG (argv, i, "PreferredAuthentications=publickey");
- ADD_ARG (argv, i, "-i");
- ADD_ARG (argv, i, config->auth.identity.file);
- }
-
- /* Source files or directories.
- * Strictly speaking this could abort() if the list of files is
- * too long, but that never happens in virt-p2v. XXX
- */
- va_start (args, local);
- do ADD_ARG (argv, i, local);
- while ((local = va_arg (args, const char *)) != NULL);
- va_end (args);
-
- /* The target file or directory. We need to rewrite this as
- * "username@server:target".
- */
- if (asprintf (&remote, "%s@%s:%s",
- config->auth.username ? config->auth.username : "root",
- config->remote.server, target) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- ADD_ARG (argv, i, remote);
-
- ADD_ARG (argv, i, NULL);
-
-#if DEBUG_STDERR
- fputs ("scp command: ", stderr);
- for (i = 0; argv[i] != NULL; ++i) {
- if (i > 0) fputc (' ', stderr);
- fputs (argv[i], stderr);
- }
- fputc ('\n', stderr);
-#endif
-
- /* Create the miniexpect handle. */
- h = mexp_spawnv ("scp", (char **) argv);
- if (h == NULL) {
- set_ssh_internal_error ("scp: mexp_spawnv: %m");
- return -1;
- }
-#if DEBUG_STDERR
- mexp_set_debug_file (h, stderr);
-#endif
-
- /* We want the ssh ConnectTimeout to be less than the miniexpect
- * timeout, so that if the server is completely unresponsive we
- * still see the error from ssh, not a timeout from miniexpect. The
- * obvious solution to this is to set ConnectTimeout (above) and to
- * set the miniexpect timeout to be a little bit larger.
- */
- mexp_set_timeout (h, SSH_TIMEOUT + 20);
-
- if (using_password_auth &&
- config->auth.password && strlen (config->auth.password) > 0) {
- CLEANUP_FREE char *ssh_message = NULL;
-
- /* Wait for the password prompt. */
- wait_password_again:
- switch (mexp_expect (h,
- (mexp_regexp[]) {
- { 100, .re = password_re },
- { 101, .re = ssh_message_re },
- { 0 }
- }, ovector, ovecsize)) {
- case 100: /* Got password prompt. */
- if (mexp_printf_password (h, "%s", config->auth.password) == -1 ||
- mexp_printf (h, "\n") == -1) {
- set_ssh_mexp_error ("mexp_printf");
- mexp_close (h);
- return -1;
- }
- break;
-
- case 101:
- free (ssh_message);
- ssh_message = strndup (&h->buffer[ovector[2]], ovector[3]-ovector[2]);
- goto wait_password_again;
-
- case MEXP_EOF:
- /* This is where we get to if the user enters an incorrect or
- * impossible hostname or port number. Hopefully scp printed an
- * error message, and we picked it up and put it in
- * 'ssh_message' in case 101 above. If not we have to print a
- * generic error instead.
- */
- if (ssh_message)
- set_ssh_error ("%s", ssh_message);
- else
- set_ssh_error ("scp closed the connection without printing an
error.");
- mexp_close (h);
- return -1;
-
- case MEXP_TIMEOUT:
- set_ssh_unexpected_timeout ("password prompt");
- mexp_close (h);
- return -1;
-
- case MEXP_ERROR:
- set_ssh_mexp_error ("mexp_expect");
- mexp_close (h);
- return -1;
-
- case MEXP_PCRE_ERROR:
- set_ssh_pcre_error ();
- mexp_close (h);
- return -1;
- }
- }
-
- /* Wait for the scp subprocess to finish. */
- switch (mexp_expect (h, NULL, NULL, 0)) {
- case MEXP_EOF:
- break;
-
- case MEXP_TIMEOUT:
- set_ssh_unexpected_timeout ("copying (scp) file");
- mexp_close (h);
- return -1;
-
- case MEXP_ERROR:
- set_ssh_mexp_error ("mexp_expect");
- mexp_close (h);
- return -1;
-
- case MEXP_PCRE_ERROR:
- set_ssh_pcre_error ();
- mexp_close (h);
- return -1;
- }
-
- if (mexp_close (h) == -1) {
- set_ssh_internal_error ("scp: mexp_close: %m");
- return -1;
- }
-
- return 0;
-}
-
-static void add_input_driver (const char *name, size_t len);
-static void add_output_driver (const char *name, size_t len);
-static int compatible_version (const char *v2v_version);
-
-#pragma GCC diagnostic ignored "-Wsuggest-attribute=noreturn" /* WTF? */
-int
-test_connection (struct config *config)
-{
- mexp_h *h;
- CLEANUP_FREE char *major_str = NULL, *minor_str = NULL, *release_str = NULL;
- int feature_libguestfs_rewrite = 0;
- int status;
- const int ovecsize = 12;
- int ovector[ovecsize];
-
- h = start_ssh (0, config, NULL, 1);
- if (h == NULL)
- return -1;
-
- /* Clear any previous version information since we may be connecting
- * to a different server.
- */
- free (v2v_version);
- v2v_version = NULL;
-
- /* Send 'virt-v2v --version' command and hope we get back a version string.
- * Note old virt-v2v did not understand -V option.
- */
- if (mexp_printf (h,
- "%svirt-v2v --version\n",
- config->auth.sudo ? "sudo -n " : "") == -1) {
- set_ssh_mexp_error ("mexp_printf");
- mexp_close (h);
- return -1;
- }
-
- for (;;) {
- switch (mexp_expect (h,
- (mexp_regexp[]) {
- { 100, .re = version_re },
- { 101, .re = sudo_password_re },
- { 102, .re = prompt_re },
- { 0 }
- }, ovector, ovecsize)) {
- case 100: /* Got version string. */
- free (v2v_version);
- v2v_version = strndup (&h->buffer[ovector[2]], ovector[3]-ovector[2]);
-#if DEBUG_STDERR
- fprintf (stderr, "%s: remote virt-v2v version: %s\n",
- getprogname (), v2v_version);
-#endif
- break;
-
- case 101:
- set_ssh_error ("sudo for user \"%s\" requires a password. Edit
/etc/sudoers on the conversion server to ensure the \"NOPASSWD:\" option is set
for this user.",
- config->auth.username);
- mexp_close (h);
- return -1;
-
- case 102: /* Got the prompt. */
- goto end_of_version;
-
- case MEXP_EOF:
- set_ssh_unexpected_eof ("\"virt-v2v --version\" output");
- mexp_close (h);
- return -1;
-
- case MEXP_TIMEOUT:
- set_ssh_unexpected_timeout ("\"virt-v2v --version\" output");
- mexp_close (h);
- return -1;
-
- case MEXP_ERROR:
- set_ssh_mexp_error ("mexp_expect");
- mexp_close (h);
- return -1;
-
- case MEXP_PCRE_ERROR:
- set_ssh_pcre_error ();
- mexp_close (h);
- return -1;
- }
- }
- end_of_version:
-
- /* Got the prompt but no version number. */
- if (v2v_version == NULL) {
- set_ssh_error ("virt-v2v is not installed on the conversion server, "
- "or it might be a too old version.");
- mexp_close (h);
- return -1;
- }
-
- /* Check the version of virt-v2v is compatible with virt-p2v. */
- if (!compatible_version (v2v_version)) {
- mexp_close (h);
- return -1;
- }
-
- /* Clear any previous driver information since we may be connecting
- * to a different server.
- */
- guestfs_int_free_string_list (input_drivers);
- guestfs_int_free_string_list (output_drivers);
- input_drivers = output_drivers = NULL;
-
- /* Get virt-v2v features. See: v2v/cmdline.ml */
- if (mexp_printf (h, "%svirt-v2v --machine-readable\n",
- config->auth.sudo ? "sudo -n " : "") == -1) {
- set_ssh_mexp_error ("mexp_printf");
- mexp_close (h);
- return -1;
- }
-
- for (;;) {
- switch (mexp_expect (h,
- (mexp_regexp[]) {
- { 100, .re = feature_libguestfs_rewrite_re },
- { 101, .re = feature_colours_option_re },
- { 102, .re = feature_input_re },
- { 103, .re = feature_output_re },
- { 104, .re = prompt_re },
- { 0 }
- }, ovector, ovecsize)) {
- case 100: /* libguestfs-rewrite. */
- feature_libguestfs_rewrite = 1;
- break;
-
- case 101: /* virt-v2v supports --colours option */
-#if DEBUG_STDERR
- fprintf (stderr, "%s: remote virt-v2v supports --colours option\n",
- getprogname ());
-#endif
- feature_colours_option = 1;
- break;
-
- case 102:
- /* input:<driver-name> corresponds to an -i option in virt-v2v. */
- add_input_driver (&h->buffer[ovector[2]],
- (size_t) (ovector[3]-ovector[2]));
- break;
-
- case 103:
- /* output:<driver-name> corresponds to an -o option in virt-v2v. */
- add_output_driver (&h->buffer[ovector[2]],
- (size_t) (ovector[3]-ovector[2]));
- break;
-
- case 104: /* Got prompt, so end of output. */
- goto end_of_machine_readable;
-
- case MEXP_EOF:
- set_ssh_unexpected_eof ("\"virt-v2v --machine-readable\"
output");
- mexp_close (h);
- return -1;
-
- case MEXP_TIMEOUT:
- set_ssh_unexpected_timeout ("\"virt-v2v --machine-readable\"
output");
- mexp_close (h);
- return -1;
-
- case MEXP_ERROR:
- set_ssh_mexp_error ("mexp_expect");
- mexp_close (h);
- return -1;
-
- case MEXP_PCRE_ERROR:
- set_ssh_pcre_error ();
- mexp_close (h);
- return -1;
- }
- }
- end_of_machine_readable:
-
- if (!feature_libguestfs_rewrite) {
- set_ssh_error ("Invalid output of \"virt-v2v --machine-readable\"
command.");
- mexp_close (h);
- return -1;
- }
-
- /* Test finished, shut down ssh. */
- if (mexp_printf (h, "exit\n") == -1) {
- set_ssh_mexp_error ("mexp_printf");
- mexp_close (h);
- return -1;
- }
-
- switch (mexp_expect (h, NULL, NULL, 0)) {
- case MEXP_EOF:
- break;
-
- case MEXP_TIMEOUT:
- set_ssh_unexpected_timeout ("end of ssh session");
- mexp_close (h);
- return -1;
-
- case MEXP_ERROR:
- set_ssh_mexp_error ("mexp_expect");
- mexp_close (h);
- return -1;
-
- case MEXP_PCRE_ERROR:
- set_ssh_pcre_error ();
- mexp_close (h);
- return -1;
- }
-
- status = mexp_close (h);
- if (status == -1) {
- set_ssh_internal_error ("mexp_close: %m");
- return -1;
- }
- if (WIFSIGNALED (status) && WTERMSIG (status) == SIGHUP)
- return 0; /* not an error */
- if (!WIFEXITED (status) || WEXITSTATUS (status) != 0) {
- set_ssh_internal_error ("unexpected close status from ssh subprocess
(%d)",
- status);
- return -1;
- }
- return 0;
-}
-
-static void
-add_option (const char *type, char ***drivers, const char *name, size_t len)
-{
- size_t n;
-
- if (*drivers == NULL)
- n = 0;
- else
- n = guestfs_int_count_strings (*drivers);
-
- n++;
-
- *drivers = realloc (*drivers, (n+1) * sizeof (char *));
- if (*drivers == NULL)
- error (EXIT_FAILURE, errno, "malloc");
-
- (*drivers)[n-1] = strndup (name, len);
- if ((*drivers)[n-1] == NULL)
- error (EXIT_FAILURE, errno, "strndup");
- (*drivers)[n] = NULL;
-
-#if DEBUG_STDERR
- fprintf (stderr, "%s: remote virt-v2v supports %s driver %s\n",
- getprogname (), type, (*drivers)[n-1]);
-#endif
-}
-
-static void
-add_input_driver (const char *name, size_t len)
-{
- add_option ("input", &input_drivers, name, len);
-}
-
-static void
-add_output_driver (const char *name, size_t len)
-{
- /* Ignore the 'vdsm' driver, since that should only be used by VDSM. */
- if (len != 4 || memcmp (name, "vdsm", 4) != 0)
- add_option ("output", &output_drivers, name, len);
-}
-
-static int
-compatible_version (const char *v2v_version)
-{
- unsigned v2v_minor;
-
- /* The major version must always be 1. */
- if (!STRPREFIX (v2v_version, "1.")) {
- set_ssh_error ("virt-v2v major version is not 1 (\"%s\"), "
- "this version of virt-p2v is not compatible.",
- v2v_version);
- return 0;
- }
-
- /* The version of virt-v2v must be >= 1.28, just to make sure
- * someone isn't (a) using one of the experimental 1.27 releases
- * that we published during development, nor (b) using old virt-v2v.
- * We should remain compatible with any virt-v2v after 1.28.
- */
- if (sscanf (v2v_version, "1.%u", &v2v_minor) != 1) {
- set_ssh_internal_error ("cannot parse virt-v2v version string
(\"%s\")",
- v2v_version);
- return 0;
- }
-
- if (v2v_minor < 28) {
- set_ssh_error ("virt-v2v version is < 1.28 (\"%s\"), "
- "you must upgrade to virt-v2v >= 1.28 on "
- "the conversion server.", v2v_version);
- return 0;
- }
-
- return 1; /* compatible */
-}
-
-mexp_h *
-open_data_connection (struct config *config,
- const char *local_ipaddr, int local_port,
- int *remote_port)
-{
- mexp_h *h;
- char remote_arg[32];
- const char *extra_args[] = {
- "-R", remote_arg,
- "-N",
- NULL
- };
- CLEANUP_FREE char *port_str = NULL;
- const int ovecsize = 12;
- int ovector[ovecsize];
-
- snprintf (remote_arg, sizeof remote_arg, "0:%s:%d", local_ipaddr,
local_port);
-
- h = start_ssh (0, config, (char **) extra_args, 0);
- if (h == NULL)
- return NULL;
-
- switch (mexp_expect (h,
- (mexp_regexp[]) {
- { 100, .re = portfwd_re },
- { 0 }
- }, ovector, ovecsize)) {
- case 100: /* Ephemeral port. */
- port_str = strndup (&h->buffer[ovector[2]], ovector[3]-ovector[2]);
- if (port_str == NULL) {
- set_ssh_internal_error ("strndup: %m");
- mexp_close (h);
- return NULL;
- }
- if (sscanf (port_str, "%d", remote_port) != 1) {
- set_ssh_internal_error ("cannot extract the port number from
'%s'",
- port_str);
- mexp_close (h);
- return NULL;
- }
- break;
-
- case MEXP_EOF:
- set_ssh_unexpected_eof ("\"ssh -R\" output");
- mexp_close (h);
- return NULL;
-
- case MEXP_TIMEOUT:
- set_ssh_unexpected_timeout ("\"ssh -R\" output");
- mexp_close (h);
- return NULL;
-
- case MEXP_ERROR:
- set_ssh_mexp_error ("mexp_expect");
- mexp_close (h);
- return NULL;
-
- case MEXP_PCRE_ERROR:
- set_ssh_pcre_error ();
- mexp_close (h);
- return NULL;
- }
-
- return h;
-}
-
-/* Wait for the prompt. */
-static int
-wait_for_prompt (mexp_h *h)
-{
- const int ovecsize = 12;
- int ovector[ovecsize];
-
- switch (mexp_expect (h,
- (mexp_regexp[]) {
- { 100, .re = prompt_re },
- { 0 }
- }, ovector, ovecsize)) {
- case 100: /* Got the prompt. */
- return 0;
-
- case MEXP_EOF:
- set_ssh_unexpected_eof ("command prompt");
- return -1;
-
- case MEXP_TIMEOUT:
- set_ssh_unexpected_timeout ("command prompt");
- return -1;
-
- case MEXP_ERROR:
- set_ssh_mexp_error ("mexp_expect");
- return -1;
-
- case MEXP_PCRE_ERROR:
- set_ssh_pcre_error ();
- return -1;
- }
-
- return 0;
-}
-
-mexp_h *
-start_remote_connection (struct config *config, const char *remote_dir)
-{
- mexp_h *h;
-
- /* This connection is opened in cooked mode so that we can send ^C
- * if the conversion needs to be cancelled. However that also means
- * we must be careful not to accidentally send any control
- * characters over this connection at other times.
- */
- h = start_ssh (MEXP_SPAWN_COOKED_MODE, config, NULL, 1);
- if (h == NULL)
- return NULL;
-
- /* Create the remote directory. */
- if (mexp_printf (h, "mkdir %s\n", remote_dir) == -1) {
- set_ssh_mexp_error ("mexp_printf");
- goto error;
- }
-
- if (wait_for_prompt (h) == -1)
- goto error;
-
- /* It's simplest to create the remote 'time' file by running the date
- * command, as that won't send any special control characters.
- */
- if (mexp_printf (h, "date > %s/time\n", remote_dir) == -1) {
- set_ssh_mexp_error ("mexp_printf");
- goto error;
- }
-
- if (wait_for_prompt (h) == -1)
- goto error;
-
- return h;
-
- error:
- mexp_close (h);
- return NULL;
-}
diff --git a/p2v/test-virt-p2v-cmdline.sh b/p2v/test-virt-p2v-cmdline.sh
deleted file mode 100755
index 2fbca1eb5..000000000
--- a/p2v/test-virt-p2v-cmdline.sh
+++ /dev/null
@@ -1,53 +0,0 @@
-#!/bin/bash -
-# libguestfs virt-p2v test script
-# Copyright (C) 2015 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# Test virt-p2v command line parsing in non-GUI mode.
-
-set -e
-
-$TEST_FUNCTIONS
-skip_if_skipped
-
-out=test-virt-p2v-cmdline.out
-rm -f $out
-
-# The Linux kernel command line.
-$VG virt-p2v --cmdline='p2v.server=localhost p2v.port=123 p2v.username=user
p2v.password=secret p2v.skip_test_connection p2v.name=test p2v.vcpus=4 p2v.memory=1G
p2v.disks=sda,sdb,sdc p2v.removable=sdd p2v.interfaces=eth0,eth1 p2v.o=local p2v.oa=sparse
p2v.oc=qemu:///session p2v.of=raw p2v.os=/var/tmp p2v.network=em1:wired,other
p2v.dump_config_and_exit' > $out
-
-# For debugging purposes.
-cat $out
-
-# Check the output contains what we expect.
-grep "^remote\.server.*localhost" $out
-grep "^remote\.port.*123" $out
-grep "^auth\.username.*user" $out
-grep "^auth\.sudo.*false" $out
-grep "^guestname.*test" $out
-grep "^vcpus.*4" $out
-grep "^memory.*"$((1024*1024*1024)) $out
-grep "^disks.*sda sdb sdc" $out
-grep "^removable.*sdd" $out
-grep "^interfaces.*eth0 eth1" $out
-grep "^network_map.*em1:wired other" $out
-grep "^output\.type.*local" $out
-grep "^output\.allocation.*sparse" $out
-grep "^output\.connection.*qemu:///session" $out
-grep "^output\.format.*raw" $out
-grep "^output\.storage.*/var/tmp" $out
-
-rm $out
diff --git a/p2v/test-virt-p2v-docs.sh b/p2v/test-virt-p2v-docs.sh
deleted file mode 100755
index d4942de4e..000000000
--- a/p2v/test-virt-p2v-docs.sh
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/bash -
-# libguestfs
-# Copyright (C) 2016 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-set -e
-
-$TEST_FUNCTIONS
-skip_if_skipped
-
-$top_srcdir/podcheck.pl $srcdir/virt-p2v.pod virt-p2v
diff --git a/p2v/test-virt-p2v-nbdkit.sh b/p2v/test-virt-p2v-nbdkit.sh
deleted file mode 100755
index cf7a416bc..000000000
--- a/p2v/test-virt-p2v-nbdkit.sh
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/bin/bash -
-# libguestfs virt-p2v test script
-# Copyright (C) 2014-2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# Test virt-p2v in non-GUI mode using nbdkit instead of qemu-nbd.
-
-set -e
-
-$TEST_FUNCTIONS
-skip_if_skipped
-skip_if_backend uml
-skip_unless nbdkit file --version
-skip_unless test -f fedora.img
-skip_unless test -f blank-part.img
-
-f1="$abs_builddir/fedora.img"
-f2="$abs_builddir/blank-part.img"
-
-d=test-virt-p2v-nbdkit.d
-rm -rf $d
-mkdir $d
-
-# We don't want the program under test to run real 'ssh' or 'scp'.
-# They won't work. Therefore create dummy 'ssh' and 'scp' binaries.
-pushd $d
-ln -sf "$abs_srcdir/test-virt-p2v-ssh.sh" ssh
-ln -sf "$abs_srcdir/test-virt-p2v-scp.sh" scp
-popd
-export PATH=$d:$PATH
-
-# Note that the PATH already contains the local virt-p2v & virt-v2v
-# binaries under test (because of the ./run script).
-
-# The Linux kernel command line.
-cmdline="p2v.server=localhost p2v.name=fedora p2v.disks=$f1,$f2 p2v.o=local
p2v.os=$(pwd)/$d p2v.network=em1:wired,other p2v.post="
-
-# Only use nbdkit, disable qemu-nbd.
-$VG virt-p2v --cmdline="$cmdline" --nbd=nbdkit,nbdkit-no-sa
-
-# Test the libvirt XML metadata and a disk was created.
-test -f $d/fedora.xml
-test -f $d/fedora-sda
-test -f $d/fedora-sdb
-
-rm -r $d
diff --git a/p2v/test-virt-p2v-pxe.sh b/p2v/test-virt-p2v-pxe.sh
deleted file mode 100755
index bad41886e..000000000
--- a/p2v/test-virt-p2v-pxe.sh
+++ /dev/null
@@ -1,96 +0,0 @@
-#!/bin/bash -
-# libguestfs virt-p2v test script
-# Copyright (C) 2014-2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# Test virt-p2v in non-GUI mode with something resembling the
-# PXE boot code path. This tests:
-# * virt-p2v-make-disk
-# * systemd p2v.service
-# * launch-virt-p2v
-# * networking
-# * virt-p2v in kernel command-line mode
-
-set -e
-
-$TEST_FUNCTIONS
-slow_test
-skip_if_skipped
-skip_if_backend uml
-skip_unless_arch x86_64
-
-qemu=qemu-system-x86_64
-skip_unless $qemu -help
-
-img="test-virt-p2v-pxe.img"
-if ! test -f $img; then
- echo "$0: test skipped because $img was not created"
- exit 77
-fi
-
-skip_unless test -f fedora.img
-f="$abs_builddir/fedora.img"
-
-d=test-virt-p2v-pxe.d
-rm -rf $d
-mkdir $d
-
-# Start the ssh server. Kill it if the script exits for any reason.
-# Note you must use an absolute path to exec sshd.
-`which sshd` -f test-virt-p2v-pxe.sshd_config -D -e &
-sshd_pid=$!
-cleanup ()
-{
- kill $sshd_pid
-}
-trap cleanup INT QUIT TERM EXIT ERR
-
-# Get the randomly assigned sshd port number.
-port="$(grep ^Port test-virt-p2v-pxe.sshd_config | awk '{print $2}')"
-
-# Connect as the local user.
-username="$(id -un)"
-
-# Output storage path.
-os="$(cd $d; pwd)"
-
-# The Linux kernel command line.
-cmdline="root=/dev/sda4 ro console=ttyS0 printk.time=1 p2v.server=10.0.2.2
p2v.port=$port p2v.username=$username p2v.identity=file:///var/tmp/id_rsa p2v.name=fedora
p2v.o=local p2v.os=$os"
-
-# Run virt-p2v inside qemu.
-$qemu \
- -no-user-config \
- -display none \
- -machine accel=kvm:tcg \
- -m 2048 \
- -kernel test-virt-p2v-pxe.vmlinuz \
- -initrd test-virt-p2v-pxe.initramfs \
- -append "$cmdline" \
- -boot c \
- -device virtio-scsi-pci,id=scsi \
- -drive file=$img,format=raw,snapshot=on,if=none,index=0,id=hd0 \
- -device scsi-hd,drive=hd0 \
- -drive file=$f,format=raw,snapshot=on,if=none,index=1,id=hd1 \
- -device scsi-hd,drive=hd1 \
- -netdev user,id=usernet \
- -device virtio-net-pci,netdev=usernet \
- -serial stdio
-
-# Test the libvirt XML metadata and a disk was created.
-test -f $d/fedora.xml
-test -f $d/fedora-sda
-
-rm -r $d
diff --git a/p2v/test-virt-p2v-pxe.sshd_config.in b/p2v/test-virt-p2v-pxe.sshd_config.in
deleted file mode 100644
index d6ce5789c..000000000
--- a/p2v/test-virt-p2v-pxe.sshd_config.in
+++ /dev/null
@@ -1,43 +0,0 @@
-# libguestfs virt-p2v test script
-# Copyright (C) 2014-2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# Minimal sshd_config used by test-virt-p2v-pxe.ssh when it runs
-# a captive sshd.
-#
-# This file is processed by awk. See p2v/Makefile.am.
-
-# Choose a random high port number.
-Port __RANDOM_PORT__
-
-# Only allow connections from loopback.
-ListenAddress [::1]
-ListenAddress 127.0.0.1
-
-# Privilege separation breaks non-root usage of sshd.
-UsePrivilegeSeparation no
-
-# Use local files instead of inaccessible global configuration.
-PidFile __abs_builddir__/test-virt-p2v-pxe.sshd.pid
-HostKey __abs_builddir__/test-virt-p2v-pxe.ssh_host_rsa_key
-
-AuthorizedKeysFile __abs_builddir__/test-virt-p2v-pxe.authorized_keys
-
-# Don't check file permissions.
-StrictModes no
-
-# Allow the environment to be set in the authorized_keys file above.
-PermitUserEnvironment yes
diff --git a/p2v/test-virt-p2v-scp.sh b/p2v/test-virt-p2v-scp.sh
deleted file mode 100755
index 53f9781fc..000000000
--- a/p2v/test-virt-p2v-scp.sh
+++ /dev/null
@@ -1,62 +0,0 @@
-#!/bin/bash -
-# Copyright (C) 2014-2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# This is an scp substitute used by test-virt-p2v.sh.
-
-TEMP=`getopt \
- -o 'o:P:' \
- -- "$@"`
-if [ $? != 0 ]; then
- echo "$0: problem parsing the command line arguments"
- exit 1
-fi
-eval set -- "$TEMP"
-
-while true ; do
- case "$1" in
- # Regular arguments that we can just ignore.
- -o|-P)
- shift 2
- ;;
-
- --)
- shift
- break
- ;;
- *)
- echo "$0: internal error ($1)"
- exit 1
- ;;
- esac
-done
-
-# Hopefully there are >= two arguments left, the source (local)
-# file(s) and a remote file of the form user@server:remote.
-if [ $# -lt 2 ]; then
- echo "$0: incorrect number of arguments found:" "$@"
- exit 1
-fi
-
-#
https://stackoverflow.com/questions/1853946/getting-the-last-argument-pas...
-remote="${@: -1}"
-#
https://stackoverflow.com/questions/20398499/remove-last-argument-from-ar...
-set -- "${@:1:$(($#-1))}"
-
-remote="$(echo $remote | awk -F: '{print $2}')"
-
-# Use the copy command.
-exec cp "$@" "$remote"
diff --git a/p2v/test-virt-p2v-ssh.sh b/p2v/test-virt-p2v-ssh.sh
deleted file mode 100755
index 79dc883c3..000000000
--- a/p2v/test-virt-p2v-ssh.sh
+++ /dev/null
@@ -1,61 +0,0 @@
-#!/bin/bash -
-# Copyright (C) 2014 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# This is an ssh substitute used by test-virt-p2v.sh.
-
-TEMP=`getopt \
- -o 'l:No:p:R:' \
- -- "$@"`
-if [ $? != 0 ]; then
- echo "$0: problem parsing the command line arguments"
- exit 1
-fi
-eval set -- "$TEMP"
-
-while true ; do
- case "$1" in
- # Regular arguments that we can just ignore.
- -N)
- shift
- ;;
- -l|-o|-p)
- shift 2
- ;;
-
- # ssh -R 0:localhost:<port> (port forwarding). Don't actually
- # port forward, just return the original port number here so that
- # the conversion process connects directly to qemu-nbd.
- -R)
- arg="$2"
- port="$(echo $arg | awk -F: '{print $3}')"
- echo "Allocated port" $port "for remote forward"
- shift 2
- ;;
-
- --)
- shift
- break
- ;;
- *)
- echo "$0: internal error ($1)"
- exit 1
- ;;
- esac
-done
-
-# Now run the interactive shell.
-exec bash
diff --git a/p2v/test-virt-p2v.sh b/p2v/test-virt-p2v.sh
deleted file mode 100755
index a6b07274e..000000000
--- a/p2v/test-virt-p2v.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/bin/bash -
-# libguestfs virt-p2v test script
-# Copyright (C) 2014 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-# Test virt-p2v in non-GUI mode.
-
-set -e
-
-$TEST_FUNCTIONS
-skip_if_skipped
-skip_if_backend uml
-skip_unless test -f fedora.img
-skip_unless test -f blank-part.img
-
-f1="$abs_builddir/fedora.img"
-f2="$abs_builddir/blank-part.img"
-
-d=test-virt-p2v.d
-rm -rf $d
-mkdir $d
-
-# We don't want the program under test to run real 'ssh' or 'scp'.
-# They won't work. Therefore create dummy 'ssh' and 'scp' binaries.
-pushd $d
-ln -sf "$abs_srcdir/test-virt-p2v-ssh.sh" ssh
-ln -sf "$abs_srcdir/test-virt-p2v-scp.sh" scp
-popd
-export PATH=$d:$PATH
-
-# Note that the PATH already contains the local virt-p2v & virt-v2v
-# binaries under test (because of the ./run script).
-
-# The Linux kernel command line.
-cmdline="p2v.server=localhost p2v.name=fedora p2v.disks=$f1,$f2 p2v.o=local
p2v.os=$(pwd)/$d p2v.network=em1:wired,other p2v.post="
-
-$VG virt-p2v --cmdline="$cmdline"
-
-# Test the libvirt XML metadata and a disk was created.
-test -f $d/fedora.xml
-test -f $d/fedora-sda
-test -f $d/fedora-sdb
-
-rm -r $d
diff --git a/p2v/utils.c b/p2v/utils.c
deleted file mode 100644
index 4b5e72390..000000000
--- a/p2v/utils.c
+++ /dev/null
@@ -1,256 +0,0 @@
-/* virt-p2v
- * Copyright (C) 2015 Red Hat Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <inttypes.h>
-#include <string.h>
-#include <ctype.h>
-#include <unistd.h>
-#include <errno.h>
-#include <error.h>
-#include <locale.h>
-#include <libintl.h>
-
-#include "ignore-value.h"
-
-#include "p2v.h"
-
-#define CHOMP(line,len) \
- do { \
- if ((len) > 0 && (line)[(len)-1] == '\n') { \
- (line)[(len)-1] = '\0'; \
- len--; \
- } \
- } while (0)
-
-/**
- * Return size of a block device, from F</sys/block/I<dev>/size>.
- *
- * This function always succeeds, or else exits (since we expect
- * C<dev> to always be valid and the C<size> file to always exist).
- */
-uint64_t
-get_blockdev_size (const char *dev)
-{
- CLEANUP_FCLOSE FILE *fp = NULL;
- CLEANUP_FREE char *path = NULL;
- CLEANUP_FREE char *size_str = NULL;
- size_t len;
- uint64_t size;
-
- if (asprintf (&path, "/sys/block/%s/size", dev) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
-
- fp = fopen (path, "r");
- if (fp == NULL)
- error (EXIT_FAILURE, errno, "fopen: %s", path);
- if (getline (&size_str, &len, fp) == -1)
- error (EXIT_FAILURE, errno, "getline: %s", path);
-
- if (sscanf (size_str, "%" SCNu64, &size) != 1)
- error (EXIT_FAILURE, 0, "cannot parse %s: %s", path, size_str);
-
- size /= 2*1024*1024; /* size from kernel is given in sectors? */
- return size;
-}
-
-/**
- * Return model of a block device, from F</sys/block/I<dev>/device/model>.
- *
- * Returns C<NULL> if the file was not found. The caller must
- * free the returned string.
- */
-char *
-get_blockdev_model (const char *dev)
-{
- CLEANUP_FCLOSE FILE *fp = NULL;
- CLEANUP_FREE char *path = NULL;
- char *model = NULL;
- size_t len = 0;
- ssize_t n;
-
- if (asprintf (&path, "/sys/block/%s/device/model", dev) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- fp = fopen (path, "r");
- if (fp == NULL) {
- perror (path);
- return NULL;
- }
- if ((n = getline (&model, &len, fp)) == -1) {
- perror (path);
- free (model);
- return NULL;
- }
- CHOMP (model, n);
- return model;
-}
-
-/**
- * Return the serial number of a block device.
- *
- * This is found using the lsblk command.
- *
- * Returns C<NULL> if we could not get the serial number. The caller
- * must free the returned string.
- */
-char *
-get_blockdev_serial (const char *dev)
-{
- CLEANUP_PCLOSE FILE *fp = NULL;
- CLEANUP_FREE char *cmd = NULL;
- char *serial = NULL;
- size_t len = 0;
- ssize_t n;
-
- if (asprintf (&cmd, "lsblk -o serial /dev/%s --nodeps --noheadings",
- dev) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- fp = popen (cmd, "r");
- if (fp == NULL) {
- perror (cmd);
- return NULL;
- }
- if ((n = getline (&serial, &len, fp)) == -1) {
- perror (cmd);
- free (serial);
- return NULL;
- }
- CHOMP (serial, n);
- return serial;
-}
-
-/**
- * Return contents of F</sys/class/net/I<if_name>/address> (if found).
- */
-char *
-get_if_addr (const char *if_name)
-{
- CLEANUP_FCLOSE FILE *fp = NULL;
- CLEANUP_FREE char *path = NULL;
- char *content = NULL;
- size_t len = 0;
- ssize_t n;
-
- if (asprintf (&path, "/sys/class/net/%s/address", if_name) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- fp = fopen (path, "r");
- if (fp == NULL)
- return NULL;
- if ((n = getline (&content, &len, fp)) == -1) {
- perror (path);
- free (content);
- return NULL;
- }
- CHOMP (content, n);
- return content;
-}
-
-/**
- * Return contents of F</sys/class/net/I<if_name>/device/vendor> (if
- * found), mapped to the PCI vendor. See:
- *
L<http://pjwelsh.blogspot.co.uk/2011/11/howto-get-network-card-vendor-device-or.html>
- */
-char *
-get_if_vendor (const char *if_name, int truncate)
-{
- CLEANUP_FCLOSE FILE *fp = NULL;
- CLEANUP_FREE char *path = NULL;
- char *line = NULL;
- size_t len = 0;
- ssize_t n;
- char vendor[5];
-
- if (asprintf (&path, "/sys/class/net/%s/device/vendor", if_name) == -1)
- error (EXIT_FAILURE, errno, "asprintf");
- fp = fopen (path, "r");
- if (fp == NULL) {
- perror (path);
- return NULL;
- }
- if ((n = getline (&line, &len, fp)) == -1) {
- perror (path);
- free (line);
- return NULL;
- }
-
- /* Vendor is (always?) a 16 bit quantity (as defined by PCI),
- * something like "0x8086" (for Intel Corp).
- */
- CHOMP (line, n);
- if (line[0] != '0' || line[1] != 'x' || strlen (&line[2]) != 4) {
- free (line);
- return NULL;
- }
-
- strcpy (vendor, &line[2]);
-
- fclose (fp);
- fp = fopen ("/usr/share/hwdata/pci.ids", "r");
- if (fp == NULL) {
- perror ("/usr/share/hwdata/pci.ids");
- free (line);
- return NULL;
- }
- while ((n = getline (&line, &len, fp)) != -1) {
- CHOMP (line, n);
- if (STRPREFIX (line, vendor)) {
- /* Find the start of the name after the vendor ID and whitespace. */
- size_t i = 4;
- n -= 4;
-
- while (n > 0 && isspace (line[i])) {
- i++;
- n--;
- }
-
- memmove (&line[0], &line[i], n+1 /* copy trailing \0 */);
-
- /* Truncate? */
- if (truncate > 0 && n > truncate)
- line[n] = '\0';
-
- return line;
- }
- }
-
- free (line);
- return NULL;
-}
-
-/* XXX We could make this configurable. */
-#define NETWORK_ONLINE_COMMAND "nm-online -t 30"
-
-/**
- * Wait for the network to come online, but don't error out if that
- * fails. The caller will call C<test_connection> immediately after
- * this which will fail if the network didn't come online.
- */
-void
-wait_network_online (const struct config *config)
-{
-#ifdef DEBUG_STDERR
- fprintf (stderr, "waiting for the network to come online ...\n");
- fprintf (stderr, "%s\n", NETWORK_ONLINE_COMMAND);
- fflush (stderr);
-#endif
-
- ignore_value (system (NETWORK_ONLINE_COMMAND));
-}
diff --git a/p2v/virt-p2v-make-disk.in b/p2v/virt-p2v-make-disk.in
deleted file mode 100644
index 4cf8f5661..000000000
--- a/p2v/virt-p2v-make-disk.in
+++ /dev/null
@@ -1,267 +0,0 @@
-#!/bin/bash -
-# @configure_input@
-# virt-p2v-make-disk
-# Copyright (C) 2014-2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-unset CDPATH
-
-program="virt-p2v-make-disk"
-version="@PACKAGE_VERSION@"
-
-if [ -n "$VIRT_P2V_DATA_DIR" ]; then
- datadir="$VIRT_P2V_DATA_DIR"
- libdir="$VIRT_P2V_DATA_DIR"
-else
- datadir="@datadir@/virt-p2v"
- libdir="@libdir@/virt-p2v"
-fi
-
-# Parse the command line arguments.
-shortopts=o:vV
-longopts=arch:,help,short-options,inject-ssh-identity:,install:,long-options,no-warn-if-partition,output:,verbose,version
-TEMP=`getopt \
- -o "$shortopts" \
- --long "$longopts" \
- -n $program -- "$@"`
-if [ $? != 0 ]; then
- echo "$program: problem parsing the command line arguments"
- exit 1
-fi
-eval set -- "$TEMP"
-
-output=
-upload=
-verbose=
-declare -a passthru
-
-usage ()
-{
- echo "Usage:"
- echo " $program [--options] -o /dev/sdX [os-version]"
- echo
- echo "Read $program(1) man page for more information."
- exit $1
-}
-
-while true; do
- case "$1" in
- --arch)
- arch="$2"
- shift 2;;
- --inject-ssh-identity)
- upload="--upload $2:/var/tmp/id_rsa"
- shift 2;;
- -o|--output)
- output="$2"
- shift 2;;
- -v|--verbose)
- set +x
- verbose=1
- shift;;
-
- # virt-builder parameters that are passed through.
- --install)
- passthru[${#passthru[*]}]="$1"
- passthru[${#passthru[*]}]="$2"
- shift 2;;
-
- --no-warn-if-partition)
- passthru[${#passthru[*]}]="$1"
- shift;;
-
- # help etc.
- --help)
- usage 0;;
- -V|--version)
- echo "$program $version"
- exit 0;;
- --short-options)
- echo -n "$shortopts" |
- @SED@ -e 's/://g' -e 's/\(.\)/-\1\n/g'
- exit 0;;
- --long-options)
- echo "$longopts" |
- @SED@ -e 's/,/\n/g' -e 's/:$//mg' -e
's/\(.*\)/--\1/mg' |
- grep -v -E -- "--(short|long)-options"
- exit 0;;
- --)
- shift
- break;;
- *)
- echo "internal error ($1)"
- exit 1;;
- esac
-done
-
-if [ -z "$output" ]; then
- echo "$program: You must set the -o (--output) option."
- exit 1
-fi
-
-if [ $# -gt 1 ]; then
- echo "$program: Too many parameters. See $program(1)."
- exit 1
-fi
-
-if [ $# -eq 1 ]; then
- osversion="$1"
-else
- # If osversion was not set, then we must guess a good value
- # based on the host distro.
- if test -f /etc/os-release; then
- osversion="`. /etc/os-release && echo ${ID}-${VERSION_ID}`"
- fi
- if [ "x$osversion" = "x" ]; then
- echo "$program: unable to guess a suitable os-version."
- echo "You must supply one on the command line and output of
'virt-builder -l'."
- echo "See $program(1) for further details."
- exit 1
- fi
-fi
-
-if [ -n "$arch" ]; then
- arch_option="--arch $arch"
- virt_p2v_xz_binary="$libdir/virt-p2v.$arch.xz"
-else
- virt_p2v_xz_binary="$libdir/virt-p2v.xz"
-fi
-
-if [ ! -f "$virt_p2v_xz_binary" ]; then
- echo "$program: cannot find $virt_p2v_xz_binary"
- if [ -n "$arch" ]; then
- echo "You used the '--arch' option, so it’s likely that you will
need to build"
- echo "a virt-p2v.$arch binary yourself."
- echo "See guestfs-building(1) section BUILDING i686 32 BIT VIRT-P2V for
help."
- fi
- exit 1
-fi
-
-# Create a temporary directory and clean it up when we finish.
-tmpdir="$(mktemp -d)"
-cleanup ()
-{
- rm -rf $tmpdir
-}
-trap cleanup INT QUIT TERM EXIT ERR
-
-# Uncompress the virt-p2v binary into tmpdir.
-virt_p2v_binary="$tmpdir/virt-p2v"
-xzcat "$virt_p2v_xz_binary" > "$virt_p2v_binary"
-
-# Variations depending on the target distro. The main difference
-# is in the list of distro packages we add to the base appliance.
-case "$osversion" in
- centos-*|fedora-*|rhel-*|scientificlinux-*|oraclelinux-*)
- depsfile="$datadir/dependencies.redhat"
- cat > $tmpdir/p2v.conf <<'EOF'
-add_drivers+=" usb-storage "
-EOF
- cat > $tmpdir/post-install <<'EOF'
-#!/bin/bash
-# Rebuild the initramfs.
-latest_version="$(cd /lib/modules; ls -1vr | head -1)"
-dracut -v -f --kver $latest_version
-EOF
- # Double quotes because we want $tmpdir to be expanded:
- extra_args="
- --selinux-relabel
- --upload $tmpdir/p2v.conf:/etc/dracut.conf.d/
- --run $tmpdir/post-install
- "
- ;;
- debian-*|ubuntu-*)
- depsfile="$datadir/dependencies.debian"
- cat > $tmpdir/policy-rc.d <<'EOF'
-#!/bin/sh
-# Avoid running daemons during the upgrade/installation
-exit 101
-EOF
- chmod +x $tmpdir/policy-rc.d
- # Double quotes because we want $tmpdir to be expanded:
- preinstall_args="
- --upload $tmpdir/policy-rc.d:/usr/sbin/policy-rc.d
- "
- final_args="
- --delete /usr/sbin/policy-rc.d
- "
- ;;
- archlinux-*)
- depsfile="$datadir/dependencies.archlinux"
- ;;
- opensuse-*|suse-*)
- depsfile="$datadir/dependencies.suse"
- ;;
- *)
- echo "$program: internal error: could not work out the Linux distro from
'$osversion'"
- exit 1
-esac
-
-# Virt-builder requires the dependencies to be comma-separated with
-# no spaces. The $depsfile is one dependency per line.
-if [ ! -f "$depsfile" ]; then
- echo "$program: cannot find dependencies file ($depsfile)"
- exit 1
-fi
-install=
-while read line; do
- if [ -n "$line" ]; then
- if [ -z "$install" ]; then
- install="$line"
- else
- install="$install,$line"
- fi
- fi
-done < $depsfile
-
-# Add -v -x if we're in verbose mode.
-if [ "x$verbose" = "x1" ]; then
- verbose_option="-v -x"
-fi
-
-# Run virt-builder. Note we controversially assume systemd here. We
-# could provide a sysvinit fallback if required.
-virt-builder "$osversion" \
- $verbose_option \
- --output "$output" \
- $arch_option \
- $preinstall_args \
- --update \
- --install "$install" \
- --root-password password:p2v \
- --upload "$datadir"/issue:/etc/issue \
- --upload "$datadir"/issue:/etc/issue.net \
- --mkdir /usr/bin \
- --upload "$virt_p2v_binary":/usr/bin/virt-p2v \
- --chmod 0755:/usr/bin/virt-p2v \
- --upload "$datadir"/launch-virt-p2v:/usr/bin/ \
- --chmod 0755:/usr/bin/launch-virt-p2v \
- --upload "$datadir"/p2v.service:/etc/systemd/system/ \
- --mkdir /etc/systemd/system/multi-user.target.wants \
- --link
/etc/systemd/system/p2v.service:/etc/systemd/system/multi-user.target.wants/p2v.service \
- --edit '/lib/systemd/system/getty@.service:
- s/^ExecStart=(.*)/ExecStart=$1 -a root/
- ' \
- --edit '/etc/systemd/logind.conf:
- s/^[Login]/[Login]\nReserveVT=1\n/
- ' \
- $upload \
- $extra_args \
- "${passthru[@]}" \
- $final_args
-
-# We have to do this so the cleanup() handler runs.
-exit $?
diff --git a/p2v/virt-p2v-make-disk.pod b/p2v/virt-p2v-make-disk.pod
deleted file mode 100644
index 05b8a3d9e..000000000
--- a/p2v/virt-p2v-make-disk.pod
+++ /dev/null
@@ -1,218 +0,0 @@
-=head1 NAME
-
-virt-p2v-make-disk - Build the virt-p2v disk using virt-builder
-
-=head1 SYNOPSIS
-
- virt-p2v-make-disk -o /dev/sdX [os-version]
-
-=head1 DESCRIPTION
-
-L<virt-p2v(1)> converts a physical machine to run virtualized on KVM,
-managed by libvirt, OpenStack, oVirt, Red Hat Enterprise
-Virtualisation (RHEV), or one of the other targets supported by
-L<virt-v2v(1)>.
-
-virt-p2v-make-disk is a script which creates a bootable disk image or
-USB key containing virt-p2v. It uses L<virt-builder(1)> to do this,
-and is just a small shell script around virt-builder.
-
-The required I<-o> parameter specifies where the output should go, for
-example to a USB key (eg. C<-o /dev/sdX>) or to a file. If you pass a
-device name, then B<the existing contents of the device will be erased>.
-
-=head2 C<os-version> parameter
-
-The optional C<os-version> parameter is the base Linux distro to use
-for the operating system on the ISO. If you don't set this parameter,
-the script tries to choose a suitable default for you. Most users
-should I<not> use the C<os-version> parameter.
-
-The base OS selected for virt-p2v is not related in any way to the OS
-of the physical machine that you are trying to convert.
-
-To list possible C<os-version> combinations, do:
-
- virt-builder -l
-
-=head1 EXAMPLES
-
-Write a virt-p2v bootable USB key on F</dev/sdX> (any existing content
-on F</dev/sdX> is erased):
-
- virt-p2v-make-disk -o /dev/sdX
-
-Write a virt-p2v bootable virtual disk image, and boot it under qemu:
-
- virt-p2v-make-disk -o /var/tmp/p2v.img
- qemu-kvm -m 1024 -boot c \
- -drive file=/var/tmp/p2v.img,if=virtio,index=0 \
- -drive file=/var/tmp/guest.img,if=virtio,index=1
-
-where F</var/tmp/guest.img> would be the disk image of some guest that
-you want to convert (for testing only).
-
-=head1 ADDING EXTRA PACKAGES
-
-You can install extra packages using the I<--install> option. This
-can be useful for making a more fully-featured virt-p2v disk with
-extra tools for debugging and troubleshooting. Give a list of
-packages, separated by commas. For example:
-
- virt-p2v-make-disk -o /var/tmp/p2v.img --install tcpdump,traceroute
-
-=head1 ADDING AN SSH IDENTITY
-
-You can inject an SSH identity (private key) file to the image using
-the I<--inject-ssh-identity> option.
-
-First create a key pair. It must have an empty passphrase:
-
- ssh-keygen -t rsa -N '' -f id_rsa
-
-This creates a private key (C<id_rsa>) and a public key
-(C<id_rsa.pub>) pair. The public key should be appended to the
-C<authorized_keys> file on the virt-v2v conversion server (usually to
-C</root/.ssh/authorized_keys>).
-
-The private key should be injected into the disk image and then
-discarded:
-
- virt-p2v-make-disk [...] --inject-ssh-identity id_rsa
- rm id_rsa
-
-When booting virt-p2v, specify the URL of the injected file like this:
-
- │ User name: [root_____________________________] │
- │ │
- │ Password: [ <leave this field blank> ] │
- │ │
- │ SSH Identity URL: [file:///var/tmp/id_rsa___________] │
-
-or if using the kernel command line, add:
-
- p2v.identity=file:///var/tmp/id_rsa
-
-For more information, see L<virt-p2v(1)/SSH IDENTITIES>.
-
-=head1 32 BIT VIRT-P2V
-
-For improved compatibility with older hardware, virt-p2v-make-disk has
-an I<--arch> option. The most useful setting (on x86-64 hosts) is
-I<--arch i686>, which builds a 32 bit virt-p2v environment that will
-work on older hardware. 32 bit virt-p2v can convert 64 bit physical
-machines and can interoperate with 64 bit virt-v2v and 64 bit
-hypervisors.
-
-This option requires that you have built F<virt-p2v.$arch> (ie.
-usually F<virt-p2v.i686>) by some means, and that you install it next
-to the ordinary F<virt-p2v> binary (eg. in F<$libdir/virt-p2v/> or
-C<$VIRT_V2V_DATA_DIR>). This is outside the scope of this manual
-page, but you can find some tips in
-L<guestfs-building(1)/BUILDING i686 32 BIT VIRT-P2V>.
-
-=head1 OPTIONS
-
-=over 4
-
-=item B<--help>
-
-Display help.
-
-=item B<--arch> ARCH
-
-Set the architecture of the virt-p2v ISO. See L</32 BIT VIRT-P2V> above.
-
-If this option is not supplied, then the default is to use the same
-architecture as the host that is running virt-p2v-make-disk.
-
-=item B<--inject-ssh-identity> id_rsa
-
-Add an SSH identity (private key) file into the image.
-See L</ADDING AN SSH IDENTITY> above.
-
-=item B<--install> pkg,pkg,...
-
-Add extra packages to the image.
-See L</ADDING EXTRA PACKAGES> above.
-
-=item B<--no-warn-if-partition>
-
-Normally you should not write to a partition on a USB drive (ie. don’t
-use S<C<-o /dev/sdX1>>, use S<C<-o /dev/sdX>> to make a bootable
USB
-drive). If you do this, virt-builder prints a warning. This option
-suppresses that warning.
-
-=item B<-o> OUTPUT
-
-=item B<--output> OUTPUT
-
-Write output to C<OUTPUT>, which can be a local file or block device.
-B<The existing contents of the device will be erased>.
-
-=item B<-v>
-
-=item B<--verbose>
-
-Enable verbose output. Use this if you need to debug problems with
-the script or if you are filing a bug.
-
-=item B<-V>
-
-=item B<--version>
-
-Display version number and exit.
-
-=back
-
-=head1 FILES
-
-=over 4
-
-=item F<$libdir/virt-p2v/virt-p2v.xz>
-
-The L<virt-p2v(1)> binary which is copied into the bootable disk
-image.
-
-The location of the binary can be changed by setting the
-C<VIRT_P2V_DATA_DIR> environment variable.
-
-=item F<$datadir/virt-p2v/issue>
-
-=item F<$datadir/virt-p2v/launch-virt-p2v.in>
-
-=item F<$datadir/virt-p2v/p2v.service>
-
-Various data files that are copied into the bootable disk image.
-
-The location of these files can be changed by setting the
-C<VIRT_P2V_DATA_DIR> environment variable.
-
-=back
-
-=head1 ENVIRONMENT VARIABLES
-
-=over 4
-
-=item C<VIRT_P2V_DATA_DIR>
-
-The directory where virt-p2v-make-disk looks for data files (see
-L</FILES> above). If not set, a compiled-in location is used.
-
-=back
-
-=head1 SEE ALSO
-
-L<virt-p2v(1)>,
-L<virt-p2v-make-kickstart(1)>,
-L<virt-p2v-make-kiwi(1)>,
-L<virt-v2v(1)>,
-L<http://libguestfs.org/>.
-
-=head1 AUTHORS
-
-Richard W.M. Jones
L<http://people.redhat.com/~rjones/>
-
-=head1 COPYRIGHT
-
-Copyright (C) 2009-2019 Red Hat Inc.
diff --git a/p2v/virt-p2v-make-kickstart.in b/p2v/virt-p2v-make-kickstart.in
deleted file mode 100644
index 97610cdd1..000000000
--- a/p2v/virt-p2v-make-kickstart.in
+++ /dev/null
@@ -1,241 +0,0 @@
-#!/bin/bash -
-# @configure_input@
-# virt-p2v-make-kickstart
-# Copyright (C) 2014-2019 Red Hat Inc.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-unset CDPATH
-
-program="virt-p2v-make-kickstart"
-version="@PACKAGE_VERSION@"
-
-# Parse the command line arguments.
-shortopts=o:vV
-longopts=help,inject-ssh-identity:,install:,long-options,output:,proxy:,short-options,verbose,version
-TEMP=`getopt \
- -o "$shortopts" \
- --long "$longopts" \
- -n $program -- "$@"`
-if [ $? != 0 ]; then
- echo "$program: problem parsing the command line arguments"
- exit 1
-fi
-eval set -- "$TEMP"
-
-usage ()
-{
- echo "Usage:"
- echo " $program [--options] [-o p2v.ks] [--proxy=http://...] repo
[repo...]"
- echo
- echo "Read $program(1) man page for more information."
- exit $1
-}
-
-extra_packages=
-output=p2v.ks
-proxy=
-ssh_identity=
-verbose=
-
-while true; do
- case "$1" in
- --inject-ssh-identity)
- ssh_identity="$2"
- shift 2;;
- --install)
- extra_packages="${extra_packages:+${extra_packages},}$2"
- shift 2;;
- -o|--output)
- output="$2"
- shift 2;;
- --proxy)
- proxy="--proxy=$2"
- shift 2;;
- --repo)
- repo="$2"
- shift 2;;
- -v|--verbose)
- set +x
- verbose=1
- shift;;
-
- # help etc.
- --help)
- usage 0;;
- -V|--version)
- echo "$program $version"
- exit 0;;
- --short-options)
- echo -n "$shortopts" |
- @SED@ -e 's/://g' -e 's/\(.\)/-\1\n/g'
- exit 0;;
- --long-options)
- echo "$longopts" |
- @SED@ -e 's/,/\n/g' -e 's/:$//mg' -e
's/\(.*\)/--\1/mg' |
- grep -v -E -- "--(short|long)-options"
- exit 0;;
- --)
- shift
- break;;
- *)
- echo "internal error ($1)"
- exit 1;;
- esac
-done
-
-if [ $# -lt 1 ]; then
- echo "$program: Missing repo(s). See $program(1)."
- exit 1
-fi
-
-set -e
-
-if [ -n "$VIRT_P2V_DATA_DIR" ]; then
- datadir="$VIRT_P2V_DATA_DIR"
- libdir="$VIRT_P2V_DATA_DIR"
-else
- datadir="@datadir@/virt-p2v"
- libdir="@libdir@/virt-p2v"
-fi
-
-# Base64-encode the files that we need to embed into the kickstart.
-base64_issue="$(base64 $datadir/issue)"
-base64_launch_virt_p2v="$(base64 $datadir/launch-virt-p2v)"
-base64_p2v_service="$(base64 $datadir/p2v.service)"
-if [ -n "$ssh_identity" ]; then
- base64_ssh_identity="$(base64 $ssh_identity)"
-else
- base64_ssh_identity=
-fi
-
-# virt-p2v binary is too large unless we strip it and recompress it.
-tmpfile="$(mktemp -u)"
-xzcat $libdir/virt-p2v.xz > $tmpfile
-md5sum_virt_p2v="$(md5sum $tmpfile | @AWK@ '{print $1}')"
-strip --strip-all $tmpfile
-gzip -9 $tmpfile
-base64_virt_p2v="$(base64 $tmpfile.gz)"
-rm $tmpfile.gz
-
-# Repositories.
-repos=
-i=0
-for repo in "$@"; do
- case "$repo" in
- fedora)
- repos="$repos
-repo --name=fedora
--mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=fedora-\$releasever\\\\&arch=\$basearch
$proxy
-"
- ;;
- rawhide)
- repos="$repos
-repo --name=rawhide
--mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=rawhide\\\\&arch=\$basearch
$proxy
-"
- ;;
- koji)
- repos="$repos
-repo --name=koji --baseurl=http://koji.fedoraproject.org/repos/rawhide/latest/\$basearch/
$proxy
-"
- ;;
- rhel-5.*)
- minor=$( echo "$repo" | sed 's/rhel-[0-9]*\.\([0-9]*\)/\1/'
)
- arch=`uname -m | sed 's/i[3456]86/i386/g'`
-
baseurl=http://download.devel.redhat.com/released/RHEL-5-Server/U$minor/$...
- # Neither $basearch nor --proxy work in RHEL 5 kickstarts.
- repos="$repos
-repo --name=rhel5_${minor}_server --baseurl=$baseurl
-"
- ;;
- rhel-6.*)
- minor=$( echo "$repo" | sed 's/rhel-[0-9]*\.\([0-9]*\)/\1/'
)
-
baseurl=http://download.devel.redhat.com/released/RHEL-6/6.$minor
- # '$basearch' cannot be used in kickstart, so:
- arch=`uname -m`
- repos="$repos
-repo --name=rhel6_${minor}_server --baseurl=$baseurl/Server/$arch/os $proxy
-repo --name=rhel6_${minor}_server_optional --baseurl=$baseurl/Server/optional/$arch/os
$proxy
-"
- ;;
- rhel-7.*)
- minor=$( echo "$repo" | sed 's/rhel-[0-9]*\.\([0-9]*\)/\1/'
)
-
baseurl=http://download.devel.redhat.com/released/RHEL-7/7.$minor
- # '$basearch' cannot be used in kickstart, so:
- arch=`uname -m`
- repos="$repos
-repo --name=rhel7_${minor}_server --baseurl=$baseurl/Server/$arch/os $proxy
-repo --name=rhel7_${minor}_server_optional --baseurl=$baseurl/Server-optional/$arch/os
$proxy
-"
- ;;
- *)
- # A custom repo is just a URL.
- ((i++)) ||:
- repos="$repos
-repo --name=custom$i --baseurl=$repo $proxy
-"
- ;;
- esac
-done
-
-# Dependencies. Since kickstart is Red Hat-specific, only include
-# dependencies.redhat here.
-depsfile="$datadir/dependencies.redhat"
-if [ ! -f "$depsfile" ]; then
- echo "$0: cannot find dependencies file ($depsfile)"
- exit 1
-fi
-dependencies=
-while read line; do
- if [ -n "$line" ]; then
- if [ -z "$dependencies" ]; then
- dependencies="$line"
- else
- dependencies="$dependencies
-$line"
- fi
- fi
-done < $depsfile
-
-# Now generate the final kickstart, substituting as necessary.
-# AWK FTW!
-@AWK@ \
- -v "base64_issue=$base64_issue" \
- -v "base64_launch_virt_p2v=$base64_launch_virt_p2v" \
- -v "base64_p2v_service=$base64_p2v_service" \
- -v "base64_ssh_identity=$base64_ssh_identity" \
- -v "base64_virt_p2v=$base64_virt_p2v" \
- -v "dependencies=$dependencies" \
- -v "extra_packages=$extra_packages" \
- -v "md5sum_virt_p2v=$md5sum_virt_p2v" \
- -v "repos=$repos" \
- '{
- gsub (/__PACKAGE_NAME__/, "@PACKAGE_NAME@");
- gsub (/__PACKAGE_VERSION__/, "@PACKAGE_VERSION@");
- gsub (/__PACKAGE_VERSION_FULL__/, "@PACKAGE_VERSION_FULL@");
- gsub (/__BASE64_ISSUE__/, base64_issue);
- gsub (/__BASE64_LAUNCH_VIRT_P2V__/, base64_launch_virt_p2v);
- gsub (/__BASE64_P2V_SERVICE__/, base64_p2v_service);
- gsub (/__BASE64_SSH_IDENTITY__/, base64_ssh_identity);
- gsub (/__BASE64_VIRT_P2V__/, base64_virt_p2v);
- gsub (/__DEPENDENCIES__/, dependencies);
- gsub (/__EXTRA_PACKAGES__/, gensub (/,/, "\n", "g",
extra_packages));
- gsub (/__MD5SUM_VIRT_P2V__/, md5sum_virt_p2v);
- gsub (/__REPOS__/, repos);
- print;
- }' \
- $datadir/p2v.ks.in > $output-t
-mv $output-t $output
-
-echo "Kickstart file written to $output"
diff --git a/p2v/virt-p2v-make-kickstart.pod b/p2v/virt-p2v-make-kickstart.pod
deleted file mode 100644
index f4abdf8d7..000000000
--- a/p2v/virt-p2v-make-kickstart.pod
+++ /dev/null
@@ -1,339 +0,0 @@
-=head1 NAME
-
-virt-p2v-make-kickstart - Build the virt-p2v kickstart
-
-=head1 SYNOPSIS
-
- virt-p2v-make-kickstart [-o p2v.ks] [--proxy=http://...] repo [repo...]
-
-=head1 DESCRIPTION
-
-L<virt-p2v(1)> converts a physical machine to run virtualized on KVM,
-managed by libvirt, OpenStack, oVirt, Red Hat Enterprise
-Virtualisation (RHEV), or one of the other targets supported by
-L<virt-v2v(1)>.
-
-Kickstart is a format used by Red Hat-derived distributions (such as
-Fedora, Red Hat Enterprise Linux, CentOS, Scientific Linux, and
-others) to describe how to make live CDs, install the distro, make
-"Spins" and so on. It is driven by a kickstart file.
-
-virt-p2v-make-kickstart builds a kickstart file which can be used to
-build a bootable P2V ISO, live CD, USB key, or PXE image. This tool
-only builds the kickstart file, but this manual page describes some of
-the ways you can use the kickstart file.
-
-=head1 BUILDING THE KICKSTART FILE
-
-Using virt-p2v-make-kickstart is very simple:
-
- virt-p2v-make-kickstart fedora
-
-will build a kickstart file for Fedora. The kickstart file will be
-called F<p2v.ks> and located in the current directory.
-
-The parameters are a list of one or more repositories. Some built-in
-repositories are available: C<fedora>, C<rawhide>, C<koji> or
-C<rhel-VERSION> (eg. C<rhel-7.1>). You can also use a URL as a
-parameter to point to a repository, for example:
-
- virt-p2v-make-kickstart
https://dl.fedoraproject.org/pub/fedora/linux/releases/21/Everything/x86_...
-
-To control the name of the output file, use the I<-o> parameter. To
-tell kickstart to use a proxy server or web cache to download files,
-use the I<--proxy> parameter.
-
-=head1 BUILDING A LIVE CD / ISO
-
-Once you have the kickstart file, you can use L<livecd-creator(8)>
-to make a live CD:
-
- sudo livecd-creator p2v.ks
-
-Before running this note that you should probably run
-C<livecd-creator> in a disposable virtual machine for these reasons:
-
-=over 4
-
-=item *
-
-You have to disable SELinux when running the tool.
-
-=item *
-
-This tool has to be run as root, and has some nasty failure modes.
-
-=item *
-
-You can only create the exact same Live CD distro as the host
-distro. Cross-builds will fail in strange ways (eg. RHBZ#1092327).
-
-=back
-
-=head1 BUILDING A FEDORA SPIN USING KOJI
-
-This requires C<spin-livecd> permissions on Koji, which are not given
-out usually, even to Fedora packagers. However assuming you have been
-given these permissions (or have your own Koji instance, I guess),
-then you can do:
-
- koji spin-livecd [--scratch] virt-p2v 1.XX.YY rawhide x86_64 p2v.ks
-
-=over 4
-
-=item *
-
-Add the C<--scratch> option to do a scratch build (recommended for
-testing).
-
-=item *
-
-C<1.XX.YY> should match the libguestfs version
-
-=item *
-
-Instead of C<rawhide> you can use any Koji target.
-
-=back
-
-=head1 BUILDING A BOOTABLE USB KEY
-
-Use the L<livecd-iso-to-disk(8)> program to convert the ISO created
-above to a USB key:
-
- sudo livecd-iso-to-disk livecd-p2v.iso /dev/sdX
-
-=head1 BUILDING A PXE BOOT IMAGE
-
-Use the C<livecd-iso-to-pxeboot> program to convert the ISO created
-above to a PXE boot image.
-
- sudo livecd-iso-to-pxeboot livecd-p2v.iso
-
-This creates a C<tftpboot> subdirectory under the current directory
-containing the files required to PXE boot virt-p2v:
-
- $ ls -1R tftpboot/
- tftpboot/:
- initrd0.img
- pxelinux.0
- pxelinux.cfg/
- vmlinuz0
-
- tftpboot/pxelinux.cfg:
- default
-
-=head1 32 OR 64 BIT VIRT-P2V?
-
-Virt-p2v can convert any 32 or 64 bit guest, regardless of whether
-virt-p2v itself is built as a 32 or 64 bit binary. The only
-restriction is that 64 bit virt-p2v cannot run on 32 bit hardware.
-
-Old virt-p2v 0.9 was always built as a 32 bit (i686) ISO. This meant
-that the CD could be booted on any 32- or 64-bit i686 or x86-64
-hardware, and could convert any guest. The old virt-p2v ISO shipped
-by Red Hat was based on Red Hat Enterprise Linux (RHEL) 6.
-
-Since RHEL 7 dropped support for 32 bit machines, current virt-p2v on
-RHEL can only be built for 64 bit. It cannot run on old 32 bit only
-hardware.
-
-Fedora virt-p2v ISOs are generally built for 32 bit, so like the old
-RHEL 6-based virt-p2v 0.9 they can boot on any hardware.
-
-=head1 TESTING VIRT-P2V USING QEMU
-
-=head2 TESTING THE P2V ISO USING QEMU
-
-You can use qemu to test-boot the P2V ISO:
-
- qemu-kvm -m 1024 -hda /tmp/guest.img -cdrom /tmp/livecd-p2v.iso -boot d
-
-Note that C<-hda> is the (virtual) system that you want to convert
-(for test purposes). It could be any guest type supported by
-L<virt-v2v(1)>, including Windows or Red Hat Enterprise Linux.
-
-=head2 TESTING PXE SUPPORT USING QEMU
-
-=over 4
-
-=item *
-
-Unpack the tftpboot directory into F</tmp> (so it appears as
-F</tmp/tftpboot>).
-
-=item *
-
-Copy F<pxelinux.0> and F<ldlinux.c32> from syslinux (usually from
-F</usr/share/syslinux>) into F</tmp/tftpboot>.
-
-=item *
-
-Adjust the C<APPEND> line in F</tmp/tftpboot/pxelinux.cfg/default> if
-required. See L<virt-p2v(1)/KERNEL COMMAND LINE CONFIGURATION>.
-
-=item *
-
-Run qemu like this so that it acts as a TFTP and BOOTP server,
-emulating a netboot:
-
- qemu-kvm \
- -m 4096 -hda /tmp/guest.img \
- -boot n \
- -netdev user,id=unet,tftp=/tmp/tftpboot,bootfile=/pxelinux.0 \
- -device virtio-net-pci,netdev=unet \
- -serial stdio
-
-Note that this requires considerably more memory because the PXE image
-is loaded into memory. Also that qemu’s TFTP server is very slow and
-the virt-p2v PXE image is very large, so it can appear to "hang" after
-pxelinux starts up.
-
-=back
-
-=head1 ADDING EXTRA PACKAGES
-
-You can install extra packages using the I<--install> option. This
-can be useful for making a more fully-featured virt-p2v disk with
-extra tools for debugging and troubleshooting. Give a list of
-packages, separated by commas. For example:
-
- virt-p2v-make-kickstart [...] --install tcpdump,traceroute
-
-=head1 ADDING AN SSH IDENTITY
-
-You can inject an SSH identity (private key) file to the kickstart and
-hence into the ISO using the I<--inject-ssh-identity> option. Note
-that you I<cannot> inject a key once the ISO has been built.
-
-First create a key pair. It must have an empty passphrase:
-
- ssh-keygen -t rsa -N '' -f id_rsa
-
-This creates a private key (C<id_rsa>) and a public key
-(C<id_rsa.pub>) pair. The public key should be appended to the
-C<authorized_keys> file on the virt-v2v conversion server (usually to
-C</root/.ssh/authorized_keys>).
-
-The private key should be added to the kickstart file and then
-discarded:
-
- virt-p2v-make-kickstart [...] --inject-ssh-identity id_rsa
- rm id_rsa
-
-The ISO can then be built from the kickstart in the usual way (see
-above), and it will contain the embedded SSH identity
-(F</var/tmp/id_rsa>).
-
-When booting virt-p2v, specify the URL of the injected file like this:
-
- │ User name: [root_____________________________] │
- │ │
- │ Password: [ <leave this field blank> ] │
- │ │
- │ SSH Identity URL: [file:///var/tmp/id_rsa___________] │
-
-or if using the kernel command line, add:
-
- p2v.identity=file:///var/tmp/id_rsa
-
-For more information, see L<virt-p2v(1)/SSH IDENTITIES>.
-
-=head1 OPTIONS
-
-=over 4
-
-=item B<--help>
-
-Display help.
-
-=item B<--inject-ssh-identity> id_rsa
-
-Add an SSH identity (private key) file into the kickstart.
-See L</ADDING AN SSH IDENTITY> above.
-
-=item B<--install> pkg,pkg,...
-
-Add extra packages to the kickstart C<%packages> section.
-See L</ADDING EXTRA PACKAGES> above.
-
-=item B<-o> OUTPUT
-
-=item B<--output> OUTPUT
-
-Write kickstart to C<OUTPUT>. If not specified, the default is
-F<p2v.ks> in the current directory.
-
-=item B<--proxy> URL
-
-Tell the kickstart to use a proxy server or web cache for downloads.
-
-=item B<-v>
-
-=item B<--verbose>
-
-Enable verbose output. Use this if you need to debug problems with
-the script or if you are filing a bug.
-
-=item B<-V>
-
-=item B<--version>
-
-Display version number and exit.
-
-=back
-
-=head1 FILES
-
-=over 4
-
-=item F<$libdir/virt-p2v/virt-p2v.xz>
-
-The L<virt-p2v(1)> binary which is copied into the kickstart file.
-
-The location of the binary can be changed by setting the
-C<VIRT_P2V_DATA_DIR> environment variable.
-
-=item F<$datadir/virt-p2v/issue>
-
-=item F<$datadir/virt-p2v/launch-virt-p2v.in>
-
-=item F<$datadir/virt-p2v/p2v.ks.in>
-
-=item F<$datadir/virt-p2v/p2v.service>
-
-Various data files that are used to make the kickstart.
-
-The location of these files can be changed by setting the
-C<VIRT_P2V_DATA_DIR> environment variable.
-
-=back
-
-=head1 ENVIRONMENT VARIABLES
-
-=over 4
-
-=item C<VIRT_P2V_DATA_DIR>
-
-The directory where virt-p2v-make-kickstart looks for data files and
-the virt-p2v binary (see L</FILES> above). If not set, a compiled-in
-location is used.
-
-=back
-
-=head1 SEE ALSO
-
-L<virt-p2v(1)>,
-L<virt-p2v-make-disk(1)>,
-L<virt-v2v(1)>,
-L<livecd-creator(8)>,
-L<livecd-iso-to-disk(8)>,
-L<http://libguestfs.org/>.
-
-=head1 AUTHORS
-
-Richard W.M. Jones
L<http://people.redhat.com/~rjones/>
-
-=head1 COPYRIGHT
-
-Copyright (C) 2009-2019 Red Hat Inc.
diff --git a/p2v/virt-p2v-make-kiwi.in b/p2v/virt-p2v-make-kiwi.in
deleted file mode 100644
index 405b629de..000000000
--- a/p2v/virt-p2v-make-kiwi.in
+++ /dev/null
@@ -1,233 +0,0 @@
-#!/bin/bash -
-# @configure_input@
-# virt-p2v-make-kiwi
-# Copyright (C) 2016 SUSE.
-#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-unset CDPATH
-
-program="virt-p2v-make-kiwi"
-version="@PACKAGE_VERSION@"
-
-# Parse the command line arguments.
-shortopts=o:V
-longopts=help,inject-ssh-identity:,long-options,output:,short-options,version
-TEMP=`getopt \
- -o "$shortopts" \
- --long "$longopts" \
- -n $program -- "$@"`
-if [ $? != 0 ]; then
- echo "$program: problem parsing the command line arguments"
- exit 1
-fi
-eval set -- "$TEMP"
-
-usage ()
-{
- echo "Usage:"
- echo " $program [--options] [-o kiwi-folder]"
- echo
- echo "Read $program(1) man page for more information."
- exit $1
-}
-
-output=p2v.kiwi
-ssh_identity=
-
-while true; do
- case "$1" in
- --inject-ssh-identity)
- ssh_identity="$2"
- shift 2;;
- -o|--output)
- output="$2"
- shift 2;;
-
- # help etc.
- --help)
- usage 0;;
- -V|--version)
- echo "$program $version"
- exit 0;;
- --short-options)
- echo -n "$shortopts" |
- @SED@ -e 's/://g' -e 's/\(.\)/-\1\n/g'
- exit 0;;
- --long-options)
- echo "$longopts" |
- @SED@ -e 's/,/\n/g' -e 's/:$//mg' -e
's/\(.*\)/--\1/mg' |
- grep -v -E -- "--(short|long)-options"
- exit 0;;
- --)
- shift
- break;;
- *)
- echo "internal error ($1)"
- exit 1;;
- esac
-done
-
-set -e
-
-if [ -n "$VIRT_P2V_DATA_DIR" ]; then
- datadir="$VIRT_P2V_DATA_DIR"
- libdir="$VIRT_P2V_DATA_DIR"
-else
- datadir="@datadir@/virt-p2v"
- libdir="@libdir@/virt-p2v"
-fi
-
-# Dependencies. Since kiwi is SUSE-specific, only include
-# dependencies.suse here.
-depsfile="$datadir/dependencies.suse"
-if [ ! -f "$depsfile" ]; then
- echo "$0: cannot find dependencies file ($depsfile)"
- exit 1
-fi
-dependencies=
-while read line; do
- if [ -n "$line" ]; then
- depname=$(echo $line | awk '{gsub(/ /, "", $0); print}')
- pkg=" <package name=\"$depname\"/>"
- if [ -z "$dependencies" ]; then
- dependencies="$pkg"
- else
- dependencies="$dependencies
-$pkg"
- fi
- fi
-done < $depsfile
-
-# Compute the distro-dependent pieces for kiwi
-branding=
-release_pkg=
-base_pattern=
-kiwi_boot=
-repos=
-. /etc/os-release
-case "$NAME" in
- SLES)
- branding="SLE"
- release_pkg="sles-release"
- base_pattern="patterns-sles-Minimal"
- case "$VERSION_ID" in
- 12)
- kiwi_boot="SLES12"
- repos="http://download.suse.de/ibs/SUSE:/SLE-12:/Update/standard
-
http://download.suse.de/ibs/SUSE:/SLE-12:/GA/standard"
- ;;
- 12.1)
- kiwi_boot="SLES12"
-
repos="http://download.suse.de/ibs/SUSE:/SLE-12-SP1:/Update/standard
-
http://download.suse.de/ibs/SUSE:/SLE-12-SP1:/GA/standard
-
http://download.suse.de/ibs/SUSE:/SLE-12:/Update/standard
-
http://download.suse.de/ibs/SUSE:/SLE-12:/GA/standard"
- ;;
- *)
- echo "Unsupported distribution $NAME $VERSION_ID"
- exit 1;;
- esac;;
- openSUSE*)
- branding="openSUSE"
- release_pkg="openSUSE-release"
- base_pattern="patterns-openSUSE-base"
- case "$VERSION" in
- 13.1\ *)
- kiwi_boot="13.1"
- repos="obs://13.1/repo/oss"
- ;;
- 13.2\ *)
- kiwi_boot="13.2"
- repos="obs://13.2/repo/oss"
- ;;
- 42.1)
- kiwi_boot="leap42.1"
- repos="obs://leap/42.1/repo/oss"
- ;;
- *\ \(Tumbleweed\))
- kiwi_boot="leap42.1"
- repos="obs://openSUSE:Factory/standard"
- ;;
- *)
- echo "Unsupported distribution $NAME $VERSION_ID"
- exit 1;;
- esac;;
- *)
- echo "Unsupported distribution $NAME $VERSION"
- exit 1;;
-esac
-
-# Compute the repos
-repos_xml=
-for repo in $repos; do
- repos_xml=" <repository type=\"rpm-md\">\n <source
path=\"$repo\"/>\n </repository>\n$repos_xml"
-done
-
-mkdir $output
-cp $datadir/kiwi-config.sh $output/config.sh
-
-mkdir -p $output/root/etc/sysconfig/network
-cat >$output/root/etc/sysconfig/network/ifcfg-eth0 << EOF
-BOOTPROTO='dhcp'
-MTU=''
-REMOTE_IPADDR=''
-STARTMODE='onboot'
-EOF
-
-mkdir -p $output/root/etc/systemd/system
-cp $datadir/p2v.service $output/root/etc/systemd/system
-
-mkdir -p $output/root/etc/udev/rules.d
-cat >$output/root/etc/udev/rules.d/70-persistent-net.rules <<EOF
-SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*",
ATTR{address}=="?*", ATTR{dev_id}=="0x0", ATTR{type}=="1",
KERNEL=="?*", NAME="eth0"
-EOF
-
-cp $datadir/issue $output/root/etc/issue
-
-mkdir -p $output/root/usr/bin
-cp $datadir/launch-virt-p2v $output/root/usr/bin
-xzcat $libdir/virt-p2v.xz > $output/root/usr/bin/virt-p2v
-
-if test "z$ssh_identity" != "z"; then
- mkdir -p $output/root/var/tmp
- cp $ssh_identity $output/root/var/tmp/id_rsa
- chmod 0600 $output/root/var/tmp/id_rsa
-fi
-
-# Now generate the final kiwi config, substituting as necessary.
-@AWK@ \
- -v "dependencies=$dependencies" \
- -v "md5sum_virt_p2v=$md5sum_virt_p2v" \
- -v "branding=$branding" \
- -v "release_pkg=$release_pkg" \
- -v "base_pattern=$base_pattern" \
- -v "kiwi_boot=$kiwi_boot" \
- -v "repos=$repos_xml" \
- '{
- gsub (/__PACKAGE_NAME__/, "@PACKAGE_NAME@");
- gsub (/__PACKAGE_VERSION__/, "@PACKAGE_VERSION@");
- gsub (/__PACKAGE_VERSION_FULL__/, "@PACKAGE_VERSION_FULL@");
- gsub (/<!--__DEPENDENCIES__-->/, dependencies);
- gsub (/__BRANDING__/, branding);
- gsub (/__RELEASE_PKG__/, release_pkg);
- gsub (/__BASE_PATTERN__/, base_pattern);
- gsub (/__KIWI_BOOT__/, kiwi_boot);
- gsub (/<!--__REPOS__-->/, repos);
- print;
- }' \
- $datadir/kiwi-config.xml.in > $output/config.xml
-
-echo "kiwi config folder written to $output"
diff --git a/p2v/virt-p2v-make-kiwi.pod b/p2v/virt-p2v-make-kiwi.pod
deleted file mode 100644
index d879d9774..000000000
--- a/p2v/virt-p2v-make-kiwi.pod
+++ /dev/null
@@ -1,184 +0,0 @@
-=head1 NAME
-
-virt-p2v-make-kiwi - Build the virt-p2v kiwi configuration
-
-=head1 SYNOPSIS
-
- virt-p2v-make-kiwi [--inject-ssh-identity path] [-o kiwi-folder]
-
-=head1 DESCRIPTION
-
-L<virt-p2v(1)> converts a physical machine to run virtualized on KVM,
-managed by libvirt, OpenStack, oVirt, Red Hat Enterprise
-Virtualisation (RHEV), or one of the other targets supported by
-L<virt-v2v(1)>.
-
-Kiwi is a tool used mainly by SUSE Linux Enterprise and openSUSE to
-build live CDs, make appliances and so on. It is driven by a few files
-including an xml description of the machine.
-
-virt-p2v-make-kiwi builds a folder containing all the pieces needed for
-kiwi to build a bootable P2V live CD ISO, USB key, or PXE image. This tool
-only builds the kiwi configuration, but this manual page describes some of
-the ways you can use the kiwi configuration.
-
-=head1 BUILDING THE KIWI CONFIGURATION
-
-Using virt-p2v-make-kiwi is very simple:
-
- virt-p2v-make-kiwi
-
-will build a kiwi configuration based on the current machine’s distribution.
-
-To control the name of the output folder, use the I<-o> parameter.
-
-=head1 BUILDING A LIVE CD / ISO
-
-Once you have the kiwi configuration folder, you can use L<kiwi(1)> to make a
-live CD:
-
- sudo kiwi --build p2v.kiwi -d build --type iso
-
-Before running this, you may have to tweak the C<config.xml> file
-to change the locale and keyboard mapping to the one you need.
-
-If running on a SUSE Linux Entreprise Server, add the path to your packages repositories
-using the C<--ignore-repos> and C<--add-repo> kiwi parameters.
-
-The generated ISO image will be placed in the C<build> folder.
-
-=head1 BUILDING A BOOTABLE USB KEY
-
-Use the L<dd(1)> program to write the ISO created above to a USB key:
-
- sudo dd if=path/to/p2v.iso of=/dev/sdX
-
-=head1 BUILDING A PXE BOOT IMAGE
-
-To create a PXE boot image, run kiwi in such a way:
-
- sudo kiwi --build $PWD/p2v.kiwi -d build --add-profile netboot --type pxe
-
-For more details on how to use the generated image, report to the kiwi documentation
-on PXE images:
L<https://doc.opensuse.org/projects/kiwi/doc/#chap.pxe>
-
-=head1 ADDING AN SSH IDENTITY
-
-You can inject an SSH identity (private key) file to the kiwi config and
-hence into the ISO using the I<--inject-ssh-identity> option. Note
-that you I<cannot> inject a key once the ISO has been built.
-
-First create a key pair. It must have an empty passphrase:
-
- ssh-keygen -t rsa -N '' -f id_rsa
-
-This creates a private key (C<id_rsa>) and a public key
-(C<id_rsa.pub>) pair. The public key should be appended to the
-C<authorized_keys> file on the virt-v2v conversion server (usually to
-C</root/.ssh/authorized_keys>).
-
-The private key should be added to the kiwi config and then
-discarded:
-
- virt-p2v-make-kiwi [...] --inject-ssh-identity id_rsa
- rm id_rsa
-
-The ISO can then be built from the kickstart in the usual way (see
-above), and it will contain the embedded SSH identity
-(F</var/tmp/id_rsa>).
-
-When booting virt-p2v, specify the URL of the injected file like this:
-
- │ User name: [root_____________________________] │
- │ │
- │ Password: [ <leave this field blank> ] │
- │ │
- │ SSH Identity URL: [file:///var/tmp/id_rsa___________] │
-
-or if using the kernel command line, add:
-
- p2v.identity=file:///var/tmp/id_rsa
-
-For more information, see L<virt-p2v(1)/SSH IDENTITIES>.
-
-=head1 OPTIONS
-
-=over 4
-
-=item B<--help>
-
-Display help.
-
-=item B<--inject-ssh-identity> id_rsa
-
-Add an SSH identity (private key) file into the kickstart.
-See L</ADDING AN SSH IDENTITY> above.
-
-=item B<-o> OUTPUT
-
-=item B<--output> OUTPUT
-
-Write kiwi configuration to the C<OUTPUT> folder. If not specified, the default
is
-F<p2v.kiwi> in the current directory.
-
-=item B<-V>
-
-=item B<--version>
-
-Display version number and exit.
-
-=back
-
-=head1 FILES
-
-=over 4
-
-=item F<$libdir/virt-p2v/virt-p2v.xz>
-
-The L<virt-p2v(1)> binary which is copied into the kiwi configuration.
-
-The location of the binary can be changed by setting the
-C<VIRT_P2V_DATA_DIR> environment variable.
-
-=item F<$datadir/virt-p2v/issue>
-
-=item F<$datadir/virt-p2v/launch-virt-p2v.in>
-
-=item F<$datadir/virt-p2v/kiwi>
-
-=item F<$datadir/virt-p2v/p2v.service>
-
-Various data files that are used to make the kiwi appliance.
-
-The location of these files can be changed by setting the
-C<VIRT_P2V_DATA_DIR> environment variable.
-
-=back
-
-=head1 ENVIRONMENT VARIABLES
-
-=over 4
-
-=item C<VIRT_P2V_DATA_DIR>
-
-The directory where virt-p2v-make-kiwi looks for data files and
-the virt-p2v binary (see L</FILES> above). If not set, a compiled-in
-location is used.
-
-=back
-
-=head1 SEE ALSO
-
-L<virt-p2v(1)>,
-L<virt-p2v-make-disk(1)>,
-L<virt-v2v(1)>,
-L<kiwi(1)>,
-L<http://libguestfs.org/>.
-
-=head1 AUTHORS
-
-Cédric Bosdonnat
-
-=head1 COPYRIGHT
-
-Copyright (C) 2016 SUSE Ltd.
diff --git a/p2v/virt-p2v.pod b/p2v/virt-p2v.pod
deleted file mode 100644
index 758021134..000000000
--- a/p2v/virt-p2v.pod
+++ /dev/null
@@ -1,757 +0,0 @@
-=head1 NAME
-
-virt-p2v - Convert a physical machine to use KVM
-
-=head1 SYNOPSIS
-
- virt-p2v
-
- virt-p2v.iso
-
-=head1 DESCRIPTION
-
-Virt-p2v converts a physical machine to run virtualized on KVM,
-managed by libvirt, OpenStack, oVirt, Red Hat Virtualisation (RHV), or
-one of the other targets supported by L<virt-v2v(1)>.
-
-Normally you don’t run the virt-p2v program directly. Instead you
-have to boot the physical machine using the bootable CD-ROM, ISO or
-PXE image. This bootable image contains the virt-p2v binary and runs
-it automatically. Booting from a CD-ROM/etc is required because the
-disks which are being converted must be quiescent. It is not safe to
-try to convert a running physical machine where other programs may be
-modifying the disk content at the same time.
-
-This manual page documents running the virt-p2v program. To create
-the bootable image you should look at L<virt-p2v-make-disk(1)> or
-L<virt-p2v-make-kickstart(1)>.
-
-=head1 NETWORK SETUP
-
-Virt-p2v runs on the physical machine which you want to convert. It
-has to talk to another server called the "conversion server" which
-must have L<virt-v2v(1)> installed on it. It always talks to the
-conversion server over SSH:
-
- ┌──────────────┐ ┌─────────────────┐
- │ virt-p2v │ │ virt-v2v │
- │ (physical │ ssh connection │ (conversion │
- │ server) ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍▶ server) │
- └──────────────┘ └─────────────────┘
-
-The virt-v2v program on the conversion server does the actual
-conversion (physical to virtual, and virtual to virtual conversions
-are sufficiently similar that we use the same program to do both).
-
-The SSH connection is always initiated from the physical server. All
-data is transferred over the SSH connection. In terms of firewall and
-network configuration, you only need to ensure that the physical
-server has access to a port (usually TCP port 22) on the conversion
-server. Note that the physical machine may reconnect several times
-during the conversion process.
-
-The reverse port forwarding feature of ssh (ie. C<ssh -R>) is required
-by virt-p2v, and it will not work if this is disabled on the
-conversion server. (C<AllowTcpForwarding> must be C<yes> in the
-L<sshd_config(5)> file on the conversion server).
-
-The scp (secure copy) feature of ssh is required by virt-p2v so it can
-send over small files (this is I<not> the method by which disks are
-copied).
-
-The conversion server does not need to be a physical machine. It
-could be a virtual machine, as long as it has sufficient memory and
-disk space to do the conversion, and as long as the physical machine
-can connect directly to its SSH port. (See also
-L<virt-v2v(1)/Resource requirements>).
-
-Because all of the data on the physical server’s hard drive(s) has to
-be copied over the network, the speed of conversion is largely
-determined by the speed of the network between the two machines.
-
-=head1 GUI INTERACTIVE CONFIGURATION
-
-When you start virt-p2v, you'll see a graphical configuration dialog
-that walks you through connection to the conversion server, asks for
-the password, which local hard disks you want to convert, and other
-things like the name of the guest to create and the number of virtual
-CPUs to give it.
-
-=head2 SSH CONFIGURATION DIALOG
-
-When virt-p2v starts up in GUI mode, the first dialog looks like this:
-
- ┌─────────────────────────────────────────────────────────────┐
- │ virt-p2v │
- │ │
- │ Conversion server: [____________________________] : [22___] │
- │ │
- │ User name: [root__________________________________] │
- │ │
- │ Password: [______________________________________] │
- │ │
- │ SSH Identity URL: [______________________________________] │
- │ │
-
-In the fields above, you must enter the details of the conversion
-server: the hostname, SSH port number, remote user name, and either
-the password or SSH identity (private key) URL. The conversion server
-must have an up to date version of virt-v2v.
-
-Normally you must log in to the conversion server as root, but if you
-check the following box:
-
- │ │
- │ [ ] Use sudo when running virt-v2v │
- │ │
-
-then you can log in as another user, and virt-p2v will use the
-L<sudo(8)> command to elevate privileges to root. Note that
-sudo must not require a password.
-
-It is also possible to run virt-v2v on the conversion server entirely
-as non-root, but output modes may be limited. Consult the
-L<virt-v2v(1)> manual page for details.
-
-At the bottom of the dialog are these buttons:
-
- │ │
- │ [ Test connection ] │
- │ │
- │ [ Configure network ] [ XTerm ] [ About virt-p2v ] [ Next ] │
- │ │
- └─────────────────────────────────────────────────────────────┘
-
-You must press the C<Test connection> button first to test the SSH
-connection to the conversion server. If that is successful (ie. you
-have supplied the correct server name, user name, password, etc., and
-a suitable version of virt-v2v is available remotely) then press the
-C<Next> button to move to the next dialog.
-
-You can use the C<Configure network> button if you need to assign a
-static IP address to the physical machine, or use Wifi, bonding or
-other network features.
-
-The C<XTerm> button opens a shell which can be used for diagnostics,
-manual network configuration, and so on.
-
-=head2 DISK AND NETWORK CONFIGURATION DIALOG
-
-The second configuration dialog lets you configure the details of
-conversion, including what to convert and where to send the guest.
-
-In the left hand column, starting at the top, the target properties
-let you select the name of the guest (ie. after conversion) and how
-many virtual CPUs and how much RAM to give it. The defaults come from
-the physical machine, and you can usually leave them unchanged:
-
- ┌─────────────────────────────────────── ─ ─ ─ ─
- │ Target properties:
- │
- │ Name: [hostname______________]
- │
- │ # vCPUs: [4_____________________]
- │
- │ Memory (MB): [16384_________________]
- │
-
-The second panel on the left controls the virt-v2v output options. To
-understand these options it is a really good idea to read the
-L<virt-v2v(1)> manual page. You can leave the options at the default
-to create a guest as a disk image plus libvirt XML file located in
-F</var/tmp> on the conversion host. This is a good idea if you are a
-first-time virt-p2v user.
-
- │
- │ Virt-v2v output options:
- │
- │ Output to (-o): [local ▼]
- │
- │ Output conn. (-oc): [___________________]
- │
- │ Output storage (-os): [/var/tmp___________]
- │
- │ Output format (-of): [___________________]
- │
- │ Output allocation (-oa): [sparse ▼]
- │
-
-All output options and paths are relative to the conversion server
-(I<not> to the physical server).
-
-Finally in the left hand column is an information box giving the
-version of virt-p2v (on the physical server) and virt-v2v (on the
-conversion server). You should supply this information when reporting
-bugs.
-
-In the right hand column are three panels which control what hard
-disks, removable media devices, and network interfaces, will be
-created in the output guest. Normally leaving these at the default
-settings is fine.
-
- ─ ─ ───────────────────────────────────────┐
- Fixed hard disks │
- │
- Convert Device │
- [✔] sda │
- 1024G HITACHI │
- s/n 12345 │
- [✔] sdb │
- 119G HITACHI │
- s/n 12346 │
- │
-
-Normally you would want to convert all hard disks. If you want
-virt-p2v to completely ignore a local hard disk, uncheck it. The hard
-disk that contains the operating system must be selected. If a hard
-disk is part of a RAID array or LVM volume group (VG), then either all
-hard disks in that array/VG must be selected, or none of them.
-
- │
- Removable media │
- │
- Convert Device │
- [✔] sr0 │
- │
-
-If the physical machine has CD or DVD drives, then you can use the
-Removable media panel to create corresponding drives on the guest
-after conversion. Note that any data CDs/DVDs which are mounted in
-the drives are I<not> copied over.
-
- │
- Network interfaces │
- │
- Convert Device Connect to ... |
- [✔] em1 [default_____________] │
- [ ] wlp3s0 [default_____________] │
- │
-
-In the Network interfaces panel, select the network interfaces that
-should be created in the guest after conversion. You can also connect
-these to target hypervisor networks (for further information about
-this feature, see L<virt-v2v(1)/Networks and bridges>).
-
-On supported hardware, left-clicking on the device name (eg. C<em1>)
-causes a light to start flashing on the physical interface, allowing
-the interface to be identified by the operator.
-
-When you are ready to begin the conversion, press the
-C<Start conversion> button:
-
- │
- [ Back ] [ Start conversion ] │
- │
- ─ ─ ───────────────────────────────────────┘
-
-=head2 CONVERSION RUNNING DIALOG
-
-When conversion is running you will see this dialog:
-
- ┌────────────────────────────────────────────────────────┐
- │ virt-p2v │
- │ │
- │ ┌──────────────────────────────────────────────────┐ │
- │ │ ▲│ │
- │ │ │ │
- │ │ │ │
- ∼ ∼ ∼ ∼
- │ │ │ │
- │ │ │ │
- │ │ ▼│ │
- │ └──────────────────────────────────────────────────┘ │
- │ │
- │ Log files ... to /tmp/virt-p2v-xxx │
- │ │
- │ Doing conversion ... │
- │ │
- │ [ Cancel conversion ] │
- │ │
- └────────────────────────────────────────────────────────┘
-
-In the main scrolling area you will see messages from the virt-v2v
-process.
-
-Below the main area, virt-p2v shows you the location of the directory
-on the conversion server that contains log files and other debugging
-information. Below that is the current status and a button for
-cancelling conversion.
-
-Once conversion has finished, you should shut down the physical
-machine. If conversion is successful, you should never reboot it.
-
-=head1 KERNEL COMMAND LINE CONFIGURATION
-
-If you don’t want to configure things using the graphical UI, an
-alternative is to configure through the kernel command line. This is
-especially convenient if you are converting a lot of physical machines
-which are booted using PXE.
-
-Where exactly you set command line arguments depends on your PXE
-implementation, but for pxelinux you put them in the C<APPEND> field
-in the F<pxelinux.cfg> file. For example:
-
- DEFAULT p2v
- TIMEOUT 20
- PROMPT 0
- LABEL p2v
- KERNEL vmlinuz0
- APPEND initrd=initrd0.img [....]
p2v.server=conv.example.com p2v.password=secret
p2v.o=libvirt
-
-You have to set some or all of the following command line arguments:
-
-=over 4
-
-__KERNEL_CONFIG__
-
-=item B<p2v.pre=COMMAND>
-
-=item B<p2v.pre="COMMAND ARG ...">
-
-Select a pre-conversion command to run. Any command or script can be
-specified here. If the command contains spaces, you must quote the
-whole command with double quotes. The default is not to run any
-command.
-
-=item B<p2v.post=poweroff>
-
-=item B<p2v.post=reboot>
-
-=item B<p2v.post=COMMAND>
-
-=item B<p2v.post="COMMAND ARG ...">
-
-Select a post-conversion command to run if conversion is successful.
-This can be any command or script. If the command contains spaces,
-you must quote the whole command with double quotes.
-
-I<If> virt-p2v is running as root, I<and> the command line was set
-from F</proc/cmdline> (not I<--cmdline>), then the default is to run
-the L<poweroff(8)> command. Otherwise the default is not to run any
-command.
-
-=item B<p2v.fail=COMMAND>
-
-=item B<p2v.fail="COMMAND ARG ...">
-
-Select a post-conversion command to run if conversion fails. Any
-command or script can be specified here. If the command contains
-spaces, you must quote the whole command with double quotes. The
-default is not to run any command.
-
-=item B<ip=dhcp>
-
-Use DHCP for configuring the network interface (this is the default).
-
-=begin comment
-
-=item B<ip=ADDR:GATEWAY:NETMASK>
-
-Set up a static IPv4 network configuration.
-
-=end comment
-
-=back
-
-=head1 SSH IDENTITIES
-
-As a somewhat more secure alternative to password authentication, you
-can use an SSH identity (private key) for authentication.
-
-First create a key pair. It must have an empty passphrase:
-
- ssh-keygen -t rsa -N '' -f id_rsa
-
-This creates a private key (C<id_rsa>) and a public key
-(C<id_rsa.pub>) pair.
-
-The public key should be appended to the C<authorized_keys> file on
-the virt-v2v conversion server (usually to
-C</root/.ssh/authorized_keys>).
-
-For distributing the private key, there are four scenarios from least
-secure to most secure:
-
-=over 4
-
-=item 1.
-
-Not using SSH identities at all, ie. password authentication.
-
-Anyone who can sniff the PXE boot parameters from the network or
-observe the password some other way can log in to the virt-v2v
-conversion server.
-
-=item 2.
-
-SSH identity embedded in the virt-p2v ISO or disk image. In the GUI, use:
-
- │ Password: [ <leave this field blank> ] │
- │ │
- │ SSH Identity URL: [file:///var/tmp/id_rsa_____________] │
-
-or on the kernel command line:
-
- p2v.identity=file:///var/tmp/id_rsa
-
-The SSH private key can still be sniffed from the network if using
-standard PXE.
-
-=item 3.
-
-SSH identity downloaded from a website. In the GUI, use:
-
- │ Password: [ <leave this field blank> ] │
- │ │
- │ SSH Identity URL: [
https://internal.example.com/id_rsa] │
-
-or on the kernel command line:
-
-
p2v.identity=https://internal.example.com/id_rsa
-
-Anyone could still download the private key and use it to log in to
-the virt-v2v conversion server, but you could provide some extra
-security by configuring the web server to only allow connections from
-P2V machines.
-
-Note that L<ssh-keygen(1)> creates the C<id_rsa> (private key) file
-with mode 0600. If you simply copy the file to a webserver, the
-webserver will not serve it. It will reply with "403 Forbidden"
-errors. You will need to change the mode of the file to make it
-publicly readable, for example by using:
-
- chmod 0644 id_rsa
-
-=item 4.
-
-SSH identity embedded in the virt-p2v ISO or disk image (like 2.),
-I<and> use of secure PXE, PXE over separate physical network, or
-sneakernet to distribute virt-p2v to the physical machine.
-
-=back
-
-Both L<virt-p2v-make-disk(1)> and L<virt-p2v-make-kickstart(1)> have
-the same option I<--inject-ssh-identity> for injecting the private key
-into the virt-p2v disk image / ISO. See also the following manual
-sections:
-
-L<virt-p2v-make-disk(1)/ADDING AN SSH IDENTITY>
-
-L<virt-p2v-make-kickstart(1)/ADDING AN SSH IDENTITY>
-
-=head1 COMMON PROBLEMS
-
-=head2 Timeouts
-
-As described below (see L</HOW VIRT-P2V WORKS>) virt-p2v makes several
-long-lived ssh connections to the conversion server. If these
-connections time out then virt-p2v will fail.
-
-To test if a timeout might be causing problems, open an XTerm on the
-virt-p2v machine, C<ssh root@I<conversion-server>>, and leave it for
-at least an hour. If the session disconnects without you doing
-anything, then there is a timeout which you should turn off.
-
-Timeouts happen because:
-
-=over 4
-
-=item C<TIMEOUT> or C<TMOUT> environment variable
-
-Check if one of these environment variables is set in the root shell
-on the conversion server.
-
-=item sshd C<ClientAlive*> setting
-
-Check for C<ClientAlive*> settings in C</etc/ssh/sshd_config> on the
-conversion server.
-
-=item Firewall or NAT settings
-
-Check if there is a firewall or NAT box between virt-p2v and the
-conversion server, and if this firewall drops idle connections after a
-too-short time.
-
-virt-p2v E<ge> 1.36 attempts to work around firewall timeouts by
-sending ssh keepalive messages every 5 minutes.
-
-=back
-
-=head1 OPTIONS
-
-=over 4
-
-=item B<--help>
-
-Display help.
-
-=item B<--cmdline=CMDLINE>
-
-This is used for debugging. Instead of parsing the kernel command line
-from F</proc/cmdline>, parse the string parameter C<CMDLINE>.
-
-=item B<--colors>
-
-=item B<--colours>
-
-Use ANSI colour sequences to colourize messages. This is the default
-when the output is a tty. If the output of the program is redirected
-to a file, ANSI colour sequences are disabled unless you use this
-option.
-
-=item B<--iso>
-
-This flag is passed to virt-p2v when it is launched inside the
-virt-p2v ISO environment, ie. when it is running on a real physical
-machine (and thus not when testing). It enables various dangerous
-features such as the Shutdown popup button.
-
-=item B<--nbd=server[,server...]>
-
-Select which NBD server is used. By default the following servers are
-checked and the first one found is used:
-I<--nbd=qemu-nbd,qemu-nbd-no-sa,nbdkit,nbdkit-no-sa>
-
-=over 4
-
-=item B<qemu-nbd>
-
-Use qemu-nbd.
-
-=item B<qemu-nbd-no-sa>
-
-Use qemu-nbd, but disable socket activation.
-
-=item B<nbdkit>
-
-Use nbdkit with the file plugin (see: L<nbdkit-file-plugin(1)>).
-
-=item B<nbdkit-no-sa>
-
-Use nbdkit, but disable socket activation
-
-=back
-
-The C<*-no-sa> variants allow virt-p2v to fall back to older versions
-of qemu-nbd and nbdkit which did not support
-L<socket activation|http://0pointer.de/blog/projects/socket-activation.html>.
-
-=item B<--test-disk=/PATH/TO/DISK.IMG>
-
-For testing or debugging purposes, replace F</dev/sda> with a local
-file. You must use an absolute path.
-
-=item B<-v>
-
-=item B<--verbose>
-
-In libguestfs E<ge> 1.33.41, debugging is always enabled on the
-conversion server, and this option does nothing.
-
-=item B<-V>
-
-=item B<--version>
-
-Display version number and exit.
-
-=back
-
-=head1 HOW VIRT-P2V WORKS
-
-B<Note this section is not normative.> We may change how virt-p2v
-works at any time in the future.
-
-As described above, virt-p2v runs on a physical machine, interrogates
-the user or the kernel command line for configuration, and then
-establishes one or more ssh connections to the virt-v2v conversion
-server. The ssh connections are interactive shell sessions to the
-remote host, but the commands sent are generated entirely by virt-p2v
-itself, not by the user. For data transfer, virt-p2v will use the
-reverse port forward feature of ssh (ie. C<ssh -R>).
-
-It will first make one or more test connections, which are used to
-query the remote version of virt-v2v and its features. The test
-connections are closed before conversion begins.
-
- ┌──────────────┐ ┌─────────────────┐
- │ virt-p2v │ │ virt-v2v │
- │ (physical │ control connection │ (conversion │
- │ server) ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍▶ server) │
- └──────────────┘ └─────────────────┘
-
-Once virt-p2v is ready to start conversion, it will open a single ssh
-control connection. It first sends a mkdir command to create a
-temporary directory on the conversion server. The directory name is
-randomly chosen and is displayed in the GUI. It has the form:
-
- /tmp/virt-p2v-YYYYMMDD-XXXXXXXX
-
-where C<YYYYMMDD> is the current date, and the ‘X’s are random
-characters.
-
-Into this directory are written various files which include:
-
-=over 4
-
-=item F<dmesg>
-
-=item F<lscpu>
-
-=item F<lspci>
-
-=item F<lsscsi>
-
-=item F<lsusb>
-
-I<(before conversion)>
-
-The output of the corresponding commands (ie L<dmesg(1)>, L<lscpu(1)>
-etc) on the physical machine.
-
-The dmesg output is useful for detecting problems such as missing
-device drivers or firmware on the virt-p2v ISO. The others are useful
-for debugging novel hardware configurations.
-
-=item F<environment>
-
-I<(before conversion)>
-
-The content of the environment where L<virt-v2v(1)> will run.
-
-=item F<name>
-
-I<(before conversion)>
-
-The name (usually the hostname) of the physical machine.
-
-=item F<physical.xml>
-
-I<(before conversion)>
-
-Libvirt XML describing the physical machine. It is used to pass data
-about the physical source host to L<virt-v2v(1)> via the I<-i libvirtxml>
-option.
-
-Note this is not "real" libvirt XML (and must B<never> be loaded into
-libvirt, which would reject it anyhow). Also it is not the same as
-the libvirt XML which virt-v2v generates in certain output modes.
-
-=item F<p2v-version>
-
-=item F<v2v-version>
-
-I<(before conversion)>
-
-The versions of virt-p2v and virt-v2v respectively.
-
-=item F<status>
-
-I<(after conversion)>
-
-The final status of the conversion. C<0> if the conversion was
-successful. Non-zero if the conversion failed.
-
-=item F<time>
-
-I<(before conversion)>
-
-The start date/time of conversion.
-
-=item F<virt-v2v-conversion-log.txt>
-
-I<(during/after conversion)>
-
-The conversion log. This is just the output of the virt-v2v command
-on the conversion server. If conversion fails, you should examine
-this log file, and you may be asked to supply the B<complete>,
-B<unedited> log file in any bug reports or support tickets.
-
-=item F<virt-v2v-wrapper.sh>
-
-I<(before conversion)>
-
-This is the wrapper script which is used when running virt-v2v. For
-interest only, do not attempt to run this script yourself.
-
-=back
-
-Before conversion actually begins, virt-p2v then makes one or more
-further ssh connections to the server for data transfer.
-
-The transfer protocol used currently is NBD (Network Block Device),
-which is proxied over ssh. The NBD server is L<qemu-nbd(1)> by
-default but others can be selected using the I<--nbd> command line
-option.
-
-There is one ssh connection per physical hard disk on the source
-machine (the common case — a single hard disk — is shown below):
-
- ┌──────────────┐ ┌─────────────────┐
- │ virt-p2v │ │ virt-v2v │
- │ (physical │ control connection │ (conversion │
- │ server) ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍▶ server) │
- │ │ │ │
- │ │ data connection │ │
- │ ╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍╍▶ │
- │qemu-nbd ← ─┘ │ │└─ ← NBD │
- │/dev/sda │ │ requests │
- ∼ ∼ ∼ ∼
- └──────────────┘ └─────────────────┘
-
-Although the ssh data connection is originated from the physical
-server and terminates on the conversion server, in fact NBD requests
-flow in the opposite direction. This is because the reverse port
-forward feature of ssh (C<ssh -R>) is used to open a port on the
-loopback interface of the conversion server which is proxied back by
-ssh to the NBD server running on the physical machine. The effect is
-that virt-v2v via libguestfs can open nbd connections which directly
-read the hard disk(s) of the physical server.
-
-Two layers of protection are used to ensure that there are no writes
-to the hard disks: Firstly, the qemu-nbd I<-r> (readonly) option is
-used. Secondly libguestfs creates an overlay on top of the NBD
-connection which stores writes in a temporary file on the conversion
-file.
-
-The long S<C<virt-v2v -i libvirtxml physical.xml ...>> command is
-wrapped inside a wrapper script and uploaded to the conversion server.
-The final step is to run this wrapper script, in turn running the
-virt-v2v command. The virt-v2v command references the F<physical.xml>
-file (see above), which in turn references the NBD listening port(s)
-of the data connection(s).
-
-Output from the virt-v2v command (messages, debugging etc) is saved
-both in the log file on the conversion server. Only informational
-messages are sent back over the control connection to be displayed in
-the graphical UI.
-
-=head1 SEE ALSO
-
-L<virt-p2v-make-disk(1)>,
-L<virt-p2v-make-kickstart(1)>,
-L<virt-p2v-make-kiwi(1)>,
-L<virt-v2v(1)>,
-L<qemu-nbd(1)>,
-L<nbdkit(1)>, L<nbdkit-file-plugin(1)>,
-L<ssh(1)>,
-L<sshd(8)>,
-L<sshd_config(5)>,
-L<http://libguestfs.org/>.
-
-=head1 AUTHORS
-
-Matthew Booth
-
-John Eckersberg
-
-Richard W.M. Jones
L<http://people.redhat.com/~rjones/>
-
-Mike Latimer
-
-Pino Toscano
-
-Tingting Zheng
-
-=head1 COPYRIGHT
-
-Copyright (C) 2009-2019 Red Hat Inc.
diff --git a/p2v/whole-file.c b/p2v/whole-file.c
deleted file mode 100644
index 63597e0c0..000000000
--- a/p2v/whole-file.c
+++ /dev/null
@@ -1,95 +0,0 @@
-/* libguestfs
- * Copyright (C) 2011-2019 Red Hat Inc.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#include <config.h>
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/stat.h>
-#include <libintl.h>
-
-#include "p2v.h"
-
-/**
- * Read the whole file into a memory buffer and return it. The file
- * should be a regular, local, trusted file.
- */
-int
-read_whole_file (const char *filename, char **data_r, size_t *size_r)
-{
- int fd;
- char *data;
- off_t size;
- off_t n;
- ssize_t r;
- struct stat statbuf;
-
- fd = open (filename, O_RDONLY|O_CLOEXEC);
- if (fd == -1) {
- fprintf (stderr, "open: %s: %m\n", filename);
- return -1;
- }
-
- if (fstat (fd, &statbuf) == -1) {
- fprintf (stderr, "stat: %s: %m\n", filename);
- close (fd);
- return -1;
- }
-
- size = statbuf.st_size;
- data = malloc (size + 1);
- if (data == NULL) {
- perror ("malloc");
- return -1;
- }
-
- n = 0;
- while (n < size) {
- r = read (fd, &data[n], size - n);
- if (r == -1) {
- fprintf (stderr, "read: %s: %m\n", filename);
- free (data);
- close (fd);
- return -1;
- }
- if (r == 0) {
- fprintf (stderr, "read: %s: unexpected end of file\n", filename);
- free (data);
- close (fd);
- return -1;
- }
- n += r;
- }
-
- if (close (fd) == -1) {
- fprintf (stderr, "close: %s: %m\n", filename);
- free (data);
- return -1;
- }
-
- /* For convenience of callers, \0-terminate the data. */
- data[size] = '\0';
-
- *data_r = data;
- if (size_r != NULL)
- *size_r = size;
-
- return 0;
-}
diff --git a/po-docs/language.mk b/po-docs/language.mk
index b50d053e6..e3d669cdf 100644
--- a/po-docs/language.mk
+++ b/po-docs/language.mk
@@ -71,9 +71,6 @@ MANPAGES = \
virt-log.1 \
virt-ls.1 \
virt-make-fs.1 \
- virt-p2v.1 \
- virt-p2v-make-disk.1 \
- virt-p2v-make-kickstart.1 \
virt-rescue.1 \
virt-resize.1 \
virt-sparsify.1 \
diff --git a/po-docs/podfiles b/po-docs/podfiles
index 119e75ad0..7d90267a1 100644
--- a/po-docs/podfiles
+++ b/po-docs/podfiles
@@ -53,11 +53,6 @@
../lua/examples/guestfs-lua.pod
../make-fs/virt-make-fs.pod
../ocaml/examples/guestfs-ocaml.pod
-../p2v/virt-p2v-kernel-config.pod
-../p2v/virt-p2v-make-disk.pod
-../p2v/virt-p2v-make-kickstart.pod
-../p2v/virt-p2v-make-kiwi.pod
-../p2v/virt-p2v.pod
../perl/examples/guestfs-perl.pod
../python/examples/guestfs-python.pod
../rescue/virt-rescue.pod
--
2.21.0