Compare commits

...

927 Commits

Author SHA1 Message Date
Richard W.M. Jones
50e3ef3357 Version 1.27.24. 2014-07-26 21:37:59 +01:00
Richard W.M. Jones
1b925a0efb build: Add `maintainer-commit' rule to create a new version commit. 2014-07-26 21:27:16 +01:00
Pino Toscano
08bfd9e41b p2v: close the mexp handle if mexp_spawnv fails 2014-07-26 18:24:52 +01:00
Pino Toscano
9c3ce6535c make-fs: use CLEANUP_FCLOSE 2014-07-26 18:24:52 +01:00
Pino Toscano
9e7f5300c9 cleanups: add CLEANUP_FCLOSE (fclose on FILE*) 2014-07-26 18:24:52 +01:00
Pino Toscano
d8b9ce65c2 p2v: properly call va_end 2014-07-26 18:24:52 +01:00
Richard W.M. Jones
7378edb9fa Add qemu-speed-test program to test speed of qemu.
Currently it tests the upload and download speed of virtio-serial and
the read and write speed of the block device (eg. virtio-scsi).
2014-07-25 22:48:09 +01:00
Richard W.M. Jones
115fcc3432 launch: Close file descriptors after fork (RHBZ#1123007).
This refactors existing code to close file descriptors in the recovery
process, and also adds code to close file descriptors between the
fork() and exec() of QEMU or User-Mode Linux.

The reason is to avoid leaking main process file descriptors where the
main process (or other libraries in the main process) are not setting
O_CLOEXEC at all or not setting it atomically.  Python is a particular
culprit.

See also this OpenStack Nova bug report:
https://bugs.launchpad.net/nova/+bug/1313477

Thanks: Qin Zhao for identifying and characterizing the problem in Nova.
2014-07-25 16:28:09 +01:00
Richard W.M. Jones
f18464995f tests: builder: Allow test to be skipped. 2014-07-25 16:06:46 +01:00
Richard W.M. Jones
81cafdcfd5 virt-resize: Unmount filesystem after testing size.
We were mounting different filesystems on top of each other.  In fact
this is not a problem, but it's nicer to unmount each filesystem
properly after examining it.
2014-07-25 16:04:18 +01:00
Richard W.M. Jones
fc7da04ccd daemon: Add extra debugging to umount_all command.
No functional change, just prints some more debug messages.
2014-07-25 16:03:09 +01:00
Richard W.M. Jones
146cc78b7d aarch64: Use a smaller test file for test-cancellation-upload-daemoncancels.sh
This test worked by uploading a 100MB file into a 100MB container and
seeing the inevitable crash.  Unfortunately virtio-mmio (used on
aarch64) is quite slow.  Since this test is not testing the speed of
virtio-mmio, use a smaller test file so the test finishes in a
reasonable time.
2014-07-25 15:28:46 +01:00
Richard W.M. Jones
d268de9394 tests: hotplug: Allow tests to be skipped.
They don't work on aarch64.
2014-07-25 14:43:06 +01:00
Richard W.M. Jones
64498034bb tests: lvm: Allow test to be skipped. 2014-07-25 10:04:44 +01:00
Richard W.M. Jones
7f826e1296 Version 1.27.23. 2014-07-23 17:40:16 +01:00
Richard W.M. Jones
d682dad186 aarch64: Add comment about efi-rtc=noprobe option.
This updates commit 5326689d50.
2014-07-23 17:09:59 +01:00
Richard W.M. Jones
bcdbe6405c v2v: Add support for converting Windows guests.
This completes commit f296d34f3b.
2014-07-23 17:02:49 +01:00
Richard W.M. Jones
f4698575cc customize: Add the ability to use --firstboot for Windows guests.
This allows you to add potentially multiple --firstboot
scripts to a Windows guest.
2014-07-23 17:02:49 +01:00
Richard W.M. Jones
199fa26950 mllib: Add regedit mini-library.
This library replaces Win::Hivex::Regedit, or at least enough for us
to be able to make the simple Registry modifications needed for
installing firstboot scripts.
2014-07-23 17:02:43 +01:00
Richard W.M. Jones
9c49590d42 customize: firstboot: Move Linux-specific functions into Linux submodule.
No functional change.
2014-07-23 15:09:56 +01:00
Richard W.M. Jones
12b54ef5e3 sparsify: Relax requirement that output device cannot be block device (RHBZ#1122557).
To fix RHBZ#1056290, I prevented virt-sparsify being used if the
output device is a block device.

I have now retested this scenario and it does work (in both copying
and in-place mode), and does not delete the output device, and
therefore we can relax this restriction so only char devices are
banned.

This is useful for oVirt which uses a qcow2 formatted block device to
store virtual machines.
2014-07-23 15:09:48 +01:00
Richard W.M. Jones
897b136aa8 Update translations from Transifex. 2014-07-22 19:10:22 +01:00
Richard W.M. Jones
e7ae071f60 Version 1.27.22. 2014-07-21 14:36:53 +01:00
Richard W.M. Jones
5326689d50 aarch64: efi-rtc=noprobe is needed to fix boot of upstream kernel on VM. 2014-07-21 13:54:43 +01:00
Pino Toscano
f4026d779e configure: look for "default-java" as directory for Java
In Debian-based systems, /usr/lib/jvm/default-java is a symlink
pointing to the location of the default Java version.
2014-07-18 09:57:04 +02:00
Richard W.M. Jones
de5924a229 tests: Add test program to run qemu/appliance repeatedly.
For example:

  $ time ./run ./tests/qemu/qemu-boot -n 100
  real 1m19.794s
  user 0m10.001s
  sys  0m5.928s

will run 100 appliance start/stops, from multiple threads.
2014-07-17 22:31:59 +01:00
Richard W.M. Jones
83790960d6 valgrind: Tweak the suppression matching OCaml leak in caml_search_in_path.
In OCaml 4.02 this still leaks, but the stack trace is slightly
different so the old suppression didn't match it.
2014-07-17 11:40:41 +01:00
Richard W.M. Jones
333ddf208b tests: Add a protocol regression test for long error messages. 2014-07-17 11:40:41 +01:00
Richard W.M. Jones
4106c97934 daemon: Truncate long error messages so XDR encoding doesn't fail. 2014-07-17 11:40:41 +01:00
Richard W.M. Jones
4d3953f092 Warn about large stack frames, and fix a few places with excessive stack usage. 2014-07-17 11:40:40 +01:00
Richard W.M. Jones
00c94d808b tests: Remove tests/protocol/test-qemudie-launchfail.sh
This test has not been run since 2012 as it depends on specifics of
how supermin and new-style appliances work (see
commit 2d89aef897).

This commit removes the test entirely.
2014-07-17 11:40:40 +01:00
Richard W.M. Jones
fa3d6e55b2 tests: qemu: Fix TCG test.
$guestfish was not defined, so the UML test/skip did not do anything.
2014-07-16 13:40:37 +01:00
Richard W.M. Jones
9cdaaeee40 tests: regressions: Allow non-exec stack test to be skipped.
Currently fails on aarch64 because of a buggy GCC.
2014-07-15 22:56:22 +01:00
Richard W.M. Jones
9e01541e48 tests: 9p: aarch64 also uses virtio-mmio (instead of virtio-pci). 2014-07-15 22:56:22 +01:00
Richard W.M. Jones
2d01e06fc9 tests: regressions: Skip test on aarch64 which also does not support IDE. 2014-07-15 22:56:22 +01:00
Richard W.M. Jones
fe9d3f7a90 ocaml: Ignore Warning 3: deprecated feature: String.* functions.
In OCaml 4.02, the 'string' type can be made immutable.  All String.*
functions that are concerned with creating or mutating strings now
give a warning like this:

  Warning 3: deprecated feature: String.unsafe_set

Disable this warning since we don't want to turn on immutable strings
yet.
2014-07-15 17:51:52 +01:00
Richard W.M. Jones
d71ec218ea aarch64: Add some earlyprintk debugging. 2014-07-15 17:44:37 +01:00
Richard W.M. Jones
57c7417f89 aarch64: Use console=ttyAMA0 instead of console=ttyS0.
This still only prints early console messages.  Output stops
after:

  bootconsole [earlycon0] disabled

but I have not found any way to get later kernel messages.
2014-07-15 17:44:37 +01:00
Richard W.M. Jones
9d8ede1ae4 sysprep: Standard exception handling, taken from virt-builder & virt-v2v. 2014-07-15 17:38:32 +01:00
Richard W.M. Jones
f913ca5ebc customize: Use Common_utils.error function instead of failwith.
This is just code refactoring.
2014-07-15 17:38:32 +01:00
Richard W.M. Jones
82cf3c9d68 customize: Update copyright messages.
No functional change.
2014-07-15 17:38:32 +01:00
Richard W.M. Jones
f955fec760 docs: Remove useless "SHELL QUOTING" section from manual pages. 2014-07-15 17:38:31 +01:00
Richard W.M. Jones
9b47a53a4b sparsify: Add --tmp prebuilt:file option.
This option allows oVirt to pass a prebuilt qcow2 file to use as the
temporary overlay.  The file must be qcow2, and must have indisk as a
backing file - the code does minimal checks to ensure this is correct.

Example usage:

  qemu-img create -f qcow2 -b indisk overlay.qcow2
  virt-sparsify indisk --tmp prebuilt:overlay.qcow2 outdisk

Note this only applies in copying mode.
2014-07-15 17:38:31 +01:00
Pino Toscano
66aa98265d appliance: init: run ldconfig
Run ldconfig early in the init script, so libraries outside standard
library paths but with a proper ld.so configuration file pointing at
them can be found.
2014-07-15 11:06:32 +02:00
Richard W.M. Jones
a791e08163 RHEL 6: p2v: Add fix for older PCRE.
RHEL 6 pcre did not define PCRE_PARTIAL_SOFT.  However PCRE_PARTIAL is
a synonym so use that.
2014-07-11 10:40:06 +01:00
Richard W.M. Jones
17bf3ce21c Version 1.27.21. 2014-07-08 14:11:57 +01:00
Richard W.M. Jones
f296d34f3b v2v: Add partial support for converting Windows guests.
This is not yet complete.
2014-07-08 14:11:48 +01:00
Richard W.M. Jones
2ee1fb6472 builder: CentOS 7.0 2014-07-08 10:12:10 +01:00
Pino Toscano
71ac957d4a Use Mkdtemp.temp_dir instead of Mkdtemp.mkdtemp 2014-07-07 19:33:44 +02:00
Pino Toscano
c8f3e99302 mllib: introduce Mkdtemp.temp_dir
Add a simple function to ease the usage of Mkdtemp.mkdtemp.
2014-07-07 19:30:29 +02:00
Pino Toscano
3fc6983b16 inspect: ignore /etc/fstab with no entries (RHBZ#1113156).
Just like no /etc/fstab is not an error, having one with no entries
shouldn't be an issue either.

With systemd, this could be a valid setup, with mount points set its own
way.
2014-07-07 11:40:19 +02:00
Richard W.M. Jones
3f2e18efde valgrind: Add suppress for libvirt memory leak in virFileFindResourceFull.
https://bugzilla.redhat.com/show_bug.cgi?id=1116427
2014-07-04 15:48:36 +01:00
Richard W.M. Jones
2fe74642f4 launch: direct: Use -cpu host when using KVM on x86.
This is the same as what the libvirt backend does.
2014-07-03 12:16:32 +01:00
Richard W.M. Jones
fc9647bb4d mllib: Remove trailing whitespace.
This fixes commit b24b0b17a8.
2014-07-02 23:09:53 +01:00
Richard W.M. Jones
bf47ed1b6a tests: qemu: Test force_tcg setting is effective. 2014-07-02 18:20:51 +01:00
Richard W.M. Jones
2369e9c2d6 log: Pass correct parameter to localtime_r on 32 bit platforms.
We were passing an int64_t which happens to be the same as time_t, but
only on 64 bit.  This didn't work on 32 bit (or rather, it works on
little endian, but only by accident).

This fixes commit fb546eaee0.
2014-07-02 16:51:36 +01:00
Richard W.M. Jones
a2747578eb journal: Fix binding of sd_journal_get_realtime_usec on 32 bit machines.
sd_journal_get_realtime_usec is defined as:

    int sd_journal_get_realtime_usec(sd_journal* j, uint64_t* usec);

Unfortunately we passed size_t* as the second argument.  This happened
to work on 64 bit machines because size_t is 64 bit there, but failed
on 32 bit machines, where we didn't pass a sufficiently large result
buffer.

This fixes commit 2d996df66c.
2014-07-02 16:51:36 +01:00
Richard W.M. Jones
1e1d7cf6af excludefiles: Exclude various common log files when building the appliance.
These log files can get pretty big, and that causes problems
like this one:

http://linuxforum.ru/viewtopic.php?id=35381

and this one:

https://bugzilla.redhat.com/show_bug.cgi?id=1099172

In both cases the problem was /var/log/lastlog which is apparently a
large sparse file.  Supermin cannot cope with sparseness, so it copies
the whole file non-sparse.  But since this could affect other log
files this commit covers various common log file names and patterns.

Thanks: semperN
2014-07-02 14:27:53 +01:00
Richard W.M. Jones
f40e11ace4 Version 1.27.20. 2014-07-02 13:54:16 +01:00
Richard W.M. Jones
5d48f7a792 Update gnulib to latest version. 2014-07-02 13:22:18 +01:00
Richard W.M. Jones
144a86ac8c v2v: Change fstrim message to warning.
This also ensures it is flushed and translated.
2014-07-01 16:21:55 +01:00
Richard W.M. Jones
dbe0b69f24 v2v: Remap block device names in grub & /etc/fstab.
eg. Change /dev/hda to /dev/vda
2014-07-01 16:21:55 +01:00
Richard W.M. Jones
120d61cf56 v2v: Kill kudzu dead. 2014-07-01 16:21:55 +01:00
Richard W.M. Jones
838dce6557 v2v: When converting Linux guests, rebuild the initrd.
It probably needs to be rebuilt to add virtio drivers.
2014-07-01 16:21:55 +01:00
Richard W.M. Jones
a32d92e420 v2v: When inspecting Linux guests, collect kernel version & location of initrd file too. 2014-07-01 16:21:54 +01:00
Richard W.M. Jones
5cf5c3f1c7 v2v: Change source disk into a struct.
Simple code refactoring, allowing us to collect the target/@dev
attribute in this (now) structure.
2014-07-01 16:21:54 +01:00
Richard W.M. Jones
544b087d4b generator: Sort the structs.
Sort the structs when generating code.  Since the structs are
logically indepedent of each other, this should have no effect except
to make generated files list the structs in a different order.

However this also fixes the following build problem:

  File "convert_linux.ml", line 322, characters 43-50:
  Error: This expression has type G.stat = Guestfs.stat
    but an expression was expected of type G.dirent = Guestfs.dirent

It turns out the OCaml bindings don't like the fact that we have
two structs with a common field name (dirent.ino and stat.ino).

In OCaml < 4.01, this means that any attempt to reference stat.ino
would fail because dirent.ino appears second in the file, overriding
stat.ino.

Sorting the structs has the side effect of making stat.ino appear
second, thus resolving the build failure above.

In OCaml >= 4.01 the compiler now uses some disambiguation rules based
on the known types to resolve this problem, so accessing either field
would work no matter what order they are listed in.

See:

http://ocaml.org/releases/4.01.0.html
http://www.lexifi.com/blog/type-based-selection-label-and-constructors
http://www.lexifi.com/blog/ocaml-extensions-lexifi-overidding-record-labels-and-constructors
2014-07-01 16:21:54 +01:00
Richard W.M. Jones
16e817456c v2v: Modify conversion step to first do proper inspection and data
gathering about the guest.
2014-06-25 13:58:32 +01:00
Richard W.M. Jones
b6b9b90dd7 Use -v and -x flags consistently across OCaml virt-* tools.
virt-customize:
virt-sparsify:
virt-sysprep:
virt-v2v:
  - These tools consistently used -v to mean verbose/debugging
    and -x to mean enable libguestfs tracing.

virt-builder:
virt-resize:
  - These two tools did not recognize -x at all, and used -v
    to enable libguestfs tracing and general debugging.
  - This commit changes these two tools to consume -v/-x
    consistently with the other tools.

Unfortunately this has a cascade of effects through the code.
2014-06-24 16:54:32 +01:00
Richard W.M. Jones
5d3ec4474c mllib: Rewrite text wrapping function so it can handle newlines within the text. 2014-06-24 16:19:23 +01:00
Richard W.M. Jones
9aa0969d8d virt-cat, virt-ls, virt-edit: Fix typo in documentation.
This fixes the following:
 commit aad3c467fb
 commit de5e7331af
 commit 86706907af
2014-06-24 12:24:53 +01:00
Richard W.M. Jones
e46bbb45d1 Version 1.27.19. 2014-06-24 08:28:28 +01:00
Richard W.M. Jones
77a963886f v2v: Refactor common code for listing files in packages.
At some point we should make these into real libguestfs inspection
APIs.  However they are fairly hard to implement, at least for RPM.
2014-06-23 21:58:11 +01:00
Richard W.M. Jones
7a68afed14 v2v: Move app2_version comparison functions to utils.
Refactoring.
2014-06-23 21:58:11 +01:00
Richard W.M. Jones
5b29d9a1a8 v2v: Create apps_map when doing inspection step. 2014-06-23 21:58:11 +01:00
Richard W.M. Jones
6705be2379 v2v: Create a shared StringMap module. 2014-06-23 21:58:11 +01:00
Richard W.M. Jones
9975bf8eb3 v2v: Rename Convert_linux_enterprise -> Convert_linux.
Just module rename.
2014-06-23 21:58:11 +01:00
Richard W.M. Jones
76bf3f7289 v2v: Rename Convert_linux_common -> Lib_linux.
Just library name refactor.
2014-06-23 21:58:10 +01:00
Richard W.M. Jones
6f73266363 mllib: Add a common 'warning' utility function.
This commit changes many places in OCaml utilities that print
warnings to use the warning function instead.
2014-06-23 21:58:10 +01:00
Richard W.M. Jones
b24b0b17a8 mllib: Add an interface for Common_utils library.
It turned out that Common_utils was exporting the 'G' module (an alias
for Guestfs).  We want any code that uses G as a shortcut to declare:

  module G = Guestfs

at the top, since that avoids confusion for newbie (or experienced)
OCaml programmers.
2014-06-23 21:58:10 +01:00
Richard W.M. Jones
273f346465 v2v: Warn only if virtio packages are missing from the guest.
In this version of virt-v2v you have to install a virtio
capable kernel before doing the conversion.
2014-06-23 21:58:10 +01:00
Richard W.M. Jones
8ed27e7865 v2v: In convert function, add a hash of app name -> app structure.
For quicker lookups than searching the linear list.
2014-06-23 21:58:10 +01:00
Richard W.M. Jones
7b89f657c4 mllib: Move common code for comparing version strings to library. 2014-06-23 21:58:10 +01:00
Richard W.M. Jones
90bf3422c5 v2v: When parsing input libvirt XML, get correct disk image format.
Old Xen PV guests had:

      <driver name='tap' type='aio'/>

The previous xpath expression matched any driver type attribute in
order to pick up the format.  However we only want to match:

      <driver name='qemu' type='raw'/>

so we need to check the name attribute as well.
2014-06-23 21:58:09 +01:00
Richard W.M. Jones
af31670d03 v2v: Avoid segfault if xpath expression doesn't match any nodes.
I'm not sure if this indicates that the xpath expression is wrong, but
in any case it can be that xpathobj->nodesetval is NULL.  In this
case, return 0 from xpathobj_nr_nodes instead of segfaulting.
2014-06-23 21:58:09 +01:00
Richard W.M. Jones
877583a6f4 v2v: In -o local mode, name disks <name>-sda instead of disk-sda.
This allows us to use the same shared output directory for multiple
parallel tests.
2014-06-23 21:58:09 +01:00
Richard W.M. Jones
8ad5698d02 v2v: Print \n after warnings.
Using eprintf so this is not implicit (unlike 'error' function).
2014-06-23 21:58:09 +01:00
Richard W.M. Jones
beef28fe96 v2v: Dump out 'source' structure when debugging. 2014-06-23 21:58:09 +01:00
Richard W.M. Jones
2f61634215 v2v: string_of_overlay already has trailing \n, don't need to add one. 2014-06-23 21:58:09 +01:00
Richard W.M. Jones
437e387c4d v2v: Print qemu-img source overlay command when using -v. 2014-06-23 21:58:08 +01:00
Richard W.M. Jones
c62dbb8afd run: Add v2v/ subdirectory to $PATH. 2014-06-23 21:58:08 +01:00
Richard W.M. Jones
27e1b6ca8b v2v: Allow relative paths to appear in -i libvirtxml input.
When writing libvirt XML by hand, or for tests, this is
immensely useful.
2014-06-23 21:58:08 +01:00
Richard W.M. Jones
c3c659e996 rescue: Use guestfs_add_drive_scratch to implement the --scratch option. 2014-06-23 21:58:08 +01:00
Richard W.M. Jones
bb3ba0c43a options: Compile out part of union which cannot be used when not compiling guestfish. 2014-06-23 21:58:08 +01:00
Pino Toscano
86706907af edit: add -m option
Implement the -m/--mount as available in guestfish to override the
automatic introspection and specify which partitions to mount instead.
2014-06-23 15:56:15 +02:00
Pino Toscano
de5e7331af cat: add -m option
Implement the -m/--mount as available in guestfish to override the
automatic introspection and specify which partitions to mount instead.
2014-06-23 15:54:00 +02:00
Pino Toscano
aad3c467fb ls: add -m option
Implement the -m/--mount as available in guestfish to override the
automatic introspection and specify which partitions to mount instead.
2014-06-23 14:44:40 +02:00
Richard W.M. Jones
54c77f99cc builder: Update centos.sh to add CentOS 7 QA. 2014-06-20 11:08:24 +01:00
Richard W.M. Jones
8d6cbd05ca website: Install HTML version of the virt-log(1) man page on the website. 2014-06-17 17:40:48 +01:00
Richard W.M. Jones
cd111bd0e3 virt-v2v: Remove text from README, moved into test data repo.
There is (will be) a new repository containing the large/proprietary
test images.  Move the README related to this to the new repo.
2014-06-17 17:40:00 +01:00
Richard W.M. Jones
e6a067e183 Version 1.27.18. 2014-06-16 12:49:02 +01:00
Richard W.M. Jones
98a1392849 virt-log: Fix memory leak because of wrong type of CLEANUP_* function.
This fixes commit a3475cf9bbbbd3514b117d5edd75d9c0e239d43a.
2014-06-16 12:25:05 +01:00
Richard W.M. Jones
cd15b2ead6 Version 1.27.17. 2014-06-16 10:53:59 +01:00
Richard W.M. Jones
c1dd8e80ba tests/guests: Add new file debian-syslog to EXTRA_DIST.
This fixes commit 026342a7ee.
2014-06-16 10:50:58 +01:00
Richard W.M. Jones
0c38cd4d25 virt-log: Add support for displaying the Windows Event Log.
Uses the external program python-evtx, and this only works
for Windows >= Vista.
2014-06-16 10:32:10 +01:00
Richard W.M. Jones
d167da86d9 virt-log: do_log_journal: return instead of exiting immediately.
This cleans up commit a3475cf9bbbbd3514b117d5edd75d9c0e239d43a.
2014-06-16 10:32:10 +01:00
Richard W.M. Jones
fb546eaee0 New tool: virt-log: It lists log files from within the guest.
See 'TODO' file for suggested future improvements.
2014-06-14 13:58:45 +01:00
Richard W.M. Jones
026342a7ee tests: guests: Add a text syslog file to the phony Debian guest. 2014-06-14 13:38:56 +01:00
Richard W.M. Jones
2d996df66c New API: journal_get_realtime_usec
This adds a binding for sd_journal_get_realtime_usec(3).
2014-06-14 13:38:56 +01:00
Richard W.M. Jones
e5276e4455 Version 1.27.16. 2014-06-13 22:48:18 +01:00
Richard W.M. Jones
31c07bc9d8 podwrapper: Put =encoding line before first POD directive.
=head isn't always the first POD directive.

This fixes commit 1148bd91ce.
2014-06-13 22:44:38 +01:00
Richard W.M. Jones
1148bd91ce podwrapper: Put the =encoding line at the correct place in the input (RHBZ#1109174).
Commit c4dc70f8c4 broke the man pages
for the Perl scripts in the tools/ directory.

It inserted the =encoding line at the top of the file, instead of in
front of the first =head1 entry, and this meant that the #!/usr/bin/perl
and the prologue became a part of the POD, which was not intended.
2014-06-13 19:59:22 +01:00
Richard W.M. Jones
870c17e99a sparsify: Add --tmp option to allow specifying temp directory or block device.
Add the virt-sparsify --tmp option.

This works in two ways.  Either you can specify a temporary directory,
in which case it's just the same as setting $TMPDIR before:

  virt-sparsify indisk outdisk --tmp /var/tmp

Or, as a new feature, you can specify a block device which is directly
used (and OVERWRITTEN):

  virt-sparsify indisk outdisk --tmp /dev/sdX

This is useful for oVirt nodes, where there is limited temporary
space, but a block device can be assigned to the node.

In both cases it is only used in copying mode.  In-place
sparsification doesn't require large amounts of temporary space.
2014-06-13 19:59:22 +01:00
Richard W.M. Jones
893bfe2e36 mllib: Create a common utility function is_directory.
This is a wrapper around Sys.is_directory which doesn't throw
exceptions.
2014-06-13 19:59:22 +01:00
Richard W.M. Jones
9b5cdc8747 fuse: UID 0 should override all permissions checks (RHBZ#1106548).
Previously if you were root, and you tried to change directory into a
directory which was not owned by you and not readable (eg. 0700
bin:bin), it would fail.

This doesn't fail on regular directories because when you are root the
kernel just ignores permissions.

Although libguestfs in general tries not to duplicate kernel code, in
the case where we emulate the FUSE access(2) system call,
unfortunately we have to do it by stat-ing the object and performing
some (half-arsed) heuristics.

This commit modifies the FUSE access(2) system call, so root is now
able to chdir to any directory.

It also adds some debugging so we can debug these complex permissions
checks in the field if some other problem arises in future.
2014-06-13 19:59:22 +01:00
Richard W.M. Jones
87ac1c186e builder: Don't copy *.xz files to WEBSITEDIR. 2014-06-12 22:18:02 +01:00
Richard W.M. Jones
bacc7fd0a3 builder: Rebuild Fedora 19 disk image with Xen drivers. 2014-06-12 22:13:25 +01:00
Richard W.M. Jones
005316b7d8 builder: Get rid of remaining disk image signatures.
These were deprecated and replaced in virt-builder 1.24.1.
2014-06-12 15:48:55 +01:00
Richard W.M. Jones
58ea77e79b builder: Update Fedora 20 image, with Xen drivers.
This commit also removes the disk image signature.  These have not
been needed since virt-builder 1.24.1.  No one should be running that
version of virt-builder since there are newer 1.24 branch versions.
2014-06-12 15:48:55 +01:00
Richard W.M. Jones
0fa52e4e45 builder: Fedora: Enable Xen driver support.
See:
https://www.redhat.com/archives/libguestfs/2014-June/thread.html#00045

Notes:

(1) Edit dracut configuration to make sure the change is permanent, in
case kickstart, virt-builder or something else installs a kernel or
runs dracut.

(2) We need to run dracut on the just-installed kernel, not on the
running kernel.  The snippet to do this was copied from the Fedora
cloud kickstart.

Thanks: Olaf Hering, George Dunlap, Dario Faggioli.
2014-06-12 15:48:54 +01:00
Richard W.M. Jones
d4d6540b24 builder: virt-install now requires '--serial pty' parameter.
This updates commit 73ebaa3066.
2014-06-12 15:48:54 +01:00
Richard W.M. Jones
73ebaa3066 builder: virt-install now seems to require '--serial pty' option. 2014-06-11 12:43:03 +01:00
Richard W.M. Jones
99472ab2e9 builder: Further updates to RHEL 7 GA script.
The location of the trees have moved ... again.
2014-06-11 12:42:08 +01:00
Richard W.M. Jones
24800d2e96 builder: Update rhel.sh script for RHEL 7 GA.
Set the rootfs for RHEL 7.x to xfs.  (/boot is ext4)

Remove old RHEL 7 beta & rc releases.
2014-06-11 08:21:34 +01:00
Richard W.M. Jones
0dbdc470ed Version 1.27.15. 2014-06-10 21:10:27 +01:00
Richard W.M. Jones
7faa602e8f launch: libvirt: Only use serial BIOS (sgabios) on x86.
This device is not present at least on ARM.  Unfortunately libvirt
doesn't give us any way to query when the device is present.

This fixes commit bed592498d.
2014-06-10 19:31:06 +01:00
Pino Toscano
e6a858907f appliance: init: properly set PS1 and TERM for virt-rescue (RHBZ#812970).
Setting environment variables such as PS1 for bash before starting it
might not be effective when the startup scripts provided by the
distribution unconditionally change it.
Hence, set PS1 and TERM in a ~/.bashrc, which will be source'd last and
thus be able to set them the way we want.
2014-06-10 19:09:43 +01:00
Pino Toscano
844066597d daemon: grub: show grub-install's output on error if verbose 2014-06-10 19:09:43 +01:00
Pino Toscano
45db96b00d daemon: print parameters for vgchange in error messages 2014-06-10 19:09:43 +01:00
Pino Toscano
134ac97d22 daemon: retire the augeas feature
Augeas has been a mandatory dependency of libguestfs for quite some
time, so the aug_* functions could have been always called (without even
checking the augeas feature). Thus retire the feature, marking it as
always available with no more functions depending on it.
2014-06-10 11:15:50 +01:00
Pino Toscano
b28ef8791a builder: handle duplicated images (RHBZ#1092753).
Filter the available images, removing the versions with an older
revisions, and duplicates.
2014-06-10 11:14:04 +01:00
Pino Toscano
aeb8792474 inspect: tighten NetBSD detection
It seems recent (?) NetBSD versions have their kernel as /netbsd, so
also check for it to detect NetBSD installations.

The current detection so far basically relied on generic files and
directories which can potentially be in every UNIX system, misdetecting
them if a /etc/release file is present in them.
2014-06-10 11:12:35 +01:00
Pino Toscano
5efbc8922f fish: list also aliases in the guestfish help (RHBZ#1103877).
Output also the aliases (telling which function they refer to) in
`guestfish -h`, together with non-alias functions.
2014-06-10 11:08:28 +01:00
Pino Toscano
6577f34a68 appliance: remove extra comma in Mageia's list
Followup of commit 00d94d95c8.

Thanks Thierry Vignaud for the notice.
2014-06-09 09:59:20 +02:00
Richard W.M. Jones
0196724330 Version 1.27.14. 2014-05-30 18:08:26 +01:00
Pino Toscano
4d8ecb0d30 generator: fix daemon functions with optional params but no mandatory params
The
  struct guestfs_$function_args args;
declaration was not emitted in that case, leading to build failure.
2014-05-29 10:32:15 +02:00
Joseph Wang
00d94d95c8 appliance: Update packagelist for Mageia (RHBZ#1102448). 2014-05-29 08:46:20 +01:00
Richard W.M. Jones
ef49b297cc appliance: Increase udev timeout to 6000s (RHBZ#1096579).
If the image is located on NFS, and the NFS mount is performing a
large copy, then all other NFS operations stop.  This delay can be
large enough that we hit the current 10 minute timeout in udev.

Increasing this to 100 minutes is reported to cure the problem (in
reality we want udev to wait indefinitely).
2014-05-27 11:50:59 +01:00
Pino Toscano
917ca11a76 ruby: add :nodoc: comment for internal methods
This way they are ignored by rdoc.
2014-05-27 11:02:58 +02:00
Pino Toscano
e4005bd530 builder: support aliases for images (RHBZ#1098718). 2014-05-27 10:57:13 +02:00
Richard W.M. Jones
bed592498d launch: libvirt: Add -device sga (sgabios).
This feature was added to libvirt in 2011-07-08 so we can assume it
exists.

Thanks: Jiri Jaburek
2014-05-26 15:27:09 +01:00
Richard W.M. Jones
1fbf0a88f6 fuse: Make all the skip messages consistent in this test. 2014-05-25 22:34:51 +01:00
Richard W.M. Jones
f32aef2971 fuse: Skip test-fuse-umount-race.sh if backing file does not exist. 2014-05-25 22:34:04 +01:00
Richard W.M. Jones
068455f210 fuse: Skip guestmount --fd test if /dev/fuse does not exist.
When we run guestmount (eg. in Koji) it will fail anyway, so don't run
the test.
2014-05-25 22:28:27 +01:00
Richard W.M. Jones
2c460ac52f Version 1.27.13. 2014-05-24 19:17:46 +01:00
Richard W.M. Jones
32f5d99873 fuse: Add a test of guestmount --fd option (RHBZ#1100498). 2014-05-24 18:11:20 +01:00
Richard W.M. Jones
145c7ed5ee fuse: Add guestmount --fd option (RHBZ#1100498).
This implements the guestmount --fd option to allow you to run
guestmount captive under another process (typically using
`guestmount --fd=<FD> --no-fork').

See: https://bugzilla.redhat.com/show_bug.cgi?id=1100498
2014-05-24 18:11:20 +01:00
Hilko Bengen
a60212ee99 golang: Fix for out-of-tree builds
RWMJ:

This is half of a downstream Debian patch to fix out-of-tree builds
for golang.
2014-05-24 18:11:19 +01:00
Richard W.M. Jones
ee9981714f Version 1.27.12. 2014-05-23 11:04:20 +01:00
Pino Toscano
5d5e66ce33 daemon: scrub-file: resolve the path before calling scrub (RHBZ#1099490).
Resolve the given path within the chroot, so scrub can be invoked
outside the chroot on an already-resolved path.

Add few tests in scrub-file for this and other similar issues.
2014-05-21 15:03:17 +02:00
Pino Toscano
d7aec9c0d3 daemon: add sysroot_realpath
Similar to sysroot_path, but first resolves (using realpath) the given
path within sysroot.
2014-05-21 15:01:50 +02:00
Pino Toscano
05f84f4c21 Make realpath mandatory
commit a86eb0e0d2 made it an optional
feature, as on Windows it was not available; on the other hand, realpath
has been used unconditionally already for quite some time, so having
just the "realpath" command conditional on the presence of it does not
make much sense.

Drop the configure/build system handling of it, make the "realpath"
command no more optional, and keep the "realpath" feature as
unconditionally available now.
2014-05-21 14:58:40 +02:00
Pino Toscano
50ed922a02 generator: add always-available optgroups
Support the possibility to have optional groups always enabled (e.g.
because they were present in the past, and they need to be kept for
users).
Add and use few helper optgroups-related functions to deal also with
them.
2014-05-21 14:51:42 +02:00
Richard W.M. Jones
865f64006e ppc64: Use console=hvc0 console=ttyS0.
console=ttyS0 used to work.  Now it's broken again, and the correct
setting appears to be console=hvc0.  Since we can pass multiple
console settings, do that to try and catch the right console.
2014-05-21 09:36:34 +01:00
Richard W.M. Jones
84189b370a Update guestfs-release-notes.txt.
This updates commit a21dfc483c.
2014-05-20 13:13:39 +01:00
Pino Toscano
697b0d4678 fish: simplify output of 'supported'
Print each line at once, making use of the padding features of printf
instead of doing it manually.
2014-05-20 13:09:27 +01:00
Richard W.M. Jones
a21dfc483c Fix some spelling mistakes and typos in documentation (RHBZ#1099284). 2014-05-20 10:45:33 +01:00
Richard W.M. Jones
e014ef33ab Update BUGS. 2014-05-20 10:40:17 +01:00
Richard W.M. Jones
f49e003a87 p2v-iso: Add a kickstart target.
This also changes the old p2v-iso/README file into a POD file
which is installed as a manual page.
2014-05-19 22:26:53 +01:00
Richard W.M. Jones
1939cd4849 p2v-iso: unset CDPATH, set -e at the top of the virt-builder-target script. 2014-05-17 11:49:13 +01:00
Richard W.M. Jones
c65fbeebb8 configure: Move --with-default-backend test later in configure.ac.
For some reason this test was right at the top of the script.
2014-05-17 11:49:13 +01:00
Richard W.M. Jones
c5106511e0 build: Use AC_PROG_AWK to define the right awk to call.
We actually call plain 'awk' in many different scripts, but this
commit does not change all of those.
2014-05-17 11:49:13 +01:00
Richard W.M. Jones
044ecdb903 builder: Make the summary printed at the end easier to read.
This is just a whitespace change.  The new output looks like this:

                   Output file: fedora-20.img
                   Output size: 4.0G
                 Output format: raw
            Total usable space: 5.2G
                    Free space: 4.5G (86%)
2014-05-17 10:38:59 +01:00
Richard W.M. Jones
467bddd3b7 p2v-iso: Use xorg-x11-drivers meta-package to install Xorg drivers.
Thanks: Andrew Price.
2014-05-16 12:54:46 +01:00
Richard W.M. Jones
8e6ddbdf70 Version 1.27.11. 2014-05-16 11:10:06 +01:00
Richard W.M. Jones
a09146386c virt-p2v: Install the binary in libexecdir.
Previously it wasn't installed at all.  However it makes sense to
install it somewhere so that it can be placed in a package (a
requirement if we're going to create a kickstart).  By placing it in
libexecdir it is hopefully clear that it should not be used.

Note on Red Hat distros, libexecdir is usually /usr/libexec.  On
Debian it is usually /usr/lib/libguestfs.
2014-05-16 10:57:48 +01:00
Pino Toscano
45971ab952 build: bump the libsystemd-journal needed version to 196
Bump to >= v196 the minimum version of libsystemd-journal needed for the
journal integration, since that version provides
sd_journal_get_data_threshold and sd_journal_set_data_threshold.
2014-05-16 11:05:40 +02:00
Richard W.M. Jones
77166308fa Version 1.27.10. 2014-05-15 23:00:46 +01:00
Richard W.M. Jones
047b6d3050 Add p2v-iso directory containing scripts for building the virt-p2v ISO.
It is not possible to have the ISO be built automatically when the
user runs 'make'.  The README file describes how you should go about
building the ISO or disk image.
2014-05-15 22:05:39 +01:00
Richard W.M. Jones
fd82bb12fd New tool: virt-p2v.
This is a graphical standalone front-end to virt-v2v which can be run
on physical machines (usually linked into a ISO or PXE boot image) to
convert the physical machine to a virtual machine.
2014-05-15 22:05:39 +01:00
Richard W.M. Jones
0131d6f666 New tool: virt-v2v.
This is a rewrite of the original virt-v2v tool.  The original was
written by Matt Booth et al in Perl between 2009 and 2013.
2014-05-15 22:05:39 +01:00
Maros Zatko
40d9609b29 generator: Change link to OCaml tutorials. 2014-05-15 14:45:00 +01:00
Richard W.M. Jones
1a1cb1ec3c builder: Fix RHEL 5 download location.
This fixes commit 3bc9ba6c84.
2014-05-15 14:45:00 +01:00
Pino Toscano
d2bfe2cb24 builder: respect the proxy also when downloading images (RHBZ#1096465).
Missing from commit 87d79c2ee2.
2014-05-14 17:59:31 +02:00
Pino Toscano
b6c8afaee6 builder: save the proxy for each entry
Copy the information about the proxy of a source in all the entries of
that source; this way it is possible to use it later when accessing to
the actual image of an entry.
2014-05-14 17:28:13 +02:00
Richard W.M. Jones
3bc9ba6c84 builder: Fix RHEL script for RHEL 5.
Root partition is on /dev/sda2:

$ virt-filesystems -a rhel-5.10 --all --long -h
Name       Type        VFS   Label      MBR  Size  Parent
/dev/sda1  filesystem  ext2  /boot      -    510M  -
/dev/sda2  filesystem  ext4  /          -    4.5G  -
/dev/sda3  filesystem  swap  SWAP-hda3  -    1.0G  -
/dev/sda1  partition   -     -          83   510M  /dev/sda
/dev/sda2  partition   -     -          83   4.5G  /dev/sda
/dev/sda3  partition   -     -          82   1.0G  /dev/sda
/dev/sda   device      -     -          -    6.0G  -

It would be better if we could mount by label in guestfish ...

There is another problem with RHEL 5 guests in that the
yum URL is slightly wrong.
2014-05-10 20:20:56 +01:00
Hilko Bengen
75022489c8 appliance: update Debian-specific package list 2014-05-10 15:36:11 +02:00
Richard W.M. Jones
944a601020 builder: Add Ubuntu 14.04 disk image.
Also remove the Ubuntu 13.10 image, since it's not an LTS image.
2014-05-10 12:40:03 +01:00
Richard W.M. Jones
a1fcd2ca5f builder: ubuntu: Allow virt-install --os-variant to be specified on the command line.
Current virt-builder in F20 does not know about --os-variant=ubuntutrusty
so to build that you can now do:

  ./ubuntu.sh 14.04 trusty ubuntusaucy
2014-05-10 10:47:05 +01:00
Pino Toscano
c7888ac618 configure: always add the extra warnings
Get rid of --enable-gcc-warnings and just add all the warnings in any
case; they are tested anyway, so only warnings supported by the compiler
will be used.

Regarding -Werror, add a new --enable-werror which enables its use.
2014-05-09 15:06:50 +02:00
Pino Toscano
a880bc1eb0 tests/syslinux: add new syslinux 6+ path of mbr.bin
Reported in https://bugs.debian.org/746748.
2014-05-09 12:20:33 +02:00
Pino Toscano
f46d53be18 tests/syslinux: factorize search for mbr.bin 2014-05-09 12:19:47 +02:00
Richard W.M. Jones
5e574bb304 Version 1.27.9. 2014-05-07 14:56:15 +01:00
Pino Toscano
a651990fb1 test-charset-fidelity: allow to skip testing specific FSes
Allow to skip testing the filesystem "foo" if the environment variable
SKIP_TEST_CHARSET_FIDELITY_foo=1 is set. This way it possible to not
test one or more filesystems without disabling the test altogether.
2014-05-07 15:45:07 +02:00
Pino Toscano
3633109ff3 Fix handling of passwords in URLs
So far, passwords in URLs (eg http://user:password@host..) have been
handled as part of the username, and thus passing
  add-drive path username:username:password ...
instead of
  add-drive path username:username secret:password ...

Fix the parsing of URLs to handle passwords as separate elements,
properly passing it as "secret" parameter for add-drive, and properly
readd it when building URLs in the direct backend.

Furthmore, to keep curl- and ssh-based qemu drivers working with
authenticated resources, make sure they can accept secrets.

Reported in comment #1 of RHBZ#1092583.
2014-05-07 15:06:51 +02:00
Nikos Skalkotos
c24ce0811d inspect: Add support for Oracle Linux
Prior to this patch the library would return "rhel" instead of
"oraclelinux" for Oracle Linux OSes.
2014-05-07 10:03:00 +01:00
Richard W.M. Jones
9e82936393 New API: cpio-out converts a directory to cpio format.
This is useful for generating Linux initramfses from other types of
filesystems.  For example:

 guestfish --ro -a disk.img -i cpio-out / - | gzip -9 > initrd.img
2014-05-07 09:05:29 +01:00
Richard W.M. Jones
c67e16734c sparsify: Add a note about qcow2 internal snapshots not being copied (RHBZ#1094746). 2014-05-07 09:05:29 +01:00
Richard W.M. Jones
2bd75a1ea1 customize: random-seed file has moved again.
Thanks, systemd.
2014-05-07 09:02:21 +01:00
Pino Toscano
845daded5f lib: xmlParse{File,Memory} -> xmlRead{File,Memory}
Switch from xmlParse* to xmlRead* so we can explicitly specify parsing
flags, including no network usage and no entity resolution.
The two behaviours mentioned above were not done before either, so this
should not introduce behaviour changes in libguestfs.
2014-05-06 19:22:14 +02:00
Richard W.M. Jones
4dc42693f2 guestfs-recipes: Fix language. 2014-05-04 20:57:41 +01:00
Richard W.M. Jones
be874d7f50 Version 1.27.8. 2014-05-02 11:25:48 +01:00
Richard W.M. Jones
c2488b6ed8 builder: Add RHEL 7 signature to EXTRA_DIST.
This fixes commit fea553778a.
2014-05-02 11:25:48 +01:00
Richard W.M. Jones
0c1a4b1781 launch: direct: Turn gdb into a backend setting.
You can now use LIBGUESTFS_BACKEND_SETTINGS=gdb in order to enable gdb
debugging of the appliance.  This only works with the direct backend.
2014-05-02 11:25:48 +01:00
Hilko Bengen
c4a91a1866 launch: direct: Supply -M option when testing qemu for devices.
qemu-system-arm 2.0 as currently available through Debian/unstable
doesn't want to tell us anything about available devices unless we
specify a machine type.
2014-05-02 11:25:47 +01:00
Pino Toscano
1550a80d6c daemon: xattr: factorize do_getxattr and do_lgetxattr
Move all the common code to a new _getxattr function, much like done for
other xattrs operations.

Mostly code motion, no functional changes.
2014-04-30 15:52:49 +02:00
Richard W.M. Jones
fea553778a builder: Add RHEL 7RC disk image. 2014-04-29 23:00:40 +01:00
Richard W.M. Jones
df5bd5741b builder: Fix parallel builds of index-parse.o.
When parallel builds are enabled it was possible for index-parse.c to
be compiled before the file had been completely written by bison.  The
usual symptom was that the 'do_parse' symbol was missing -- this
simply happened because that symbol is defined at the end of this
file, and the compiler compiled the file before the end part was
written out.  But you could also see other strange & random compile
failures as you would expect.

This was tested by running this script on an 8 core server:

 cd builder/
 export MAKEFLAGS=-j9
 while make clean >/dev/null; make all V=1 >& /tmp/log; do echo -n . ; done

Previously it would fail after <= 5 iterations.  With this change it
runs for at least 100 iterations.
2014-04-29 15:43:20 +01:00
Richard W.M. Jones
50b207ca45 Add a regression test for RHBZ#1091803. 2014-04-28 09:52:22 +01:00
Richard W.M. Jones
efd159a063 tar-in: Fix places where we didn't cancel the receive (FileIn) correctly along error paths (RHBZ#1091803).
Thanks: Bo Fan.
2014-04-28 09:51:48 +01:00
Richard W.M. Jones
8df792d4a7 Version 1.27.7. 2014-04-23 19:50:37 +01:00
Pino Toscano
ae891bc5f5 builder: isolate all the cache handling to a new Cache module
While there is not that much in it, it groups together the small
scattered-around bits handling the cache directory.
2014-04-23 10:39:51 +02:00
Richard W.M. Jones
101d728e80 configure: Make sure grep matches qemu 2.x version string. 2014-04-22 22:47:06 -04:00
Pino Toscano
4f5dc4afdc builder: add "[ignored]" to parsing errors for .conf files
Parsing sources .conf files is not a fatal error (that file would just
be ignored), so explicitly state that such parsing errors are ignored.

This should address the last bit in RHBZ#1077817.
2014-04-22 17:58:27 +02:00
Pino Toscano
e7c746854b builder: add an optional suffix string for INI parsing errors 2014-04-22 17:57:05 +02:00
Richard W.M. Jones
3f4903e53a Version 1.27.6. 2014-04-22 14:14:12 +01:00
Richard W.M. Jones
b176bde942 FAQ: Describe better how to compile libguestfs from source using alternate qemu/supermin/kernel. 2014-04-22 13:32:49 +01:00
Pino Toscano
2f5e9066db ruby: tests: convert from Test::Unit to MiniTest (RHBZ#1085029)
Convert the tests to the MiniTest test framework, but keeping the usage
of the old Test::Unit as fallback in case MiniTest is not available.
In the latter case, use a bit of "glue" to make the old API look like
the new API, so we can just rely on the newer MiniTest API.
2014-04-22 14:02:35 +02:00
Pino Toscano
fbae7f3e69 ruby: tests: isolate boilerplate in common file
Isolate in a common file all the standard boilerplate in tests, i.e. the
import of the test framework and the guestfs module (including the
import path hack needed for the latter).

Thanks to Vít Ondruch for the precious hints and suggestions.
2014-04-22 14:02:29 +02:00
Pino Toscano
0316d24770 daemon: parted: part-get-name: switch from sgdisk to parted (RHBZ#1088424).
Use parted to get the name of partitions in GPT layouts instead of
sgdisk, to reduce the possible discrepancy between output of tools.

The actual case here is that recent parted versions fixed/improved their
UTF-16 handling of partition names in GPT, and sgdisk seems to not be
properly handling them, returning also unicode control bytes.
Since parted can provide partition names already, just make use of it.

Since sgdisk is no more needed for part_get_name, the function is no
more optional on it.
2014-04-22 13:59:59 +02:00
Richard W.M. Jones
909c10d758 sparsify: If using -v (verbose), ensure #disk_create runs verbose too. 2014-04-16 21:12:52 +01:00
Richard W.M. Jones
e1a82bb130 builder: If using -v (verbose), ensure #disk_create runs verbose too. 2014-04-16 21:12:30 +01:00
Richard W.M. Jones
9515345bbd builder: Suggest using virt-install --os-variant option in virt-builder man page. 2014-04-16 20:09:39 +01:00
Richard W.M. Jones
27355c9b0b disk-create: Fix this API so it works correctly with block devices (RHBZ#1088262).
When you call guestfs_disk_create on a block device with format=raw
then it will try to discard the blocks on the device.
2014-04-16 12:01:17 +01:00
Richard W.M. Jones
1898d457bd Version 1.27.5. 2014-04-15 23:29:03 +01:00
Richard W.M. Jones
3c260f23d4 configure: Fix tests of qemu on ARM.
qemu-system-arm now requires that you pass '-machine virt' (or some
-machine type) explicitly.

Change the configure test so it works on upstream ARM.
2014-04-15 18:13:43 -04:00
Pino Toscano
87d79c2ee2 builder: add per-repository proxy configuration
Add the possibility to configure the proxy in each repository .conf
file, specifying whether use no proxy at all, follow the system
configuration or use a specific proxy.
2014-04-15 15:55:51 +01:00
Richard W.M. Jones
040694ab79 Version 1.27.4. 2014-04-15 14:23:34 +01:00
Pino Toscano
8ae2a8a936 sysprep: remove also hidden files/dirs in temporary dirs
List manually and remove the content left (hidden files/directories) in
temporary directories after the glob listing & removal.
2014-04-14 14:18:41 +02:00
Richard W.M. Jones
8f3959e581 sparsify: Fix automake build.
Previous commit 97c57a8887 added a
potential bug in the sparsify build.  If virt-sparsify had used a
*.mli file then it would have tried to run a command like:

 ocamlc mlguestfs.cmxa -c foo.mli -o foo.cmi

This would fail because ocamlc doesn't know about native code
libraries (*.cmxa).  In fact virt-sparsify was not affected by this
because it doesn't use any *.mli files.

Fix this by adjusting the automake variables.
2014-04-14 11:42:33 +01:00
Pino Toscano
c78b932199 builder: set an empty XDG_CONFIG_HOME in tests
This way they are affected less by the environment.
2014-04-11 16:15:13 +02:00
Richard W.M. Jones
47ec61e9af listfs: If LDM not available, don't inhibit partition detection (RHBZ#1079182).
If a disk has type 0x42 partition (which would indicate LDM), but LDM
is not available then try parsing the partition anyway.  It might be
parseable as plain old NTFS.
2014-04-09 21:46:01 +01:00
Richard W.M. Jones
97c57a8887 sparsify: Use automake to build and link virt-sparsify binary.
There are two observations which make this possible: (1) virt-sparsify
contains at least one C unit, so automake thinks it is compiling a C
program.  (2) Automake lets us add a *_LINK rule to override linking.

We list the C sources of virt-sparsify as virt_sparsify_SOURCES, so
automake thinks it is building a C program as normal.

We override virt_sparsify_LINK to make it actually link an OCaml
program.

We add virt_sparsify_DEPENDENCIES listing the OCaml objects so that
they get built before linking.

We need a small linker script (link.sh) which adds some options at the
end of the linker command line which are impossible to add using pure
automake.

Inspired by the same idea in supermin:
https://github.com/libguestfs/supermin/blob/master/src/Makefile.am
2014-04-09 21:45:54 +01:00
Pino Toscano
65b8edda0a sysprep: remove ConsoleKit logs 2014-04-09 15:54:54 +02:00
Pino Toscano
54d1f6e611 sysprep: remove the exim logs 2014-04-09 15:54:54 +02:00
Pino Toscano
f7d2738902 sysprep: remove apt and aptitude logs 2014-04-09 15:54:54 +02:00
Pino Toscano
d413c94fa6 sysprep: remove debug, syslog and faillog logs 2014-04-09 15:54:53 +02:00
Pino Toscano
ccf84d7b80 sysprep: remove debian-installer files 2014-04-09 15:54:53 +02:00
Pino Toscano
b08955e76a sysprep: remove the lightdm logs 2014-04-09 15:54:53 +02:00
Pino Toscano
fc9a4221ba sysprep: remove more anaconda configs/logs 2014-04-09 15:54:53 +02:00
Pino Toscano
0c35c3addd sysprep: remove systemd journals 2014-04-09 15:54:53 +02:00
Richard W.M. Jones
ffffe71c16 build: Remove code coverage and code profiling options.
This reverts commit 5a2e320ec9.
2014-04-09 14:51:59 +01:00
Richard W.M. Jones
595bd5022a sparsify: Relax test constraint (RHBZ#1079210).
As long as over ~300MB is recovered, declare sparsification to be
successful in this test.

It looks as if the journal or other metadata takes up a variable
amount of space after sparsification.
2014-04-08 10:05:34 +01:00
Richard W.M. Jones
466885b226 configure: Add message about GNUlib tests.
Output was:

  yes

Now the output is:

  checking if we should run the GNUlib tests... yes
2014-04-07 13:18:34 +01:00
Pino Toscano
f63d827819 customize: add the chmod command
Add the chmod customize command to change the permissions of files.
2014-04-07 09:42:48 +02:00
Richard W.M. Jones
df0d197812 Version 1.27.3. 2014-04-06 16:19:33 +01:00
Richard W.M. Jones
7173883154 recipes: Update the section on installing packages.
Libguestfs >= 1.26 makes this easy.
2014-04-03 20:27:43 +01:00
Richard W.M. Jones
55437e459b mllib: utils: Add mapi function.
This is List.mapi from the stdlib.  RHEL 6 did not have this function.
2014-04-03 17:59:54 +01:00
Richard W.M. Jones
82b486a908 appliance: Avoid touching appliance/supermin.d directory.
We must avoid touching appliance/supermin.d unless it is necessary, so
that we avoid unnecessary rebuilds of the full appliance.
Unfortunately since we created temporary files there, even if we
didn't decide to keep those temporary files they would still end up
touching supermin.d.  To stop this, move the temporary files out.
2014-04-03 17:59:54 +01:00
Pino Toscano
b7ad029536 appliance: exclude pkg-config, doc-base, and reportbug stuff
Exclude the arch-independent pkg-config files (no pkg-config available
in the appliance).

Exclude also the doc-base and reportbug files, typically found in Debian
systems.
2014-04-03 15:26:26 +02:00
Richard W.M. Jones
d268cfd13e builder: Add test of virt-index-validate. 2014-04-03 08:58:46 +01:00
Richard W.M. Jones
358c6571d0 builder: Rearrange EXTRA_DIST in alphabetical order.
No functional change.
2014-04-03 08:45:31 +01:00
Richard W.M. Jones
795a162cee builder: Don't use configure to generate test-index file.
The file contained no replacement patterns so generating it
with configure did nothing.
2014-04-03 08:44:24 +01:00
Pino Toscano
9cbb619db2 builder: better handle some index parsing errors
Add a new lexer token, unused in the grammar, for the unknown lines in
index files; this should allow to better handle such kind of parsing
errors, removing the need to exit() directly (and leave things in an
unclean state).
2014-04-03 08:41:06 +01:00
Richard W.M. Jones
3fa5096f48 customize: Add a "finishing" message at the end.
Useful, mainly because it tells you the total time spent running.
2014-04-02 17:33:37 +01:00
Richard W.M. Jones
8c46a644bc customize: Add customize/*.ml files for translation. 2014-04-02 14:06:38 +01:00
Pino Toscano
84f646a41a src/launch: improve the addition of the no-hpet option
Since HPET is specific to x86, we can safely add it its option only on
x86 and x86_64 when creating the libvirt XML (no more hitting the
launching failures due to that on other architectures).

Regarding the direct qemu launch, since qemu 1.1 (which is our current
minimum) "-ho-hpet" appears in the help only where actually supported,
so we could just checking for it and adding it only if present. This
should fix the architecture issues on this backend as well.
2014-04-01 18:01:19 +02:00
Richard W.M. Jones
b03b3f6f46 sparsify: Reorder external programs in SEE ALSO section. 2014-04-01 14:56:32 +01:00
Richard W.M. Jones
07dff756a7 sparsify: Remove duplicate "EXIT STATUS" sections from man page. 2014-04-01 14:55:20 +01:00
Richard W.M. Jones
c58bef5125 Version 1.27.2. 2014-03-31 18:07:08 +01:00
Richard W.M. Jones
7c1d95cca0 rescue: Fix the --suggest regression test so it works when using UML backend.
The boot partition name is /dev/ubda1 in this case, so use a small sed
script to canonicalize it for the test comparison.

This fixes commit f6a37740f2.
2014-03-31 18:00:07 +01:00
Lee Yarwood
cf31656923 Add the now mandatory arch=ARCH field to the index file examples.
61323fa introduced a mandatory arch field within index files to
identify the architecture of the OS installed within a given template.
This change simply documents the requirement within the relevant
section of the virt-builder man page.

Signed-off-by: Lee Yarwood <lyarwood@redhat.com>
2014-03-31 17:43:27 +01:00
Richard W.M. Jones
4916806bdf Version 1.27.1. 2014-03-31 15:13:16 +01:00
Richard W.M. Jones
957afde13b python: Add README.txt to EXTRA_DIST. 2014-03-31 15:13:16 +01:00
Richard W.M. Jones
0d9a61a91d src: Fix test-utils.c to test the validate_guid function again.
This fixes commit 768ab2e01d.
2014-03-31 14:21:45 +01:00
Richard W.M. Jones
7e39cd4600 Remove internal libvirt_setlinux* APIs and use backend settings instead.
This removes the internal APIs internal_set_libvirt_selinux_label and
internal_set_libvirt_selinux_norelabel_disks.  The communication
between the libvirt domain and the backend now uses the backend
settings.
2014-03-31 14:21:45 +01:00
Richard W.M. Jones
5d4e4e7eca ocaml: Add ESRCH to Guestfs.Errno module. 2014-03-31 14:21:45 +01:00
Richard W.M. Jones
d137ad52c5 New APIs: set-backend-setting, get-backend-setting, clear-backend-setting.
Currently the backend settings are treated as a list of strings.  You
can set the whole list (clearing any strings there previously), but
you cannot search for an individual string or replace an individual
string.

This adds further APIs allowing you to do that.  We treat the backend
settings as a list of environment-like strings (ie.  name=value), and
add the following functions:

 - set-backend-setting (name, value)

   Set name=value.  Any previous settings of name are cleared.

 - get-backend-setting (name)

   Search for name or name=value and return the value.

 - clear-backend-setting (name)

   Remove any name or name=value settings.

This also adds a regression test.
2014-03-31 13:33:53 +01:00
Richard W.M. Jones
1893eaded0 handle: Free g->backend_settings.
This was not being freed, resulting in a memory leak if you used
LIBGUESTFS_BACKEND_SETTINGS.

Found by valgrind.
2014-03-31 13:33:53 +01:00
Richard W.M. Jones
6af2306730 python: Remove unnecessary library dependencies.
We can remove the deps on libxml2, libvirt and gnulib, by only linking
with utils.o (instead of utils.a).
2014-03-29 18:52:32 +00:00
Richard W.M. Jones
fcbfc4775f python: Add a Python setup.py script.
This is not used by libguestfs right now, but it does allow you to
build a python "distribution" of libguestfs, like this:

  make -C python sdist

The distribution tarball will be in python/dist/

You can copy the distribution tarball somewhere, unpack it, and use
regular 'python setup.py' commands such as:

  python setup.py build
  python setup.py install [--prefix=...]
  python setup.py --name

In future we hope to be able to upload the distribution tarball to
PyPi, but licensing issues prevent this at present.
2014-03-29 17:36:16 +00:00
Richard W.M. Jones
768ab2e01d utils: Move guestfs___validate_guid out of utils.c.
guestfs___validate_guid was a new function added to utils.c in
commit beef77403c.

However utils.c should not include <guestfs-internal.h> since the
other functions in this file can be used by all front-end code, not
just libguestfs.so.

This function is only needed in libguestfs.so, so move it to another
source file, and remove include of <guestfs-internal.h> from utils.c.

Also: use 'size_t' for counting, not 'int'.

This fixes commit beef77403c.
2014-03-29 17:12:47 +00:00
Richard W.M. Jones
bc1a415794 utils: Remove for-loop variable decl.
Breaks Python distutils which doesn't use C99:

utils.c: In function ‘guestfs___copy_string_list’:
utils.c:79:7: error: ‘for’ loop initial declarations are only allowed in C99 mode
       for (size_t j = 0; j < i; ++j)
       ^
utils.c:79:7: note: use option -std=c99 or -std=gnu99 to compile your code
2014-03-29 17:12:47 +00:00
Richard W.M. Jones
ebda77b647 virt-builder: Add --machine-readable option, as in virt-resize and virt-sparsify.
This makes it easier to query the virt-builder binary capabilities,
from external programs.
2014-03-29 15:09:19 +00:00
Richard W.M. Jones
30bdadf032 builder: Disable internal parallel xzcat on RHEL 6. 2014-03-29 14:55:01 +00:00
Richard W.M. Jones
eff7aed6cf builder: Remove recursive include of index-parse.h.
This breaks on Bison < 2.7, and seems unnecessary in any case since
the same file is included earlier.
2014-03-29 14:47:28 +00:00
Richard W.M. Jones
f6a37740f2 rescue: Add a regression test for virt-rescue --suggest option. 2014-03-28 14:38:06 +00:00
Richard W.M. Jones
c8657535fd rescue: Don't leak various variables when using --suggest option with multi-boot guests.
This fixes a leak which was introduced in
commit 4255db65e5.

Found by Coverity.
2014-03-28 14:37:58 +00:00
Richard W.M. Jones
15b06d6100 make-fs: Close FILE* along error path.
Found by Coverity.
2014-03-28 14:01:19 +00:00
Richard W.M. Jones
410aae4b6f make-fs: Check for error return from guestfs_statvfs.
Found by Coverity.
2014-03-28 13:59:56 +00:00
Richard W.M. Jones
4cea94a958 daemon: parted: part-get-name: Don't leak partition type string.
Found by './configure --enable-valgrind-daemon'.

This fixes commit 820b870167.
2014-03-28 12:35:25 +00:00
Richard W.M. Jones
a7a239f7ab builder: Use libgnu.la instead of -lgnu.
This updates commit effcb99f83.
2014-03-28 09:57:07 +00:00
Olaf Hering
effcb99f83 builder: Link virt-index-validate with gnulib.
[Gnulib tries to replace getopt because of the bug shown below.
However because -lgnu was not used in the Makefile, the replacement
failed. -- RWMJ]

from config.log:

             /* This code dumps core on glibc 2.14.  */
             {
               static char program[] = "program";
               static char w[] = "-W";
               static char dummy[] = "dummy";
               char *argv[] = { program, w, dummy, NULL };
               optind = opterr = 1;
               if (getopt (3, argv, "W;") != 'W')
                 result |= 64;
             }

gdb --quiet --readnow ./conftest -ex r -ex bt -ex detach -ex q
Reading symbols from /usr/src/packages/BUILD/libguestfs-1.26.0/conftest...expanding to full symbols...done.
Starting program: /usr/src/packages/BUILD/libguestfs-1.26.0/conftest
Missing separate debuginfo for /lib64/ld-linux-x86-64.so.2
Try: zypper install -C "debuginfo(build-id)=5d1a12e6f0e95331cc4e39df74ecbd5adb76a1f7"
Missing separate debuginfo for /lib64/libc.so.6
Try: zypper install -C "debuginfo(build-id)=a06caa12df8f953a453befa827c3145adaf6269a"
main(323) result 0
main(344) result 0
main(357) result 0
main(370) result 0

Program received signal SIGSEGV, Segmentation fault.
0x00007ffff7b2dbf8 in _getopt_internal_r () from /lib64/libc.so.6
Detaching from program: /usr/src/packages/BUILD/libguestfs-1.26.0/conftest, process 31042

This change actually fixes build for me on sles11sp3 and 11.4.
2014-03-28 09:53:39 +00:00
Richard W.M. Jones
a78cd210c3 Version 1.27.0. 2014-03-27 15:47:16 +00:00
Richard W.M. Jones
996eca5da7 Version 1.26.0.
New stable version.
2014-03-27 12:04:44 +00:00
Richard W.M. Jones
a20e368fea fish: Check return values from a couple of API calls.
Found by Coverity.
2014-03-27 11:34:40 +00:00
Richard W.M. Jones
be250948bc fish: Ignore return value from guestfs_user_cancel.
As we are in a signal handler, there's nothing else we can do.

Found by Coverity.
2014-03-27 11:34:05 +00:00
Richard W.M. Jones
4099880643 examples: Check return value from guestfs_list_filesystems.
Found by Coverity.
2014-03-26 20:25:05 +00:00
Richard W.M. Jones
7792278e05 virt-diff: Free memory along error path.
Found by Coverity.
2014-03-26 20:23:19 +00:00
Richard W.M. Jones
8da50e5a3f daemon: md: Whitespace fix. 2014-03-26 20:08:36 +00:00
Richard W.M. Jones
4caa2ea5ff daemon: ldm: Initialize glob_t struct before passing to glob.
Some implementations of glob might use fields in the struct, although
not glibc as far as I know.

Issue identified by Coverity.
2014-03-26 20:07:43 +00:00
Richard W.M. Jones
fe97d5ed9c builder: pxzcat: Ignore return value from posix_fadvise.
Quiets warning from Coverity.
2014-03-26 20:03:15 +00:00
Richard W.M. Jones
21390bc4aa Pull latest translations from Transifex. 2014-03-26 16:53:37 +00:00
Richard W.M. Jones
f566f176c6 Remove the ROADMAP file.
I don't think it provides any value now.  There is a list of bugs in
'BUGS' and a set of ideas in 'TODO'.
2014-03-26 16:48:37 +00:00
Richard W.M. Jones
0febb59afa Final updates to release notes for 1.26. 2014-03-26 13:35:05 +00:00
Richard W.M. Jones
a9b62321b6 Version 1.25.49. 2014-03-26 10:28:36 +00:00
Richard W.M. Jones
90973755b2 customize: Use --no-network flag so test works under UML. 2014-03-26 10:21:38 +00:00
Richard W.M. Jones
63f0ee9c57 Version 1.25.48. 2014-03-26 00:05:45 +00:00
Richard W.M. Jones
218ac6996b Further updates to the release notes, for 1.26. 2014-03-25 23:53:11 +00:00
Richard W.M. Jones
36f4f10581 Further updates to release notes, for 1.26. 2014-03-25 23:31:39 +00:00
Richard W.M. Jones
cec31436f8 customize: Rename main.ml to customize_main.ml.
The OCaml compiler isn't happy when two modules have the same name in
different directories.  Since customize/ contains a library of modules
used in other directories, and since those directories may have
main.ml files too, we need to rename 'customize/main.ml' to
'customize/customize_main.ml'.
2014-03-25 22:41:19 +00:00
Richard W.M. Jones
1a4709147a customize: Add various options from virt-builder.
This adds the following options to virt-customize:

  --attach
  --attach-format
  -m / --memsize
  --network / --no-network
  --smp

This fixes commit 2b208d84db.
2014-03-25 22:21:40 +00:00
Richard W.M. Jones
87fcb4df03 Add customize subdirectory to ./run script.
This fixes commit 2b208d84db.
2014-03-25 22:09:14 +00:00
Richard W.M. Jones
36f179fdfa Begin working on release notes for libguestfs 1.26 release. 2014-03-25 16:06:25 +00:00
Richard W.M. Jones
a70dd85a17 aarch64: Use -M virt to specify virtual machine type.
Thanks: Paolo Bonzini
2014-03-25 14:54:40 +00:00
Richard W.M. Jones
d6072de4ff arm: Replace #ifdef with #if defined, etc.
No functional change.
2014-03-25 13:46:13 +00:00
Richard W.M. Jones
afb74f104d aarch64: Cannot emulate IDE, like all non-PC. 2014-03-25 13:46:13 +00:00
Richard W.M. Jones
219c2ddf1b aarch64: This has no working hpet emulation, like ARM 32 bit. 2014-03-25 13:46:13 +00:00
Richard W.M. Jones
f8c83e801a aarch64: This has no PCI, like ARM 32 bit. 2014-03-25 13:46:13 +00:00
Richard W.M. Jones
d396ccb470 Open release notes for 1.26 release. 2014-03-25 13:11:45 +00:00
Richard W.M. Jones
40cac10b62 Update TODO with Python bindings suggestion. 2014-03-25 13:11:45 +00:00
Richard W.M. Jones
3d79c51a28 Update API support. 2014-03-25 13:11:23 +00:00
Richard W.M. Jones
7ad1683dae Version 1.25.47. 2014-03-25 12:51:25 +00:00
Richard W.M. Jones
2b208d84db Add virt-customize standalone tool.
This includes some simple tests and a manual page.
2014-03-25 12:41:04 +00:00
Richard W.M. Jones
aa3bc8b65d sysprep: Remove the --autorelabel (and related) options.
The customize module includes an --selinux-label option which can run
'fixfiles restore' (on most SELinux guests) or set /.autorelabel (on
some older ones).

Commit 49014f81f3 renamed the old
--selinux-label option to --autorelabel, but note this was not
included in a stable version of libguestfs.

Note this change leaves a bunch of now redundant code for detecting if
we created a new file in the guest.
2014-03-25 12:41:04 +00:00
Richard W.M. Jones
ae6f726ecc sysprep: Use customize module for customizing the guest after sysprepping.
Note this removes the following modules (all replaced by 'customize'):

 - delete       [--delete, --scrub]
 - firstboot    [--firstboot]
 - hostname     [--hostname]
 - password     [--password, --password-crypto, --root-password]
 - random-seed
 - timezone     [--timezone]
2014-03-25 12:41:04 +00:00
Richard W.M. Jones
51834ad219 customize: Add a --password option for setting user passwords. 2014-03-25 12:41:04 +00:00
Richard W.M. Jones
4b0b3589e8 customize: Move virt-customize-related code to a separate directory.
Split virt-builder into build and customize steps, so that we can spin
off a separate tool called 'virt-customize'.  This commit does not in
fact create such a tool, but it moves all the common code into a
library, in the customize/ subdirectory of the source.

Although this is mostly refactoring, it does change the order in which
virt-builder command line arguments are processed, so they are now
processed in the order they appear, not the inflexible fixed order
used before.
2014-03-25 12:41:04 +00:00
Richard W.M. Jones
8e386fc1be sysprep: Pass debug and quiet flags to all modules.
Also use the Common_utils.make_message_function function to print
messages (same as virt-builder).
2014-03-25 12:41:04 +00:00
Richard W.M. Jones
1edfdcbd58 sysprep: Allow order of operations to be specified by modules. 2014-03-25 12:41:04 +00:00
Richard W.M. Jones
f450fb4106 sysprep: Perform operations in alphabetical order.
Previously we ran them in essentially a random order, although it
might have looked alphabetical in some cases because the modules are
loaded in order.
2014-03-25 12:41:04 +00:00
Hilko Bengen
4a9581668c appliance: Not all of Grub is needed, only grub-install 2014-03-25 12:01:00 +01:00
Richard W.M. Jones
0116a482fc Update gnulib to latest.
Includes a fix for the missing 'git-log-fix' file.
https://lists.gnu.org/archive/html/bug-gnulib/2014-03/threads.html#00019
2014-03-25 10:47:53 +00:00
Pino Toscano
f80fc724bc php: raise the per-test timeout to 300 secs
Some tests might spawn an appliance, which will take time on slower
architectures and on some virtualized environments.
Hence raise the per-test timeout from the default of 60s to 300s (which
should be hopefully enough for now).
2014-03-24 17:05:14 +01:00
Pino Toscano
483f0e3096 virt-sparsify --in-place: remove image if discard is not supported
No point leaving it around if the test has been skipped.
2014-03-24 17:05:14 +01:00
Richard W.M. Jones
08234a1c48 po-docs: Do not translate "__AVAILABILITY__" placeholder.
This fixes commit da122e382f.
2014-03-24 14:19:32 +00:00
Pino Toscano
ad2c6a13b3 docs: remove customize-related files
The work on them has not been committed yet.
2014-03-24 15:13:13 +01:00
Richard W.M. Jones
da5b8b6d61 appliance: Fix quoting so that DEBIAN isn't always defined.
Because of incorrect quoting previously, the DEBIAN symbol
was always defined.
2014-03-23 21:56:29 +00:00
Richard W.M. Jones
07bf740238 Update gnulib to latest version. 2014-03-23 19:40:44 +00:00
Richard W.M. Jones
26599da373 ocaml: Enable parallel builds.
Commit f75142c577 disabled parallel
builds in the ocaml subdirectory (which was the correct thing to do).
This made building the OCaml tests in particular very slow.  Therefore
fix things so that parallel builds can be used again.

See also discussion here about different approaches:

https://www.redhat.com/archives/libguestfs/2014-March/thread.html#00223

This reintroduces commit dce94f3e26.
2014-03-23 18:35:35 +00:00
Richard W.M. Jones
da122e382f Update Ukrainian translations.
Contributed by: Yuri Chornoivan (via Transifex)
2014-03-23 12:59:18 +00:00
Richard W.M. Jones
f42769f94b virt-make-fs: Fix typo in error string.
Thanks: Yuri Chornoivan
2014-03-23 12:09:01 +00:00
Richard W.M. Jones
20f412637e builder: Fix typo in string.
Thanks: Yuri Chornoivan
2014-03-22 14:08:45 +00:00
Pino Toscano
e589b6e823 builder: do not parse the same repository file name twice
When parsing the repository configuration files, track the file names
parsed, and in case of same file name in multiple location consider only
the one in the directory coming before others in the prioritised list of
paths.

This way it is possible to "shadow" a configuration file in a system
path with one with the same name in a local directory, for example.
2014-03-20 16:57:29 +01:00
Pino Toscano
603ad40c5a builder: allow the index parser to parse files with no sections
Gracefully handle files with no sections; extend the validate.sh test
to try to validate an empty file.
2014-03-20 16:39:40 +01:00
Pino Toscano
fa0fed8a2d builder: allow to run website tests under valgrind 2014-03-20 16:39:40 +01:00
Richard W.M. Jones
37ed019f53 Version 1.25.46. 2014-03-20 15:28:57 +00:00
Richard W.M. Jones
4edf659aa0 php: Include new location of tests in EXTRA_DIST.
This fixes commit 251a1934c9.
2014-03-20 15:24:34 +00:00
Pino Toscano
62875c88be builder: clean the parsing structs on error 2014-03-20 15:36:38 +01:00
Pino Toscano
c6c27620d0 builder: rename and make public the section/field free functions
They will be needed also elsewhere.
2014-03-20 15:36:38 +01:00
Pino Toscano
87ed6365e4 builder/virt-index-validate: try to cleanup in any occasion
Always close the file (ignoring its result) after a parsing, and cleanup
the parse_context object before any exit().

This eases the debugging of memory issues in the actual parser.
2014-03-20 15:36:38 +01:00
Richard W.M. Jones
c7639495d7 Revert "appliance: Remove genisoimage from packagelist."
This reverts commit cd996642e0.

The daemon uses 'isoinfo' which is part of this package.

Thanks: Pino Toscano.
2014-03-20 14:34:58 +00:00
Richard W.M. Jones
cd996642e0 appliance: Remove genisoimage from packagelist.
It is not used by the daemon as far as I can tell.
2014-03-20 13:49:19 +00:00
Richard W.M. Jones
c4dc70f8c4 podwrapper: Remove =encoding from input files and add it back in podwrapper.
This changes podwrapper so that the input (POD) files should not
contain an =encoding directive.  However they must be UTF-8.
Podwrapper then adds the '=encoding utf8' directive back during final
generation.

This in particular avoids problems with nested =encoding directives in
fragments.  These break POD, and are undesirable anyway.
2014-03-20 13:47:19 +00:00
Richard W.M. Jones
ad33a5434c po-docs: Filter the po4a warning and =encoding line. 2014-03-20 13:47:11 +00:00
Richard W.M. Jones
420d324555 po-docs: There are no *.pl files in the po-docs subdirectories any longer. 2014-03-20 13:47:00 +00:00
Richard W.M. Jones
01548fd5b7 generator: Generate copyright notice in generated POD fragments.
Using =begin comment ... =end comment.
2014-03-20 13:46:53 +00:00
Richard W.M. Jones
d4129988c1 podwrapper: Give an error if an --insert or --verbatim pattern is not found in the input. 2014-03-20 13:46:45 +00:00
Pino Toscano
121c2894bc tests/run-xml-to-junit.xsl: allow to define a different classname
Read and use the classname attribute in each test if present, falling
back to "TestSuite" (used so far).
2014-03-19 18:30:58 +01:00
Pino Toscano
7c70429e2e builder: show the application name in errors of the index parser 2014-03-19 16:48:20 +01:00
Pino Toscano
15f04f21b9 builder: show the file name in errors of the index parser 2014-03-19 16:14:34 +01:00
Pino Toscano
c871ed6b50 builder: make the C index parser reentrant
Switch the lex/yacc parser into reentrant mode, to ease the handling of
parsing-specific data; introduce a new parser_context struct for that,
which is added as extra data to the parser.

This should cause no behaviour changes in the parsing, just no more
global variables used for getting data in/out the parser.
2014-03-19 15:42:45 +01:00
Pino Toscano
251a1934c9 php: move tests under a tests subdirectory
This eases fixes the classname in the junit output of run-tests.php,
which now can be properly handled by junit XML consumers.
2014-03-18 15:12:26 +01:00
Pino Toscano
7fb823e427 php: make the test suite failures fatal
So far the failure of some test would have not reported a non-zero
return value by run-tests.php. Since now all the PHP tests pass, we can
ask for failures to be fatal, by exporting REPORT_EXIT_STATUS=1 for
run-tests.php.
2014-03-18 14:38:02 +01:00
Richard W.M. Jones
d521f7c2e3 build: Disable a couple more ineffective warnings. 2014-03-17 21:05:18 +00:00
Richard W.M. Jones
19dcc0de1f Annual scavange to find mixed declarations and statements.
Hopefully this is just code motion.
2014-03-17 19:54:16 +00:00
Richard W.M. Jones
6035c764e6 build: Remove -Wno-declaration-after-statement.
We have generally forbidden declaration-after-statement in our code
(although there are plenty of places that do it).  In any case this
warning is not in the default set, so we don't need to turn off the
warning.
2014-03-17 19:50:37 +00:00
Richard W.M. Jones
931aec5b88 virt-sparsify --in-place: Exit with code 3 if discard is not supported.
Also skip the test in this case instead of failing.
2014-03-17 12:36:43 +00:00
Richard W.M. Jones
5e1fc4640d mllib: Allow exit code to be specified when calling 'error' function. 2014-03-17 12:22:50 +00:00
Richard W.M. Jones
6e99530ea8 launch: Return errno == ENOTSUP if discard is not supported. 2014-03-17 12:22:50 +00:00
Richard W.M. Jones
0563405d2e ocaml: Add Guestfs.Errno submodule exposing useful raw errno numbers.
For use when calling G.last_errno.
2014-03-17 12:22:50 +00:00
Richard W.M. Jones
996c0a2868 Version 1.25.45. 2014-03-16 22:55:52 +00:00
Richard W.M. Jones
455ccc15c3 Add tests/run-xml-to-junit.* to EXTRA_DIST. 2014-03-16 22:55:24 +00:00
Richard W.M. Jones
7fe365eee6 tests/regressions/rhbz895904.sh: Rewrite without multi-line expression.
RHEL 6-era bash cannot handle the multi-line $(...) expression in the
original code.  Rewrite the test so it is semantically the same but
doesn't have the expression that old bash can't handle.
2014-03-16 22:45:30 +00:00
Richard W.M. Jones
93335b5c4a appliance: init: Remove unnecessary comment, whitespace changes. 2014-03-15 15:46:54 +00:00
Richard W.M. Jones
bae2134aef tests/discard: sync before close isn't necessary.
However we should be calling shutdown, since we're writing to the disk
and need to catch qemu errors.
2014-03-14 13:20:22 +00:00
Richard W.M. Jones
d46ceea601 tests: fstrim: Sync before running fstrim.
This makes fstrim work.  It's not clear why exactly.

Thanks: Paolo Bonzini.
2014-03-14 13:19:42 +00:00
Richard W.M. Jones
55730f6118 Revert "tests: fstrim: Remount the disk."
This reverts commit accf1b66aa.
2014-03-14 13:19:42 +00:00
Pino Toscano
56efdb29bf tests: skip the output of test-virt-rescue.pl from RUN_OUTPUT_FILE
The output of test-virt-rescue.pl contains non-ASCII chars which give
troubles when being XSLT-transformed, so just avoid its output to leave
the rest of the resulting XML well-formed.
2014-03-14 13:52:09 +01:00
Pino Toscano
38fbda9d37 tests: provide a simple way to extract the tests data from run
If the RUN_OUTPUT_FILE environment variable is set, "run" will output
to the file indicated by that snippets of XML with the results and
outputs of the tests run.

Together with the run-xml-to-junit.sh (and its associated
run-xml-to-junit.xsl style sheet) it is possible to convert that output
file to a jUnit-like XML file, which could be used in CI systems.
2014-03-14 13:52:09 +01:00
Richard W.M. Jones
accf1b66aa tests: fstrim: Remount the disk.
This makes fstrim work.  It's not clear why exactly.
2014-03-14 10:09:47 +00:00
Richard W.M. Jones
9b883d3c3e tests/discard: Ensure a significant number of blocks are freed up on the host.
It's reasonable to expect megabytes will be freed up and given back to
the host.  Previously we just tested that at least 1 block was
released.  This test checks that at least 1000 blocks are released
(since stat(2) returns blocks of 512 bytes: 512 bytes * 1000 = approx 0.5 MB).
2014-03-14 09:42:31 +00:00
Richard W.M. Jones
8584c8cadf gobject: Don't ignore old generated files.
This was ignoring an old generated file (gobject/guestfs-gobject.h)
which, if still around, would break the build.
2014-03-13 13:51:21 +00:00
Richard W.M. Jones
b96dfa60d3 gitignore: appliance: Don't ignore some files which are now obsolete and should be removed. 2014-03-13 13:01:14 +00:00
Richard W.M. Jones
bd226af94b Version 1.25.44. 2014-03-13 10:57:47 +00:00
Pino Toscano
083203c635 php: fix crash with OStringList optional arguments
Properly initialize the variables for them to NULL, so there is no crash
because of trying to use rubbish pointers.

Kind of followup of commit 289fd29f0b.
2014-03-13 11:43:25 +01:00
Pino Toscano
e411cf8269 php: remove the custom "env" loading in tests
Other than being too late for changing environment variables like
LD_LIBRARY_PATH, now it is no more needed.
2014-03-13 11:43:24 +01:00
Pino Toscano
5fbbfe7440 php: add a custom PHP runner for tests
Since the default PHP test runner ignores a good number of environment
variables to potentially tampering the test suite execution, create a
custom php-for-tests.sh script which does nothing more than sourcing the
custom environment that our run-php-tests.sh outputs and running the
actual "php" executable (the one found by configure).

This fixes the loading of the guestfs_php.so module in the test suite,
as the libguestfs.so.0 library can be found by that module.
2014-03-13 11:43:24 +01:00
Richard W.M. Jones
04aaa6ddfc appliance: Fix 'make clean' in appliance subdirectory.
Commit 71dfd73042 broke 'make clean' in
the appliance subdirectory, so it would remove all the supermin.d/*
files, but without removing stamp-supermin so you couldn't rebuild
supermin.d/ with a 'make' afterwards.

In any case, 'make clean' is not supposed to delete the appliance
(which is expensive to rebuild).

Fix this so that 'make clean' doesn't remove supermin.d/* files.
'make distclean' can be used to delete this, and since it also removes
stamp-supermin, it will be recreated properly by 'make'.
2014-03-13 10:38:41 +00:00
Richard W.M. Jones
a13109c260 FAQ: Make issues which will be fixed in libguestfs >= 1.26 / supermin >= 5. 2014-03-13 10:38:41 +00:00
Richard W.M. Jones
8df1c47269 FAQ: Remove section that only applied to obsolete Fedora & RHEL releases.
Since this is fixed in all currently supported versions of Fedora
& RHEL, there's no need to document the problem in the FAQ.
2014-03-13 10:38:40 +00:00
Richard W.M. Jones
80d77e934f FAQ: Document virt-sparsify >= 1.26 can do in-place sparsification. 2014-03-13 10:38:40 +00:00
Richard W.M. Jones
b7cec3e8f4 sparsify: Add a test of the virt-sparsify --in-place option. 2014-03-13 10:38:40 +00:00
Richard W.M. Jones
e3a32f95d0 sparsify: Add virt-sparsify --in-place mode. 2014-03-13 10:38:40 +00:00
Richard W.M. Jones
b48e885004 sysprep: Add disks with discard = "besteffort".
Since virt-sysprep tends to delete a lot of files, adding discard
support to it makes some sense.

Note that this probably won't have any effect for most filesystems
since:

(a) ext4 mounts also need to use -o discard,

(b) ext4, and maybe others, require you to call fstrim explicitly,
they don't discard automatically (except for userspace tools like
mkfs.ext4 but that doesn't apply in this case).
2014-03-13 10:38:40 +00:00
Richard W.M. Jones
fb3afdff47 virt-format: Discard the data on the disks.
If possible, this means that the host will be able to reclaim most of
the space used by formatted disks.
2014-03-13 10:38:40 +00:00
Richard W.M. Jones
93f1bfcad7 Pass discard parameter from add-domain to add-drive.
Allow callers to specify that all the disks from a domain are added
with a specific discard mode (instead of always having discard
disabled).
2014-03-13 10:38:40 +00:00
Richard W.M. Jones
3106789d81 Pass cachemode parameter from add-domain to add-drive.
Allow callers to specify that all the disks from a domain are added
with a specific cachemode (instead of always having to use the
default, writeback).
2014-03-13 10:38:40 +00:00
Richard W.M. Jones
a9fc09366a tests: Add tests of discard support.
Test that blkdiscard, -o discard, and fstrim work in reality, end-to-end.
2014-03-13 10:38:40 +00:00
Richard W.M. Jones
b408419791 New API: blkdiscardzeroes - do discarded blocks read back as zeroes? 2014-03-13 10:38:40 +00:00
Richard W.M. Jones
452b228b46 New API: blkdiscard - discard all blocks on a block device. 2014-03-13 10:38:40 +00:00
Richard W.M. Jones
499b9ee416 New API parameter: Add discard parameter to guestfs_add_drive_opts.
This adds a discard parameter to guestfs_add_drive_opts which
approximately maps to the discard=ignore|unmap parameter supported by
qemu.

If discard is set to "enable" then we force discard=unmap (and try to
fail if it is not possible).  If discard is set to the more useful
"besteffort" option, then we enable discard if possible.  The default
is "disable".
2014-03-13 10:38:40 +00:00
Pino Toscano
53afa03af9 builder: fix typo in comment
Followup of commit b1cf6246f3.
2014-03-12 16:07:55 +01:00
Richard W.M. Jones
2489692067 sparsify: Move copying-mode code to a separate file.
This is just code motion.
2014-03-12 14:21:30 +00:00
Richard W.M. Jones
a665a570a3 sparsify: Refactor command line parsing to pass back a mode.
This is just code motion, but sets the ground-work for adding a second
mode (in-place image modification).
2014-03-12 14:21:30 +00:00
Richard W.M. Jones
63e836881e sparsify: Move command line parsing code to separate file.
This is just code motion.
2014-03-12 14:21:30 +00:00
Richard W.M. Jones
d263a301bf sparsify: Remove unused 'open' directive. 2014-03-12 14:21:30 +00:00
Richard W.M. Jones
8df13884df sparsify: Capture any exceptions and display nicer error messages.
This is just code motion, there is no functional change.
2014-03-12 14:21:30 +00:00
Richard W.M. Jones
073f90e681 sparsify: Remove unused variable definition. 2014-03-12 14:21:30 +00:00
Richard W.M. Jones
2b4baf3478 launch: libvirt: Move the is_kvm flag (derived from libvirt capabilities) to backend data struct.
This is just rearranging the data between structs.  There should be no
functional change.
2014-03-12 14:08:22 +00:00
Richard W.M. Jones
5e105e06be daemon: fstrim: Fix fstrim so it trims the correct filesystem.
We didn't call sysroot_path, so it was trimming the appliance instead
of the guest filesystem.
2014-03-12 14:08:22 +00:00
Richard W.M. Jones
46e30c1f7c daemon: fstrim: When debugging, capture and print fstrim -v output. 2014-03-12 14:08:22 +00:00
Pino Toscano
b1cf6246f3 builder: complete architecture handling
Add the possibility to choose which architecture use to build the wanted
image (--arch). Since this implies that running commands on the guest is
usually not possible when the architecture is different than the host
one, virt-builder will nevertheless try to check whether the host is
compatible with the guest, allowing to run commands only in that case.

The caching scheme is adapted to account for the architecture (with
--print-cache showing the architecture as well).
2014-03-12 15:06:55 +01:00
Pino Toscano
cc495247f2 builder: show the architecture in the short --list output
Just like the other --list output formats provide the architecture, show
them also in the short format.
2014-03-12 15:05:24 +01:00
Pino Toscano
7942cbf537 drivers: group drive creation params in an own struct
Group together all the various parameters (except the guestfs handle)
passed to the create_drive_*, to avoid passing all of them at every
function call.

This is mostly an internal refatoring with no behaviour change.
2014-03-12 15:03:56 +01:00
Richard W.M. Jones
013ed9f94b appliance: Cosmetic rearrangement of supermin.d/* targets.
No functional change.
2014-03-11 22:40:22 +00:00
Richard W.M. Jones
71dfd73042 appliance: Don't rebuild everything if just the daemon changes. 2014-03-11 22:38:23 +00:00
Pino Toscano
72d1a6335e builder: add languages.ml to POTFILES-ml
Followup of commit 3cffc28834.
2014-03-11 15:57:35 +01:00
Pino Toscano
6379c85d1f builder: output translated notes also in --notes 2014-03-11 14:25:39 +01:00
Pino Toscano
3cffc28834 builder: move some language-related code into a Languages module
Mostly code motion, no behaviour changes.
2014-03-11 14:20:22 +01:00
Pino Toscano
8ba31e69dc builder: use Filename.check_suffix
... instead of manually extracting and checking the suffix by ourselves
2014-03-10 13:42:16 +01:00
Richard W.M. Jones
596955c1b5 Version 1.25.43. 2014-03-08 12:57:23 +00:00
Richard W.M. Jones
29440e2fbc java: Complete test suite. 2014-03-08 12:47:44 +00:00
Richard W.M. Jones
6fa9e5dac7 java: Document how to compile and run Java programs. 2014-03-08 12:29:00 +00:00
Richard W.M. Jones
2b3131cf40 java: Document how to use optional parameters in the guestfs-java(3) man page. 2014-03-08 12:13:46 +00:00
Richard W.M. Jones
1ba2e3e14a java: Add regression test for RStruct/RStructList (RHBZ#1073906). 2014-03-07 15:53:59 +00:00
Richard W.M. Jones
ebf8a3654a bindtests: Fill in all fields in dummy lvm_pv struct.
Used for testing RStruct/RStructList return values, but only
in GObject and Java bindings.
2014-03-07 15:53:59 +00:00
Richard W.M. Jones
dff35285e4 java: Use correct Set*Field JNI accessors to set fields of the appropriate type.
Using the wrong accessors (somehow - I have no idea how) caused other
fields in the struct to contain incorrect values.
2014-03-07 15:53:59 +00:00
Richard W.M. Jones
7a0e71f733 java: Factor out common field code in RStructList.
No functional change.
2014-03-07 15:53:59 +00:00
Richard W.M. Jones
8c219636a2 java: Split long lines in generated output, and add other whitespace.
No functional change.
2014-03-07 15:53:59 +00:00
Richard W.M. Jones
d00840d727 java: Fix bogus construction of all RStructList returned values (RHBZ#1073906).
Thanks Maarten on IRC for spotting the problem.
2014-03-07 15:53:59 +00:00
Richard W.M. Jones
6aa64ee3a3 java: run: Add java/.libs to LD_LIBRARY_PATH so JVM finds the right JNI file. 2014-03-07 15:53:59 +00:00
Hilko Bengen
16954981e2 Allow gnulib tests to be disabled.
RWMJ:

 - Patch taken from Debian downstream package.

 - The default in the original patch was to disable the tests.  I have
   changed this to default to enable them instead.

 - Removed AC_SUBST as the variable was not being used.
2014-03-07 15:53:48 +00:00
Richard W.M. Jones
96f6a8f57c Version 1.25.42. 2014-03-06 15:59:35 +00:00
Hilko Bengen
e1fdc43539 Remove two more files that are generated by configure 2014-03-05 18:31:02 +01:00
Richard W.M. Jones
5213d7b960 tests/md: Remove bogus test skip which tried to appliance hostfiles.
This file no longer exists since supermin >= 5.

Bug identified by Pino Toscano.
2014-03-05 16:13:49 +00:00
Hilko Bengen
bdcc37b888 Debian: Add systemd-related libraries (for guestfsd) to packagelist 2014-03-04 19:17:40 +01:00
Hilko Bengen
7c21e129c9 Do not ship test-qemu-drive-libvirt.xml with tarball as it is generated by configure 2014-03-04 18:56:07 +01:00
Hilko Bengen
b30e2cf122 Fix out-of-tree build: Do not accidentally build mllib components in srcdir 2014-03-04 00:06:09 +01:00
Hilko Bengen
d7e3aea7bc Fixes for various tests in out-of-tree builds 2014-03-04 00:06:09 +01:00
Hilko Bengen
0048b5dc32 Fix out-of-tree appliance build 2014-03-04 00:06:09 +01:00
Hilko Bengen
876983365a More fixes for situations where ocamlopt is not available
- run bindtests.opt only if available
- use ocamlc -custom
- Don't try to install native code if it hasn't been built (Thanks to Olaf Hering)
2014-03-04 00:06:07 +01:00
Richard W.M. Jones
0b285e07a0 Version 1.25.41. 2014-03-03 22:06:58 +00:00
Richard W.M. Jones
e87e377cfb appliance: Ensure that supermin.d directory is installed properly.
Commit 0a966727ab had a missing
backslash in the list of files, so that 'make install' didn't install
all the files.
2014-03-03 21:58:42 +00:00
Richard W.M. Jones
3acb4343ea Version 1.25.40. 2014-03-03 17:22:06 +00:00
Richard W.M. Jones
d37dd9b055 Add new logo to EXTRA_DIST.
This fixes commit d73531a0aa.
2014-03-03 17:22:06 +00:00
Richard W.M. Jones
0a966727ab appliance: Remove conditionals in appliance/Makefile.am.
If appliance is disabled, the whole appliance/ subdirectory is
skipped.

If appliance is enabled, we can assume that the daemon is enabled too
(see previous commit) so we don't need the conditional code.  That
conditional code didn't work since the supermin 5 rewrite.
2014-03-03 17:12:13 +00:00
Richard W.M. Jones
a6d72be984 build: Don't allow --disable-daemon and --enable-appliance together.
This makes no sense, since the daemon is contained in the appliance so
you cannot build a (meaningful) appliance without having a daemon.
2014-03-03 17:12:13 +00:00
Pino Toscano
631c7d9241 builder: install a $sysconfdir/virt-builder -> xdg-virt-builder symlink
This way "virt-builder" appears directly in the sysconfdir.
2014-03-03 16:28:14 +01:00
Pino Toscano
6a5052a409 run: add the builddir of inspector to $PATH 2014-03-03 14:25:12 +01:00
Hilko Bengen
31b16a9dda Debian: Strip Lintian overrides, initramfs-related stuff from appliance 2014-03-03 13:18:17 +00:00
Bastien ROUCARIÈS
7adc60d955 remove last trace of ntfsprogs 2014-03-03 13:18:17 +00:00
Hilko Bengen
2b4e2eb97d Fix for systemd-based Debian systems 2014-03-03 13:18:17 +00:00
Richard W.M. Jones
e0124b9a91 logo: Make the 5 years text larger and more readable for website.
This fixes commit d73531a0aa.
2014-03-03 12:19:06 +00:00
Richard W.M. Jones
d73531a0aa logo: Add fish logo with 5 years star. 2014-03-03 11:55:24 +00:00
Richard W.M. Jones
b88f98849a appliance: Cosmetic change to the order of command line arguments of 'supermin'. 2014-03-03 11:55:24 +00:00
Richard W.M. Jones
49209b3f96 Version 1.25.39. 2014-03-01 16:26:12 +00:00
Richard W.M. Jones
0c4fae7cb3 configure: supermin should be listed as AC_PATH_PROG, since it is used at run time.
See top of configure.ac:

 > # NB: AC_CHECK_PROG(S) or AC_PATH_PROG(S)?
 > # Use AC_CHECK_PROG(S) for programs which are only used during build.
 > # Use AC_PATH_PROG(S) for program names which are compiled into the
 > # binary and used at run time.  The reason is so that we know which
 > # programs the binary actually uses.
2014-03-01 15:49:54 +00:00
Richard W.M. Jones
01a018a9de mageia: Add distro setting and extra packages needed by Mageia. 2014-02-28 22:49:39 +00:00
Pino Toscano
962837650c builder: add libguestfs.gpg to EXTRA_DIST
It needs to be in EXTRA_DIST, otherwise it is not put in the dist.
2014-02-28 15:07:32 +01:00
Pino Toscano
12bdd94f7e tests/luks: disable if luks is not available 2014-02-28 15:07:32 +01:00
Hilko Bengen
f75142c577 Fix building on architectures where ocamlopt is not available 2014-02-28 14:01:25 +00:00
Richard W.M. Jones
a4be4231cc launch: libvirt: Fix unused variable when libselinux is not installed. 2014-02-28 13:36:05 +00:00
Richard W.M. Jones
7c8af23430 appliance: init: Don't write to /proc/sys/kernel/hotplug when starting udev (RHBZ#1020806).
/proc/sys/kernel/hotplug is an obsolete interface for processing
hotplug events.  It is not used by modern kernels, which should set
this path to the empty string (because they have
CONFIG_UEVENT_HELPER_PATH="").

Unfortunately our udev initialization code did:

  echo -e '\000\000\000\000' > /proc/sys/kernel/hotplug

which was intended to set this file to \0 bytes.  However on Debian,
where /bin/sh is "dash", not "bash", this writes "-e" to this file,
which breaks udev events.

Thanks: Peter Rajnoha for solving this.

https://bugzilla.redhat.com/show_bug.cgi?id=1020806#c10
2014-02-27 12:36:13 +00:00
Pino Toscano
963b0341e2 builder: update documentation
Update the documentation according to the new .conf files structure, the
drop of VIRT_BUILDER_SOURCE and VIRT_BUILDER_FINGERPRINT, the drop of
hardcoded source and its key, etc.
2014-02-27 09:59:56 +00:00
Pino Toscano
47538865f2 builder: remove the default fingerprint/pubkey
Sigchecker can still import keys from the user's keyring, so there is no
need to hardcode fingerprint and key of the index hosted on
libguestfs.org (which is now pointed to using a .conf file).
2014-02-27 09:59:56 +00:00
Pino Toscano
573cae45c3 builder: remove VIRT_BUILDER_SOURCE and VIRT_BUILDER_FINGERPRINT
Drop these two environment variables, and the implicit hardcoded source
hosted at libguestfs.org.
This means all the sources must be provided as .conf files, or at each
invocation with --source.
2014-02-27 09:59:56 +00:00
Pino Toscano
f4990bef1c builder: switch sources to .conf files
Introduce and use simple .conf files to configure the sources of indexes
for virt-builder. The location of these files is in XDG_CONFIG_DIRS /
XDG_CONFIG_HOME, so it can be easily overridden.

There are three .conf(.in) files shipped with this commit:
- "test-index.conf.in" (in "test-config"), which points to the
  "test-index" index (used in tests only); the tests are adapted to
  point to the hierarchy containing this .conf
- "libguestfs.conf.in" (in "test-website"), which points to the local
  "index.asc" (i.e. the offline copy of the libguestfs.org index);
  run(.in) will point to the hierarchy providing this .conf
- "libguestfs.conf.in" (directly among the other sources), which points
  to the online "index.asc" and it is installed in sysconfdir, along
  with the key of this repository

The tests are adapted, other than to the different way to pick sources,
to the different output of --list, as "test-index" is not signed.
2014-02-27 09:59:56 +00:00
Pino Toscano
a3f1ac9a2d builder: extract the default key to file
This is basically default_pubkey from sigchecker.ml, just extracted as
file. Not used right now, but will be in the future.
2014-02-27 09:59:56 +00:00
Pino Toscano
a21da3c801 builder: add functions to read XDG_CONFIG_DIRS and XDG_CONFIG_PATH 2014-02-27 09:59:56 +00:00
Pino Toscano
ad38e68c34 builder: use Sigchecker.gpgkey_type for the fingerprint
Use Sigchecker.gpgkey_type instead of just string as type in the
sources list; adapt the listing code (and its expected output) to that.

No behaviour change which eases a bit the addition of new sources with
other key types.
2014-02-27 09:59:56 +00:00
Pino Toscano
c09f5bbc70 builder: allow "no key" as key in Sigchecker
Additional way to distinguish no actual key available for signature
checking; make sure to not allow signing in such situation.
2014-02-27 09:59:56 +00:00
Richard W.M. Jones
fbe4dad2de appliance: init: Initialize LVM in the same way as done on physical machines.
Running vgscan appears to be unnecessary.

The -aa option of vgchange activates LVs.

The --sysinit option disables locking.
2014-02-27 09:58:47 +00:00
Richard W.M. Jones
06011270ec Version 1.25.38. 2014-02-26 19:41:07 +00:00
Richard W.M. Jones
eb81df93d0 appliance: Initialize local variables because gcc cannot track that they are not used uninitialized. 2014-02-26 15:21:14 +00:00
Richard W.M. Jones
b13c22668d appliance: Use supermin >= 5.
This requires the new version of supermin (5.1.0).
2014-02-26 15:21:08 +00:00
Richard W.M. Jones
d353b4a3c8 builder: Add arch= entry for Cirros.
Thanks: Pino Toscano.
2014-02-24 20:13:41 +00:00
Richard W.M. Jones
9124730df2 builder: Add arch=x86_64 entries. 2014-02-24 15:43:13 +00:00
Pino Toscano
0f3898b2f5 sysprep: use Mkdtemp to create the temporary directory
Use the safer mkdtemp instead of manually creating a path.
2014-02-24 15:40:29 +01:00
Pino Toscano
8ed905c7e6 builder: split INI C <-> OCaml glue code in own module
Move in an own module the code which calls the C
virt_builder_parse_index and does the array -> list conversion of the
result. This way this code can be easily called also in places different
than Index_parser without the need to copy the types mapping, etc.

Just code motion, no actual behaviour changes.
2014-02-24 15:08:03 +01:00
Pino Toscano
61323fabaf builder: add a mandatory 'arch' key in index files
Introduce a mandatory arch= key in all the entries of index files, to
identify which architecture is each. Adapt the long and JSON list
outputs to print also this new field.

This introduces an incompatibility with index files created with
virt-builder < 1.26, as they will be rejected until entries will have
the arch= key added (which is ignored by older virt-builder, so adding
it will not create backward-compatibility issues).
2014-02-24 11:31:35 +01:00
Richard W.M. Jones
838a3c997c Version 1.25.37. 2014-02-21 16:46:14 +00:00
Pino Toscano
35e53c0381 builder: allow Sigchecker to import keys from file
Extend Sigchecker so it allows both fingerprints (to be imported from
user's keyring, as before) and keys stored in files. To simplify this
process (and have the fingerprint always around), the key is imported
on Sigchecker.create time, instead of lazily at the first verification.
2014-02-21 15:21:08 +01:00
Pino Toscano
dd03d38be3 builder: use a disposable GPG keyring for every Sigchecker
Create a temporary directory and tell gpg to use it as homedir, so
imported keys do not get into the user's keyring. This also avoid
importing the default key  when a different one is needed to check the
signature.

The only exception is when a non-default fingerprint is used: in this
case, that key is read from the user's keyring, since it is where it is.
2014-02-21 14:39:57 +01:00
Pino Toscano
c79c62a3b0 mllib: add a binding for mkdtemp
It seems OCaml has no way to safely create a temporary directory, so add
a new binding to C's mkdtemp which does that.
2014-02-21 14:34:36 +01:00
Richard W.M. Jones
7794d9a187 builder: Add ScientificLinux 6.5. 2014-02-21 08:35:49 +00:00
Pino Toscano
7f77f4fb28 mllib: add an hook to cleanup directories on exit
Much similar to unlink_on_exit, but recursively cleaning directories.
2014-02-20 16:33:19 +01:00
Pino Toscano
4c5a6afc84 builder: accept also '_' in group names 2014-02-19 16:40:00 +01:00
Richard W.M. Jones
482fefa5d8 ppc64: Don't add -no-hpet with the direct backend either.
Related changes in commit 479665e4fc
and commit 62cb3a606d.
2014-02-18 17:43:06 +00:00
Richard W.M. Jones
479665e4fc ppc64: Disable hpet fragment in libvirt XML.
Related change in commit 62cb3a606d.
2014-02-18 17:40:58 +00:00
Pino Toscano
bb35e72503 builder: move the XDG path handling in an own file
Just code motion and renaming, no actual behaviour changes.
2014-02-18 12:55:14 +01:00
Pino Toscano
8b1f1c15f5 fish: use XDG paths for the config file
Read the configuration file from XDG paths for both global and
user-local locations, keeping the old paths as fallback.
2014-02-18 10:44:49 +01:00
Richard W.M. Jones
62cb3a606d launch: libvirt: Don't include hpet XML fragment on ARM.
See comment and https://bugzilla.redhat.com/show_bug.cgi?id=1066145
for explanation.
2014-02-18 03:37:50 -05:00
Pino Toscano
8577aded98 fish: change order of config files being read
First read the global configuration and then the local one in user's
HOME, so the latter can really override system settings.
2014-02-17 16:24:41 +01:00
Pino Toscano
5d2b0d1366 fish: small refactor of config reading code
Even though so far there is just one possible setting to read, isolate
in an own function the code to parse a configuration file and read the
settings out of it.

Now there's a new config_t handle used every time, but since config_read
would reset an handle completely, there is no behaviour change.
2014-02-17 16:21:18 +01:00
Or Goshen
6b71b81a5f appliance: Use configurable separator character for LIBGUESTFS_PATH.
On Windows, the path separator character will be ';' instead.
2014-02-17 14:52:46 +00:00
Richard W.M. Jones
22f6c79b32 Version 1.25.36. 2014-02-17 10:08:38 +00:00
Richard W.M. Jones
360abeebda builder: Fix dependencies which are not generated correctly by automake.
See the error messages here:
https://www.redhat.com/archives/libguestfs/2014-February/msg00148.html

This fixes commit e2cc8b6465.
2014-02-17 09:53:25 +00:00
Richard W.M. Jones
8f767f4caa Version 1.25.35. 2014-02-16 22:34:56 +00:00
Richard W.M. Jones
b987be513a FAQ: Remove obsolete entry about libguestfs <= 1.13 and slow writes.
Long since not a problem.
2014-02-16 19:20:40 +00:00
Richard W.M. Jones
728ba9b33f FAQ: Add several common problems with opening disk images. 2014-02-16 19:15:49 +00:00
Richard W.M. Jones
c16d5d3de4 FAQ: Create new section about problems opening disk images.
Move the stuff about encoding problems here, because these are not
really common problems.
2014-02-16 19:15:49 +00:00
Richard W.M. Jones
6594e88d80 FAQ: Remove old RHEL 6.5 section. 2014-02-16 19:15:49 +00:00
Richard W.M. Jones
6cc521dc45 generator: Sort most output.
Look for use of external_functions and fish_functions and replace with
use of external_functions_sorted and fish_functions_sorted where
possible.  This ensures that the output of the generator is sorted as
far as possible.

I also checked for uses of internal_functions and documented_functions
but those are not used.  The *_sorted versions are always used
instead.
2014-02-15 20:27:12 +00:00
Hilko Bengen
bbfb9f9480 podwrapper: Recognize git-style dates in ChangeLog 2014-02-14 15:09:42 +01:00
Richard W.M. Jones
bf8d75590c test: Use = instead of == for testing string equality in bash script.
Found by make syntax-check.
2014-02-14 12:33:37 +00:00
Richard W.M. Jones
d56b8bcb2c Remove some unused header files.
Found by make syntax-check.
2014-02-14 12:33:37 +00:00
Richard W.M. Jones
f5de589966 src/drives.c: Remove useless if-before-free.
Found by make syntax-check.
2014-02-14 12:33:37 +00:00
Richard W.M. Jones
9018356a67 Use bindtextdomain in some programs where it was missing.
Found by make syntax-check.
2014-02-14 12:33:37 +00:00
Richard W.M. Jones
e3d23cccf4 builder: Suppress warning about unused yyunput.
CC       virt_index_validate-index-validate.o
index-scan.c:1270:17: warning: 'yyunput' defined but not used [-Wunused-function]
     static void yyunput (int c, register char * yy_bp )
                 ^
  CCLD     virt-index-validate

By using %option nounput we can prevent this from being generated in
the first place.
2014-02-14 12:33:37 +00:00
Richard W.M. Jones
9df9c87147 configure: Move ocaml-gettext writing boilerplate to separate m4 module.
This is just code motion.

NOTE that after this commit you have to do:

  aclocal -I m4
  autoconf

as 'make' may not do this automatically.
2014-02-13 21:07:40 +00:00
Richard W.M. Jones
e4fe09c5ae builder: pxzcat: Fix char * signedness warning. 2014-02-13 17:48:23 +00:00
Richard W.M. Jones
f8bac1329e mllib/uri-c.c: Remove unused variable. 2014-02-13 17:48:23 +00:00
Richard W.M. Jones
72713825c4 gobject: Remove some more warnings from session.c code. 2014-02-13 17:48:23 +00:00
Richard W.M. Jones
e74c957a2b gobject: Clean up some warnings about unused variables. 2014-02-13 17:48:23 +00:00
Richard W.M. Jones
23d6d53633 gobject: Don't direct error messages to /dev/null.
We might want to see them.
2014-02-13 17:48:23 +00:00
Richard W.M. Jones
99ce50e0a0 gobject: Use spaces between function name and call parameters.
This is just a whitespace change.

This was done by running the following command and then fixing a
couple of places where it got it wrong:

perl -pi.bak -e 'unless (m/#define/) { s/([a-zA-Z0-9])\(/$1 (/g }' \
  generator/gobject.ml
2014-02-13 17:48:23 +00:00
Richard W.M. Jones
cd9f741174 fish/uri: Initialize some variables to avoid a warning.
The warning only appears when we set CFLAGS to be the same as used by
RPM, which you can do by setting:

  CFLAGS="$(rpm --eval '%{__global_cflags}')"

before running ./configure.

FWIW the current value of that RPM expression (in Fedora 20) is:

  -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches

It is not clear which option precisely enables the warning.
2014-02-13 17:48:23 +00:00
Richard W.M. Jones
2954541fdd java: Avoid warnings in the tests and examples.
Avoid warnings about missing serial version, and fix a warning about
raw types.
2014-02-13 17:48:23 +00:00
Pino Toscano
ab2df2e659 mllib: hostname: on Debian replace it also in /etc/hosts (RHBZ#953907).
In Debian/Ubuntu systems, read the previous hostname from /etc/hostname
before replacing it, and replace it in /etc/hosts with the new hostname.
2014-02-13 14:52:50 +01:00
Pino Toscano
4ca4eef0cc sysprep: remove RH subscription manager files
Add a new operation for it, which should do what
`subscription-manager clean` does.

Part of RHBZ#1063374.
2014-02-13 10:57:31 +01:00
Pino Toscano
f78877c77e sysprep: remove RH subscription manager log files
Part of RHBZ#1063374.
2014-02-13 10:50:15 +01:00
Richard W.M. Jones
dcd5edd5d4 Version 1.25.34. 2014-02-12 22:52:53 +00:00
Pino Toscano
3d4cc3cf57 mllib: hostname: add a newline in /etc/hostname
/etc/hostname usually has an ending newline, so add it when changing it.
2014-02-12 18:48:08 +01:00
Richard W.M. Jones
82a4a8f02c FAQ: Another common problem is permission denied errors when running as root. 2014-02-12 09:32:08 +00:00
Richard W.M. Jones
37aead588e FAQ: Add another common Ubuntu appliance problem. 2014-02-12 09:31:57 +00:00
Richard W.M. Jones
d70ceb4cbe list-filesystems: Do not segfault if guestfs_btrfs_subvolume_list returns an error (RHBZ#1064008).
If calling guestfs_list_filesystems with a disk image containing a
corrupt btrfs volume, the library would segfault.  There was a missing
check for a NULL return from guestfs_btrfs_subvolume_list.

This adds a check, returning the real error up through the stack and
out of guestfs_list_filesystems.

This is potentially a denial of service if processing disk images from
untrusted sources, but is not exploitable.

Thanks: Jeff Bastian for reporting the bug.
2014-02-11 20:14:01 +00:00
Pino Toscano
76e3e15d03 builder: do a copy when downloading local files
Instead of spawning curl even to "download" file:// URIs, just copy
them.
2014-02-11 12:52:10 +01:00
Pino Toscano
ba3569704c builder: prepare for different per-protocol download actions
Small refactor of Downloader.download_to to allow different download
actions depending on the protocol of the URI (which is now parsed).

No actual behaviour changes, just mostly code motion.
2014-02-11 12:39:56 +01:00
Pino Toscano
c66cec6ffa builder: isolate C libraries in an own OCAMLCLIBS
Just moving stuff within Makefile.am, no functional changes.
2014-02-11 10:40:31 +01:00
Pino Toscano
a948389ce9 actions/part_set_gpt_type: set type of "guid" parameter as "GUID" (RHBZ#1008417).
Switch the type of the "guid" parameter from "String" to "GUID"; this
adds the validation of the GUID as such, rejecting straight away invalid
GUIDs which otherwise could be handled badly by low-level tools (such as
sgdisk).

Add a couple of easy tests (taken from RHBZ#1008417) to
part_set_gpt_type about this.
2014-02-10 11:00:09 +01:00
Pino Toscano
775cad63a3 generator: generate code for parameter validation
Implemented only in the C output, since every binding uses it anyway,
and just for the "GUID" type (since its format is well-known).
2014-02-06 20:02:51 +01:00
Pino Toscano
b10dd601fb generator: add a GUID parameter type
At the moment it is basically the change as String, and it is mapped as
if it was such.
2014-02-06 17:43:04 +01:00
Pino Toscano
beef77403c utils: add a function to validate a GUID string 2014-02-06 15:57:09 +01:00
Richard W.M. Jones
ed912a54d6 libguestfs-make-fixed-appliance: All supported versions of libguestfs should work.
We're not supporting anything < 1.20 now.
2014-02-05 19:39:28 +00:00
Richard W.M. Jones
758d021b41 Version 1.25.33. 2014-02-05 15:18:49 +00:00
Pino Toscano
798b539a1f appliance/init: provide a symlink /var/lock
Provide /var/lock as symlink to /run/lock, as it might be used by
applications.
2014-02-05 11:42:17 +01:00
Pino Toscano
59eb9bff87 resize: preserve GPT partition names (RHBZ#1060404).
Save the partition names/labels of the source partitions, and restore
them after the partition copy.
2014-02-04 15:54:44 +01:00
Pino Toscano
820b870167 New API: part-get-name (RHBZ#593511).
Counterpart of part-set-name, it uses sgdisk (hence needs the "gdisk"
feature) to query for the label/name of a partition in a GPT layout.
2014-02-04 15:54:44 +01:00
Pino Toscano
78c21ce912 daemon: parted: refactor sgdisk info parsing code
Isolate in an own function the code that runs sgdisk and parse a field
of it (using an extraction function passed as parameter), using it for
the GUID type.

This is just code motion, no actual behaviour changes.
2014-02-04 15:54:44 +01:00
Richard W.M. Jones
170b64337d resize: Try to remove a few more _ -> .. cases.
This allows the compiler to catch missing cases more effectively,
especially if we update the types with more cases in future.
2014-02-04 13:27:34 +00:00
Pino Toscano
ef7ac043a6 resize: properly restore GPT partition types
If there is a GPT partition layout, then what should be read and
restored for each partition is the GPT type and not the MBR ID.

Related to RHBZ#1060404.
2014-02-04 13:32:28 +01:00
Richard W.M. Jones
eab810f778 Version 1.25.32. 2014-02-04 08:50:43 +00:00
Richard W.M. Jones
d5b540153f Remove bogus license file from daemon subdirectory.
It was left over from when the daemon was a separate autoconf
directory, and in any case the daemon has never been GPLv3 (it is
GPLv2+).
2014-02-03 13:57:33 +00:00
Richard W.M. Jones
d93e3c50eb fish: Additional GUESTFISH_* environment variables to control the prompt.
This adds:

 - GUESTFISH_INIT
 - GUESTFISH_OUTPUT
 - GUESTFISH_RESTORE

which along with existing GUESTFISH_PS1 allow you to fine control the
colour of the output.
2014-02-03 13:57:33 +00:00
Pino Toscano
bed8a168c0 builder: remove unused variables
Leftovers of the list_entries_short+list_entries_long split done in
commit 91aae893c7.
2014-01-30 17:06:42 +01:00
Pino Toscano
07ef60c63f builder: output translated notes
Output all the translations available for the notes in the "verbose"
output and the JSON output, while trying to match the system langauge in
the "show notes" output.

The JSON output is slightly changed to handle translations, with the
"untranslated" notes being matched as "C". The version is not bumped
though, since there have been no stable releases with the former output
yet.
2014-01-30 17:05:34 +01:00
Richard W.M. Jones
49014f81f3 sysprep: Deprecate --selinux-relabel in favour of --autorelabel.
virt-builder added a --selinux-relabel option with a slightly
different meaning.

This commit keeps the old --selinux-relabel / --no-selinux-relabel
options in virt-sysprep, but deprecates them and replaces them with
--autorelabel and --no-autorelabel.
2014-01-30 09:03:46 +00:00
Richard W.M. Jones
fc6d3e6a9a sysprep: Add a reference to virt-builder from the manual page.
The whole "COPYING AND CLONING" section really needs to be overhauled
too, but first we need to make virt-builder work properly for
customizing templates.
2014-01-30 09:03:46 +00:00
Richard W.M. Jones
5db1a28461 sysprep: Add --scrub option.
This works like the option in virt-builder with the same name.
2014-01-30 09:03:46 +00:00
Richard W.M. Jones
2595fa5069 builder: Move Perl_edit module into common code.
There is no functional change.
2014-01-29 14:04:40 +00:00
Richard W.M. Jones
c841d08d70 appliance: Create checksum file with mode 0644 instead of 0755.
Initial commit 4beb284409 used mode 0755
for no reason.  It seems to have been a mistake.
2014-01-29 09:31:24 +00:00
Richard W.M. Jones
f0f95bd038 perl: Data::Dumper and String::ShellQuote modules are no longer required.
They used to be used by old Perl virt-make-fs.  Nothing else uses
them.

This updates commit d3512deb67.
2014-01-29 08:45:19 +00:00
Richard W.M. Jones
32cbd7ca0d make-fs: Remove warning from man page about lone --partition argument.
C's getopt_long has no problem with this.
2014-01-29 08:20:38 +00:00
Richard W.M. Jones
a8a655a859 make-fs: Ensure --partition (on its own) creates an MBR partition.
This fixes commit d3512deb67.
2014-01-29 08:20:38 +00:00
Richard W.M. Jones
90d3378778 make-fs: Refactor debug stats code.
Code motion, no functional change.
2014-01-29 08:20:38 +00:00
Richard W.M. Jones
5bf8c81d7d make-fs: Use an anonymous pipe instead of a named pipe.
The previous translation from Perl slavishly followed the Perl code a
bit too much and used a named pipe to communicate between the
uncompressing subprocess and libguestfs tar-in.  From C we can use an
anonymous pipe instead.

This updates commit d3512deb67.
2014-01-29 08:20:18 +00:00
Richard W.M. Jones
c86fcc0fd4 make-fs: Make check-valgrind do something. 2014-01-29 08:00:55 +00:00
Richard W.M. Jones
f5bc913434 make-fs: Run virt-make-fs in test from builddir, not srcdir. 2014-01-29 08:00:30 +00:00
Richard W.M. Jones
59fce974e2 pod: Remove stray +x (executable) mode on various POD files.
find -name '*.pod' -perm /0111 -exec chmod -x {} \;
2014-01-28 22:17:12 +00:00
Richard W.M. Jones
1771e1f2b2 Version 1.25.31. 2014-01-28 22:10:25 +00:00
Richard W.M. Jones
233d5410e5 sysprep: Add script4.sh (test script) to EXTRA_DIST.
This fixes commit ce9d4d335b.
2014-01-28 21:56:18 +00:00
Richard W.M. Jones
dc91bf7231 Version 1.25.30. 2014-01-28 21:02:13 +00:00
Richard W.M. Jones
642cf4c5dc tests: Test --label and other options in virt-make-fs. 2014-01-28 21:02:11 +00:00
Richard W.M. Jones
d3512deb67 Rewrite virt-make-fs in C (originally Perl).
It should be very compatible with the Perl version.
2014-01-28 21:02:11 +00:00
Richard W.M. Jones
40512c66af daemon: Always pass -F option to mkfs.ntfs.
Otherwise it moans about:

  mkfs: ntfs: /dev/sda: /dev/sda is entire device, not just one partition.
  Refusing to make a filesystem here!

This has been happening for a while, so I don't know why we didn't
notice it before.  It even happens on RHEL 6.

A simple reproducer is:

  virt-make-fs -t ntfs any-tarball.tar.gz test.img
2014-01-28 21:02:11 +00:00
Richard W.M. Jones
9015d5ac14 virt-make-fs: Use disk-create API instead of calling qemu-img create.
Strictly speaking this reduces the number of formats that virt-make-fs
can output to, but it's likely that no one cares and if they do we can
add new formats in future.
2014-01-28 21:02:11 +00:00
Richard W.M. Jones
a594b7f90a sparsify: Use new disk-create API instead of calling qemu-img.
disk-create doesn't support the lazy_refcounts option.
2014-01-28 21:02:11 +00:00
Richard W.M. Jones
40261e4adc rescue: Note that we're not using add-drive-scratch here, and maybe we should be. 2014-01-28 21:02:11 +00:00
Richard W.M. Jones
f02fddc26b tests: Update miscellaneous tests to use disk-create API.
Instead of calling out to qemu-img / truncate.
2014-01-28 21:02:11 +00:00
Richard W.M. Jones
bd12e784e7 builder: Use disk-create API instead of calling qemu-img create. 2014-01-28 21:02:11 +00:00
Richard W.M. Jones
d60e6a23a6 examples: Update various examples to use new disk-create API. 2014-01-28 21:02:11 +00:00
Richard W.M. Jones
2794eac739 fish: Use disk-create API to implement guestfish 'alloc' and 'sparse' commands. 2014-01-28 21:02:11 +00:00
Richard W.M. Jones
1e5eb0aebb lib: Use disk-create API instead of qemu-img/truncate inside the library. 2014-01-28 21:02:11 +00:00
Richard W.M. Jones
588af1953e New API: disk-create for creating blank disks.
This is a wrapper around either 'qemu-img create' or calls to open,
truncate and posix_fallocate which litter and complicate existing
code.
2014-01-28 21:02:11 +00:00
Richard W.M. Jones
65fc841ea6 src/Makefile.am: Reorder SOURCES into alphabetical order. 2014-01-28 21:02:11 +00:00
Richard W.M. Jones
e3f72805d1 run: Actually use timeout --foreground option (RHBZ#1025269).
The following commit managed to not actually add the --foreground
option to the timeout command, just test for it.  Add it this time.

  commit 6814888774
  Author: Richard W.M. Jones <rjones@redhat.com>
  Date:   Thu Dec 19 08:21:53 2013 +0000

    run: Use timeout --foreground option.

    If timeout doesn't have this option (RHEL 6) don't use timeout at all.

    Attempt to fix RHBZ#1025269.
2014-01-28 21:02:11 +00:00
Richard W.M. Jones
d9cd2dc9b0 daemon: Add a note about how 'mount --rbind' doesn't work. 2014-01-28 21:02:11 +00:00
Richard W.M. Jones
9df50877f8 daemon: If /selinux exists in the guest, bind-mount /sys/fs/selinux to there.
Commit 72afcf450a was partially
incorrect.  If the guest userspace is expecting /selinux to exist,
then we should bind-mount /sys/fs/selinux from the appliance kernel
there.
2014-01-28 21:02:11 +00:00
Pino Toscano
ce9d4d335b builder, sysprep: initialise the random generator
virt-builder and virt-sysprep may make use of
Common_utils.string_random8 (which uses Random.int) for constructing
temporary paths; not initialising the random generator means that every
invocation will reuse the same name used previously (!).
Thus just call Random.self_init, just like virt-sparsify already does.

Expand the test-virt-sysprep-script.sh test to ensure that virt-sysprep
is not affected again by this issue.
2014-01-28 15:04:38 +01:00
Pino Toscano
95f8144cb6 tests/regressions: remove C part of rhbz1044014
All it did was checking for a libvirt version, which is what
libvirt-is-version now does; hence remove the C part, and use guestfish,
ignoring the launch failure (as the C test did).
2014-01-27 17:25:55 +01:00
Pino Toscano
4310f8f175 tests/disks: skip test-qemu-drive-libvirt.sh if libvirt is < 1.1.3
This test relies on the <test:runstate> element in the domain XML, which
has been introduced in libvirt 1.1.3.
2014-01-27 16:33:22 +01:00
Pino Toscano
c01fb37839 tests: add a a simple libvirt-is-version test tool
libvirt-is-version returns successfully in case the available version of
libvirt is greater or equal than the specified major/minor/release
values.
2014-01-27 16:31:32 +01:00
Pino Toscano
f66d6a85b6 tests/mountable: add missing space in test-mountable-inspect.sh
No actual behaviour, other than getting rid of a bash warning.
2014-01-27 14:25:47 +01:00
Richard W.M. Jones
de7a8336cd Version 1.25.29. 2014-01-25 12:04:37 +00:00
Richard W.M. Jones
4e18712562 tests/disks/test-qemu-drive-libvirt: Include test data.
This was inadvertantly deleted.

This fixes commit 01d27033bd.
2014-01-25 11:56:40 +00:00
Richard W.M. Jones
24e61492cc Version 1.25.28. 2014-01-25 10:59:03 +00:00
Richard W.M. Jones
080300dfec builder: Add documentation for enabling Puppet (agent) in a guest. 2014-01-25 09:41:10 +00:00
Richard W.M. Jones
90e23b4e56 builder: Add --selinux-relabel option to perform SELinux relabelling.
This adds the --selinux-relabel option which enables selinux in the
appliance and runs:

  if load_policy && fixfiles restore; then
    rm -f /.autorelabel
  else
    touch /.autorelabel
  fi

at the end of installation.

When possible this fixes SELinux labels in the guest and makes the
autorelabel step unnecessary.

Notes:

 - The previous commit is required so that load_policy works.

 - During the build, SELinux is enabled but no policy is loaded.  This
   works because SELinux is in permissive mode.

 - This flag does not work if the appliance kernel and the guest have
   greatly differing versions, eg. a RHEL 6 guest with a Fedora 20
   appliance.  This is because SELinux changes the policy format and
   breaks backwards compatibility.  You would see errors like this:

   libsepol.policydb_write: policy version 15 cannot support MLS
   libsepol.policydb_to_image: could not compute policy length
   libsepol.policydb_to_image: could not create policy image
   SELinux:  Could not downgrade policy file /etc/selinux/targeted/policy/policy.24, searching for an older version.
   SELinux:  Could not open policy file <= /etc/selinux/targeted/policy/policy.24:  No such file or directory

   These errors are ignored (they go to the log file) and relabelling
   is done at boot instead.

 - It's not clear if loading guest policy is safe.  You should trust
   the virt-builder templates and to use libguestfs confinement for
   additional protection.
2014-01-25 09:41:07 +00:00
Richard W.M. Jones
ab33653ef3 daemon: Bind-mount /sys/fs/selinux into sysroot when running commands.
Even though we are already bind-mounting /sys, it is necessary to also
bind-mount /sys/fs/selinux in order for SELinux commands (in
particular, 'load_policy') to work.

This fixes/reverts commit 7367729ec7.
2014-01-24 19:36:33 +00:00
Richard W.M. Jones
0e2489974b fuse: In mount-local-run, test if root filesystem has been mounted (RHBZ#1057504).
It is never normally valid to use the mount-local* APIs when you
haven't mounted some filesystems in the libguestfs namespace.

If you try it, it results in some odd errors.  The mount-local-run
call is successful, but subsequent operations fail:

$ mkdir -p /tmp/mnt
$ guestfish -x -N fs mount-local /tmp/mnt : mount-local-run
libguestfs: error: lstat: lstat_stub: you must call 'mount' first to mount the root filesystem
libguestfs: error: lstat: lstat_stub: you must call 'mount' first to mount the root filesystem

With this commit, the mount-local-run call gives an error:

libguestfs: error: you must call 'guestfs_mount' first to mount a filesystem on '/'.
Note: '/tmp/mnt' is still mounted.  Use 'guestunmount /tmp/mnt' to clean up.

The error is implemented by calling guestfs_exists (g, "/") which has
the side effect of running the NEED_ROOT macro in the daemon.  (There
is no simple equivalent of NEED_ROOT on the library side.)
2014-01-24 12:26:34 +00:00
Richard W.M. Jones
01d27033bd lib, fish: Handle Gluster, NBD, iSCSI and Sheepdog paths properly.
This fixes the handling of paths for the protocols named above, with
respect to leading '/' (or not) on the volume/export name.

See previous commits which did the same fixes for Ceph:
commit 53a3ff9c00
commit 992a6b2970
2014-01-23 21:49:16 +00:00
Richard W.M. Jones
870f076bdd Version 1.25.27. 2014-01-23 19:35:23 +00:00
Richard W.M. Jones
3331db84bc resize: Don't truncate libguestfs error messages.
If we rely on OCaml's internal exception printing, then it will
truncate error messages like this:

  Fatal error: exception Guestfs.Error("could not create appliance
  through libvirt.

  Try running qemu directly without libvirt using this environment
  variable: export LIBGUESTFS_BACKEND=direct

  Original error from libvirt: unable to set security context
  'unconfined_u:object_r:svi
note the truncation here ^^^^^^^

Instead of using the internal exception printing, wrap the whole
program in a 'main ()' function and add an exception handler.

This large change is non-functional apart from the addition of the
exception handlers at the end.
2014-01-23 15:08:52 +00:00
Richard W.M. Jones
e8c1067021 launch: direct: Stop using deprecated -no-kvm-pit-reinjection if qemu is new enough (RHBZ#1053847). 2014-01-23 14:46:03 +00:00
Richard W.M. Jones
1d6ba35e6f tests: Add a test of libvirt domain XML to qemu command line (RHBZ#1026688).
This tests that libvirt domain XML (ie. guestfish -d option) is parsed
correctly and results in the correct qemu command line when using the
direct backend.

This is a good end-to-end test of various layers.
2014-01-23 14:46:03 +00:00
Richard W.M. Jones
1ed0ce3ef8 libvirt domain: Allow network drives with no <source name="..."> attr.
This is valid for some network drives, for example:

  <source protocol='nbd'>
    <host name='foo' port='1234'/>
  </source>

We pass an empty string as path to the guestfs_add_drive_opts API in
this case.
2014-01-23 14:46:03 +00:00
Richard W.M. Jones
1d2e74414b libvirt-domain: Remove unnecessary and wrongly indented parens. 2014-01-23 14:46:03 +00:00
Richard W.M. Jones
58ada01783 libvirt domain: Allow network drives with no <host> elements.
This is valid for some network drives:

<source protocol='rbd' name='abc-def/ghi-jkl'/>

instead of this:

<source protocol='rbd' name='abc-def/ghi-jkl'>
  <host name='foo' port='1234'/>
</source>

Allow both forms.
2014-01-23 14:46:03 +00:00
Richard W.M. Jones
992a6b2970 fish: Handle Ceph/rbd URIs and convert them to paths properly (RHBZ#1026688).
The path at the API level (for guestfs_add_drive_opts) is:

  pool/disk

The URI syntax is either rbd:///pool/disk or rbd://server:port/pool/disk.
Because of the way URI parsing works we may need to remove a leading
'/' character before passing the path down to the API.
2014-01-23 14:46:03 +00:00
Richard W.M. Jones
53a3ff9c00 lib: Handle Ceph/rbd paths properly (RHBZ#1026688).
The path at the protocol level is:

  pool/disk

(with no leading '/' character).  This is now what you have to pass to
guestfs_add_drive_opts.

Also Ceph can be called with no explicit servers (it uses the contents
of /etc/ceph/ceph.conf instead).  So allow zero servers to be used.
2014-01-23 14:46:03 +00:00
Richard W.M. Jones
b93a1d50ad fish/uri: Tidy up error messages. 2014-01-23 14:46:03 +00:00
Pino Toscano
b7cd63fc1d builder: read all the available notes from the index
Switch the internal storage for the notes of each entry to a sorted list
with all the subkeys available (which should represent the translations
to various languages).
The current outputs are the same (i.e. still the untranslated notes), so
this is just internal refactoring/preparation.
2014-01-23 15:36:15 +01:00
Pino Toscano
958e84d699 builder: small code simplification
No actual behaviour changes, just remove extra match statements.
2014-01-23 10:19:16 +01:00
Richard W.M. Jones
2541563a18 Version 1.25.26. 2014-01-22 18:01:17 +00:00
Richard W.M. Jones
629cb87b6d tests/regressions: Don't include binaries in EXTRA_DIST.
Because EXTRA_DIST simply used $(TESTS), and because the list of tests
includes C binaries, these were included in the tarball (actually not
binaries, but libtool scripts, but it's still undesirable).
2014-01-22 17:13:00 +00:00
Richard W.M. Jones
7d8d065fee tests: Add a regression test for RHBZ#1054761. 2014-01-22 17:10:37 +00:00
Richard W.M. Jones
aa2ca8ba70 daemon: lvm2: Ignore "unknown device" output when a PV is missing (RHBZ#1054761). 2014-01-22 17:10:37 +00:00
Colin Walters
49c3d819c1 generator/set-uuid: Fix two typos in documentation 2014-01-22 15:47:34 +00:00
Pino Toscano
9e4357ca54 builder: fix small regression in subkey parsing
Introduced in 5cbdf35d65, it caused the
first character of the value to be skipped if the key has a subkey.
2014-01-22 15:34:22 +01:00
Richard W.M. Jones
13bca32e4e sparsify: Prevent overwriting block or char output devices (RHBZ#1056290).
virt-sparsify doesn't work if the output is a block device, and cannot
possibly work if the output is a char device.  Currently if you try
this it actually overwrites (deletes) the output device which is not
exactly desirable.  Therefore throw an error and exit.
2014-01-22 13:10:08 +00:00
Richard W.M. Jones
c6ec6cde27 builder: Add -monitor none to example command line. 2014-01-22 12:55:52 +00:00
Dan Lipsitt
873051e108 remove non-portable chmod
'chmod --reference' is not available on Mac OS X.

Keeping the original file and directing edits into it preserves permissions and removes the need to chmod.

(Tried 'sed -i' for inplace editing but unfortunately it isn't portable either.)
2014-01-21 20:26:32 +00:00
Richard W.M. Jones
ebb04b64a2 Version 1.25.25. 2014-01-21 18:37:26 +00:00
Pino Toscano
5cbdf35d65 builder: proper consider subkeys in index files
The index files already allowed the 'key[subkey]=...' syntax for keys,
but considering such string as whole key. Proper split the parsing and
the handling of the subkeys, so they can be searched a bit easier.

This causes no actual behaviour changes, it is just internal
micro-refactoring. (Thanks Rich for the hints, too.)
2014-01-21 19:19:22 +01:00
Richard W.M. Jones
20a4bfde96 builder: Add tip for how to relabel SELinux guest at build time.
Thanks: purpleidea/James.
2014-01-21 17:33:35 +00:00
Richard W.M. Jones
88094f3da4 builder: Clearer note in man page about SELinux and where /.autorelabel file comes from.
It's not added by virt-builder.  It is present in the templates (added
by virt-sysprep in fact).
2014-01-21 17:33:35 +00:00
Richard W.M. Jones
be5fd2fd34 builder: Add note about cloning to man page. 2014-01-21 17:33:35 +00:00
Richard W.M. Jones
3e3e7cf029 sysprep: Replace flags list with side_effects object.
Previously callbacks would return a list of flags, such as []
or [`Created_files].

In this commit we introduce two new objects, filesystem_side_effects
and device_side_effects (the latter is not used yet).

The callbacks that create files now need to call

  side_effects#created_file ()

instead of returning flags.

There is no functional change in this patch.
2014-01-21 17:33:35 +00:00
Richard W.M. Jones
11b4fc88fb sysprep: Update comments. 2014-01-21 17:33:35 +00:00
Pino Toscano
4505f61979 builder: allow more empty lines in index files
Improve the index grammar to allow more than one empty line between
sections, and to allow any number of empty lines at the end of the file
(after the last section).
2014-01-21 17:54:23 +01:00
Pino Toscano
e2cc8b6465 builder: add index-struct.h as dependency for index-parser-c.c
Just like with index-parse.h, also index-struct.h is a dependency of
index-parser-c.c which automake cannot generate correctly.
Thus, add it manually.
2014-01-21 13:47:29 +01:00
Richard W.M. Jones
10b20b7938 test-tool: Rearrange output into alphabetical order. 2014-01-21 11:07:03 +00:00
Pino Toscano
ffe1eaa11c Revert "Minimum libvirt version is >= 1.1.1."
0.10.2+ is still available on some recent-ish stable distros (like
Fedora 19, Ubuntu 13.04), and should work fine for guestfs.

This reverts commit 6b3e05e8da.
2014-01-20 16:10:43 +01:00
Richard W.M. Jones
a7b5be067e dist: Run 'git log' instead of custom script.
It's useful to see the complete SHA1's since that is how we refer to
fixes in Bugzilla.
2014-01-20 14:34:03 +00:00
Richard W.M. Jones
ee90a36521 tests: Add regression test for get-attach-method == "appliance".
This updates commit ecd31806a4.
2014-01-20 12:09:29 +00:00
Richard W.M. Jones
ecd31806a4 tests: Add a regression test for parsing LIBGUESTFS_BACKEND/LIBGUESTFS_ATTACH_METHOD (RHBZ#1055452). 2014-01-20 10:22:41 +00:00
Richard W.M. Jones
69267d8762 launch: Allow backend = "appliance" for backwards compatibility (RHBZ#1055452).
This fixes a regression which was introduced in
commit 0f26218905.
2014-01-20 10:22:41 +00:00
Richard W.M. Jones
d0c5450c45 daemon: Use wipefs_has_force_option to decide whether to add wipefs --force option. 2014-01-19 20:30:42 +00:00
Olaf Hering
d87cfefcdd daemon: add missing GUESTFSD_EXT_CMD usage
Signed-off-by: Olaf Hering <olaf@aepfle.de>
2014-01-19 20:30:42 +00:00
Richard W.M. Jones
badc4ffad5 Version 1.25.24. 2014-01-18 21:38:11 +00:00
Richard W.M. Jones
a1eacea572 init: Display clocksource (only when debugging is enabled). 2014-01-18 16:55:09 +00:00
Richard W.M. Jones
012b01a0fb launch: direct: Make sure we pass lpj= parameter when using TCG.
I have verified that 'refined-jiffies' is the clock source when using
TCG (ie. not kvm-clock which seems only to be used for KVM).
2014-01-18 16:52:58 +00:00
Richard W.M. Jones
26f7fb237b launch: libvirt: Add force_tcg backend setting.
By using:

  export LIBGUESTFS_BACKEND_SETTINGS=force_tcg

you can force the libvirt backend to use TCG (software emulation)
instead of KVM (hardware accelerated virtualization).
2014-01-18 16:36:14 +00:00
Richard W.M. Jones
11ac9f7024 launch: direct: Add force_tcg backend setting.
By using:

  export LIBGUESTFS_BACKEND=direct
  export LIBGUESTFS_BACKEND_SETTINGS=force_tcg

you can force the direct backend to use TCG (software emulation)
instead of KVM (hardware accelerated virtualization).

This is sometimes useful, especially if you are trying to use
nested KVM on Intel.
2014-01-18 16:32:03 +00:00
Richard W.M. Jones
1e4663858b New API: set-backend-settings, get-backend-settings.
Allow settings (an arbitrary list of strings) to be passed to the
current backend.  This will allow us to tweak how the backend works,
eg. by forcing TCG.
2014-01-18 16:32:03 +00:00
Richard W.M. Jones
815e739d12 utils: Add regression test for C utility functions. 2014-01-18 16:32:03 +00:00
Richard W.M. Jones
89a617c07d utils: Add utility function to split string into list of strings. 2014-01-18 16:32:03 +00:00
Richard W.M. Jones
693a21513b utils: Add utility function to copy string lists. 2014-01-18 16:32:03 +00:00
Richard W.M. Jones
20514fec25 test-tool: Use size_t instead of int for array index. 2014-01-18 16:32:03 +00:00
Richard W.M. Jones
3858eeb517 tests/nbd: Move wait for qemu-nbd to start up earlier.
tests/nbd/test-nbd.pl contains a hack (a call to sleep) to wait
for qemu-nbd to start up in another process.

This sleep was previously located before the call to $g->launch()
since that is where (previous to commit 4a0f5ed382) the backend would
have connected to the NBD server.

However in the new code, an initial NBD connection test is done when
the drive is added (ie. $g->add_drive (..., protocol=>"nbd")), which
duly failed intermittently because the qemu-nbd server had not opened
its socket yet.

Move the wait earlier -- just after the fork -- to avoid this.

This updates commit 4a0f5ed382.
2014-01-18 16:32:03 +00:00
Richard W.M. Jones
b6ff642168 Use recommended timer settings for KVM (RHBZ#1053847).
See: https://bugzilla.redhat.com/show_bug.cgi?id=1053847#c0

Thanks: Cole Robinson, and several QEMU developers.
2014-01-18 16:32:03 +00:00
Richard W.M. Jones
937c0313a0 launch: libvirt: Slightly simplify the XML generation code further.
This updates commit 96737fc5b7.
2014-01-18 11:40:30 +00:00
Richard W.M. Jones
e5190e0932 Version 1.25.23. 2014-01-17 19:32:05 +00:00
Richard W.M. Jones
c537b26f20 uml: Fix rule which disables relative-paths test on UML.
This fixes commit e22bd2dcd2.
2014-01-17 19:23:27 +00:00
Richard W.M. Jones
716f6e4275 Version 1.25.22. 2014-01-17 15:48:22 +00:00
Richard W.M. Jones
e22bd2dcd2 tests: Add a test of relative paths, to make sure we don't break them.
In some places we turn relative paths passed by the caller into
absolute paths: for example in the libvirt backend, all relative paths
to disk images have to be turned into absolute paths (by calling
realpath) because otherwise libvirt doesn't work.

This has the potential to break things, especially considering that
qemu uses the path passed to it in order to resolve the relative paths
of backing files.

For example consider the case where 'overlay' is a symbolic link to
/dev/dm-1, but /dev/dm-1 contains a qcow2 which references './backing'
as its backing file.  If we rewrote 'overlay' to '/dev/dm-1', then
qemu would try to look up '/dev/backing' for the backing file and
fail.

See also:

https://bugzilla.redhat.com/show_bug.cgi?id=1053684
https://www.redhat.com/archives/libguestfs/2014-January/thread.html#00087
2014-01-17 15:33:26 +00:00
Richard W.M. Jones
96737fc5b7 launch: libvirt: Use C macros to simplify XML generation.
This commit implements some hairy C macros to simplify
XML generation.

Given the target XML:

  <cpu mode="host-passthrough">
    <model fallback="allow"/>
  </cpu>

The old code would have looked like this:

   XMLERROR (-1, xmlTextWriterStartElement (xo, BAD_CAST "cpu"));
   XMLERROR (-1,
            xmlTextWriterWriteAttribute (xo, BAD_CAST "mode",
                                         BAD_CAST "host-passthrough"));
   XMLERROR (-1, xmlTextWriterStartElement (xo, BAD_CAST "model"));
   XMLERROR (-1,
            xmlTextWriterWriteAttribute (xo, BAD_CAST "fallback",
                                         BAD_CAST "allow"));
   XMLERROR (-1, xmlTextWriterEndElement (xo));
   XMLERROR (-1, xmlTextWriterEndElement (xo));

The new code looks like this:

   start_element ("cpu") {
     attribute ("mode", "host-passthrough");
     start_element ("model") {
       attribute ("fallback", "allow");
     } end_element ();
   } end_element ();
2014-01-17 12:16:31 +00:00
Richard W.M. Jones
f106b30c41 drives: Avoid double-free along error path.
This fixes commit 4a0f5ed382.

A simple test of this:

  guestfish <<EOF
  add-drive "" readonly:1 format:raw protocol:nbd server:localhost:10000
  EOF

which would core dump.
2014-01-17 12:15:40 +00:00
Richard W.M. Jones
6b3e05e8da Minimum libvirt version is >= 1.1.1.
Note this is the version in RHEL 7.
2014-01-16 20:00:03 +00:00
Richard W.M. Jones
4a0f5ed382 drives: Centrally create overlays for read-only drives.
qemu has broken snapshot=on ... again.

Change the way that drives are created so that the backend no longer
has to use snapshot=on, <transient/> (which never worked), or UML's
corresponding COW-creation feature (also broken).

Instead of that, the src/drives.c code will create overlays when
required by calling into a new backend operation 'create_cow_overlay'.
This operation runs 'qemu-img create -b' or 'uml_mkcow' as determined
by the backend, and returns the name of the overlay.

The format of the overlay is still backend-specific because qemu needs
to use qcow2 and UML needs to use COW.

This patch also includes some factorization of the libvirt XML code.

This also drops the drv->priv (private per-drive data) field, since it
is no longer used by any backend.

This also moves the guestfs___drive_source_qemu_param utility
function, used & shared by the direct & libvirt backends only, into
src/launch-direct.c (from src/drives.c).
2014-01-16 18:01:46 +00:00
Richard W.M. Jones
07e47513df fish: Fix tests that specified qcow2 format, but passed a raw format disk.
In some tests we were specifying qcow2 as the image format when adding
a disk, but actually passing a raw format image.

Libguestfs previously did not detect this until guestfs_launch, but it
was still a bug to pass an incorrect format to guestfs_add_drive_opts.

It only worked because these tests never call guestfs_launch.

A later commit in this series will cause this to be detected
(sometimes) during guestfs_add_drive_opts.
2014-01-16 18:01:46 +00:00
Richard W.M. Jones
b3cf877e58 builder: Fix unterminated I<...> in man page.
Thanks: Lukas Zapletal.
2014-01-16 18:01:46 +00:00
Pino Toscano
5b42351294 builder: add a JSON output for --list
Simple JSON output for sources and templates, to be able to query them
with no need to parse unstructured outputs like the "--list-format long"
one.
2014-01-16 14:58:25 +01:00
Pino Toscano
e45bfe0d36 builder: add --list-format
Add a --list-format which allows to choose which in format should be the
output of --list.
2014-01-16 12:34:48 +01:00
Pino Toscano
91aae893c7 builder: small refactor of the list output
Switch from a boolean for the short/long list output to labels for the
actual format. Also, split the output of each list format to an own
function for easier maintaineance.
2014-01-16 11:49:05 +01:00
Pino Toscano
99d6e2c84e fuse: clear stat structs (RHBZ#660687).
Not all the fields of struct stat are actually filled by us. This caused
rubbish to appear in the microseconds fields, which were then used as
base when changing atime/ctime (with e.g. touch), triggering EINVAL by
futimens/utimensat when those rubbish values were out of the range
allowed for microseconds.
2014-01-15 18:51:18 +01:00
Pino Toscano
8bbd22d373 fuse: remove extra trailing \n in debug messages
debug() adds it already.
2014-01-15 14:02:24 +01:00
Richard W.M. Jones
7c431d7030 builder: Add documentation for how to import images into OpenStack. 2014-01-14 17:30:40 +00:00
Pino Toscano
775c6daf22 builder: test-virt-builder: check some results
Check at least some basic modifications in the image created with
virt-builder.
2014-01-14 13:30:19 +01:00
Pino Toscano
b7bb1f6cee builder, edit, fish: use copy-attributes
Make use of the new copy-attributes command to properly copy all file
attributes from a file to the new version of it.
2014-01-14 11:08:25 +01:00
Richard W.M. Jones
4c4480de28 Version 1.25.21. 2014-01-13 22:12:37 +00:00
Richard W.M. Jones
aba64a0327 fish: Add test-file-attrs.sh to EXTRA_DIST.
This fixes commit efb5f18415.
2014-01-13 22:12:33 +00:00
Richard W.M. Jones
e664739a57 builder: planner: Whitespace change. 2014-01-13 20:58:08 +00:00
Richard W.M. Jones
69d9c8515c builder: For performance, recommend using the --no-sync option. 2014-01-13 20:42:48 +00:00
Richard W.M. Jones
5136de98e7 builder: Add --no-delete-on-failure option to aid debugging.
This lets you debug failures in virt-builder, especially when scripts
or installing packages fails.
2014-01-13 20:30:43 +00:00
Richard W.M. Jones
6879fdf989 builder: Minor documentation fix to manual page. 2014-01-13 20:16:27 +00:00
Richard W.M. Jones
e68baf1954 Update generated files for new copy-attributes API.
This updates commit efb5f18415.
2014-01-13 19:26:01 +00:00
Richard W.M. Jones
5fa55389d4 builder: Fix documentation for --attach option. 2014-01-13 19:25:34 +00:00
Richard W.M. Jones
d885d6f6a9 builder: Document how to set Japanese in Debian 7. 2014-01-13 16:20:11 +00:00
Pino Toscano
efb5f18415 New API: copy-attributes.
This allows one to copy attributes (like permissions, xattrs,
ownership) from a file to another.
2014-01-13 14:57:44 +01:00
Pino Toscano
418c064bc1 sysprep: add --operations
Add a new --operation parameter which, similarly to --enable, can be
used to enable operations, but also to remove them, and to add/remove
the default operations and all the available ones.
2014-01-13 14:57:00 +01:00
Richard W.M. Jones
0d1c00211b Version 1.25.20. 2014-01-12 18:07:21 +00:00
Richard W.M. Jones
ed43cc12c4 builder/website: Add CirrOS signature file to EXTRA_DIST.
This fixes commit 40b88fdbc7.
2014-01-12 18:06:26 +00:00
Richard W.M. Jones
7500ae3f75 builder: Fix virt-builder test.
Add Europe/London timezone to phony Fedora guest.

This fixes commit dd1bfea513.
2014-01-12 17:49:48 +00:00
Richard W.M. Jones
fcdea83c6b builder: Document how to set Japanese language support in Fedora 20.
This updates/fixes commit 7e8ad13e86.
2014-01-12 17:10:30 +00:00
Richard W.M. Jones
a8c9aedd51 builder: Document that SELinux guests will reboot for autorelabel. 2014-01-12 14:59:46 +00:00
Richard W.M. Jones
f40e44c2f9 builder: Document how to set up local mirrors for performance and reliability. 2014-01-12 14:59:46 +00:00
Richard W.M. Jones
7e8ad13e86 builder: Document how to change the language/locale of a new guest. 2014-01-12 14:59:46 +00:00
Richard W.M. Jones
6d4ac696e5 builder: Add --link option for creating symbolic links.
This is useful for configuring systemd services.
2014-01-10 21:25:19 +00:00
Richard W.M. Jones
39bc959c5b builder: List --install packages in the same order as on the command line.
Previously the list was reversed.  Note this doesn't have any effect
on how the packages are installed since the guest package manager
doesn't care about the order.
2014-01-10 21:20:36 +00:00
Richard W.M. Jones
8ae6b6c9ff builder: Document how to change keyboard layout.
This is too complex to implement directly in virt-builder.

Instead we just document how to do it for some common Linux distros
using --run-command, --edit etc.
2014-01-10 21:20:36 +00:00
Richard W.M. Jones
1e1b027c1b builder: docs: Remove confusing reference to timezone. 2014-01-10 21:20:36 +00:00
Richard W.M. Jones
dd1bfea513 sysprep, builder: Add --timezone option to set timezone of guest.
You can use it like this:

  virt-sysprep --timezone Europe/London ...
  virt-builder --timezone Europe/London ...
2014-01-10 21:20:36 +00:00
Richard W.M. Jones
cea270de3b daemon: xattr: Remove unused variable.
Revealed by using ./configure --enable-gcc-warnings.
2014-01-10 21:20:30 +00:00
Pino Toscano
59d8cf62cb daemon: xattr: move the listxattrs code in an own function
Move in an own function the code that does the (l)listxattrs allocating
the buffer of the right legth, as it will be useful later.

No functional changes, just code motion.
2014-01-10 15:10:03 +01:00
Pino Toscano
7630a7bbbd daemon: xattr: simplify the enabling of the linuxxattrs features
Instead of enable them when having one of the two headers for it but
still checking for the HAVE_* availability of each *xattr() function
used, just enable the linuxxattrs as a whole when having any of the
needed headers (like before) and all the needed functions.

This might cause the linuxxattrs to not be available anymore on systems
without the whole set of *xattr() functions implemented, but OTOH it
simplifies the xattr.c implementations.
2014-01-09 18:59:19 +01:00
Richard W.M. Jones
746a0b1f19 tests: Add a regression test for libvirt authentication (RHBZ#1044014).
This tests the virConnectAuthPtrDefault wrapper path.
2014-01-08 21:11:52 +00:00
Richard W.M. Jones
873db60c0e tests: Add a regression test of libvirt authentication events.
This requires a change to libvirt (in libvirt >= 1.2.1), see:

https://www.redhat.com/archives/libvir-list/2014-January/msg00378.html
2014-01-08 21:11:52 +00:00
Richard W.M. Jones
4125064554 libvirt-auth: Provide a friendlier wrapper around virConnectAuthPtrDefault (RHBZ#1044014). 2014-01-08 21:11:52 +00:00
Richard W.M. Jones
06f7bea148 builder: Fix handling of --size parameter.
It now matches the documentation:

  "Select the size of the output disk, [...]

  Virt-builder will resize filesystems inside the disk image
  automatically.

  If the size is not specified, then one of two things happens.  If
  the output is a file, then the size is the same as the template.  If
  the output is a device, partition, etc then the size of that device
  is used."

This also adds checks to make sure that users don't try to shrink a
disk (which is not possible), and they don't try to resize larger than
the output block device.
2014-01-07 17:32:04 +00:00
Richard W.M. Jones
a403febb8c mllib: Add library function to run external command and slurp up the output.
This also changes a couple of functions to use this new library
function.
2014-01-07 17:30:57 +00:00
Richard W.M. Jones
3e802605b5 builder: Pass ~prog global (program name) around. 2014-01-07 17:30:20 +00:00
Richard W.M. Jones
ac41f616db builder: Note in man page how to specify size in bytes. 2014-01-07 14:52:08 +00:00
Richard W.M. Jones
40b88fdbc7 builder: Add CirrOS 0.3.1 disk image. 2014-01-04 12:37:40 +00:00
Richard W.M. Jones
169a4a34e5 Version 1.25.19. 2014-01-02 17:06:10 +00:00
Richard W.M. Jones
6c971faecf Update copyright dates for 2014. 2014-01-02 16:53:34 +00:00
Richard W.M. Jones
883208284b Allow ./configure --without-qemu.
This means there will be no default hypervisor, and effectively the
user will always have to specify one (eg. by setting LIBGUESTFS_HV or
calling guestfs_set_hv).

This is useful on platforms where qemu doesn't work, or where qemu is
not needed (eg. if you want to use UML, or you just want to compile
libguestfs without using/testing it).
2014-01-02 16:24:26 +00:00
Richard W.M. Jones
ee4ce2a029 ruby: Fix .new method (RHBZ#1046509).
The .new method was unintentionally broken in
commit 9466060201.

This fixes the .new method and allows it to be called with multiple
parameters, so you can use:

  Guestfs::Guestfs.new
  Guestfs::Guestfs.new()
  Guestfs::Guestfs.new(:close_on_exit => false)
  etc.

For backwards compatibility, Guestfs::create may still be used.

This commit also adds regression tests:

 - Use .new method in regular tests.  (Because this was not done
   before, we didn't catch the breakage.)

 - Test that ::create still works.

 - Test that args can be passed to .new method.
2013-12-27 13:22:20 +00:00
Richard W.M. Jones
480bd3a6d8 RHEL 6: ruby: Fix fallback to rake/rdoctask for old rake. 2013-12-27 13:22:20 +00:00
Richard W.M. Jones
c16f2ea53d RHEL 6: builder: Use iteri instead of List.iteri.
RHEL 6 OCaml did not have List.iteri, so use the version from
Common_utils instead.
2013-12-27 12:58:57 +00:00
Pino Toscano
ac1d5ba77b tests/mountable: skip if btrfs is not available
This test uses btrfs, so skip it if either the "btrfs" feature or the
btrfs filesystem is not available.
2013-12-23 17:02:02 +01:00
Pino Toscano
d20289186d inspect: fix detection of newer CirrOS versions (RHBZ#1045450).
Add an own case for CirrOS, based on the /etc/cirros/version file
provided in newer version instead of the Buildroot-generated
/etc/br-version.
2013-12-20 15:00:09 +01:00
Richard W.M. Jones
1580d965cd builder: Add support for RHEL 7.0 beta 1 (public beta) to the script. 2013-12-20 12:52:48 +00:00
Pino Toscano
a13696e99c Re-add regression tests for rh#563450
Added in 2392fae680 and removed in
be025369ad622867ecf08d5c9170e8e59d2d6294; now they should work with any
backend, as the device names are normalised and not change the guestfish
output depending on the used backend.

Thanks Richard for the hints.
2013-12-20 11:38:52 +01:00
Richard W.M. Jones
8acb91a584 launch: libvirt: Clearer message when libvirt screws up.
Instead of:

libguestfs: error: could not create appliance through libvirt.
Try using the direct backend to run qemu directly without libvirt,
by setting the LIBGUESTFS_BACKEND=direct environment variable.: internal error: process exited while connecting to monitor: qemu-system-x86_64: -drive file=/tmp/libguestfs3RnJSd/snapshot2,if=none,id=drive-scsi0-0-0-0,format=qcow2,cache=writeback: could not open disk image /tmp/libguestfs3RnJSd/snapshot2: Could not open backing file: Could not open '/home/lsm5/fimagebuilder/fedora-imagebuilder/fedora-imagebuilder-sda.qcow2': Permission denied

it will now say:

libguestfs: error: could not create appliance through libvirt.

Try running qemu directly without libvirt using this environment variable:
export LIBGUESTFS_BACKEND=direct

Original error from libvirt: internal error: process exited while connecting to monitor: qemu-system-x86_64: -drive file=/tmp/libguestfs3RnJSd/snapshot2,if=none,id=drive-scsi0-0-0-0,format=qcow2,cache=writeback: could not open disk image /tmp/libguestfs3RnJSd/snapshot2: Could not open backing file: Could not open '/home/lsm5/fimagebuilder/fedora-imagebuilder/fedora-imagebuilder-sda.qcow2': Permission denied
2013-12-19 18:43:09 +00:00
Richard W.M. Jones
d16db5a618 launch: libvirt: Don't default to using NULL for libvirt connection URI (RHBZ#1045033).
NULL means that libvirt gets to guess what connection URI we meant.
Currently it guesses qemu:///session for non-root and qemu:///system
for root.  Except if LIBVIRT_DEFAULT_URI is set in which case this is
used even if it's not appropriate.  Except if Xen is installed in
which case it guesses xen:/// which is not helpful at all.

Instead use qemu:///session (or qemu:///system for root -- that's
likely to be wrong, but we can't help that).

If the user really wants to use NULL and let libvirt guess, then they
can now specify the libvirt:null backend.

See:

https://bugzilla.redhat.com/show_bug.cgi?id=1045033
https://bugzilla.redhat.com/show_bug.cgi?id=886915

A good way to test this is:

LIBVIRT_DEFAULT_URI=iambroken libguestfs-test-tool

The libguestfs libvirt backend should (after this commit) ignore
LIBVIRT_DEFAULT_URI.  However other parts of libguestfs will still use
it, eg. guestfs_add_drive_opts, guestfish '-d' option.
2013-12-19 14:32:27 +00:00
Richard W.M. Jones
b46a5511b3 builder: Add --update option to update template/core packages. 2013-12-19 12:54:24 +00:00
Richard W.M. Jones
6814888774 run: Use timeout --foreground option.
If timeout doesn't have this option (RHEL 6) don't use timeout at all.

Attempt to fix RHBZ#1025269.
2013-12-19 08:21:53 +00:00
Richard W.M. Jones
05b3aefb8b Version 1.25.18. 2013-12-18 20:42:41 +00:00
Richard W.M. Jones
be025369ad tests/regressions: Remove regression tests rhbz563450*.
These two tests failed 'make check-release' (particularly the
UML tests).

This partially reverts commit 2392fae680.
2013-12-18 20:40:54 +00:00
Richard W.M. Jones
80d2677784 Version 1.25.17. 2013-12-18 18:38:40 +00:00
Richard W.M. Jones
70db54974b fish: Fix memory leak in inspect/-i code (detected by valgrind).
This only manifested in the new virt-diff tool.
2013-12-18 18:37:50 +00:00
Richard W.M. Jones
d08efbec83 Version 1.25.16. 2013-12-18 17:38:26 +00:00
Richard W.M. Jones
34cbde5b88 builder: Change how EXTRA_DIST is generated.
So that we don't need to change this every time we upload
a new operating system signature.
2013-12-18 17:37:56 +00:00
Richard W.M. Jones
308292e4fb Update to latest gnulib. 2013-12-18 16:19:08 +00:00
Richard W.M. Jones
1fcea09ee2 appliance: Create an /etc/resolv.conf file referring to qemu user network nameserver (RHBZ#1044585). 2013-12-18 16:03:43 +00:00
Richard W.M. Jones
1ee879f3e5 New tool: virt-diff.
This tool can be used to show the differences between two
disk images.
2013-12-18 15:15:53 +00:00
Richard W.M. Jones
c7a2dce607 daemon: Sort extended attributes when returning them.
A single file can have multiple xattrs.  Previously these were
returned in the same order as the kernel returns them.  However it is
more useful if they are sorted by attribute name.
2013-12-18 15:15:53 +00:00
Richard W.M. Jones
937ea7f16f virt-ls: visit: Fix a bug with handling of extended attributes.
The wrong pointer was passed to the visitor_function, resulting in it
seeing the placeholder xattr entry (the one which stores the length of
the list of xattrs - see
http://libguestfs.org/guestfs.3.html#guestfs_lxattrlist ).

virt-ls doesn't list xattrs at the moment, hence this bug was not seen
before.
2013-12-18 15:15:53 +00:00
Richard W.M. Jones
276ef546c4 virt-ls: visit: Add an opaque pointer to the visitor function.
Useful for passing around data, but not used by virt-ls.  It
will be used by virt-diff.
2013-12-18 15:15:53 +00:00
Richard W.M. Jones
a93d418c3e virt-ls: Move visit and other functions to common code library.
This will allow us to reuse these functions in virt-diff.
2013-12-18 15:15:53 +00:00
Richard W.M. Jones
2b674ccdd3 fish: options: Add alternate add_drives_handle and inspect_mount_handle.
These functions don't use the implicit 'g' global variable, but
take a handle argument instead.
2013-12-18 15:15:53 +00:00
Richard W.M. Jones
c513d3a6e5 fish: Add option parsing for -A and -D options.
Same as -a and -d except these add the drives to a second list
of drives (drvs2).
2013-12-18 15:15:53 +00:00
Richard W.M. Jones
28adf7cea6 fish: Move -d option parsing to common function.
This is essentially just code motion, except:

(1) It cleans up a few variable declarations which were implicitly
used by the old macro that aren't needed any more.

(2) The options are reordered alphabetically.
2013-12-18 15:15:52 +00:00
Richard W.M. Jones
d9826467c2 fish: Deprecate the -D option (prefer --no-dest-paths instead).
This option will now print a warning:
guestfish: warning: -D option is deprecated, use --no-dest-paths instead
2013-12-18 15:15:52 +00:00
Richard W.M. Jones
78b9229bc8 lib: Export guestfs_compare_* functions for comparing structs and lists of structs. 2013-12-18 15:15:52 +00:00
Richard W.M. Jones
3d398687be lib: Export guestfs_copy_* functions for copying structs and lists of structs.
These complement the guestfs_free_* functions.
2013-12-18 15:15:52 +00:00
Richard W.M. Jones
0f3489ba6b lib: Rename cleanup-structs.c -> structs-cleanup.c and free-structs.c -> structs-free.c.
Just renaming generated files, no other effects.
2013-12-18 15:15:52 +00:00
Richard W.M. Jones
193b81a633 daemon: Improve error message for readlink call. 2013-12-18 15:15:52 +00:00
Richard W.M. Jones
882b91cb48 generator: Fix bug in documentation of guestfs_free_* functions.
These appeared in the documentation as:

 void guestfs_free_int_bool (struct guestfs_free_int_bool *);
                                            ^^^^

which is obviously wrong.
2013-12-18 15:15:52 +00:00
Richard W.M. Jones
d39b4dc606 fish: Ensure print_inspect_prompt can only be called by guestfish.
Code clean-up.
2013-12-18 15:15:52 +00:00
Richard W.M. Jones
a4f4f9c075 inspector: Ensure low-level inspection functions can only be called by virt-inspector.
Code clean-up.
2013-12-18 15:15:52 +00:00
Richard W.M. Jones
d6e4709f5b fish: options: Fix incorrect comment. 2013-12-18 15:15:52 +00:00
Richard W.M. Jones
076d73696e virt-cat, virt-filesystems, virt-ls don't use libconfig.
So it doesn't need to be linked in.
2013-12-18 15:15:51 +00:00
Richard W.M. Jones
685a28eb2c tests: guests: Add /etc/motd test file to Fedora test image. 2013-12-18 15:15:51 +00:00
Richard W.M. Jones
c4646290d6 builder: no_proxy environment variable should be passed to the appliance. 2013-12-18 15:15:51 +00:00
Richard W.M. Jones
6f3ca3699d builder: Add Fedora 20 image. 2013-12-17 16:08:45 +00:00
Richard W.M. Jones
c4fdb4023e builder: Remove blank line. 2013-12-16 14:14:11 +00:00
Pino Toscano
2392fae680 drives: add CD-ROM disk images as read-only drives (RHBZ#563450).
The current add_cdrom way basically appends a new raw "-cdrom /path"
parameter to the qemu invocation (even when using libvirt as backend),
hence such images are seen as "CD-ROM drives" inside the appliance.
However, there is no need for such particular behaviour, as they need to
be handled as normal (read-only) drives.

Adding CD-ROM disk images as drives also changes the device names used
for them inside the appliance from /dev/srN to the usual e.g. /dev/sdX.

These changes fix different issues:
- it is possible to start guestfish without adding disks with -a, then
  just add-cdrom and run
- list-devices does not cause guestfsd to crash when sorting the list
  of devices (exposed by the test case in RHBZ#563450)
- the result of list-devices now reflects the order images were added
  (RHBZ#563450)

add_cdrom is still deprecated, but now in favour of add_drive_ro
(instead of add_drive), with its documentation reflecting that.

Add two small regression tests for the fixes described above.
2013-12-16 14:54:27 +01:00
Richard W.M. Jones
3cf5a25e3f builder: Refuse to write to a char device or /dev/null.
virt-builder --output /dev/null is tempting, but not possible, and
might result in /dev/null being deleted(!)  Check for this case and
prevent it happening.
2013-12-14 18:54:56 +00:00
Richard W.M. Jones
0037820ee0 builder: Only use virt-resize --no-sparse when writing to a block device.
Previously we would use the virt-resize --no-sparse option if the
final output file was a block device.  This is safe, but unnecessary
for example if virt-resize was used as an intermediate step.  So only
use this option if virt-resize is actually writing to the block
device.
2013-12-14 18:53:20 +00:00
Richard W.M. Jones
0cdc864588 Version 1.25.15. 2013-12-14 17:32:40 +00:00
Richard W.M. Jones
d5d1dac3ac builder: Add a link to blog posting about the planner.
http://rwmj.wordpress.com/2013/12/14/writing-a-planner-to-solve-a-tricky-programming-optimization-problem/
should help people to understand how this code works.
2013-12-14 16:43:40 +00:00
Richard W.M. Jones
6901cd2250 builder: tests: Add test-virt-builder-planner.sh to EXTRA_DIST.
This fixes commit a27963b67b.
2013-12-14 16:18:50 +00:00
Richard W.M. Jones
3f433d90f2 builder: tests: Fix virt-builder --list output.
This fixes commit a27963b67b.
2013-12-14 16:18:23 +00:00
Richard W.M. Jones
a27963b67b builder: Add a test of the planner.
This tries out many combinations of size/format and ensures
that the planner can deal with them.
2013-12-14 15:50:37 +00:00
Richard W.M. Jones
7af9cabade builder: Flush debug info after printing it. 2013-12-14 15:50:04 +00:00
Richard W.M. Jones
0af1e55e68 builder: planner: Handle no format= in source case correctly. 2013-12-14 15:49:25 +00:00
Richard W.M. Jones
62cc7d3361 builder: Use a planner to work out how to convert the template to the final image.
The original template might be, say, xz-compressed raw of a certain
size.  We need to work out how to convert it to, say, qcow2 with a
larger size, in as few operations as possible.

Instead of using a nasty aggregation of special cases to do this, use
a breadth-first search over all possible trees to try to find an
optimal plan.

(Actually the current implementation isn't optimal, but it's fine for
virt-builder.)
2013-12-14 13:21:26 +00:00
Richard W.M. Jones
81b4e5d5cd builder: Move is_block_device function into common utilities.
This is just code motion.
2013-12-14 13:21:26 +00:00
Richard W.M. Jones
d98fbf2071 resize: Move roundup64 function into common utilities.
This is just code motion.
2013-12-14 13:21:25 +00:00
Hilko Bengen
d57d8f22de golang: Don't run launch test if appliance has not been built. 2013-12-13 18:46:57 +01:00
Pino Toscano
30936f499e sysprep: remove some Pegasus files, like certs (RHBZ#1041552). 2013-12-13 11:04:30 +01:00
Richard W.M. Jones
3ae829d752 golang: Add note about difficulty of parsing go version numbers. 2013-12-13 08:46:04 +00:00
Richard W.M. Jones
29cfb10bd4 Version 1.25.14. 2013-12-12 16:18:37 +00:00
Pino Toscano
1877c10603 fuse: provide a stub "flush" implementation (RHBZ#660687).
It seems that FUSE can invoke flush to make sure the pending changes
(e.g. to the attributes) of a file are set. Since a missing flush
implementation is handled as if it were returning ENOSYS, this can cause
issues later.

To overcome this, just provide a stub implementation which does nothing,
since we have nothing to do and don't want to have FUSE error out.

Furthermore, uncomment the timestamp checks in test-fuse.sh, since now
they should be working fine.
2013-12-12 16:23:50 +01:00
Richard W.M. Jones
7775c121f7 recipes: Use new style -a/-d options in virt-edit example. 2013-12-11 19:22:12 +00:00
Hilko Bengen
0c0caaddb0 po: Create empty files to be edited by xgettext
This avoids:

    xgettext: error while opening "libguestfs.pot-t" for reading: No such file or directory

which I observed with xgettext (GNU gettext-tools) 0.18.3
2013-12-10 21:53:46 +01:00
Hilko Bengen
dabc7a4a56 Fix builder/website test in out-of-tree builds 2013-12-10 21:52:52 +01:00
Hilko Bengen
cbc0e79d38 Fix manpage generation in out-of-tree builds 2013-12-10 21:52:52 +01:00
Richard W.M. Jones
b121015221 daemon: mkfs: Use -I option to force mkfs.fat to write a filesystem over a whole device (RHBZ#1039995).
If you use virt-make-fs to create a partitionless FAT-formatted disk
image then currently you will get an error:

$ virt-make-fs --type=fat . /tmp/test.img
'mkfs' (create filesystem) operation failed.
Instead of 'fat', try 'vfat' (long filenames) or 'msdos' (short filenames).
mkfs: fat: /dev/sda: mkfs.fat: Device partition expected, not making filesystem on entire device '/dev/sda' (use -I to override) at /usr/bin/virt-make-fs line 508, <PIPE> line 1.
      ...propagated at /usr/bin/virt-make-fs line 518, <PIPE> line 1.

With this patch, the error goes away and partitionless disks can be
created.
2013-12-10 13:46:54 +00:00
Richard W.M. Jones
1f0e75213b proto: Remove another error message which hides earlier error.
When receive_file_data calls guestfs___recv_from_daemon, and that
function returns -1, it adds the following error to the handle:

  receive_file_data: parse error in reply callback

However this hides a more specific error message which was already
added by guestfs___recv_from_daemon.
2013-12-10 13:34:13 +00:00
Richard W.M. Jones
78df80d649 proto: Remove error message which hides earlier error.
When chunked encoding fails, the following error is added to
the handle:

  [filename]: error in chunked encoding

However all paths returning -1 from receive_file_data already set a
more specific error, which this error hides.
2013-12-10 13:34:13 +00:00
Pino Toscano
41729c6556 lib: fix newline in error output (RHBZ#923355). 2013-12-10 10:32:12 +01:00
Pino Toscano
1472fbd903 sysprep: mention globbing in help for --delete
Followup of ed4bcb119c.
2013-12-09 19:37:51 +01:00
Pino Toscano
ed4bcb119c sysprep: allow to specify globbing for --delete
Adapt the globbing part from the old --remote-path work previously
proposed for sysprep [1], allowing --delete to perform globbing when
deleting paths.

[1] https://www.redhat.com/archives/libguestfs/2013-October/msg00045.html
2013-12-09 15:26:43 +00:00
Pino Toscano
7a41f5c126 launch: switch from -nographic to -display none
The latter is a better way to disable the qemu display output as we
need to, without enabling extra devices (which are disabled already,
anyway).

Also, related to the change above, ban the -display parameter from the
ones that can be supplied by the user.
2013-12-09 15:26:43 +00:00
Pino Toscano
c89ffbc152 sysprep: remove more anaconda and tuned logs (RHBZ#1039540). 2013-12-09 15:26:43 +00:00
Richard W.M. Jones
a0c642c156 Version 1.25.13. 2013-12-08 12:43:02 +00:00
Hilko Bengen
3f44e09cb5 Fix virt-builder tests for out-of-tree build 2013-12-07 21:40:00 +01:00
Hilko Bengen
38410afc5a Fix installing man-pages from out-of-tree build 2013-12-07 21:40:00 +01:00
Richard W.M. Jones
f631770974 Add CentOS 6.5 image. 2013-12-07 10:30:14 +00:00
Richard W.M. Jones
5c76af3a95 recipes: Add a recipe for masking a systemd service. 2013-12-06 18:58:17 +00:00
Richard W.M. Jones
023128a0eb Revert half of "builder: translate more user-visible strings"
Don't change "os-version" to "OS version".  It's intended to be the
same as the virt-builder man page, which consistently calls this the
"os-version" string.

This partially reverts commit ee0e56f43e.
2013-12-06 15:03:41 +00:00
Richard W.M. Jones
915908fcdd launch: direct: Pass -enable-fips option if qemu supports it. 2013-12-05 22:43:53 +00:00
Pino Toscano
178bc878e1 po: fix dependencies for libguestfs.pot extraction
Fix the dependencies of the libguestfs.pot target: other than using the
right make variables holding the contents of the POTFILES, depend also
on the POTFILES themselves.
2013-12-05 18:59:21 +00:00
Pino Toscano
c60dc40fe4 fish: improve the command error messages
- when a command needs no parameters, tell that explicitly instead of
  "command should have 0 parameters"
- use gettext's plural form when printing the number of required
  arguments
- improve the error message for a variable number of parameters limited
  only in the maximum number of them, using also a plural form
2013-12-05 15:44:00 +00:00
Pino Toscano
1a9a8ab48f po: fix broken message extraction
Extracting separately the pot for the various languages and then
creating manually the global pot (by manually joining the above ones
after having stripped their headers) is wrong, since other than being
an hack it can create an invalid pot when the same message appears in
sources written in different languages.

Instead, a cleaner and safer solution is to first let ocaml-gettext
(if available) extract the messages for the ml files, and then use
xgettext to extract the messages for the other languages, joining the
new messages to the existing (or not) pot file.
2013-12-05 15:40:04 +00:00
Pino Toscano
ee0e56f43e builder: translate more user-visible strings
Translate also the "OS version" and "Notes" strings that appear in the
--long output.
2013-12-04 20:50:29 +00:00
Richard W.M. Jones
6739073757 Version 1.25.12. 2013-12-02 13:40:56 +00:00
Pino Toscano
7af3602f5f inspect: improve detection of FreeBSD install discs (RHBZ#1033207).
Check for /boot/loader.rc as "install disc" detection, using it to mark
FreeBSD install discs.
Also, check for /mfsroot.gz to see whether such disc is also a live one.

See also RHBZ#1033207.
2013-11-28 15:10:52 +00:00
Pino Toscano
e754add14c inspect: ignore special CD devices on FreeBSD install discs
/etc/fstab in installation discs of FreeBSD can have an entry pointing
to the mounted CD itself; skip it as it is done with other CD devices in
check_fstab.
2013-11-28 15:08:02 +00:00
Pino Toscano
75bf5cfebf inspect: recognise Debian live images as such
Check for filesystem.squashfs also in /live, since it is where
live-build places it.
2013-11-28 15:08:02 +00:00
Richard W.M. Jones
04769ad507 launch: direct: Whitespace fix. 2013-11-26 18:32:01 +00:00
Richard W.M. Jones
e7fa7f4d16 launch: Print program and version as part of standard debug output when launching the handle.
There are a lot of cases where people post debugging output, but we're
not sure precisely which version they are using.
2013-11-25 23:25:44 +00:00
Richard W.M. Jones
97ea81eb21 tests: Test that network drives are mapped to correct qemu -drive parameters.
Although this test only specifically tests the direct backend, the
same code is shared with the libvirt backend in some circumstances
(eg. creating readonly drives).  So this is testing a bit of both.
2013-11-25 22:58:23 +00:00
Richard W.M. Jones
45afcdb307 ocaml: Remove unused function prototype. 2013-11-25 20:07:37 +00:00
Richard W.M. Jones
1ea1646e6f po-docs: If *.pod files are missing, tell user to run 'make update-po'.
I'm now fairly convinced it's not possible to do this automatically.
However we should at least tell the user what needs to be done.
2013-11-25 18:27:00 +00:00
Richard W.M. Jones
d81c577eff Version 1.25.11. 2013-11-23 09:46:44 +00:00
Richard W.M. Jones
53e45c8280 sysprep: Fix broken test when backend is UML.
This fixes commit cc1888a497.
2013-11-23 09:37:17 +00:00
Richard W.M. Jones
78d452e9a6 Version 1.25.10. 2013-11-22 17:16:11 +00:00
Richard W.M. Jones
5ee193433a lua: Don't redefine lua_objlen if already defined.
lua 5.2.2 seems to define this symbol already.
2013-11-22 17:15:20 +00:00
Richard W.M. Jones
c90b0eff98 Version 1.25.9. 2013-11-22 16:39:46 +00:00
Richard W.M. Jones
cc1888a497 sysprep: Add a test suite for the --password option. 2013-11-22 15:10:44 +00:00
Richard W.M. Jones
3712249f96 builder/sysprep: Allow accounts to be locked (RHBZ#1028660).
This allows you to select both locked accounts and disabled
passwords.  The two are subtly different concepts.

A locked account [cf. passwd -l] puts "!!" at the beginning of the
shadow password field.  Locking is reversible, because the "!!"  can
be removed, restoring the original password.  Therefore "locked"
acts as a flag in front of an existing selector.

A disabled account has "*" in the password field.  Therefore it has no
password.

Note that an account may be both locked and disabled, although this is
probably not useful.  The shadow password field will contain "!!*".
2013-11-22 15:10:44 +00:00
Richard W.M. Jones
02b5f00b2b builder/sysprep: Allow 'random' as a password selector.
This chooses a random password.
2013-11-22 14:16:09 +00:00
Richard W.M. Jones
91450b5f9a mllib: password: Replace password string with password_selector type.
This is just code motion, there is no functional change.
2013-11-21 17:34:59 +00:00
Richard W.M. Jones
9186438937 builder/sysprep: Describe --password/--root-password option as "selector".
It now appears in the respective man pages as:

  --root-password selector

or:

  --password selector

This avoids confusion from people who think these command line options
take the password directly.
2013-11-21 17:13:37 +00:00
Richard W.M. Jones
c7b0457c32 ls: Note that you can use virt-cat or guestfish to show file differences. 2013-11-21 17:13:37 +00:00
Richard W.M. Jones
9024551245 ls: In image diff example, don't use --time-t.
It shows differences in file access times (atime) which is not
actually that useful for most people.
2013-11-21 17:13:37 +00:00
Richard W.M. Jones
2d9f69db61 FAQ: "execl: /init: Permission denied" error also caused by /init not being executable.
This updates commit 98cd329323.
2013-11-19 17:50:04 +00:00
Richard W.M. Jones
98cd329323 FAQ: Attempt to explain "execl: /init: Permission denied" error. 2013-11-19 16:59:34 +00:00
Richard W.M. Jones
acce28e887 lib: Make sure -lselinux is used when linking libguestfs.so.
If libselinux was detected, it was not added to the linker command
line.  This still worked (at least on Fedora) because some other
library pulls in the dependency implicitly, possibly libvirt.  However
this broke on Arch:

https://aur.archlinux.org/packages/libguestfs/

Reported by and thanks: Antoni Segura Puimedon.
2013-11-19 09:09:02 +00:00
Richard W.M. Jones
59596810b0 daemon: btrfs: Upstream 'btrfs device add' command now needs '--force' option to work.
However earlier versions didn't have the --force option, so we
have to detect it.
2013-11-15 09:05:43 +00:00
Richard W.M. Jones
64f93b36de Version 1.25.8. 2013-11-14 17:01:12 +00:00
Richard W.M. Jones
793a5677cb virt-win-reg: Allow URIs (RHBZ#912193). 2013-11-14 16:34:07 +00:00
Richard W.M. Jones
c032130226 perl: Give error instead of crashing if optarg is not an array reference.
$g->add_drive ("", server => 1);

would segfault.  Now it gives a nice error instead:

  array reference expected for 'server' argument at [line]
2013-11-14 15:45:23 +00:00
Török Edwin
6a1061663f Avoid modulo bias in random password generation
Char.code (input_char chan) mod nr_chars has modulo bias because
the original interval is not a multiple of the destination interval,
i.e. 256 mod nr_chars != 0.

One way to fix this is to keep generating random numbers until they fall outside
the interval where modulo bias occurs, that is accept only c=[256 % nr_chars, 256).
That interval maps back to [0, nr_chars), and has a length of
(256 - 256 % nr_chars), which is a multiple of nr_chars.

RWMJ:
 - Modify the code so it goes into a utility library.
 - Use the same code across virt-builder and virt-sysprep.
2013-11-14 10:52:16 +00:00
Richard W.M. Jones
f013b15fa1 mllib: Add a utility function for safely reading from /dev/urandom.
OCaml's buffered 'in_channel' has a 64k buffer, so using it to read a
few bytes from /dev/urandom removes a lot of the system's entropy (for
example /proc/sys/kernel/random/entropy_avail goes from ~3000 to 128).

This patch was originally by Edwin Török for builder.ml.  I
generalized it because there are two other places where we did
over-sized reads from /dev/urandom.
2013-11-14 10:52:16 +00:00
Richard W.M. Jones
544d6b25e3 builder: Clarify architecture section of the documentation.
I have checked and cross architecture builds work fine:

http://rwmj.wordpress.com/2013/11/09/virt-builder-running-on-arm/#content
2013-11-12 19:57:29 +00:00
Richard W.M. Jones
fb41ce252f Change supermin man pages section 8 to section 1.
Corresponding change in upstream supermin:
cb3f9e8bba
2013-11-12 08:49:45 +00:00
Richard W.M. Jones
edacd479fa podwrapper: virt-install is not a libguestfs page.
This now redirect to http://man.he.net/man1/virt-install, but this is
unfortunately a 404.

Incomplete fix for RHBZ#1029134.

Thanks: Paul Maunders.
2013-11-11 18:38:37 +00:00
Richard W.M. Jones
4b2e9c9264 builder: debian: Remove bogus proxy from apt configuration.
Thanks: Daniel Miranda
2013-11-11 13:35:17 +00:00
Richard W.M. Jones
50aca447ea builder: After building a template, print fields for index file. 2013-11-11 13:17:18 +00:00
Richard W.M. Jones
299e3153ee Version 1.25.7. 2013-11-08 16:14:41 +00:00
Richard W.M. Jones
300b357eb9 builder/website: Add some missing files to EXTRA_DIST. 2013-11-08 16:13:35 +00:00
Richard W.M. Jones
63ec023f19 builder: Allow /tmp or /Temp to be symlinks to a directory. 2013-11-07 15:30:13 +00:00
Richard W.M. Jones
7a8addb485 builder: Allow upload to directory when target is a symlink to a directory. 2013-11-07 15:29:51 +00:00
Richard W.M. Jones
e982c0a2f5 Update TODO: Remove some things that we've done. 2013-11-07 14:06:00 +00:00
Richard W.M. Jones
55795e652e builder/website: Add support for RHEL 5 releases to internal RHEL script. 2013-11-06 21:42:54 +00:00
Richard W.M. Jones
133ae6a34b builder/website: Don't use http_proxy in internal RHEL script. 2013-11-06 21:42:54 +00:00
Richard W.M. Jones
e906d30c62 builder: After compressing the template, calculate the SHA-512 hash. 2013-11-06 21:39:52 +00:00
Richard W.M. Jones
f459fe47f8 builder: Add a Scientific Linux 6 image. 2013-11-06 21:39:34 +00:00
Richard W.M. Jones
7147d41564 builder: Old OCaml didn't have List.iteri, so add a utility function. 2013-11-06 19:22:57 +00:00
Richard W.M. Jones
e9294668b4 builder: Add script for making Red Hat Enterprise Linux instances.
This uses some internal Red Hat repositories so it's not generally
useful, but could be easily adapted by users.
2013-11-06 16:54:20 +00:00
Richard W.M. Jones
b3a106cefc builder: Fail if lex is not installed.
This completes the fix for commit a4800e2d4f.
2013-11-06 15:08:08 +00:00
Richard W.M. Jones
4dd6e4328c builder: Use common code to sysprep, sparsify and compress images. 2013-11-06 13:42:58 +00:00
Adam Huffman
c76912cd77 builder: Add script for making Scientific Linux instances.
RWMJ:
 - Renamed the script from sl.sh -> scientificlinux.sh
 - The output file is called scientificlinux-$version
 - I fixed some whitespace issues so it's now similar to the CentOS script.
2013-11-06 13:32:32 +00:00
Richard W.M. Jones
f526fe1766 builder: Fail if bison is not installed.
This partially fixes commit a4800e2d4f.
2013-11-05 22:25:59 +00:00
Richard W.M. Jones
4339b55d10 builder: Add dependencies which automake doesn't generate correctly.
This is a further attempt, earlier commits:
commit e3ac293e86
commit dfe97b352d
2013-11-05 17:40:20 +00:00
Richard W.M. Jones
d669db7ff0 Update to latest gnulib to get hash relicensing change (thanks Jim Meyering). 2013-11-05 16:54:37 +00:00
Richard W.M. Jones
663012c5ff builder: Fix centos script - output filename was wrong.
This fixes commit 2f3fb2420e.
2013-11-05 16:51:08 +00:00
Richard W.M. Jones
6db81dc72e Version 1.25.6. 2013-11-05 16:13:17 +00:00
Richard W.M. Jones
e3ac293e86 builder: Add dependency from index-parse.h to index-validate.
For some reason automake doesn't get this dependency right,
resulting in occasional build failures if yacc races the
rest of the build.
2013-11-05 15:56:34 +00:00
Richard W.M. Jones
01551e5462 builder: Add some generated files to CLEANFILES.
This updates commit a4800e2d4f.
2013-11-05 15:43:27 +00:00
Richard W.M. Jones
dfe97b352d builder: Add missing dependency.
index-parser-c.c depends on index-parse.h being created first.
However without an explicit dependency, this is not done (and implicit
deps don't work because automake doesn't sufficiently understand OCaml
programs).

This fixes commit a4800e2d4f.
2013-11-05 15:42:05 +00:00
Richard W.M. Jones
96eab7cc00 Version 1.25.5. 2013-11-05 15:19:08 +00:00
Richard W.M. Jones
ab801c2657 Don't include email addresses in AUTHORS file.
Some authors had duplicate entries because they had multiple
email addresses.
2013-11-05 15:18:16 +00:00
Richard W.M. Jones
92206e8d09 builder/website: Add validate.sh test script to EXTRA_DIST.
This fixes commit 154bfb7dd4.
2013-11-05 15:15:17 +00:00
Richard W.M. Jones
2f3fb2420e builder: Replace centos-6.sh with a single script.
Just use:

  ./centos.sh 6

Note that you don't need to be root.
2013-11-05 14:25:24 +00:00
Richard W.M. Jones
af9e9299bf builder: Replace debian-<NN>.sh with a single script.
Just use:

  ./debian.sh 6 squeeze

Note that you don't need to be root.
2013-11-05 14:25:24 +00:00
Richard W.M. Jones
91b5e7fb37 builder: Replace ubuntu-<NN>.sh with a single script.
Just use:

  ./ubuntu.sh 10.04 lucid

Note that you don't need to be root.
2013-11-05 14:25:24 +00:00
Richard W.M. Jones
ade0f1a97d builder: Replace fedora-<NN> shell & kickstart with a single script.
Just use:

  ./fedora.sh 18

Note that you don't need to be root.
2013-11-05 14:25:24 +00:00
Richard W.M. Jones
681c88ef5d builder: Internal implementation of parallel xzcat (pxzcat).
Instead of calling out to the pxzcat program, use an internal
implementation.  This requires liblzma to be available at build time.
If it's not available, fall back to using regular xzcat.

It is intended that eventually this code will go away when regular
xzcat / unxz is able to use threads.
2013-11-05 12:45:42 +00:00
Nikos Skalkotos
7e2576a74a Fix fstab block device resolution for FreeBSD
The device name prefix for IDE hard drives used to be `ad' but now
is `ada' (http://www.freebsd.org/doc/handbook/disks-naming.html).
For virtio hard drives it is `vtbd'.

Under an MBR partition table a slice will be used, so the name of
the first partitions will be either `ada0s1a' or `vtbd0s1a'. Under a
GPT partition table, where no slice is needed, the name of the first
partition will be either `ada0p1' or `vtbd0p1'.

Signed-off-by: Nikos Skalkotos <skalkoto@grnet.gr>
2013-11-05 12:45:42 +00:00
Richard W.M. Jones
154bfb7dd4 builder/website: Add index validation test script. 2013-11-05 07:27:35 +00:00
Richard W.M. Jones
cd10f6f4db builder: Add an extra Makefile.am to builder/website. 2013-11-05 07:25:14 +00:00
Richard W.M. Jones
2035a75d66 builder: Fix missing files in EXTRA_DIST.
This fixes commit a4800e2d4f.
2013-11-05 07:15:19 +00:00
Richard W.M. Jones
004bf7c3db Version 1.25.4. 2013-11-04 22:33:48 +00:00
Richard W.M. Jones
2dca9d7194 builder: Fix 'check-valgrind' so it does something in this directory. 2013-11-04 22:13:23 +00:00
Richard W.M. Jones
a4800e2d4f builder: Add a real scanner/parser for index files.
This adds a tool called virt-index-validate to validate index files.
2013-11-04 21:49:01 +00:00
Richard W.M. Jones
3ffdddbedf builder: Don't use git tree / libguestfs.git to refer to the source.
git is just a VCS.
2013-11-04 21:36:22 +00:00
Richard W.M. Jones
50486232db df: Allow parallel test to be skipped.
It currently fails because of
https://bugzilla.redhat.com/show_bug.cgi?id=1025942
2013-11-02 08:31:27 +00:00
Richard W.M. Jones
5280e3031b builder: Only warn about unknown fields in the index if -v option is used.
Allows us to add new fields in future without having pointless
warnings from old versions of virt-builder.
2013-11-01 16:47:37 +00:00
Richard W.M. Jones
8d14abb0df builder: Allow checksum= as an alias for checksum[sha512]=.
This is for backwards compatibility with virt-builder 1.24.0 which
could not parse a key that contains square brackets and numbers.

This updates commit 4b73e0be29.
2013-11-01 16:45:52 +00:00
Richard W.M. Jones
5b9ac57d4e builder: Update TODO file with some more ideas. 2013-11-01 15:10:11 +00:00
Richard W.M. Jones
20ad6becd8 Version 1.25.3. 2013-11-01 14:45:46 +00:00
Richard W.M. Jones
e9d908929f builder: Add missing files to EXTRA_DIST. 2013-11-01 14:45:46 +00:00
Richard W.M. Jones
7113aee0b4 ./run: Disable timeouts in tests on RHEL 6.
Workaround for https://bugzilla.redhat.com/show_bug.cgi?id=1025269
2013-11-01 14:33:25 +00:00
Richard W.M. Jones
bb4e882d61 builder: Allow multiple source paths to be specified.
Users can now specify multiple source paths, eg:

  virt-builder --source http://example.com/foo \
    --source http://example.com/bar

to get templates from multiple places.

There is still only one built-in path, but we can add more later.
2013-11-01 14:16:34 +00:00
Richard W.M. Jones
b25e8da6d6 builder: When debugging, print curl command before running it. 2013-11-01 13:48:30 +00:00
Richard W.M. Jones
4b73e0be29 builder: index: Add checksum[sha512]=... option and deprecate template sigs.
We don't need to sign individual templates, provided the signed index
file contains the cryptographically secure checksums of the templates.
Since the index file cannot be interfered with and the checksums
cannot be spoofed, this is sufficient to ensure the integrity of the
templates.

Note the template signatures are now deprecated and will be removed in
libguestfs 1.26.  To avoid any backwards compatibility issues, I will
backport the relevant changes to the stable-1.24 branch.

Thanks Dennis Gilmore for pointing out that we could do this.
2013-11-01 08:21:52 +00:00
Richard W.M. Jones
3b746ee796 ./run: Fix massive thinko in $PATH setting.
This fixes commit 76c20d761b.
2013-11-01 08:21:52 +00:00
Richard W.M. Jones
984b024c5a builder: Whitespace change in error message. 2013-10-29 21:03:01 +00:00
Richard W.M. Jones
124f20a1ca builder: Be more careful about deleting temporary files on exit. 2013-10-29 21:02:39 +00:00
Richard W.M. Jones
9ac076c269 builder: Whitespace fix in Index_parser module. 2013-10-29 21:01:54 +00:00
Richard W.M. Jones
2191b9ae40 Version 1.25.2. 2013-10-29 19:45:23 +00:00
Wanlong Gao
e4c9212a8e sysprep: add feature of deleting specified paths
Signed-off-by: Wanlong Gao <gaowanlong@cn.fujitsu.com>
Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
2013-10-29 19:24:08 +00:00
Richard W.M. Jones
42e445f986 builder: Add -m/--memsize and --smp command line options. 2013-10-29 19:23:33 +00:00
Richard W.M. Jones
eb4e356bc3 launch: direct: Add some code to enable qemu / gdb debugging.
See the comment for details.

Note this is disabled by default.  Developers can only enable it by
changing #if 0 -> #if 1.
2013-10-29 12:30:20 -04:00
Matthew Booth
12e0e3fb09 docs: guestfs_case_sensitive_path returns error on non-existent path 2013-10-29 14:29:34 +00:00
Daniel Exner
2f85affefb Initial FrugalWare support. 2013-10-29 13:14:06 +00:00
Richard W.M. Jones
276cde033c builder: Add CentOS 6.4 guest. 2013-10-27 18:53:17 +00:00
Richard W.M. Jones
2937c03595 builder: Add a section on performance to the manual. 2013-10-27 14:59:39 +00:00
Richard W.M. Jones
76c20d761b ./run: Adjust $PATH to include all libguestfs binaries.
Instead of typing:

  ./run ./fish/guestfish ...

you can now use:

  ./run guestfish ...

This is shorter, but there are also two good reasons for this change:
It never made any sense to run the system-installed guestfish (or
other) binary.  It would be unlikely to work.  Also binaries in
libguestfs should be able to call other binaries freely without adding
special exceptions (which we had before this change).
2013-10-26 20:23:22 +01:00
Richard W.M. Jones
f114e28cc8 firstboot: Send the output to the console as well as to the log file.
For systemd:
Currently stdout+stderr go to the journal (these are effectively
empty unless there are gross errors).  The output of the commands
goes to the log file.

With this change, the output goes to the journal, the console and
the log file.

For SysV-init:
Currently stdout+stderr go to the console (but these are effectively
empty).  The output of the commands goes to the log file.

With this change, the output goes to the console and the log file.
2013-10-26 17:39:23 +01:00
Richard W.M. Jones
8b34855684 builder: Document how to boot VMs directly in qemu or KVM. 2013-10-26 17:39:23 +01:00
Richard W.M. Jones
0520aa3c42 builder: Add --write option to write a literal file. 2013-10-26 15:31:41 +01:00
Richard W.M. Jones
10c849ed1c builder: Allow --upload to a directory.
Also set the owner and permissions on the destination file correctly.
2013-10-26 15:31:27 +01:00
Richard W.M. Jones
cede5316b0 Version 1.25.1. 2013-10-26 11:01:51 +01:00
Richard W.M. Jones
2add5c9295 builder: Don't fail if ~/.cache doesn't exist (RHBZ#1022431). 2013-10-25 14:25:03 +01:00
Richard W.M. Jones
dd5959cd88 builder: Copy-editing on documentation.
Plus some ideas added to TODO file.
2013-10-25 14:05:34 +01:00
Richard W.M. Jones
99840550d5 builder: Add --mkdir option to create directories. 2013-10-25 13:35:51 +01:00
Richard W.M. Jones
b3ab3b452a builder: Fix two problems in --help output. 2013-10-23 11:37:11 +01:00
Richard W.M. Jones
3f46a92ed5 builder: Add --no-sync option to avoid sync on exit. 2013-10-22 22:28:27 +01:00
Richard W.M. Jones
f59a404568 Revert "java: Remove version number from the jar file (RHBZ#1022184)."
This reverts commit 7330ccd288.

See comment in https://bugzilla.redhat.com/1022184
2013-10-22 17:56:11 +01:00
Richard W.M. Jones
7330ccd288 java: Remove version number from the jar file (RHBZ#1022184). 2013-10-22 17:44:33 +01:00
Richard W.M. Jones
d4450c6590 builder: Use pxzcat (optionally) to speed up xzcat step. 2013-10-22 14:52:52 +01:00
Richard W.M. Jones
0e18bccb64 builder: Make xzcat binary configurable and use AC_PATH_PROG. 2013-10-22 14:52:52 +01:00
Richard W.M. Jones
2f3a3e308a builder: Don't run virt-resize when not necessary.
If:
 - the output is a regular file
 - the output format is raw
 - the user didn't specify the --size option
then we don't need to run virt-resize.  Simply uncompress
the template directly to the output file.
2013-10-22 14:52:52 +01:00
Richard W.M. Jones
2a76aa22c7 build: xz is required.
It is needed for libguestfs-make-fixed-appliance and many other places.
2013-10-22 13:58:33 +01:00
Richard W.M. Jones
5b89dd4aa1 mllib: Create config.ml from configure and use it for --version options.
Also don't internationalize the output of the --version option, as
that isn't useful.
2013-10-22 13:48:41 +01:00
Richard W.M. Jones
d6e5a6546a configure: Use AC_PATH_PROG{,S} for external programs used by the library. 2013-10-19 22:27:52 +01:00
Richard W.M. Jones
a29777c111 Version 1.25.0. 2013-10-18 17:55:45 +01:00
Richard W.M. Jones
356e6a6504 Version 1.24.0.
New stable branch.
2013-10-18 17:38:46 +01:00
Richard W.M. Jones
3b69792cd5 appliance: When valgrinding daemon + error path, sleep so valgrind messages are seen. 2013-10-18 13:59:01 +01:00
Richard W.M. Jones
dfaf417fef appliance: Add comments to init script. 2013-10-18 13:59:01 +01:00
Richard W.M. Jones
1e24b88270 resize, builder: Improve speed by using cache=unsafe on newly created files.
However because qemu might open these files immediately afterwards
using cache=none, we have to sync the file before exiting.
2013-10-18 13:59:01 +01:00
Richard W.M. Jones
9a4bfb386e resize: Rearrange objects.
This is just build refactoring.
2013-10-18 13:33:32 +01:00
Richard W.M. Jones
18c93ac61f RHEL 5: Don't use 'truncate' command in tests.
Use 'guestfish sparse' instead, which is roughly equivalent.

See commit ef1514aa1e
and commit 39df80dcc0.
2013-10-18 09:09:59 +01:00
Richard W.M. Jones
b68a99b8e2 Finalize release notes for libguestfs 1.24 release. 2013-10-17 16:03:49 +01:00
Richard W.M. Jones
6611d45ab7 Update PO files from Transifex. 2013-10-17 15:49:20 +01:00
Richard W.M. Jones
bbac0beab9 Update ROADMAP. 2013-10-17 15:48:44 +01:00
Richard W.M. Jones
feaf871856 API support: Fix website directory for new location. 2013-10-17 15:47:56 +01:00
Richard W.M. Jones
ad82de35b7 Update API support. 2013-10-17 15:47:52 +01:00
Richard W.M. Jones
3cce894f1b Update TODO. 2013-10-17 15:42:38 +01:00
Richard W.M. Jones
24a315507d Add man page for /etc/libguestfs-tools.conf (RHBZ#1019889).
Add a man page to document this configuration file.  This is
required by some distros, eg. Debian and RHEL.
2013-10-17 15:23:40 +01:00
Richard W.M. Jones
13b79aacca Use qemu-img -o preallocation=metadata where possible.
When format is qcow2 and we're *not* using a backing disk, we can use
preallocation=metadata for better performance.
2013-10-17 15:03:37 +01:00
Richard W.M. Jones
54fb09e052 fish: CVE-2013-4419: Fix insecure temporary directory handling for remote guestfish (RHBZ#1016960).
When using the guestfish --remote or guestfish --listen options,
guestfish would create a socket in a known location
(/tmp/.guestfish-$UID/socket-$PID).

The location has to be a known one in order for both ends to
communicate.  However no checking was done that the containing
directory (/tmp/.guestfish-$UID) is owned by the user.  Thus another
user could create this directory and potentially modify sockets owned
by another user's guestfish client or server.

This commit fixes the issue by creating the directory unconditionally,
and then checking that the directory has the correct owner and
permissions, thus preventing another user from creating the directory
first.

If guestfish sees a suspicious socket directory it will print an error
like this and exit with an error status:

  guestfish: '/tmp/.guestfish-1000' is not a directory or has insecure owner or permissions

Thanks: Michael Scherer for discovering this issue.

Version 2:
 - Add assigned CVE number.
 - Update documentation.

Signed-off-by: Richard W.M. Jones <rjones@redhat.com>
2013-10-17 12:54:06 +01:00
Richard W.M. Jones
34da8850bb builder: When doing maintainer test for new guests, test adding a user account. 2013-10-17 12:24:25 +01:00
Richard W.M. Jones
61306130f8 launch: libvirt: Add guestfs-<random> name to the handle.
This is so we can display the random name in debug messages.
2013-10-17 12:24:18 +01:00
Richard W.M. Jones
fc733cf943 FAQ: useradd -> usermod.
This fixes commit dd554d94ad.
2013-10-16 10:48:07 +01:00
Richard W.M. Jones
cb49299c13 Version 1.23.33. 2013-10-15 20:41:22 +01:00
Richard W.M. Jones
f08ef9778b builder: Add maintainer test for new guests.
This is not part of the automated test suite.  It's a manual test run
by the maintainer which must be run on each new guest to ensure that
all the virt-builder features work on the new guest.
2013-10-15 20:41:22 +01:00
Richard W.M. Jones
b816f29ada firstboot: Ensure firstboot scripts run in command line order.
Previously they ran in effectively random order.
2013-10-15 20:41:22 +01:00
Richard W.M. Jones
a3e5bc7bfa sysprep: firstboot: Don't set `Created_files flag unless files are created. 2013-10-15 20:41:22 +01:00
Richard W.M. Jones
356a749bba firstboot: Add some debugging to the control script.
For reasons unknown, firstboot does not work on Debian 6 & 7.
https://bugzilla.redhat.com/show_bug.cgi?id=1019388
2013-10-15 20:41:22 +01:00
Richard W.M. Jones
49e6ba51e3 sysprep: random seed: Try much harder to create a random seed file.
Since this is essential for security, be much more proactive about
trying to create a random seed file, even for guests which have buggy
installers that don't create this file during installation.
2013-10-15 20:41:22 +01:00
Richard W.M. Jones
862da5dd79 builder: Really force apt not to ask questions.
This fixes commit b812a0d459.
2013-10-15 15:33:02 +01:00
Richard W.M. Jones
8b977d152a builder: Remove capital O and lower case L from random root password.
They look too much like 0 and 1.
2013-10-15 14:46:40 +01:00
Richard W.M. Jones
70e660a157 builder: Wrap program in an exception handler which pretty-prints common exceptions.
This looks like a large change, but is mainly just reindenting
everything into a 'main ()' function.
2013-10-15 14:37:48 +01:00
Richard W.M. Jones
fd63d89644 builder: Remove nbdkit-xz-plugin support (it was disabled anyway).
We can re-add this later if libvirt gets fixed, but for now simplify
the code and concentrate on the one code path.
2013-10-15 14:19:53 +01:00
Richard W.M. Jones
d8499c428a builder: Move command line argument processing to separate source file.
This is just code motion.
2013-10-15 14:10:06 +01:00
Richard W.M. Jones
2bc223b6b2 firstboot: Fix test for installing sysvinit scripts.
This fixes commit 9aa13e0574.
2013-10-15 09:53:08 +01:00
Richard W.M. Jones
b812a0d459 builder: Try really hard to make apt non-interactive. 2013-10-14 23:25:31 +01:00
Richard W.M. Jones
ec6f9ee542 appliance: Remove cruft and run udevd directly.
This commit removes a lot of cruft from old RHEL which was required to
start udev.  Instead we run the daemon directly.

Also it removes the fallback path which created some device nodes in
/dev by hand.  This likely did not work.  This also removes the
dependency on MAKEDEV which is long gone from most distros.

This is required for Ubuntu, since the /etc/init.d/udev script didn't
actually work.  The most common symptom was that /dev/virtio-ports/*
was not created because udev didn't process the cold start events.
2013-10-14 23:22:26 +01:00
Richard W.M. Jones
c9f98011fc Version 1.23.32. 2013-10-14 18:25:45 +01:00
Richard W.M. Jones
d9008e141c build: Add missing EXTRA_DIST files. 2013-10-14 18:21:54 +01:00
Richard W.M. Jones
ec0d0e0f62 build: Add maintainer-check-extra-dist rule.
This is used by the maintainer to check for missing files
in EXTRA_DIST.
2013-10-14 18:21:54 +01:00
Richard W.M. Jones
56928b5381 build: Don't hard-code list of virt-builder templates in top level directory.
It's troublesome for maintenance.  Use a wildcard here.
2013-10-14 18:21:54 +01:00
Richard W.M. Jones
9c7497a1eb Update to latest gnulib. 2013-10-14 15:51:47 +01:00
Richard W.M. Jones
9aa13e0574 firstboot: Install both systemd and SysV init scripts.
This should be safe, and avoids the whole issue of whether a guest
uses systemd or not.  Also it is possible to switch init systems
(eg. by specifying init= on the command line) so it's not even clear
if a guest "is" systemd.

Thanks: Tom Gundersen on #systemd.

This updates/fixes commit 596de56a43.
2013-10-14 14:56:56 +01:00
Richard W.M. Jones
cff95392f5 firstboot: Start service after network only.
Not necessary to wait for syslog since (a) we do our own logging
to a file and (b) syslog might not be installed.
2013-10-14 14:56:13 +01:00
Richard W.M. Jones
596de56a43 firstboot: Fix firstboot scripts so they work on Ubuntu.
Ubuntu 13.10 has /etc/systemd but uses Upstart.  This confuses the
script because it assumed that if you have /etc/systemd then you are
using systemd.  Ubuntu includes systemd services (inherited from
Debian) but they just don't run.
2013-10-14 14:05:27 +01:00
Richard W.M. Jones
234c380128 builder: Add --notes option.
This displays the release notes.
2013-10-14 13:45:10 +01:00
Richard W.M. Jones
d0b62bd500 builder: Add short synopsis in --help output. 2013-10-14 13:44:41 +01:00
Richard W.M. Jones
cc15877f07 builder: Tidy up release notes for operating systems. 2013-10-14 13:44:06 +01:00
Richard W.M. Jones
7e7017957e builder: debian/ubuntu: Add notes about running dpkg-reconfigure.
Required to regenerate SSH host keys.
2013-10-14 13:40:57 +01:00
Richard W.M. Jones
6238cc84f6 builder: Fix typo in man page. 2013-10-14 13:27:07 +01:00
Richard W.M. Jones
22d182dbcb builder: Fix output to block devices.
If the output is a block device:

- Detect the size of the output device.

- Don't attempt to delete the output device on failure.

- Turn off sparse copying in virt-resize.
2013-10-14 13:26:37 +01:00
Richard W.M. Jones
fb4dd1b55a resize: Add --no-sparse flag to let you turn off sparse copying.
Useful when the target is a block device containing old data.
2013-10-14 13:26:37 +01:00
Richard W.M. Jones
ceaa1ef0b8 builder: Run 'apt-get update' before trying to install packages. 2013-10-14 13:26:37 +01:00
Richard W.M. Jones
dd554d94ad FAQ: Clearer instructions for Debian and Ubuntu users. 2013-10-14 12:32:04 +01:00
Richard W.M. Jones
b08d8e15bb builder: Kill any daemons started by installed packages.
Some --install requests may pull in packages that start daemons (dbus
being a favourite daemon apparently).  These daemons will prevent the
disks from being unmounted and everything being cleaned up at the end.
Add some experimental code to kill these daemons.
2013-10-13 19:57:25 +01:00
Richard W.M. Jones
e8e0d98ef8 builder: Add more templates to the list which is copied to the website. 2013-10-13 17:51:12 +01:00
Richard W.M. Jones
5d22ee8760 builder: Add the logo to the HTML manual page.
Unfortunately:

 - It appears below the TOC.  This is unavoidable because of the
   flow of the current HTML.

 - The logo is now duplicated in git.
2013-10-13 17:50:16 +01:00
770 changed files with 215756 additions and 113397 deletions

93
.gitignore vendored
View File

@@ -9,9 +9,6 @@
*.cmxa
*.diff
*.eml
*.gcda
*.gcno
*.gcov
*.hi
*.jar
*.la
@@ -26,7 +23,6 @@ bindtests.tmp
cscope.out
.deps
.gdb_history
gmon.out
.libs
Makefile
Makefile.in
@@ -37,7 +33,6 @@ Makefile.in
/align/stamp-virt-alignment-scan.pod
/align/virt-alignment-scan
/align/virt-alignment-scan.1
/appliance/excludelist
/appliance/libguestfs-make-fixed-appliance
/appliance/libguestfs-make-fixed-appliance.1
/appliance/make.sh
@@ -53,21 +48,33 @@ Makefile.in
/bash/virt-filesystems
/bash/virt-format
/bash/virt-inspector
/bash/virt-log
/bash/virt-ls
/bash/virt-sysprep
/bash/virt-sparsify
/build-aux
/builder/.depend
/builder/index-parse.c
/builder/index-parse.h
/builder/index-scan.c
/builder/libguestfs.conf
/builder/*.qcow2
/builder/stamp-virt-builder.pod
/builder/test-index
/builder/stamp-virt-index-validate.pod
/builder/test-config/virt-builder/repos.d/test-index.conf
/builder/test-website/virt-builder/repos.d/libguestfs.conf
/builder/virt-builder
/builder/virt-builder.1
/builder/virt-index-validate
/builder/virt-index-validate.1
/builder/*.xz
/cat/stamp-virt-*.pod
/cat/virt-cat
/cat/virt-cat.1
/cat/virt-filesystems
/cat/virt-filesystems.1
/cat/virt-log
/cat/virt-log.1
/cat/virt-ls
/cat/virt-ls.1
/ChangeLog
@@ -81,6 +88,14 @@ Makefile.in
/config.sub
/configure
/csharp/Libguestfs.cs
/customize/.depend
/customize/customize_cmdline.ml
/customize/customize_cmdline.mli
/customize/customize-options.pod
/customize/customize-synopsis.pod
/customize/stamp-virt-customize.pod
/customize/virt-customize
/customize/virt-customize.1
/daemon/actions.h
/daemon/errnostring.c
/daemon/errnostring-gperf.c
@@ -102,6 +117,9 @@ Makefile.in
/df/stamp-virt-df.pod
/df/virt-df
/df/virt-df.1
/diff/stamp-virt-diff.pod
/diff/virt-diff
/diff/virt-diff.1
/edit/stamp-virt-*.pod
/edit/virt-edit
/edit/virt-edit.1
@@ -142,11 +160,13 @@ Makefile.in
/fish/guestfish-actions.pod
/fish/guestfish-commands.pod
/fish/guestfish-prepopts.pod
/fish/libguestfs-tools.conf.5
/fish/prepopts.c
/fish/prepopts.h
/fish/rc_protocol.c
/fish/rc_protocol.h
/fish/stamp-guestfish.pod
/fish/stamp-libguestfs-tools.conf.pod
/fish/stamp-virt-copy-in.pod
/fish/stamp-virt-copy-out.pod
/fish/stamp-virt-tar-in.pod
@@ -164,6 +184,7 @@ Makefile.in
/fuse/guestunmount.1
/fuse/stamp-guestmount.pod
/fuse/stamp-guestunmount.pod
/fuse/test-guestmount-fd
/fuse/test-guestunmount-fd
/generator/.depend
/generator/files-generated.txt
@@ -177,8 +198,6 @@ Makefile.in
/gobject/bindtests.js
/gobject/Guestfs-1.0.gir
/gobject/Guestfs-1.0.typelib
/gobject/guestfs-gobject*.c
/gobject/guestfs-gobject*.h
/golang/bindtests.go
/golang/examples/guestfs-golang.3
/golang/examples/stamp-guestfs-golang.pod
@@ -200,6 +219,7 @@ Makefile.in
/html/guestfs-java.3.html
/html/guestfs-lua.3.html
/html/guestfs-ocaml.3.html
/html/guestfs-p2v-iso.1.html
/html/guestfs-performance.1.html
/html/guestfs-perl.3.html
/html/guestfs-python.3.html
@@ -212,20 +232,26 @@ Makefile.in
/html/guestunmount.1.html
/html/libguestfs-make-fixed-appliance.1.html
/html/libguestfs-test-tool.1.html
/html/libguestfs-tools.conf.5.html
/html/virt-alignment-scan.1.html
/html/virt-builder.1.html
/html/virt-cat.1.html
/html/virt-copy-in.1.html
/html/virt-copy-out.1.html
/html/virt-customize.1.html
/html/virt-df.1.html
/html/virt-diff.1.html
/html/virt-edit.1.html
/html/virt-filesystems.1.html
/html/virt-format.1.html
/html/virt-index-validate.1.html
/html/virt-inspector.1.html
/html/virt-list-filesystems.1.html
/html/virt-list-partitions.1.html
/html/virt-log.1.html
/html/virt-ls.1.html
/html/virt-make-fs.1.html
/html/virt-p2v.1.html
/html/virt-rescue.1.html
/html/virt-resize.1.html
/html/virt-sparsify.1.html
@@ -233,6 +259,7 @@ Makefile.in
/html/virt-tar.1.html
/html/virt-tar-in.1.html
/html/virt-tar-out.1.html
/html/virt-v2v.1.html
/html/virt-win-reg.1.html
/inspector/actual-*.xml
/inspector/stamp-virt-inspector.pod
@@ -267,10 +294,14 @@ Makefile.in
/m4/ltsugar.m4
/m4/ltversion.m4
/maint.mk
/make-fs/stamp-virt-make-fs.pod
/make-fs/virt-make-fs
/make-fs/virt-make-fs.1
/missing
/mllib/.depend
/mllib/common_gettext.ml
/mllib/common_utils_tests
/mllib/config.ml
/mllib/dummy
/mllib/libdir.ml
/ocaml/bindtests.bc
@@ -290,6 +321,16 @@ Makefile.in
/ocaml/stamp-mlguestfs
/ocaml/t/*.bc
/ocaml/t/*.opt
/p2v/stamp-virt-p2v.pod
/p2v/virt-p2v
/p2v/virt-p2v.1
/p2v-iso/guestfs-p2v-iso.1
/p2v-iso/guestfs-p2v-iso.txt
/p2v-iso/kickstart-target.sh
/p2v-iso/launch-virt-p2v
/p2v-iso/p2v.ks
/p2v-iso/stamp-guestfs-p2v-iso.pod
/p2v-iso/virt-builder-target.sh
/perl/bindtests.pl
/perl/blib
/perl/examples/guestfs-perl.3
@@ -334,27 +375,38 @@ Makefile.in
/php/extension/mkinstalldirs
/php/extension/missing
/php/extension/modules/
/php/extension/php-for-tests.sh
/php/extension/php_guestfs_php.h
/php/extension/run-tests.php
/php/extension/tmp-php.ini
/pick-guests.pl
/po-docs/*/*.1
/po-docs/*/*.3
/po-docs/*/*.5
/po-docs/*/*.8
/po-docs/po4a.conf
/po-docs/*/*.pod
/po-docs/*/stamp-update-po
/podwrapper.1
/podwrapper.pl
/po/*.gmo
/python/bindtests.py
/python/build
/python/config.h
/python/dist
/python/examples/guestfs-python.3
/python/examples/stamp-guestfs-python.pod
/python/guestfs.py
/python/guestfs-py.c
/python/guestfs.pyc
/python/guestfs.pyo
/python/guestfs-internal-all.h
/python/guestfs-internal-frontend-cleanups.h
/python/guestfs-internal-frontend.h
/python/MANIFEST
/python/__pycache__
/python/setup.py
/python/stamp-extra-files
/python/utils.c
/qemu-wrapper.sh
/rescue/stamp-virt-rescue.pod
/rescue/virt-rescue
@@ -376,19 +428,18 @@ Makefile.in
/ruby/Rakefile
/run
/sparsify/.depend
/sparsify/link.sh
/sparsify/stamp-virt-sparsify.pod
/sparsify/virt-sparsify
/sparsify/virt-sparsify.1
/src/actions-?.c
/src/actions-variants.c
/src/bindtests.c
/src/cleanup-structs.c
/src/errnostring.c
/src/errnostring-gperf.c
/src/errnostring-gperf.gperf
/src/errnostring.h
/src/event-string.c
/src/free-structs.c
/src/guestfs.3
/src/guestfs-actions.pod
/src/guestfs-availability.pod
@@ -402,12 +453,19 @@ Makefile.in
/src/libguestfs.pc
/src/libguestfs.syms
/src/.libs/libguestfs.so
/src/libvirt-is-version
/src/stamp-guestfs.pod
/src/structs-cleanup.c
/src/structs-compare.c
/src/structs-copy.c
/src/structs-free.c
/src/test-utils
/stamp-guestfs-release-notes.pod
/stamp-h1
/sysprep/.depend
/sysprep/stamp-script1.sh
/sysprep/stamp-script2.sh
/sysprep/stamp-script4.sh
/sysprep/stamp-virt-sysprep.pod
/sysprep/sysprep-extra-options.pod
/sysprep/sysprep-operations.pod
@@ -417,6 +475,7 @@ Makefile.in
/test.out
/tests/c-api/test-add-drive-opts
/tests/c-api/test-add-libvirt-dom
/tests/c-api/test-backend-settings
/tests/c-api/test-command
/tests/c-api/test-config
/tests/c-api/test-create-handle
@@ -449,6 +508,8 @@ Makefile.in
/tests/data/initrd-x86_64.img.gz
/tests/data/test-grep.txt.gz
/tests/data/test.iso
/tests/disks/test-qemu-drive-libvirt.xml
/tests/events/test-libvirt-auth-callbacks
/tests/guests/blank-*.img
/tests/guests/debian.img
/tests/guests/fedora.img
@@ -467,9 +528,14 @@ Makefile.in
/tests/mount-local/test-parallel-mount-local
/tests/mountable/test-internal-parse-mountable
/tests/parallel/test-parallel
/tests/protocol/test-error-messages
/tests/qemu/qemu-boot
/tests/qemu/qemu-speed-test
/tests/regressions/rhbz501893
/tests/regressions/rhbz790721
/tests/regressions/rhbz914931
/tests/regressions/rhbz1044014.out
/tests/regressions/rhbz1055452
/tests/rsync/rsyncd.pid
/tests/syslinux/extlinux-guest.img
/tests/syslinux/syslinux-guest.img
@@ -478,3 +544,8 @@ Makefile.in
/test-tool/libguestfs-test-tool-helper
/test-tool/stamp-libguestfs-test-tool.pod
/tools/virt-*.1
/v2v/.depend
/v2v/link.sh
/v2v/stamp-virt-v2v.pod
/v2v/virt-v2v
/v2v/virt-v2v.1

Submodule .gnulib updated: 03e96cc338...e2646b0c6b

97
AUTHORS
View File

@@ -1,44 +1,53 @@
Angus Salkeld <asalkeld@redhat.com>
Ani Peter <apeter@redhat.com>
Charles Duffy <cduffy@messageone.com>
Cole Robinson <crobinso@redhat.com>
Daniel Berrange <berrange@redhat.com>
Daniel Cabrera <logan@fedoraproject.org>
Dave Vasilevsky <dave@vasilevsky.ca>
Douglas Schilling Landgraf <dougsland@redhat.com>
Eric Blake <eblake@redhat.com>
Erik Nolte <erik_nolte@acm.org>
Evaggelos Balaskas <ebalaskas@ebalaskas.gr>
Geert Warrink <geert.warrink@onsnet.nu>
Guido Günther <agx@sigxcpu.org>
Hilko Bengen <bengen@debian.org>
Hilko Bengen <bengen@hilluzination.de>
infernix <infernix@infernix.net>
Jaswinder Singh <jsingh@redhat.com>
Jim Meyering <meyering@redhat.com>
Jiri Popelka <jpopelka@redhat.com>
John Eckersberg <jeckersb@redhat.com>
Karel Klíč <kklic@redhat.com>
Marcin Gibula <m.gibula@e24cloud.com>
Martin Kletzander <mkletzan@redhat.com>
Masami HIRATA <msmhrt@gmail.com>
Matthew Booth <mbooth@redhat.com>
Maxim Koltsov <kolmax94@gmail.com>
Michael Scherer <misc@zarb.org>
Mike Kelly <pioto@pioto.org>
Nicholas Strugnell <nstrug@redhat.com>
Nikita A Menkovich <menkovich@gmail.com>
Nikita Menkovich <n.menkovich@sprinthost.ru>
Nikos Skalkotos <skalkoto@gmail.com>
Olaf Hering <olaf@aepfle.de>
Or Goshen <oberonc@gmail.com>
Paul Mackerras <paulus@samba.org>
Piotr Drąg <piotrdrag@gmail.com>
Qin Guan <qguan@redhat.com>
Rajesh Ranjan <rranjan@redhat.com>
Richard W.M. Jones <rjones@redhat.com>
Sandeep Shedmake <sshedmak@redhat.com>
Shankar Prasad <svenkate@redhat.com>
Thomas S Hatch <thatch45@gmail.com>
Wanlong Gao <gaowanlong@cn.fujitsu.com>
Wulf C. Krueger <philantrop@exherbo.org>
Adam Huffman
Angus Salkeld
Ani Peter
Bastien ROUCARIÈS
Charles Duffy
Cole Robinson
Colin Walters
Dan Lipsitt
Daniel Berrange
Daniel Cabrera
Daniel Exner
Dave Vasilevsky
Douglas Schilling Landgraf
Eric Blake
Erik Nolte
Evaggelos Balaskas
Geert Warrink
Guido Günther
Hilko Bengen
infernix
Jaswinder Singh
Jim Meyering
Jiri Popelka
John Eckersberg
Joseph Wang
Karel Klíč
Lee Yarwood
Marcin Gibula
Maros Zatko
Martin Kletzander
Masami HIRATA
Matthew Booth
Maxim Koltsov
Michael Scherer
Mike Kelly
Nicholas Strugnell
Nikita A Menkovich
Nikita Menkovich
Nikos Skalkotos
Olaf Hering
Or Goshen
Paul Mackerras
Pino Toscano
Piotr Drąg
Qin Guan
Rajesh Ranjan
Richard W.M. Jones
Sandeep Shedmake
Shankar Prasad
Thomas S Hatch
Török Edwin
Wanlong Gao
Wulf C. Krueger

447
BUGS
View File

@@ -1,5 +1,5 @@
NOTE: This file is automatically generated from "update-bugs.sh".
Last updated: 2013-10-12
Last updated: 2014-07-26
This contains a local list of the bugs that are open against
libguestfs. Bugs are tracked in the Red Hat Bugzilla database
@@ -29,39 +29,21 @@ Bugs in NEW or ASSIGNED state are open and waiting for someone to fix.
554829 NEW https://bugzilla.redhat.com/show_bug.cgi?id=554829
SELinux handling could be done better.
563450 NEW https://bugzilla.redhat.com/show_bug.cgi?id=563450
list-devices returns devices of different types out of order
572337 NEW https://bugzilla.redhat.com/show_bug.cgi?id=572337
libguestfs should support gptsync
578103 NEW https://bugzilla.redhat.com/show_bug.cgi?id=578103
[RFE] Tool to Compare Windows Registry Entries
593511 NEW https://bugzilla.redhat.com/show_bug.cgi?id=593511
[RFE] function to get partition name
604041 NEW https://bugzilla.redhat.com/show_bug.cgi?id=604041
guestmount absolute symlinks don't work
637251 NEW https://bugzilla.redhat.com/show_bug.cgi?id=637251
virt-inspector fails to recognize data-only NTFS disk image
660687 NEW https://bugzilla.redhat.com/show_bug.cgi?id=660687
guestmount: "touch" command fails: touch: setting times of `timestamp': Invalid argument
693064 NEW https://bugzilla.redhat.com/show_bug.cgi?id=693064
Symbolic links on ntfs-3g are not followed correctly by some commands
696445 NEW https://bugzilla.redhat.com/show_bug.cgi?id=696445
Backport virt-inspector for virt-v2v
696451 NEW https://bugzilla.redhat.com/show_bug.cgi?id=696451
libguestfs: unknown filesystem label SWAP-sda2
700342 NEW https://bugzilla.redhat.com/show_bug.cgi?id=700342
virt-inspector resports unknown filesystem UUID
709326 NEW https://bugzilla.redhat.com/show_bug.cgi?id=709326
virt-inspector cannot detect ReactOS
@@ -92,9 +74,6 @@ Bugs in NEW or ASSIGNED state are open and waiting for someone to fix.
803657 NEW https://bugzilla.redhat.com/show_bug.cgi?id=803657
[RFE] inspect-is-netinst : support more distributions
812970 NEW https://bugzilla.redhat.com/show_bug.cgi?id=812970
virt-rescue cannot set ><rescue> prompt, on Ubuntu 12.04
813290 NEW https://bugzilla.redhat.com/show_bug.cgi?id=813290
mdadm (md-detail) test occasionally fails with 'md device /dev/md125 does not appear to be active.'
@@ -164,27 +143,9 @@ Bugs in NEW or ASSIGNED state are open and waiting for someone to fix.
920617 NEW https://bugzilla.redhat.com/show_bug.cgi?id=920617
RFE: virt-inspector (or another tool) should produce OVF output for oVirt / RHEV
923355 NEW https://bugzilla.redhat.com/show_bug.cgi?id=923355
guestfish prints literal "n" in error messages
927447 NEW https://bugzilla.redhat.com/show_bug.cgi?id=927447
[suse] virt tools hang on disk image, but libguestfs-test-tool runs OK
950444 NEW https://bugzilla.redhat.com/show_bug.cgi?id=950444
inspection fails if libosinfo is not installed
953907 NEW https://bugzilla.redhat.com/show_bug.cgi?id=953907
virt-sysprep does not correctly set the hostname on Debian/Ubuntu
960522 NEW https://bugzilla.redhat.com/show_bug.cgi?id=960522
libguestfs is not built for F18 ppc64
972292 NEW https://bugzilla.redhat.com/show_bug.cgi?id=972292
lgetxattrs can't show the file attribute list with ntfs FS in rhel7
972294 NEW https://bugzilla.redhat.com/show_bug.cgi?id=972294
lsetxattr/lgetxattr doesn't work to softlink file with ntfs FS in rhel7
973138 NEW https://bugzilla.redhat.com/show_bug.cgi?id=973138
RFE: sh & debug sh should be able to capture all output and error return code
@@ -197,9 +158,6 @@ Bugs in NEW or ASSIGNED state are open and waiting for someone to fix.
982516 NEW https://bugzilla.redhat.com/show_bug.cgi?id=982516
sh "rpm -Va" fails because apparently /dev/shm is not created/bind-mounted correctly
982979 NEW https://bugzilla.redhat.com/show_bug.cgi?id=982979
Disable fstrim API/command in RHEL 6
983969 NEW https://bugzilla.redhat.com/show_bug.cgi?id=983969
RFE: virt-sysprep should be SELinux-aware
@@ -221,14 +179,167 @@ Bugs in NEW or ASSIGNED state are open and waiting for someone to fix.
994965 NEW https://bugzilla.redhat.com/show_bug.cgi?id=994965
libguestfs doesn't work on armv7hl
997160 NEW https://bugzilla.redhat.com/show_bug.cgi?id=997160
virt-sysprep prints: filesize: /etc/mdadm.conf: No such file or directory
1019388 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1019388
firstboot scripts (virt-builder, virt-sysprep) don't work for Debian 6 & 7 guests
998065 NEW https://bugzilla.redhat.com/show_bug.cgi?id=998065
libguestfs kernel hang in RHEL 6.5
1023630 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1023630
enable-valgrind-daemon option breaks UML
1012110 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1012110
libguestfs fails to parse /var/lib/rpm/Name during inspection
1025942 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1025942
Parallel virt-df and virt-alignment-scan tests sometimes deadlock
1027526 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1027526
RFE: Labels for logical partitions lost in Windows 2003 after virt-resize for primary partition
1028676 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1028676
Add virt-builder to RHEL 7.1
1029134 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1029134
Broken links in virt-builder web man page
1033573 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1033573
libguestfs inspection does not recognize NAS4Free OS installed on QCOW2 image
1040912 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1040912
[ARM] mount-local / FUSE support does not seem to work at all
1041552 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1041552
virt-sysprep should remove Pegasus certificates
1042780 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1042780
Support the virt-sysprep --delete option
1051694 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1051694
libguestfs FTBFS on Ubuntu saucy
1056047 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1056047
virt-df generates no output for Solaris 11 x86_64 guest.
1057873 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1057873
libguestfs df/ subdirectory tests fail occasionally
1059428 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1059428
Failed dependencies installing libguestfs with glibc ppc64p7
1060423 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1060423
Support setting xattrs via FUSE
1061040 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1061040
RFE: Enable ZFS support
1064041 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1064041
virt-sparsify fails if a btrfs filesystem contains readonly snapshots
1074005 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1074005
java bindings inspect_list_applications2 throws java.lang.ArrayIndexOutOfBoundsException:
1075164 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1075164
RFE: allow passing in a pre-opened libvirt connection from python
1075594 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1075594
RFE: python-libguestfs should be available on pypi
1076478 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1076478
FTBFS: libguestfs-1.22.6-15.el7
1079625 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1079625
virt-sparsify fails if a btrfs filesystem contains readonly snapshots
1079734 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1079734
Tiny Core Linux is not recognized by libguestfs inspection
1084221 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1084221
virt-builder --update causes vm not to allow logins
1089100 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1089100
NetworkManager avc unlink denied for resolv.conf after using --selinux-relabel
1091856 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1091856
scrub-file can't handle link file
1091859 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1091859
scrub-file can't handle link file
1092583 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1092583
guestfish removes query string from URI
1097272 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1097272
Ruby bindings should use RB_GC_GUARD (instead of volatile) for enhanced safety
1099284 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1099284
typo errors in man pages
1099292 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1099292
sfdisk failed by "Device or resource busy" when using one command line
1099475 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1099475
sfdisk: BLKRRPART: Device or resource busy
1099976 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1099976
virt-builder gives GPG warning message
1100138 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1100138
some operation cause "lvremove" can not find the object
1100140 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1100140
some operation cause "lvremove" can not find the object
1100528 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1100528
These APIs also need to add to `guestfish -h` command list
1100530 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1100530
These APIs also need to add to `guestfish -h` command list
1100533 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1100533
Remove 'user-cancel' from guestfish(1)
1102241 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1102241
[RFE] libguestfs should detect OSTree (project-atomic) qcow2 disk image
1102447 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1102447
libguestfs 1.27.13 does not build due to libxml library order
1102619 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1102619
lvm-clear-filter failed when has two same name but different uuid's VG
1102620 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1102620
lvm-clear-filter failed when has two same name but different uuid's VG
1107317 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1107317
Ubuntu package fails to depend on linux-image-extra (causes missing virtio-serial)
1108171 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1108171
RFE: virt-builder should be able to build PXE images for baremetal installation
1109144 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1109144
virt-builder --get-kernel doesn't fetch the dtb from images
1111662 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1111662
Guestfs.Error("vgchange_uuid_all: Volume group has active logical volumes")
1111794 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1111794
virt-sparsify leaves lots of data in TMPDIR
1113020 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1113020
Support virt-sparsify option to allow specifying temporary file or block device
1113153 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1113153
RFE: Inspection should support systemd mount units
1114012 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1114012
"yum install guestfish" on fresh Fedora 20 results in broken libguestfs
1117540 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1117540
Support virt-sparsify option to allow specifying temporary file or block device
1118305 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1118305
RFE: Ability to set iSCSI-Initiator-IQN for iSCSI connections
1123221 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1123221
make xfs faield, "mkfs.xfs: No such file or directory"
1123281 NEW https://bugzilla.redhat.com/show_bug.cgi?id=1123281
lvm-set-filter stopped working in Rawhide
503134 ASSIGNED https://bugzilla.redhat.com/show_bug.cgi?id=503134
guestfish's list splitting does not recognize internal quoting
@@ -242,230 +353,86 @@ Bugs in NEW or ASSIGNED state are open and waiting for someone to fix.
619334 ASSIGNED https://bugzilla.redhat.com/show_bug.cgi?id=619334
RFE: Enable coredump capture in the appliance
624335 ASSIGNED https://bugzilla.redhat.com/show_bug.cgi?id=624335
blockdev-setbsz succeeds, but does not affect blockdev-getbsz
691389 ASSIGNED https://bugzilla.redhat.com/show_bug.cgi?id=691389
SELinux labels don't work over guestmount (FUSE)
965495 ASSIGNED https://bugzilla.redhat.com/show_bug.cgi?id=965495
New APIs required in libguestfs for virt-v2v in RHEL 6.5
1069966 ASSIGNED https://bugzilla.redhat.com/show_bug.cgi?id=1069966
RFE: let virt-builder etc build ARM guests on x86 host
998109 ASSIGNED https://bugzilla.redhat.com/show_bug.cgi?id=998109
Let's enable kvmclock in RHEL 7
(78 bugs)
(113 bugs)
--------------------------------------------------
Bugs in MODIFIED, POST or ON_QA state are fixed.
You can help by testing the fixes.
995712 MODIFIED https://bugzilla.redhat.com/show_bug.cgi?id=995712
list-filesystems command fails if there are no block devices
1028650 POST https://bugzilla.redhat.com/show_bug.cgi?id=1028650
virt-* argument parser doesn't accept --arg=value (you have to use --arg value)
998750 MODIFIED https://bugzilla.redhat.com/show_bug.cgi?id=998750
guestfish does not work due to conflict of remote and interactive mode
1073917 POST https://bugzilla.redhat.com/show_bug.cgi?id=1073917
java bindings inspect_list_applications2 throws java.lang.ArrayIndexOutOfBoundsException:
1000428 MODIFIED https://bugzilla.redhat.com/show_bug.cgi?id=1000428
virt-format uses wrong partition type for vfat filesystems
1091803 POST https://bugzilla.redhat.com/show_bug.cgi?id=1091803
tar-in-opts execute failed that cause libguestfs appliance crashed
1003291 MODIFIED https://bugzilla.redhat.com/show_bug.cgi?id=1003291
Backport cachemode patch to RHEL 7
1122557 POST https://bugzilla.redhat.com/show_bug.cgi?id=1122557
virt-sparsify overwrites block devices if used as output files
1011922 MODIFIED https://bugzilla.redhat.com/show_bug.cgi?id=1011922
Use host-passthrough instead of host-model
1123007 POST https://bugzilla.redhat.com/show_bug.cgi?id=1123007
libguestfs 'direct' backend should close file descriptors before exec-ing qemu to avoid leaking !O_CLOEXEC fds
672485 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=672485
[RFE] virt-edit/tar-in/tar-out/inspector do not support encrypted system
1053847 MODIFIED https://bugzilla.redhat.com/show_bug.cgi?id=1053847
Recommended default clock/timer settings
819086 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=819086
look for qemu-kvm on /usr/libexec
1020950 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=1020950
CVE-2013-4419 libguestfs: insecure temporary directory handling for guestfish's network socket [epel-5]
869179 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=869179
libguestfs fail to startup on latest rhel7 tree
1021149 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=1021149
Rebase libguestfs to 1.28 in RHEL 7.1
880806 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=880806
virt-df with two -a options displays incorrect disk image name
1079182 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=1079182
virt-df cannot report used disk space of windows guest when updated to 6.5
892271 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=892271
virt-format fail to format the same disk more than twice with lvm enable
1097359 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=1097359
virt-sparsify hangs with 'No space left on device' while filling LV
892275 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=892275
checksums-out fail to compute the checksums of all regular files in directory
1106548 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=1106548
root gets an error accessing to a non-root dir on a snapshot guestmount VMDK img
892291 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=892291
guestmount: link() incorrectly returns ENOENT, when it should be EXDEV
905322 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=905322
"hivex-commit" should fail with a relative path
909666 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=909666
Unexpected non-tail recursion in recv_from_daemon results in stack overflow in very long-running API calls that send progress messages
909667 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=909667
Unexpected non-tail recursion in recv_from_daemon results in stack overflow in very long-running API calls that send progress messages
921710 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=921710
9p support should be disabled in libguestfs in RHEL 7
957796 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=957796
tar-out and base64-out quoting error
958183 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=958183
Rebase libguestfs in RHEL 6.5
962113 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=962113
Disable libguestfs block drivers which are not supported by RHEL 7 qemu + libvirt
972776 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=972776
txz-out command produces a bzip2-compressed file (should be xz-compressed)
974490 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=974490
Regression: Fedora inspection broken by change from guestfs_exists to guestfs_is_file
975573 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=975573
virt-sysprep is in the wrong subpackage
975771 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=975771
Specifying virtio interface ('iface' parameter) breaks the direct backend - libguestfs hangs
976250 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=976250
Make xfs filesystem failed with specified blocksize, gives "unknown option -b" error
976299 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=976299
mke2fs-J should give a meaningful error when specified type is anything except 'ext{2,3,4}'
976662 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=976662
Create raid{4, 5, 6} by md-create leads to guestfish hang
980338 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=980338
disk-format "qemu-img info: JSON parse error" when target file does not exist
980502 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=980502
libguestfs is not able to be built with yum cache from multiple repos
983691 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=983691
libguestfs double free when kernel link fails during launch
985856 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=985856
Can't set acl value for a specified user with 'acl-set-file'
988862 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=988862
virt-sysprep --firstboot option writes incorrect "99" (instead of "S99") sysv-init-style start up script
988863 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=988863
virt-sysprep --firstboot option writes incorrect "99" (instead of "S99") sysv-init-style start up script
989356 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=989356
cap-get-file will return error if the file has not be set capabilities
995176 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=995176
RFE: Implement set-uuid command
996039 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=996039
guestfish does not work due to conflict of remote and interactive mode
997884 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=997884
9p support should be disabled in libguestfs in RHEL 6
998108 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=998108
Let's enable kvmclock in RHEL 6
998485 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=998485
guestfish remote prints "libguestfs: error: waitpid (qemu): No child processes"
1000122 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=1000122
'sh' command before mount causes daemon to segfault
1000123 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=1000123
'sh' command before mount causes daemon to segfault
1001875 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=1001875
Argument 'excludes' of tar-out does not work
1001876 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=1001876
Update "rsync-out" helpout for using wildcard
1002032 ON_QA https://bugzilla.redhat.com/show_bug.cgi?id=1002032
mke2fs can't return the correct filesystem type when blockscount is less than 2048 for ext3
(43 bugs)
(11 bugs)
--------------------------------------------------
These bugs are in the VERIFIED state.
889536 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=889536
[RFE]It's better to emphasize "libguestfs-winsupport" in V2V manpage or error output
624335 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=624335
blockdev-setbsz succeeds, but does not affect blockdev-getbsz
889537 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=889537
Libguestfs live support should be disabled in RHEL 7 packages
965495 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=965495
New APIs required in libguestfs for virt-v2v in RHEL 6.5
889538 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=889538
libguestfs can not be installed with recent iptables
982979 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=982979
Disable fstrim API/command in RHEL 6
892834 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=892834
guestmount: rename() incorrectly follows symbolic links
1025269 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=1025269
libguestfs tests hang in libguestfs-1.20.11/tests/guests/guest-aux/make-fedora-img.pl
894241 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=894241
aug-init fail with the newest augeas package
1056558 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=1056558
virt-sparsify overwrites block devices if used as output files
908255 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=908255
error message didn't translate to user language
1057510 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=1057510
mount-local should give a clearer error if root is not mounted
909573 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=909573
patch libguestfs to use 'supermin' instead of 'febootstrap' in RHEL 7
1072062 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=1072062
Ruby bindings for libguestfs throws an error periodically
947438 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=947438
Some obsolete tools should be removed from libguestfs RHEL 7 package
1091805 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=1091805
tar-in-opts execute failed that cause libguestfs appliance crashed
949486 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=949486
libguestfs-1.20.5-3.el7.x86_64 dependency problem
1099105 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=1099105
libguestfs Requires: /lib64/libldif-2.4.so.2 missing from openldap-2.4.39-6.el6.x86_64
957616 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=957616
libguestfs-1.21.31-1.1.el7.1.1.x86_64 won't install due to missing dependency
1099332 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=1099332
typo errors in man pages
971207 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=971207
guestfish aug-init command fails: libguestfs: error: aug_init: Augeas initialization failed
971326 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=971326
ntfsresize-opts execute failed when omitted the 'size' option
971664 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=971664
Need add some removed commands back into guestfish in RHEL 6.5
972413 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=972413
txz-out command produces a bzip2-compressed file (should be xz-compressed)
973425 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=973425
lsscsi is not available in 6client
975377 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=975377
inspect-get-hostname return unknown for linux guest in rhel6
975572 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=975572
virt-sysprep is in the wrong subpackage
975753 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=975753
"virt-resize --expand" and "virt-resize --resize" outputs error message for Win2008 32bit OS
975760 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=975760
Specifying virtio interface ('iface' parameter) breaks the appliance attach-method - libguestfs hangs
980358 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=980358
filesystem-available should return false for xfs in rhel6
980372 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=980372
"hivex-commit" should fail with a relative path
983690 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=983690
libguestfs double free when kernel link fails during launch
985269 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=985269
Can't set acl value for a specified user with 'acl-set-file'
989352 VERIFIED https://bugzilla.redhat.com/show_bug.cgi?id=989352
cap-get-file will return error if the file has not be set capabilities
(24 bugs)
(10 bugs)
End of BUGS file.

View File

@@ -1,5 +1,5 @@
# libguestfs
# Copyright (C) 2009-2013 Red Hat Inc.
# Copyright (C) 2009-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
@@ -20,7 +20,10 @@ include $(top_srcdir)/common-rules.mk
ACLOCAL_AMFLAGS = -I m4
# Gnulib - must be built and tested before the library.
SUBDIRS = gnulib/lib gnulib/tests
SUBDIRS = gnulib/lib
if ENABLE_GNULIB_TESTS
SUBDIRS += gnulib/tests
endif
# Basic source for the library.
SUBDIRS += tests/data generator src examples po
@@ -28,7 +31,9 @@ SUBDIRS += tests/data generator src examples po
if ENABLE_DAEMON
SUBDIRS += daemon
endif
if ENABLE_APPLIANCE
SUBDIRS += appliance
endif
# Tests - order is important.
if ENABLE_APPLIANCE
@@ -39,7 +44,9 @@ SUBDIRS += tests/tmpdirs
SUBDIRS += tests/protocol
SUBDIRS += tests/events
SUBDIRS += tests/parallel
SUBDIRS += tests/create
SUBDIRS += tests/disks
SUBDIRS += tests/discard
SUBDIRS += tests/mountable
SUBDIRS += tests/network
SUBDIRS += tests/lvm
@@ -62,6 +69,7 @@ SUBDIRS += tests/http
SUBDIRS += tests/syslinux
SUBDIRS += tests/journal
SUBDIRS += tests/fuzz
SUBDIRS += tests/relative-paths
SUBDIRS += tests/regressions
endif
@@ -72,7 +80,10 @@ SUBDIRS += test-tool
SUBDIRS += fish
# virt-tools in C.
SUBDIRS += align cat df edit format inspector rescue
SUBDIRS += align cat diff df edit format inspector make-fs rescue
if HAVE_P2V
SUBDIRS += p2v p2v-iso
endif
# bash-completion
SUBDIRS += bash
@@ -115,10 +126,17 @@ endif
# Unconditional because nothing is built yet.
SUBDIRS += csharp
# OCaml tools. Note 'mllib' contains random shared code used by
# all of the OCaml tools.
# OCaml tools. Note 'mllib' and 'customize' contain shared code used
# by other OCaml tools, so these must come first.
if HAVE_OCAML
SUBDIRS += mllib builder resize sparsify sysprep
SUBDIRS += \
mllib \
customize \
builder builder/website \
resize \
sparsify \
sysprep \
v2v
endif
# Perl tools.
@@ -137,14 +155,16 @@ SUBDIRS += po-docs
endif
EXTRA_DIST = \
BUGS HACKING ROADMAP TODO \
BUGS HACKING TODO \
.gitignore \
.lvimrc \
.mailmap \
.tx/config \
bootstrap \
bugs-in-changelog.sh \
autogen.sh \
bindtests \
cfg.mk \
contrib/autobuild/autobuild.sh \
contrib/intro/libguestfs-intro.html \
contrib/intro/overview.png \
@@ -169,18 +189,31 @@ EXTRA_DIST = \
contrib/visualize-alignment/qemu-0.13-trace-block-device-access.patch \
contrib/visualize-alignment/README \
contrib/visualize-alignment/tracetops.ml \
contrib/windows-icons.pl \
guestfs-release-notes.pod \
guestfs-release-notes.txt \
html/draft.png \
html/draft.svg \
html/pod.css \
html/virt-builder.svg \
libtool-kill-dependency_libs.sh \
logo/fish.svg logo/fish.png \
logo/fish-5yrs.svg logo/fish-5yrs.png \
logo/virt-builder.svg \
m4/.gitignore \
tests/run-xml-to-junit.sh \
tests/run-xml-to-junit.xsl \
tmp/.gitignore \
tx-pull.sh \
update-bugs.sh \
valgrind-suppressions
valgrind-suppressions \
.x-sc_avoid_ctype_macros \
.x-sc_prohibit_have_config_h \
.x-sc_prohibit_magic_number_exit \
.x-sc_prohibit_strcmp \
.x-sc_prohibit_strcmp_and_strncmp \
.x-sc_TAB_in_indentation \
.x-sc_trailing_blank
# The website.
HTMLFILES = \
@@ -192,6 +225,7 @@ HTMLFILES = \
html/guestfs-java.3.html \
html/guestfs-lua.3.html \
html/guestfs-ocaml.3.html \
html/guestfs-p2v-iso.1.html \
html/guestfs-performance.1.html \
html/guestfs-perl.3.html \
html/guestfs-python.3.html \
@@ -210,13 +244,16 @@ HTMLFILES = \
html/virt-cat.1.html \
html/virt-copy-in.1.html \
html/virt-copy-out.1.html \
html/virt-customize.1.html \
html/virt-df.1.html \
html/virt-diff.1.html \
html/virt-edit.1.html \
html/virt-filesystems.1.html \
html/virt-format.1.html \
html/virt-inspector.1.html \
html/virt-list-filesystems.1.html \
html/virt-list-partitions.1.html \
html/virt-log.1.html \
html/virt-ls.1.html \
html/virt-make-fs.1.html \
html/virt-rescue.1.html \
@@ -226,22 +263,20 @@ HTMLFILES = \
html/virt-tar.1.html \
html/virt-tar-in.1.html \
html/virt-tar-out.1.html \
html/virt-v2v.1.html \
html/virt-win-reg.1.html
HTMLSUPPORTFILES = html/draft.png html/pod.css
HTMLSUPPORTFILES = \
html/draft.png \
html/pod.css \
html/virt-builder.svg
TEXTFILES = BUGS README ROADMAP TODO
TEXTFILES = BUGS README TODO
BUILDERFILES = \
builder/website/README \
builder/website/index \
builder/website/index.asc \
builder/website/debian-7.xz \
builder/website/debian-7.xz.sig \
builder/website/fedora-18.xz \
builder/website/fedora-18.xz.sig \
builder/website/fedora-19.xz \
builder/website/fedora-19.xz.sig
builder/website/index.asc
WEBSITEDIR = $(HOME)/d/websites/libguestfs
@@ -261,12 +296,12 @@ website: $(HTMLFILES) $(HTMLSUPPORTFILES) $(TEXTFILES) $(BUILDERFILES)
# When doing 'make dist' update a few files automatically.
dist-hook:
$(top_srcdir)/build-aux/gitlog-to-changelog > ChangeLog
git log --decorate=false > ChangeLog
cp ChangeLog $(distdir)/ChangeLog
$(top_srcdir)/update-bugs.sh > BUGS-t
mv BUGS-t BUGS
cp BUGS $(distdir)/BUGS
git shortlog -se | awk -F'\t' '{print $$2}' | sort -f > AUTHORS-t
git shortlog -s | $(AWK) -F'\t' '{print $$2}' | sort -f > AUTHORS-t
mv AUTHORS-t AUTHORS
cp AUTHORS $(distdir)/AUTHORS
@@ -286,9 +321,10 @@ all-local:
find $(DIST_SUBDIRS) -name '*.c' -o -name '*.pl' -o -name '*.pm' | \
grep -v -E '^(examples|gnulib|perl/(blib|examples)|po-docs|tests)/' | \
grep -v -E '/((guestfs|rc)_protocol\.c)$$' | \
grep -v -E '^python/utils.c$$' | \
LC_ALL=C sort > po/POTFILES
cd $(srcdir); \
find builder mllib resize sparsify sysprep -name '*.ml' | \
find builder customize mllib resize sparsify sysprep v2v -name '*.ml' | \
LC_ALL=C sort > po/POTFILES-ml
# Manual pages in top level directory.
@@ -474,11 +510,28 @@ build-test-guests:
print-subdirs:
@echo $(SUBDIRS)
# Commit everything in current directory to HEAD, and set commit
# message to current version (only for maintainer).
maintainer-commit:
git commit -a -m "Version $(VERSION)."
# Tag HEAD with current version (only for maintainer).
maintainer-tag:
git tag -a $(VERSION) -m "Version $(VERSION) ($(BRANCH_TYPE))" -f
# Maintainer only: check EXTRA_DIST rule is complete.
# (Note you must have done 'make dist')
maintainer-check-extra-dist:
zcat $(PACKAGE_NAME)-$(VERSION).tar.gz | tar tf - | sort | \
sed 's,^$(PACKAGE_NAME)-$(VERSION)/,,' > tmp/tarfiles
git ls-files | sort > tmp/gitfiles
diff -ur tmp/tarfiles tmp/gitfiles | grep '^\+' | \
grep -v src/api-support/[0-9]
rm tmp/tarfiles tmp/gitfiles
# Provide help on common Makefile targets.
help:

46
README
View File

@@ -61,12 +61,11 @@ The full requirements are described below.
| | | | - virtio-block |
| | | | - virtio-net |
+--------------+-------------+---+-----------------------------------------+
| supermin | 4.1.0 | R | This is required on all distros. |
| febootstrap | 3.20 | | 'supermin' is the new name for |
| supermin | 5.1.0 | R | This is required on all distros. |
| | | | 'supermin' is the new name for |
| | | | 'febootstrap'. |
| | | | For alternatives, see: |
| | | | libguestfs.org/download/binaries/appliance/
| | | | febootstrap 2.x WILL NOT WORK |
+--------------+-------------+---+-----------------------------------------+
| glibc | | R | We use various glibc-isms. |
| | | | Also glibc provides XDR, rpcgen. |
@@ -94,6 +93,10 @@ The full requirements are described below.
+--------------+-------------+---+-----------------------------------------+
| gperf | | R | |
+--------------+-------------+---+-----------------------------------------+
| flex | | R | flex & bison are required for virt- |
+--------------+-------------+---| builder. We could make these |
| bison | | R | optional but automakes makes it hard. |
+--------------+-------------+---+-----------------------------------------+
| PCRE | | R | Perl-compatible Regular Expression lib. |
+--------------+-------------+---+-----------------------------------------+
| genisoimage | | R | mkisofs may work. |
@@ -102,6 +105,9 @@ The full requirements are described below.
+--------------+-------------+---+-----------------------------------------+
| augeas | 1.0.0 | R | |
+--------------+-------------+---+-----------------------------------------+
| xz | | R | Used to compress disk images. |
| | | | Used by virt-builder for compression. |
+--------------+-------------+---+-----------------------------------------+
| po4a | |R/O| Required if compiling from git. |
| | | | Optional if compiling from tarball. |
| | | | For localizing man pages. |
@@ -167,10 +173,13 @@ The full requirements are described below.
| gpg | | O | Used by virt-builder for digital |
| | | | signatures |
+--------------+-------------+---+-----------------------------------------+
| xz | | O | Used by virt-builder for compression |
| liblzma | | O | Can be used by virt-builder for fast |
| | | | uncompression of templates. |
+--------------+-------------+---+-----------------------------------------+
| nbdkit | | O | Used by virt-builder to speed up |
| | | | template xz-decompression |
| gtk2 | | O | Used by virt-p2v user interface. |
+--------------+-------------+---+-----------------------------------------+
| python-evtx | | O | Used by virt-log to parse Windows |
| | | | Event Log files. |
+--------------+-------------+---+-----------------------------------------+
| findlib | | O | For the OCaml bindings. |
+--------------+-------------+---+-----------------------------------------+
@@ -217,8 +226,6 @@ The full requirements are described below.
+--------------+-------------+---+-----------------------------------------+
| Test::More | | O | Perl module used by tests. |
+--------------+-------------+---+-----------------------------------------+
| String::Shellquote | O | Perl module used by some virt-* tools. |
+--------------+-------------+---+-----------------------------------------+
| XML::XPath | | O | Perl module used by some virt-* tools. |
+--------------+-------------+---+-----------------------------------------+
| XML::XPath::XMLParser | O | Perl module used by some virt-* tools. |
@@ -277,34 +284,31 @@ You can run guestfish, guestmount and the virt tools without needing
to install, using the "./run" script in the top directory. This
script sets up some environment variables. For example:
./run ./fish/guestfish [usual guestfish args ...]
./run guestfish [usual guestfish args ...]
./run ./inspector/virt-inspector [usual virt-inspector args ...]
./run virt-inspector [usual virt-inspector args ...]
If you are already in the fish/ subdirectory, then the following
command will also work:
../run ./guestfish [...]
../run guestfish [...]
You can also make a link from your $PATH to the run script, eg:
cd ~/bin
ln -s ~/libguestfs/run libguestfs-run
cd ~/libguestfs
libguestfs-run ./inspector/virt-inspector [...]
The ./run script adds every libguestfs binary to the $PATH, so the
above example runs guestfish from the build directory (not the
globally installed guestfish if there is one).
You can also run the C programs under valgrind like this:
./run valgrind [valgrind opts...] ./cat/virt-cat [virt-cat opts...]
./run valgrind [valgrind opts...] virt-cat [virt-cat opts...]
or under gdb:
./run gdb --args ./cat/virt-cat [virt-cat opts...]
./run gdb --args virt-cat [virt-cat opts...]
This also works with sudo (eg. if you need root access for libvirt or
to access a block device):
sudo ./run ./cat/virt-cat -d LinuxGuest /etc/passwd
sudo ./run virt-cat -d LinuxGuest /etc/passwd
qemu
@@ -391,7 +395,7 @@ Don't enable GCC warnings (ie. *don't* use
Copyright and license information
----------------------------------------------------------------------
Copyright (C) 2009-2013 Red Hat Inc.
Copyright (C) 2009-2014 Red Hat Inc.
The library is distributed under the LGPLv2+. The programs are
distributed under the GPLv2+. Please see the files COPYING and

39
ROADMAP
View File

@@ -1,39 +0,0 @@
Roadmap for future releases
---------------------------
Before you read this:
(1) To see what's in the current release, read 'guestfs-release-notes(1)'.
(2) To see the list of bugs, read 'BUGS'.
(3) To understand libguestfs versioning, read this:
http://libguestfs.org/guestfs.3.html#libguestfs_version_numbers
(4) For general "might be good to have" items, see 'TODO'.
For next major stable release (1.24)
------------------------------------
* Allow remote libvirt volumes to be accessed. This requires some
enhancements to libvirt which have been agreed but not yet
implemented.
Bugs assigned to 1.24 (put "1.24" in the Devel Whiteboard field in
Bugzilla):
https://bugzilla.redhat.com/buglist.cgi?query_format=advanced&field0-0-0=cf_devel_whiteboard&bug_status=NEW&bug_status=ASSIGNED&bug_status=MODIFIED&bug_status=ON_DEV&bug_status=ON_QA&bug_status=VERIFIED&bug_status=FAILS_QA&bug_status=RELEASE_PENDING&bug_status=POST&bug_status=PASSES_QA&type0-0-0=anywords&value0-0-0=1.24&component=libguestfs&product=Virtualization%20Tools
Beyond 1.24
-----------
* Make 'guestfish --ro' be the default, and get users to use
'guestfish --rw' for write access (but allow the default to be
overridden in a configuration file). This was originally planned
for 1.10 but there's not nearly enough adoption of the new
'guestfish --rw' option out there to do this yet.
* Write a new partition handling library to replace parted, and use it
instead of parted. (RHBZ#593511, RHBZ#642821).
See TODO and BUGS files.

54
TODO
View File

@@ -501,22 +501,6 @@ this approach works, it doesn't solve the MBR problem, so likely we'd
have to write a library for that (or perhaps go back to sfdisk but
using a very abstracted interface over sfdisk).
qemu caching
------------
(Suggested by Paolo Bonzini and Kevin Wolf)
Measure the effect of cache=none, cache=directsync,
cache=writethrough, cache=writeback.
It's doubtful that using cache=none is useful, since it disables the
host cache making read-heavy workloads slower (they rely entirely on
the smaller appliance kernel's cache). And in libguestfs we don't
necessarily care about ongoing data integrity while writing, as long
as data is reliably written out when g.sync, g.shutdown or g.close
return. Also in libguestfs we effectively control the whole stack, so
we can ensure write barriers happen when we want.
virt-sparsify should use discard
--------------------------------
@@ -558,9 +542,20 @@ virt-builder
- set default timezone and language
- how can we give users a shell?
- set permissions on uploaded files & created directories
- Ubuntu templates
- how can we give users a shell for debugging purposes?
- allow non-xz-compressed templates (faster)
- let notes etc be localized, ie. notes[en]=...
- add a CLI option to print the in-built path/fingerprint(s)
- allow public keys to come from local file paths
- doing virt-builder then running (eg. via qemu, libvirt?) is common; is
it possible to make this more automatic?
- more common code between virt-sysprep & virt-builder:
@@ -569,12 +564,19 @@ virt-builder
- document:
* how to upload to glance
* how to integrate with ansible, puppet, chef
* how to import to OpenStack / Glance
* how to import to EC2
- /etc/resolv.conf handling works but is best described as a hack:
https://github.com/libguestfs/libguestfs/commit/9521422ce60578f7196cc8b7977d998159238c19
- let's make UML work
+ SLIRP is insecure, but we could allow just a bare web proxy which
gets proxied over virtio-serial to the outside world (except
virtio-serial can't be multiplexed)
- sometimes (not always) aug_init takes ages, why?
Midnight Commander (mc) extension
---------------------------------
@@ -582,3 +584,17 @@ Midnight Commander (mc) extension
Write an extension for mc that would let people browse into
filesystems. See
http://repo.or.cz/w/midnight-commander.git/tree/HEAD:/misc/ext.d
Python
------
It seems as if we should call PyErr_Clear() somewhere in every
Python binding.
Improvements in virt-log
------------------------
- Make it faster, especially if the user wants to grep the output.
- Support Windows guests, see
http://rwmj.wordpress.com/2011/04/17/decoding-the-windows-event-log-using-guestfish/

View File

@@ -58,7 +58,6 @@ virt_alignment_scan_CPPFLAGS = \
virt_alignment_scan_CFLAGS = \
-pthread \
$(WARN_CFLAGS) $(WERROR_CFLAGS) \
$(GPROF_CFLAGS) $(GCOV_CFLAGS) \
$(LIBCONFIG_CFLAGS) \
$(LIBXML2_CFLAGS) \
$(LIBVIRT_CFLAGS)

View File

@@ -121,7 +121,6 @@ main (int argc, char *argv[])
{ 0, 0, 0, 0 }
};
struct drv *drvs = NULL;
struct drv *drv;
const char *format = NULL;
int c;
int option_index;

9
align/virt-alignment-scan.pod Executable file → Normal file
View File

@@ -1,5 +1,3 @@
=encoding utf8
=head1 NAME
virt-alignment-scan - Check alignment of virtual machine partitions
@@ -349,13 +347,6 @@ contains an explicit C<%pre> section that creates aligned partitions
using L<parted(8)>. Do not use the Kickstart C<part> command. The
NetApp document above contains an example.
=head1 SHELL QUOTING
Libvirt guest names can contain arbitrary characters, some of which
have meaning to the shell such as C<#> and space. You may need to
quote or escape these characters on the command line. See the shell
manual page L<sh(1)> for details.
=head1 EXIT STATUS
This program returns:

View File

@@ -1,5 +1,5 @@
# libguestfs
# Copyright (C) 2009 Red Hat Inc.
# Copyright (C) 2009-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
@@ -19,8 +19,9 @@ include $(top_srcdir)/subdir-rules.mk
EXTRA_DIST = \
99-guestfs-serial.rules \
excludelist.in \
excludefiles.in \
guestfsd.suppressions \
hostfiles.in \
init \
libguestfs-make-fixed-appliance.in \
libguestfs-make-fixed-appliance.pod \
@@ -32,23 +33,25 @@ superminfsdir = $(libdir)/guestfs/supermin.d
fs_DATA =
superminfs_DATA = \
supermin.d/init.img \
supermin.d/udev-rules.img
supermin.d/base.tar.gz \
supermin.d/daemon.tar.gz \
supermin.d/excludefiles \
supermin.d/hostfiles \
supermin.d/init.tar.gz \
supermin.d/packages \
supermin.d/udev-rules.tar.gz
if SUPERMIN_HELPER_COMPRESSED_CPIO
GZ = .gz
endif
if ENABLE_DAEMON
superminfs_DATA += \
supermin.d/daemon.img$(GZ)
endif
if ENABLE_APPLIANCE
superminfs_DATA += \
supermin.d/base.img$(GZ) \
supermin.d/hostfiles
endif
supermin.d/base.tar.gz supermin.d/packages: stamp-supermin
stamp-supermin: make.sh packagelist
rm -f $@ supermin.d/base.tar.gz supermin.d/packages
./make.sh
$(MAKE) \
supermin.d/daemon.tar.gz \
supermin.d/excludefiles \
supermin.d/hostfiles \
supermin.d/init.tar.gz \
supermin.d/udev-rules.tar.gz
touch $@
# This used to be a configure-generated file. However config.status
# always touches the destination file, which means the appliance got
@@ -66,56 +69,49 @@ PACKAGELIST_CPP_FLAGS += -DVALGRIND_DAEMON=1
endif
packagelist: packagelist.in Makefile
cpp -undef $(PACKAGELIST_CPP_FLAGS) < $< | \
m4 $(PACKAGELIST_CPP_FLAGS) $< | \
grep -v '^[[:space:]]*$$' | grep -v '^#' > $@-t
cmp -s $@ $@-t || mv $@-t $@
rm -f $@-t
excludelist: excludelist.in Makefile
cpp -undef $(PACKAGELIST_CPP_FLAGS) < $< | \
grep -v '^[[:space:]]*$$' | grep -v '^#' > $@-t
cmp -s $@ $@-t || mv $@-t $@
rm -f $@-t
supermin.d/base.img$(GZ) supermin.d/hostfiles: stamp-supermin
stamp-supermin: make.sh packagelist excludelist
rm -f $@ supermin.d/base.img$(GZ) supermin.d/hostfiles
./make.sh
if SUPERMIN_HELPER_COMPRESSED_CPIO
gzip -9 supermin.d/base.img
endif
touch $@
supermin.d/daemon.img$(GZ): ../daemon/guestfsd guestfsd.suppressions
rm -f $@ $@-t $@-tt
supermin.d/daemon.tar.gz: ../daemon/guestfsd guestfsd.suppressions
rm -f $@ $@-t
rm -rf tmp-d
mkdir -p tmp-d$(DAEMON_SUPERMIN_DIR) tmp-d/etc
ln ../daemon/guestfsd tmp-d$(DAEMON_SUPERMIN_DIR)/guestfsd
ln $(srcdir)/guestfsd.suppressions tmp-d/etc/guestfsd.suppressions
( cd tmp-d && find | cpio --quiet -o -H newc ) > $@-t
( cd tmp-d && tar zcf - * ) > $@-t
rm -r tmp-d
if SUPERMIN_HELPER_COMPRESSED_CPIO
gzip -9 -c $@-t > $@-tt
mv $@-tt $@-t
endif
mv $@-t $@
supermin.d/init.img: init
rm -rf init.tmp $@ $@-t
mkdir init.tmp
cp $< init.tmp
(cd init.tmp; echo "init" | cpio --quiet -o -H newc) > $@-t
rm -r init.tmp
# Note we must avoid touching supermin.d if possible, so don't create
# the temporary files inside the supermin.d directory.
$@supermin.d/excludefiles: excludefiles.in Makefile
m4 $(PACKAGELIST_CPP_FLAGS) $< | \
grep -v '^[[:space:]]*$$' | grep -v '^#' > excludefiles-t
cmp -s $@ excludefiles-t || mv excludefiles-t $@
rm -f excludefiles-t
supermin.d/hostfiles: hostfiles.in Makefile
m4 $(PACKAGELIST_CPP_FLAGS) $< | \
grep -v '^[[:space:]]*$$' | grep -v '^#' > hostfiles-t
cmp -s $@ hostfiles-t || mv hostfiles-t $@
rm -f hostfiles-t
supermin.d/init.tar.gz: init
rm -f $@ $@-t
( cd $(srcdir) && tar zcf - init ) > $@-t
mv $@-t $@
# We should put this file in /lib/udev/rules.d, but put it in /etc so
# we don't have to deal with all the UsrMove crap in Fedora.
supermin.d/udev-rules.img: 99-guestfs-serial.rules
supermin.d/udev-rules.tar.gz: 99-guestfs-serial.rules
rm -f $@ $@-t
rm -rf tmp-u
mkdir -p tmp-u/etc/udev/rules.d
for f in $^; do ln $$f tmp-u/etc/udev/rules.d/$$(basename $$f); done
( cd tmp-u && find | cpio --quiet -o -H newc ) > $@-t
( cd tmp-u && tar zcf - etc ) > $@-t
rm -r tmp-u
mv $@-t $@
@@ -144,7 +140,11 @@ stamp-libguestfs-make-fixed-appliance.pod: libguestfs-make-fixed-appliance.pod
# Make clean.
CLEANFILES = packagelist excludelist \
CLEANFILES = \
*~ \
libguestfs-make-fixed-appliance.1 \
stamp-libguestfs-make-fixed-appliance.pod \
stamp-libguestfs-make-fixed-appliance.pod
DISTCLEANFILES = \
stamp-supermin \
supermin.d/*

44
appliance/excludefiles.in Normal file
View File

@@ -0,0 +1,44 @@
dnl This is the list of files excluded from the appliance, even if
dnl they appear in packagelist.in (or more likely, as dependencies of
dnl packages in packagelist.in).
dnl
dnl List is a list of wildcards, one per line, prefixed by a '-' character.
dnl
dnl This file is processed by m4 with one of the
dnl following symbols defined (depending on the distro):
dnl
dnl REDHAT=1 For Fedora, RHEL, EPEL and workalikes.
dnl DEBIAN=1 For Debian.
dnl UBUNTU=1 For Ubuntu.
dnl ARCHLINUX=1 For Archlinux.
dnl
dnl Note that any matching file will be dropped from the appliance.
dnl Of course, this may break the appliance, so be careful.
dnl The right kernel modules are added back by supermin.
-/boot/*
-/lib/modules/*
-/usr/lib/locale/*
-/usr/share/locale/*
-/usr/share/man/*
-/usr/share/doc/*
-/usr/share/info/*
-/usr/share/gnome/help/*
-/usr/share/cracklib/*
-/usr/share/i18n/*
-/usr/share/pkgconfig/*
-/var/log/*.log*
-/var/log/cron*
-/var/log/lastlog*
-/var/log/messages*
-/var/log/secure*
-/var/log/syslog*
dnl For Debian:
-/usr/share/lintian/*
-/usr/share/initramfs-tools/*
-/usr/share/doc-base/*
-/usr/share/bug/*
-/etc/initramfs-tools/*

View File

@@ -1,57 +0,0 @@
/* This is the list of distro packages which are
* excluded from the appliance, even if they appear in
* packagelist.in (or more likely, as dependencies of
* packages in packagelist.in).
*
* List is a list of basic regular expressions, one per line.
*
* This file is processed by cpp with one of the
* following symbols defined (depending on the distro):
*
* REDHAT=1 For Fedora, RHEL, EPEL and workalikes.
* DEBIAN=1 For Debian.
* UBUNTU=1 For Ubuntu.
* ARCHLINUX=1 For Archlinux.
*
* Note that any file provided by one of these packages will
* be dropped from the appliance. Of course, this may break
* the appliance, so be careful. Other files are also dropped
* from the appliance such as docs and man pages: see 'make.sh.in'
* for the full details.
*/
/* Basically the same with a few minor tweaks. */
#ifdef UBUNTU
#define DEBIAN 1
#endif
/* Don't need any Perl or Python appearing in the appliance. */
^perl
^python
/* Plymouth is a graphical boot thing - not needed. */
^plymouth
/* Linux firmware. */
^linux-firmware
/* Keyboard maps - appliance is not interactive. */
^kbd-misc
#ifdef REDHAT
/* Linux kernel. febootstrap <= 3.18 used to exclude the kernel
* package (only) by default, but since 3.19 it doesn't do this any
* longer.
*/
^kernel
^fedora-logos
^redhat-logos
^dracut
#endif
#ifdef DEBIAN
^file-rc
#endif

14
appliance/hostfiles.in Normal file
View File

@@ -0,0 +1,14 @@
dnl This is the list of extra files added to appliance.
dnl
dnl List is a list of wildcards, one per line.
dnl
dnl This file is processed by m4 with one of the
dnl following symbols defined (depending on the distro):
dnl
dnl REDHAT=1 For Fedora, RHEL, EPEL and workalikes.
dnl DEBIAN=1 For Debian.
dnl UBUNTU=1 For Ubuntu.
dnl ARCHLINUX=1 For Archlinux.
/lib/lsb/*
/usr/share/augeas/lenses/*.aug

View File

@@ -10,6 +10,10 @@ RUNLEVEL=S
PREVLEVEL=N
export RUNLEVEL PREVLEVEL
# Make sure to find all the libraries, also those in non-standard place
# but with a proper ld.so configuration pointing at them
ldconfig
# Try to print a stack trace for segfaults inside the appliance.
for d in /lib64 /lib; do
f=$d/libSegFault.so
@@ -32,53 +36,25 @@ mount -t sysfs /sys /sys
mkdir -p /run
mount -t tmpfs -o "nosuid,size=20%,mode=0755" tmpfs /run
mkdir -p /run/lock
ln -s ../run/lock /var/lock
# devtmpfs is required since udev 176
mount -t devtmpfs /dev /dev
if [ ! -L /etc/init.d/udev -a -x /etc/init.d/udev ]; then
if type service >/dev/null 2>&1; then
service udev start
else
/etc/init.d/udev start
fi
elif [ -x /sbin/start_udev ] && /sbin/start_udev; then
:
else
# Find udevd and run it directly.
for f in /sbin/udevd /lib/udev/udevd \
/lib/systemd/systemd-udevd /usr/lib/systemd/systemd-udevd \
/usr/lib/udev/udevd; do
if [ -x "$f" ]; then UDEVD="$f"; fi
done
if [ -n "$UDEVD" ]; then
echo -e '\000\000\000\000' > /proc/sys/kernel/hotplug
$UDEVD --daemon
udevadm trigger
udevadm settle --timeout=600
else
echo No udevd, creating /dev manually.
mount -t tmpfs none /dev
mkdir /dev/pts /dev/shm /dev/mapper
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
# Must do each MAKEDEV individually, because if one device fails,
# MAKEDEV will quit without creating the rest (RHBZ#507374).
for dev in mem null port zero core full ram tty console fd \
hda hdb hdc hdd sda sdb sdc sdd loop sd; do
MAKEDEV $dev ||:
done
mknod /dev/ptmx c 5 2; chmod 0666 /dev/ptmx
mknod /dev/random c 1 8; chmod 0666 /dev/random
mknod /dev/urandom c 1 9; chmod 0444 /dev/urandom
ln -sf /proc/self/fd/0 /dev/stdin
ln -sf /proc/self/fd/1 /dev/stdout
ln -sf /proc/self/fd/2 /dev/stderr
modprobe virtio_pci
modprobe virtio_net
fi
# Find udevd and run it directly.
for f in /sbin/udevd /lib/udev/udevd \
/lib/systemd/systemd-udevd /usr/lib/systemd/systemd-udevd \
/usr/lib/udev/udevd; do
if [ -x "$f" ]; then UDEVD="$f"; fi
done
if [ -z "$UDEVD" ]; then
echo "udev not found! Things will probably not work ..."
fi
$UDEVD --daemon
udevadm trigger
udevadm settle --timeout=600
if grep -sq selinux=1 /proc/cmdline; then
mount -t selinuxfs none /sys/fs/selinux
fi
@@ -108,6 +84,8 @@ ip link set dev eth0 up
ip route add default via 169.254.2.2
echo nameserver 169.254.2.3 > /etc/resolv.conf
# Scan for MDs.
mdadm -As --auto=yes --run
@@ -115,8 +93,7 @@ mdadm -As --auto=yes --run
modprobe dm_mod ||:
lvmetad ||:
lvm vgscan --ignorelockingfailure
lvm vgchange -ay --ignorelockingfailure
lvm vgchange -aay --sysinit
# Scan for Windows dynamic disks.
ldmtool create all
@@ -134,6 +111,8 @@ if grep -sq guestfs_verbose=1 /proc/cmdline; then
lsmod
#hwclock -r
date
echo -n "clocksource: "
cat /sys/devices/system/clocksource/clocksource0/current_clocksource
#ping -n -v -c 5 10.0.2.2
#ping -n -v -c 5 10.0.2.4
@@ -141,6 +120,8 @@ if grep -sq guestfs_verbose=1 /proc/cmdline; then
fi
if ! grep -sq guestfs_rescue=1 /proc/cmdline; then
# Run the daemon.
# Run the daemon under valgrind if ./configure --enable-valgrind-daemon
if grep -sq guestfs_valgrind_daemon=1 /proc/cmdline; then
if [ -r /etc/guestfsd.suppressions ]; then
@@ -152,14 +133,24 @@ if ! grep -sq guestfs_rescue=1 /proc/cmdline; then
# Run guestfsd, under valgrind if asked.
$vg guestfsd
if [ $? -eq 119 ]; then echo "DAEMON VALGRIND FAILED"; fi
if [ $? -eq 119 ]; then
echo "DAEMON VALGRIND FAILED"
# Sleep so valgrind messages are seen by the host. Note this
# only happens in non-production builds
# (--enable-valgrind-daemon) + on an error path.
sleep 10
fi
else
# Run virt-rescue shell.
# Remove LD_PRELOAD=libSegFault set above.
unset LD_PRELOAD
# Use appliance in rescue mode, also used by the virt-rescue command.
eval $(grep -Eo 'TERM=[^[:space:]]+' /proc/cmdline)
PS1='><rescue> '
export TERM PS1
:> $HOME/.bashrc
grep -Eo 'TERM=[^[:space:]]+' /proc/cmdline >> $HOME/.bashrc
echo "PS1='><rescue> '" >> $HOME/.bashrc
echo "export TERM PS1" >> $HOME/.bashrc
echo
echo "------------------------------------------------------------"
echo

View File

@@ -105,7 +105,7 @@ guestfish -a /dev/null run
# Find the location of the appliance.
cachedir="$(guestfish get-cachedir)"
euid="$(id -u)"
appliancedir="$cachedir/.guestfs-$euid"
appliancedir="$cachedir/.guestfs-$euid/appliance.d"
cp "$appliancedir/kernel" "$outputdir/kernel"
cp "$appliancedir/initrd" "$outputdir/initrd"
@@ -128,8 +128,8 @@ Then copy all four files:
into a directory somewhere, eg. /usr/local/lib/guestfs/appliance/
Then build libguestfs (>= 1.16.7 or >= 1.18) from source, disabling
the normal appliance and daemon:
Then build libguestfs from source, disabling the normal appliance
and daemon:
./configure --disable-appliance --disable-daemon
make

View File

@@ -1,5 +1,3 @@
=encoding utf8
=head1 NAME
libguestfs-make-fixed-appliance - Make a "fixed appliance" for libguestfs
@@ -25,7 +23,7 @@ Some reasons why you I<might> want to use this include:
You want to make a self-contained libguestfs appliance that can be
copied to another machine or platform that doesn't support
L<supermin(8)>.
L<supermin(1)>.
=item *
@@ -129,8 +127,8 @@ looking for an appliance. The path is built into libguestfs, or can
be set using the C<LIBGUESTFS_PATH> environment variable.
Normally a supermin appliance is located on this path (see
L<supermin(8)/SUPERMIN APPLIANCE>). libguestfs reconstructs this
into a full appliance by running L<supermin-helper(8)>.
L<supermin(1)/SUPERMIN APPLIANCE>). libguestfs reconstructs this
into a full appliance by running C<supermin --build>.
However, a simpler "fixed appliance" can also be used. libguestfs
detects this by looking for a directory on the path containing four
@@ -166,8 +164,7 @@ libguestfs, please see the L<guestfs(3)> manual page.
=head1 SEE ALSO
L<guestfs(3)>,
L<supermin(8)>,
L<supermin-helper(8)>,
L<supermin(1)>,
L<xz(1)>,
L<http://libguestfs.org/>,
L<http://qemu.org/>.
@@ -178,4 +175,4 @@ Richard W.M. Jones (C<rjones at redhat dot com>)
=head1 COPYRIGHT
Copyright (C) 2009-2013 Red Hat Inc.
Copyright (C) 2009-2014 Red Hat Inc.

View File

@@ -1,6 +1,6 @@
#!/bin/bash -
# @configure_input@
# Copyright (C) 2009-2013 Red Hat Inc.
# Copyright (C) 2009-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
@@ -20,48 +20,14 @@ unset CDPATH
set -e
# Turn excludelist file into command line arguments.
exec 5<excludelist
while read regexp <&5; do
excludes="$excludes --exclude $regexp"
done
exec 5<&-
# Run supermin.
# Run supermin on the package list.
# NB: Keep using --yum-config (deprecated alias) here since both old
# and new supermin still support it.
if [ "x@SUPERMIN_PACKAGER_CONFIG@" != "xno" ]; then
extra="--yum-config @SUPERMIN_PACKAGER_CONFIG@"
extra="--packager-config @SUPERMIN_PACKAGER_CONFIG@"
fi
if [ "x@SUPERMIN_EXTRA_OPTIONS@" != "xno" ]; then
extra="$extra @SUPERMIN_EXTRA_OPTIONS@"
fi
echo @SUPERMIN@ -v -o supermin.d --names $(< packagelist ) $excludes $extra
@SUPERMIN@ -v -o supermin.d --names $(< packagelist ) $excludes $extra
# Remove some things that we don't want in the appliance. This is
# copied from the old febootstrap-minimize. However minimization is
# not so important now that we are caching the appliance.
< supermin.d/hostfiles \
grep -v '^/usr/lib/locale' |
grep -v '^/usr/share/locale' |
grep -v '^/usr/share/man/' |
grep -v '^/usr/share/doc/' |
grep -v '^/usr/share/info/' |
grep -v '^/usr/share/gnome/help/' |
grep -v '^/usr/share/cracklib/' |
grep -v '^/usr/share/i18n/' > supermin.d/hostfiles-t
# XXX resolv.conf? The old script had:
# echo nameserver 169.254.2.3 > resolv.conf
if ! grep -q /etc/resolv.conf supermin.d/hostfiles-t; then
echo /etc/resolv.conf >> supermin.d/hostfiles-t
fi
# Include any Augeas lenses from the host.
if grep -q /usr/share/augeas/lenses supermin.d/hostfiles-t; then
echo "/usr/share/augeas/lenses/*.aug" >> supermin.d/hostfiles-t
fi
mv supermin.d/hostfiles-t supermin.d/hostfiles
echo @SUPERMIN@ --prepare -v -o supermin.d $(< packagelist ) $extra
@SUPERMIN@ --prepare -v -o supermin.d $(< packagelist ) $extra

View File

@@ -1,34 +1,32 @@
/* This is the list of distro packages which are
* installed on the appliance.
*
* This file is processed by cpp with one of the
* following symbols defined (depending on the distro):
*
* REDHAT=1 For Fedora, RHEL, EPEL and workalikes.
* DEBIAN=1 For Debian.
* UBUNTU=1 For Ubuntu.
* ARCHLINUX=1 For Archlinux.
*
* There is also a list of packages which are excluded if they appear
* as dependencies of the packages below. See: excludelist.in
*
* To add arbitrary extra packages, use:
*
* ./configure --with-extra-packages="gdb valgrind [etc]"
*/
dnl This is the list of distro packages which are
dnl installed on the appliance.
dnl
dnl This file is processed by m4 with one of the
dnl following symbols defined (depending on the distro):
dnl
dnl REDHAT=1 For Fedora, RHEL, EPEL and workalikes.
dnl DEBIAN=1 For Debian.
dnl UBUNTU=1 For Ubuntu.
dnl MAGEIA=1 For Mageia
dnl ARCHLINUX=1 For Archlinux.
dnl
dnl There is also a list of packages which are excluded if they appear
dnl as dependencies of the packages below. See: excludelist.in
dnl
dnl To add arbitrary extra packages, use:
dnl
dnl ./configure --with-extra-packages="gdb valgrind [etc]"
/* Basically the same with a few minor tweaks. */
#ifdef UBUNTU
#define DEBIAN 1
#endif
dnl Basically the same with a few minor tweaks.
ifelse(UBUNTU,1,`define(`DEBIAN',1)')
#ifdef REDHAT
ifelse(REDHAT,1,
augeas-libs
btrfs-progs
cryptsetup
cryptsetup-luks /* old name used before Fedora 17 */
cryptsetup-luks dnl old name used before Fedora 17
e2fsprogs
/* e4fsprogs only exists on RHEL 5, will be ignored everywhere else. */
dnl e4fsprogs only exists on RHEL 5, will be ignored everywhere else.
e4fsprogs
genisoimage
gfs-utils
@@ -40,8 +38,7 @@
iputils
kernel
libcap
libldm /* only Fedora has this for now, but we should add it to others later*/
MAKEDEV
libldm dnl only Fedora for now, others later
nilfs-utils
ntfsprogs
ntfs-3g
@@ -50,46 +47,54 @@
reiserfs-utils
libselinux
syslinux-extlinux
systemd /* for /sbin/reboot and udevd */
systemd dnl for /sbin/reboot and udevd
vim-minimal
xz
yajl
zfs-fuse
#endif /* REDHAT */
)
#ifdef DEBIAN
ifelse(DEBIAN,1,
bsdmainutils
btrfs-tools
cryptsetup
e2fsprogs
extlinux
genisoimage
dnl gfs-tools, gfs2-tools have been renamed to gfs2-utils
gfs-tools
gfs2-tools
grub-pc
gfs2-utils
grub2-common
hfsplus
dnl iproute has been renamed to iproute2
iproute
iproute2
iputils-ping
iputils-arping
iputils-tracepath
libaugeas0
libcap2
libhivex0
libpcre3
libsystemd-id128-0
libsystemd-journal0
libyajl2
linux-image
/* syslinux 'suggests' mtools, but in reality it's a hard dependency: */
dnl syslinux 'suggests' mtools, but in reality it's a hard dependency:
mtools
nilfs-tools
ntfs-3g
ntfsprogs
openssh-client
reiserfsprogs
sysvinit /* for /sbin/reboot */
sysvinit dnl for /sbin/reboot
ufsutils
vim-tiny
xz-utils
zfs-fuse
#endif /* DEBIAN */
)
#ifdef ARCHLINUX
ifelse(ARCHLINUX,1,
augeas
btrfs-progs
cdrkit
@@ -112,7 +117,97 @@
xz
yajl
zfs-fuse
#endif /* ARCHLINUX */
)
ifelse(FRUGALWARE,1,
augeas
btrfs-progs
cryptsetup-luks
e2fsprogs
cdrkit
grub2
hfsplus
iproute2
iputils
kernel
libcap
ntfsprogs
ntfs-3g
openssh
pcre
reiserfsprogs
syslinux
systemd
vim
xz
yajl
xfsprogs-acl
xfsprogs-attr
bash
binutils
bzip2
coreutils
cpio
diffutils
dosfstools
file
findutils
gawk
gptfdisk
grep
gzip
jfsutils
kmod
less
libxml2
lsof
lsscsi
lvm2
mdadm
module-init-tools
parted
procps
psmisc
rsync
sed
strace
syslinux
tar
util-linux
xfsprogs
)
ifelse(MAGEIA,1,
augeas
btrfs-progs
cryptsetup
chkconfig /* for /etc/init.d */
e2fsprogs
cdrkit-genisoimage
extlinux
gfs2-utils
grub
hfsplus-tools
hivex
iproute2
iputils
libcap
nilfs-utils
ntfsprogs
ntfs-3g
openssh-clients
pcre
reiserfs-utils
libselinux
systemd /* for /sbin/reboot and udevd */
vim-minimal
xz
yajl
module-init-tools
procps-ng
udev
util-linux-ng
)
acl
attr
@@ -139,11 +234,9 @@ lvm2
lzop
mdadm
module-init-tools
/*
Enabling this pulls out 140 extra packages
into the appliance:
ocfs2-tools
*/
dnl Enabling this pulls out 140 extra packages
dnl into the appliance:
dnl ocfs2-tools
parted
procps
procps-ng
@@ -157,17 +250,10 @@ tar
udev
util-linux
util-linux-ng
#ifndef UBUNTU
/* on Ubuntu contains a file in /lib64 which conflicts with libc6 that has
* /lib64 as a symbolic link
*/
xfsprogs
#endif
zerofree
#ifdef VALGRIND_DAEMON
valgrind
#endif
ifelse(VALGRIND_DAEMON,1,valgrind)
/* Define this by doing: ./configure --with-extra-packages="..." */
dnl Define this by doing: ./configure --with-extra-packages="..."
EXTRA_PACKAGES

View File

@@ -28,6 +28,7 @@ scripts = \
virt-filesystems \
virt-format \
virt-inspector \
virt-log \
virt-ls \
virt-rescue \
virt-resize \
@@ -51,6 +52,8 @@ virt-format:
ln -sf virt-alignment-scan $@
virt-inspector:
ln -sf virt-alignment-scan $@
virt-log:
ln -sf virt-alignment-scan $@
virt-ls:
ln -sf virt-alignment-scan $@
virt-sysprep:

View File

@@ -1,5 +1,5 @@
# guestfish bash completion script -*- shell-script -*-
# Copyright (C) 2010-2013 Red Hat Inc.
# Copyright (C) 2010-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

View File

@@ -1,5 +1,5 @@
# guestmount bash completion script -*- shell-script -*-
# Copyright (C) 2010-2013 Red Hat Inc.
# Copyright (C) 2010-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

View File

@@ -1,5 +1,5 @@
# virt-tools bash completion script -*- shell-script -*-
# Copyright (C) 2010-2013 Red Hat Inc.
# Copyright (C) 2010-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

View File

@@ -1,5 +1,5 @@
# virt-rescue bash completion script -*- shell-script -*-
# Copyright (C) 2010-2013 Red Hat Inc.
# Copyright (C) 2010-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

View File

@@ -1,6 +1,6 @@
# virt-resize, virt-builder, virt-sparsify bash completion script
# -*- shell-script -*-
# Copyright (C) 2010-2013 Red Hat Inc.
# Copyright (C) 2010-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

View File

@@ -1,6 +1,6 @@
#!/bin/bash -
# bugs-in-changelog.sh
# Copyright (C) 2009-2013 Red Hat Inc.
# Copyright (C) 2009-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

View File

@@ -17,64 +17,127 @@
include $(top_srcdir)/subdir-rules.mk
AM_YFLAGS = -d
AM_CFLAGS = \
-I$(shell $(OCAMLC) -where) \
-I$(top_srcdir)/gnulib/lib \
-I$(top_srcdir)/src \
-I$(top_srcdir)/fish \
-pthread \
$(LIBLZMA_CFLAGS)
EXTRA_DIST = \
$(SOURCES) \
virt-builder.pod \
libguestfs.gpg \
test-index \
test-virt-builder.sh \
test-virt-builder-list.sh \
website/.gitignore \
website/README \
website/index \
website/index.asc \
website/debian-7.preseed \
website/debian-7.sh \
website/debian-7.xz.sig \
website/fedora-18.ks \
website/fedora-18.sh \
website/fedora-18.xz.sig \
website/fedora-19.ks \
website/fedora-19.sh \
website/fedora-19.xz.sig
test-virt-builder-planner.sh \
test-virt-index-validate.sh \
test-virt-index-validate-bad-1 \
test-virt-index-validate-good-1 \
test-virt-index-validate-good-2 \
virt-builder.pod \
virt-index-validate.pod
CLEANFILES = *~ *.cmi *.cmo *.cmx *.cmxa *.o virt-builder
# Alphabetical order.
SOURCES = \
architecture.ml \
builder.ml \
cache.mli \
cache.ml \
cmdline.ml \
downloader.mli \
downloader.ml \
get_kernel.mli \
get_kernel.ml \
index_parser.mli \
index_parser.ml \
index-parser-c.c \
ini_reader.mli \
ini_reader.ml \
languages.mli \
languages.ml \
list_entries.mli \
list_entries.ml \
perl_edit.ml \
perl_edit.mli \
paths.ml \
pxzcat.ml \
pxzcat.mli \
pxzcat-c.c \
setlocale.ml \
setlocale.mli \
setlocale-c.c \
sigchecker.mli \
sigchecker.ml
sigchecker.ml \
sources.mli \
sources.ml \
uname.ml \
uname.mli \
uname-c.c
man_MANS =
noinst_DATA =
if HAVE_OCAML
# Note this list must be in dependency order.
OBJECTS = \
deps = \
$(top_builddir)/mllib/libdir.cmx \
$(top_builddir)/mllib/config.cmx \
$(top_builddir)/mllib/common_gettext.cmx \
$(top_builddir)/mllib/common_utils.cmx \
$(top_builddir)/mllib/random_seed.cmx \
$(top_builddir)/mllib/hostname.cmx \
$(top_builddir)/mllib/firstboot.cmx \
$(top_builddir)/mllib/crypt-c.o \
$(top_builddir)/mllib/crypt.cmx \
$(top_builddir)/mllib/password.cmx \
$(top_builddir)/mllib/fsync-c.o \
$(top_builddir)/mllib/fsync.cmx \
$(top_builddir)/mllib/planner.cmx \
$(top_builddir)/mllib/regedit.cmx \
$(top_builddir)/mllib/uri-c.o \
$(top_builddir)/mllib/uRI.cmx \
$(top_builddir)/mllib/mkdtemp-c.o \
$(top_builddir)/mllib/mkdtemp.cmx \
$(top_builddir)/customize/urandom.cmx \
$(top_builddir)/customize/random_seed.cmx \
$(top_builddir)/customize/hostname.cmx \
$(top_builddir)/customize/timezone.cmx \
$(top_builddir)/customize/firstboot.cmx \
$(top_builddir)/customize/perl_edit.cmx \
$(top_builddir)/customize/crypt-c.o \
$(top_builddir)/customize/crypt.cmx \
$(top_builddir)/customize/password.cmx \
$(top_builddir)/customize/customize_cmdline.cmx \
$(top_builddir)/customize/customize_run.cmx \
$(top_builddir)/fish/guestfish-uri.o \
index-scan.o \
index-struct.o \
index-parse.o \
index-parser-c.o \
pxzcat-c.o \
pxzcat.cmx \
setlocale-c.o \
setlocale.cmx \
uname-c.o \
uname.cmx \
architecture.cmx \
ini_reader.cmx \
paths.cmx \
languages.cmx \
get_kernel.cmx \
cache.cmx \
downloader.cmx \
sigchecker.cmx \
index_parser.cmx \
list_entries.cmx \
perl_edit.cmx \
sources.cmx \
cmdline.cmx \
builder.cmx
if HAVE_OCAMLOPT
OBJECTS = $(deps)
else
OBJECTS = $(patsubst %.cmx,%.cmo,$(deps))
endif
bin_SCRIPTS = virt-builder
# -I $(top_builddir)/src/.libs is a hack which forces corresponding -L
@@ -84,20 +147,37 @@ OCAMLPACKAGES = \
-package str,unix \
-I $(top_builddir)/src/.libs \
-I $(top_builddir)/ocaml \
-I $(top_builddir)/mllib
-I $(top_builddir)/mllib \
-I $(top_builddir)/customize
if HAVE_OCAML_PKG_GETTEXT
OCAMLPACKAGES += -package gettext-stub
endif
OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX $(OCAMLPACKAGES)
OCAMLCFLAGS = -g -warn-error CDEFLMPSUVYZX-3 $(OCAMLPACKAGES)
OCAMLOPTFLAGS = $(OCAMLCFLAGS)
OCAMLCLIBS = \
$(LIBLZMA_LIBS) \
$(LIBXML2_LIBS) \
-L../src/.libs -lutils \
-L../gnulib/lib/.libs -lgnu \
-pthread -lpthread \
-lncurses -lcrypt
if HAVE_OCAMLOPT
virt-builder: $(OBJECTS)
$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) \
mlguestfs.cmxa -linkpkg $^ \
-cclib '-lncurses -lcrypt' \
$(OCAML_GCOV_LDFLAGS) \
-cclib '$(OCAMLCLIBS)' \
-o $@
else
virt-builder: $(OBJECTS)
$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) \
mlguestfs.cma -linkpkg $^ \
-cclib '$(OCAMLCLIBS)' \
-custom \
-o $@
endif
.mli.cmi:
$(OCAMLFIND) ocamlc $(OCAMLCFLAGS) -c $< -o $@
@@ -106,31 +186,19 @@ virt-builder: $(OBJECTS)
.ml.cmx:
$(OCAMLFIND) ocamlopt $(OCAMLOPTFLAGS) -c $< -o $@
# automake will decide we don't need C support in this file. Really
# we do, so we have to provide it ourselves.
DEFAULT_INCLUDES = \
-I. \
-I$(top_builddir) \
-I$(shell $(OCAMLC) -where) \
-I$(top_srcdir)/src \
-I$(top_srcdir)/fish
.c.o:
$(CC) $(CFLAGS) $(PROF_CFLAGS) $(DEFAULT_INCLUDES) -c $< -o $@
# Manual pages and HTML files for the website.
man_MANS = virt-builder.1
noinst_DATA = $(top_builddir)/html/virt-builder.1.html
man_MANS += virt-builder.1
noinst_DATA += $(top_builddir)/html/virt-builder.1.html
virt-builder.1 $(top_builddir)/html/virt-builder.1.html: stamp-virt-builder.pod
stamp-virt-builder.pod: virt-builder.pod
stamp-virt-builder.pod: virt-builder.pod $(top_srcdir)/customize/customize-synopsis.pod $(top_srcdir)/customize/customize-options.pod
$(PODWRAPPER) \
--man virt-builder.1 \
--html $(top_builddir)/html/virt-builder.1.html \
--insert $(top_srcdir)/customize/customize-synopsis.pod:__CUSTOMIZE_SYNOPSIS__ \
--insert $(top_srcdir)/customize/customize-options.pod:__CUSTOMIZE_OPTIONS__ \
--license GPLv2+ \
$<
touch $@
@@ -141,17 +209,32 @@ CLEANFILES += stamp-virt-builder.pod
TESTS_ENVIRONMENT = $(top_builddir)/run --test
all_disk_images := debian.xz fedora.xz ubuntu.xz windows.xz
disk_images := $(shell for f in $(all_disk_images); do b=`basename $$f .xz`; if [ -f "../tests/guests/$$b.img" ]; then echo $$f; fi; done)
disk_images := \
$(shell for f in debian fedora ubuntu windows; do if [ -s "../tests/guests/$$f.img" ]; then echo $$f.xz; fi; done) \
$(shell if [ -s "../tests/guests/fedora.img" ]; then echo fedora.qcow2 fedora.qcow2.xz; fi)
CLEANFILES += $(all_disk_images)
CLEANFILES += *.qcow2 *.xz
check_DATA = $(disk_images)
%.xz: ../tests/guests/%.img
xz --best --block-size=16777216 -c $< > $@
fedora.qcow2: ../tests/guests/fedora.img
rm -f $@ $@-t
qemu-img convert -f raw -O qcow2 $< $@-t
mv $@-t $@
TESTS = test-virt-builder-list.sh
fedora.qcow2.xz: fedora.qcow2
rm -f $@ $@-t
xz --best --block-size=16777216 -c $< > $@-t
mv $@-t $@
%.xz: ../tests/guests/%.img
rm -f $@ $@-t
xz --best --block-size=16777216 -c $< > $@-t
mv $@-t $@
TESTS = \
test-virt-builder-list.sh \
test-virt-index-validate.sh
if ENABLE_APPLIANCE
TESTS += test-virt-builder.sh
@@ -160,12 +243,15 @@ endif ENABLE_APPLIANCE
check-valgrind:
$(MAKE) VG="$(top_builddir)/run @VG@" check
check-slow:
$(MAKE) TESTS="test-virt-builder-planner.sh" check
# Dependencies.
depend: .depend
.depend: $(wildcard $(abs_srcdir)/*.mli) $(wildcard $(abs_srcdir)/*.ml)
rm -f $@ $@-t
$(OCAMLFIND) ocamldep -I ../ocaml -I $(abs_srcdir) -I $(top_srcdir)/mllib $^ | \
$(OCAMLFIND) ocamldep -I ../ocaml -I $(abs_srcdir) -I $(abs_top_builddir)/mllib -I $(abs_top_builddir)/customize $^ | \
$(SED) 's/ *$$//' | \
$(SED) -e :a -e '/ *\\$$/N; s/ *\\\n */ /; ta' | \
$(SED) -e 's,$(abs_srcdir)/,$(builddir)/,g' | \
@@ -179,3 +265,55 @@ endif
DISTCLEANFILES = .depend
.PHONY: depend docs
# virt-builder's default repository
repoconfdir = $(sysconfdir)/xdg/virt-builder/repos.d
repoconf_DATA = libguestfs.conf libguestfs.gpg
install-exec-hook:
$(LN_S) xdg/virt-builder $(DESTDIR)$(sysconfdir)/virt-builder
# Build a small C index validator program.
bin_PROGRAMS = virt-index-validate
virt_index_validate_SOURCES = \
index-parse.y \
index-scan.l \
index-struct.h \
index-struct.c \
index-validate.c
virt_index_validate_CPPFLAGS = \
-DLOCALEBASEDIR=\""$(datadir)/locale"\"
virt_index_validate_LDADD = \
../gnulib/lib/libgnu.la
man_MANS += virt-index-validate.1
noinst_DATA += $(top_builddir)/html/virt-index-validate.1.html
virt-index-validate.1 $(top_builddir)/html/virt-index-validate.1.html: stamp-virt-index-validate.pod
stamp-virt-index-validate.pod: virt-index-validate.pod
$(PODWRAPPER) \
--man virt-index-validate.1 \
--html $(top_builddir)/html/virt-index-validate.1.html \
--license GPLv2+ \
$<
touch $@
CLEANFILES += \
index-parse.c \
index-parse.h \
index-scan.c \
stamp-virt-index-validate.pod
if HAVE_OCAML
# Automake-generated makefile has a rule ".l.c:" but lacks a rule ".l.h:".
# Also it doesn't generate dependencies for the C files that include
# index-parse.h.
index-parser-c.c index-scan.c index-validate.c: index-parse.h
index-parse.h: index-parse.y
$(MAKE) index-parse.h
endif

41
builder/architecture.ml Normal file
View File

@@ -0,0 +1,41 @@
(* virt-builder
* 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.
*)
open Common_gettext.Gettext
open Common_utils
open Unix
let filter_arch = function
| "amd64" | "x86_64" | "x64" -> "x86_64"
| "powerpc" | "ppc" -> "ppc"
| arch -> arch
let arch_is_compatible nativearch otherarch =
let nativearch = filter_arch nativearch in
let otherarch = filter_arch otherarch in
match nativearch, otherarch with
| a, b when a = b -> true
| "x86_64", "i386" -> true
| "ppc64", "ppc" -> true
| "sparc64", "sparc" -> true
| a, b -> false
let current_arch =
try filter_arch ((Uname.uname ()).Uname.machine)
with Unix_error _ -> "unknown"

File diff suppressed because it is too large Load Diff

60
builder/cache.ml Normal file
View File

@@ -0,0 +1,60 @@
(* virt-builder
* Copyright (C) 2013-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.
*)
open Common_gettext.Gettext
open Common_utils
open Unix
open Printf
let quote = Filename.quote
let clean_cachedir dir =
let cmd = sprintf "rm -rf %s" (quote dir) in
ignore (Sys.command cmd);
type t = {
verbose : bool;
directory : string;
}
let create ~verbose ~directory =
if not (is_directory directory) then
mkdir directory 0o755;
{
verbose = verbose;
directory = directory;
}
let cache_of_name t name arch revision =
t.directory // sprintf "%s.%s.%d" name arch revision
let is_cached t name arch revision =
let filename = cache_of_name t name arch revision in
Sys.file_exists filename
let print_item_status t ~header l =
if header then (
printf (f_"cache directory: %s\n") t.directory
);
List.iter (
fun (name, arch, revision) ->
let cached = is_cached t name arch revision in
printf "%-24s %-10s %s\n" name arch
(if cached then s_"cached" else (*s_*)"no")
) l

45
builder/cache.mli Normal file
View File

@@ -0,0 +1,45 @@
(* virt-builder
* Copyright (C) 2013-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 module represents a local cache. *)
val clean_cachedir : string -> unit
(** [clean_cachedir dir] clean the specified cache directory. *)
type t
(** The abstract data type. *)
val create : verbose:bool -> directory:string -> t
(** Create the abstract type. *)
val cache_of_name : t -> string -> string -> int -> string
(** [cache_of_name t name arch revision] return the filename
of the cached file. (Note: It doesn't check if the filename
exists, this is just a simple string transformation). *)
val is_cached : t -> string -> string -> int -> bool
(** [is_cached t name arch revision] return whether the file with
specified name, architecture and revision is cached. *)
val print_item_status : t -> header:bool -> (string * string * int) list -> unit
(** [print_item_status t header items] print the status in the cache
of the specified items (which are tuples of name, architecture,
and revision).
If [~header:true] then display a header with the path of the
cache. *)

348
builder/cmdline.ml Normal file
View File

@@ -0,0 +1,348 @@
(* virt-builder
* Copyright (C) 2013 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.
*)
(* Command line argument parsing. *)
open Common_gettext.Gettext
open Common_utils
open Customize_cmdline
module G = Guestfs
open Unix
open Printf
let prog = Filename.basename Sys.executable_name
let parse_cmdline () =
let display_version () =
printf "virt-builder %s\n" Config.package_version;
exit 0
in
let mode = ref `Install in
let list_mode () = mode := `List in
let notes_mode () = mode := `Notes in
let get_kernel_mode () = mode := `Get_kernel in
let cache_all_mode () = mode := `Cache_all in
let print_cache_mode () = mode := `Print_cache in
let delete_cache_mode () = mode := `Delete_cache in
let arch = ref "" in
let attach = ref [] in
let attach_format = ref None in
let set_attach_format = function
| "auto" -> attach_format := None
| s -> attach_format := Some s
in
let attach_disk s = attach := (!attach_format, s) :: !attach in
let cache = ref Paths.xdg_cache_home in
let set_cache arg = cache := Some arg in
let no_cache () = cache := None in
let check_signature = ref true in
let curl = ref "curl" in
let delete_on_failure = ref true in
let fingerprints = ref [] in
let add_fingerprint arg = fingerprints := arg :: !fingerprints in
let format = ref "" in
let gpg = ref "gpg" in
let list_format = ref `Short in
let list_set_long () = list_format := `Long in
let list_set_format arg =
list_format := match arg with
| "short" -> `Short
| "long" -> `Long
| "json" -> `Json
| fmt ->
eprintf (f_"%s: invalid --list-format type '%s', see the man page.\n") prog fmt;
exit 1 in
let machine_readable = ref false in
let memsize = ref None in
let set_memsize arg = memsize := Some arg in
let network = ref true in
let output = ref "" in
let quiet = ref false in
let size = ref None in
let set_size arg = size := Some (parse_size ~prog arg) in
let smp = ref None in
let set_smp arg = smp := Some arg in
let sources = ref [] in
let add_source arg = sources := arg :: !sources in
let sync = ref true in
let trace = ref false in
let verbose = ref false in
let argspec = [
"--arch", Arg.Set_string arch, "arch" ^ " " ^ s_"Set the output architecture";
"--attach", Arg.String attach_disk, "iso" ^ " " ^ s_"Attach data disk/ISO during install";
"--attach-format", Arg.String set_attach_format,
"format" ^ " " ^ s_"Set attach disk format";
"--cache", Arg.String set_cache, "dir" ^ " " ^ s_"Set template cache dir";
"--no-cache", Arg.Unit no_cache, " " ^ s_"Disable template cache";
"--cache-all-templates", Arg.Unit cache_all_mode,
" " ^ s_"Download all templates to the cache";
"--check-signature", Arg.Set check_signature,
" " ^ s_"Check digital signatures";
"--check-signatures", Arg.Set check_signature,
" " ^ s_"Check digital signatures";
"--no-check-signature", Arg.Clear check_signature,
" " ^ s_"Disable digital signatures";
"--no-check-signatures", Arg.Clear check_signature,
" " ^ s_"Disable digital signatures";
"--curl", Arg.Set_string curl, "curl" ^ " " ^ s_"Set curl binary/command";
"--delete-cache", Arg.Unit delete_cache_mode,
" " ^ s_"Delete the template cache";
"--no-delete-on-failure", Arg.Clear delete_on_failure,
" " ^ s_"Don't delete output file on failure";
"--fingerprint", Arg.String add_fingerprint,
"AAAA.." ^ " " ^ s_"Fingerprint of valid signing key";
"--format", Arg.Set_string format, "raw|qcow2" ^ " " ^ s_"Output format (default: raw)";
"--get-kernel", Arg.Unit get_kernel_mode,
"image" ^ " " ^ s_"Get kernel from image";
"--gpg", Arg.Set_string gpg, "gpg" ^ " " ^ s_"Set GPG binary/command";
"-l", Arg.Unit list_mode, " " ^ s_"List available templates";
"--list", Arg.Unit list_mode, " " ^ s_"List available templates";
"--long", Arg.Unit list_set_long, " " ^ s_"Shortcut for --list-format short";
"--list-format", Arg.String list_set_format,
"short|long|json" ^ " " ^ s_"Set the format for --list (default: short)";
"--long-options", Arg.Unit display_long_options, " " ^ s_"List long options";
"--machine-readable", Arg.Set machine_readable, " " ^ s_"Make output machine readable";
"-m", Arg.Int set_memsize, "mb" ^ " " ^ s_"Set memory size";
"--memsize", Arg.Int set_memsize, "mb" ^ " " ^ s_"Set memory size";
"--network", Arg.Set network, " " ^ s_"Enable appliance network (default)";
"--no-network", Arg.Clear network, " " ^ s_"Disable appliance network";
"--notes", Arg.Unit notes_mode, " " ^ s_"Display installation notes";
"-o", Arg.Set_string output, "file" ^ " " ^ s_"Set output filename";
"--output", Arg.Set_string output, "file" ^ " " ^ s_"Set output filename";
"--print-cache", Arg.Unit print_cache_mode,
" " ^ s_"Print info about template cache";
"--quiet", Arg.Set quiet, " " ^ s_"No progress messages";
"--size", Arg.String set_size, "size" ^ " " ^ s_"Set output disk size";
"--smp", Arg.Int set_smp, "vcpus" ^ " " ^ s_"Set number of vCPUs";
"--source", Arg.String add_source, "URL" ^ " " ^ s_"Set source URL";
"--no-sync", Arg.Clear sync, " " ^ s_"Do not fsync output file on exit";
"-v", Arg.Set verbose, " " ^ s_"Enable debugging messages";
"--verbose", Arg.Set verbose, " " ^ s_"Enable debugging messages";
"-V", Arg.Unit display_version, " " ^ s_"Display version and exit";
"--version", Arg.Unit display_version, " " ^ s_"Display version and exit";
"-x", Arg.Set trace, " " ^ s_"Enable tracing of libguestfs calls";
] in
let customize_argspec, get_customize_ops =
Customize_cmdline.argspec ~prog () in
let customize_argspec =
List.map (fun (spec, _, _) -> spec) customize_argspec in
let argspec = argspec @ customize_argspec in
let argspec =
let cmp (arg1, _, _) (arg2, _, _) =
let arg1 = skip_dashes arg1 and arg2 = skip_dashes arg2 in
compare (String.lowercase arg1) (String.lowercase arg2)
in
List.sort cmp argspec in
let argspec = Arg.align argspec in
long_options := argspec;
let args = ref [] in
let anon_fun s = args := s :: !args in
let usage_msg =
sprintf (f_"\
%s: build virtual machine images quickly
virt-builder OS-VERSION
virt-builder -l
virt-builder --notes OS-VERSION
virt-builder --print-cache
virt-builder --cache-all-templates
virt-builder --delete-cache
virt-builder --get-kernel IMAGE
A short summary of the options is given below. For detailed help please
read the man page virt-builder(1).
")
prog in
Arg.parse argspec anon_fun usage_msg;
(* Dereference options. *)
let args = List.rev !args in
let mode = !mode in
let arch = !arch in
let attach = List.rev !attach in
let cache = !cache in
let check_signature = !check_signature in
let curl = !curl in
let delete_on_failure = !delete_on_failure in
let fingerprints = List.rev !fingerprints in
let format = match !format with "" -> None | s -> Some s in
let gpg = !gpg in
let list_format = !list_format in
let machine_readable = !machine_readable in
let memsize = !memsize in
let network = !network in
let ops = get_customize_ops () in
let output = match !output with "" -> None | s -> Some s in
let quiet = !quiet in
let size = !size in
let smp = !smp in
let sources = List.rev !sources in
let sync = !sync in
let trace = !trace in
let verbose = !verbose in
(* No arguments and machine-readable mode? Print some facts. *)
if args = [] && machine_readable then (
printf "virt-builder\n";
printf "arch\n";
printf "config-file\n";
printf "customize\n";
printf "json-list\n";
if Pxzcat.using_parallel_xzcat () then printf "pxzcat\n";
exit 0
);
(* Check options. *)
let arg =
match mode with
| `Install ->
(match args with
| [arg] -> arg
| [] ->
eprintf (f_"%s: virt-builder os-version\nMissing 'os-version'. Use '--list' to list available template names.\n") prog;
exit 1
| _ ->
eprintf (f_"%s: virt-builder: too many parameters, expecting 'os-version'\n") prog;
exit 1
)
| `List ->
(match args with
| [] -> ""
| _ ->
eprintf (f_"%s: virt-builder --list does not need any extra arguments.\n") prog;
exit 1
)
| `Notes ->
(match args with
| [arg] -> arg
| [] ->
eprintf (f_"%s: virt-builder --notes os-version\nMissing 'os-version'. Use '--list' to list available template names.\n") prog;
exit 1
| _ ->
eprintf (f_"%s: virt-builder: too many parameters, expecting 'os-version'\n") prog;
exit 1
)
| `Cache_all
| `Print_cache
| `Delete_cache ->
(match args with
| [] -> ""
| _ ->
eprintf (f_"%s: virt-builder --cache-all-templates/--print-cache/--delete-cache does not need any extra arguments.\n") prog;
exit 1
)
| `Get_kernel ->
(match args with
| [arg] -> arg
| [] ->
eprintf (f_"%s: virt-builder --get-kernel image\nMissing 'image' (disk image file) argument.\n") prog;
exit 1
| _ ->
eprintf (f_"%s: virt-builder --get-kernel: too many parameters\n") prog;
exit 1
) in
(* Check source(s) and fingerprint(s). *)
let sources =
let rec repeat x = function
| 0 -> [] | 1 -> [x]
| n -> x :: repeat x (n-1)
in
let nr_sources = List.length sources in
let fingerprints =
match fingerprints with
| [fingerprint] ->
(* You're allowed to have multiple sources and one fingerprint: it
* means that the same fingerprint is used for all sources.
*)
repeat fingerprint nr_sources
| xs -> xs in
if List.length fingerprints <> nr_sources then (
eprintf (f_"%s: source and fingerprint lists are not the same length\n")
prog;
exit 1
);
(* Combine the sources and fingerprints into a single list of pairs. *)
List.combine sources fingerprints in
(* Check the architecture. *)
let arch =
match arch with
| "" -> Architecture.current_arch
| arch ->
let target_arch = Architecture.filter_arch arch in
if Architecture.arch_is_compatible Architecture.current_arch target_arch <> true then (
let requires_execute_on_guest = List.exists (
function
| `Command _ | `InstallPackages _ | `Script _ | `Update -> true
| `Delete _ | `Edit _ | `FirstbootCommand _ | `FirstbootPackages _
| `FirstbootScript _ | `Hostname _ | `Link _ | `Mkdir _
| `Password _ | `RootPassword _ | `Scrub _ | `Timezone _ | `Upload _
| `Write _ | `Chmod _ -> false
) ops.ops in
if requires_execute_on_guest then (
eprintf (f_"%s: sorry, cannot run commands on a guest with a different architecture\n")
prog;
exit 1
);
);
target_arch in
(* If user didn't elect any root password, that means we set a random
* root password.
*)
let ops =
let has_set_root_password = List.exists (
function `RootPassword _ -> true | _ -> false
) ops.ops in
if has_set_root_password then ops
else (
let pw = Password.parse_selector ~prog "random" in
{ ops with ops = ops.ops @ [ `RootPassword pw ] }
) in
mode, arg,
arch, attach, cache, check_signature, curl,
delete_on_failure, format, gpg, list_format, memsize,
network, ops, output, quiet, size, smp, sources, sync,
trace, verbose

View File

@@ -23,105 +23,141 @@ open Unix
open Printf
let quote = Filename.quote
let (//) = Filename.concat
let cache_of_name cachedir name revision =
cachedir // sprintf "%s.%d" name revision
type uri = string
type filename = string
type t = {
debug : bool;
verbose : bool;
curl : string;
cache : string option; (* cache directory for templates *)
cache : Cache.t option; (* cache for templates *)
}
let create ~debug ~curl ~cache = {
debug = debug;
type proxy_mode =
| UnsetProxy
| SystemProxy
| ForcedProxy of string
let create ~verbose ~curl ~cache = {
verbose = verbose;
curl = curl;
cache = cache;
}
let rec download t ?template ?progress_bar uri =
let rec download ~prog t ?template ?progress_bar ?(proxy = SystemProxy) uri =
match template with
| None -> (* no cache, simple download *)
(* Create a temporary name. *)
let tmpfile = Filename.temp_file "vbcache" ".txt" in
download_to t ?progress_bar uri tmpfile;
download_to ~prog t ?progress_bar ~proxy uri tmpfile;
(tmpfile, true)
| Some (name, revision) ->
| Some (name, arch, revision) ->
match t.cache with
| None ->
(* Not using the cache at all? *)
download t ?progress_bar uri
download t ~prog ?progress_bar ~proxy uri
| Some cachedir ->
let filename = cache_of_name cachedir name revision in
| Some cache ->
let filename = Cache.cache_of_name cache name arch revision in
(* Is the requested template name + revision in the cache already?
* If not, download it.
*)
if not (Sys.file_exists filename) then
download_to t ?progress_bar uri filename;
download_to ~prog t ?progress_bar ~proxy uri filename;
(filename, false)
and download_to t ?(progress_bar = false) uri filename =
(* Get the status code first to ensure the file exists. *)
let cmd = sprintf "%s%s -g -o /dev/null -I -w '%%{http_code}' %s"
t.curl
(if t.debug then "" else " -s -S")
(quote uri) in
let chan = open_process_in cmd in
let status_code = input_line chan in
let stat = close_process_in chan in
(match stat with
| WEXITED 0 -> ()
| WEXITED i ->
eprintf (f_"virt-builder: curl (download) command failed downloading '%s'\n") uri;
exit 1
| WSIGNALED i ->
eprintf (f_"virt-builder: external command '%s' killed by signal %d\n")
cmd i;
exit 1
| WSTOPPED i ->
eprintf (f_"virt-builder: external command '%s' stopped by signal %d\n")
cmd i;
exit 1
);
let bad_status_code = function
| "" -> true
| s when s.[0] = '4' -> true (* 4xx *)
| s when s.[0] = '5' -> true (* 5xx *)
| _ -> false
in
if bad_status_code status_code then (
eprintf (f_"virt-builder: failed to download %s: HTTP status code %s\n")
uri status_code;
exit 1
);
and download_to ~prog t ?(progress_bar = false) ~proxy uri filename =
let parseduri =
try URI.parse_uri uri
with Invalid_argument "URI.parse_uri" ->
eprintf (f_"Error parsing URI '%s'. Look for error messages printed above.\n") uri;
exit 1 in
(* Now download the file.
*
* Note because there may be parallel virt-builder instances running
* and also to avoid partial downloads in the cachedir if the network
(* Note because there may be parallel virt-builder instances running
* and also to avoid partial downloads in the cache if the network
* fails, we download to a random name in the cache and then
* atomically rename it to the final filename.
*)
let filename_new = filename ^ "." ^ string_random8 () in
unlink_on_exit filename_new;
let cmd = sprintf "%s%s -g -o %s %s"
t.curl
(if t.debug then "" else if progress_bar then " -#" else " -s -S")
(quote filename_new) (quote uri) in
if t.debug then eprintf "%s\n%!" cmd;
let r = Sys.command cmd in
if r <> 0 then (
eprintf (f_"virt-builder: curl (download) command failed downloading '%s'\n") uri;
exit 1
(match parseduri.URI.protocol with
| "file" ->
let path = parseduri.URI.path in
let cmd = sprintf "cp%s %s %s"
(if t.verbose then " -v" else "")
(quote path) (quote filename_new) in
let r = Sys.command cmd in
if r <> 0 then (
eprintf (f_"%s: cp (download) command failed copying '%s'\n")
prog path;
exit 1
)
| _ as protocol -> (* Any other protocol. *)
let outenv = proxy_envvar protocol proxy in
(* Get the status code first to ensure the file exists. *)
let cmd = sprintf "%s%s%s -g -o /dev/null -I -w '%%{http_code}' %s"
outenv
t.curl
(if t.verbose then "" else " -s -S")
(quote uri) in
if t.verbose then eprintf "%s\n%!" cmd;
let lines = external_command ~prog cmd in
if List.length lines < 1 then (
eprintf (f_"%s: unexpected output from curl command, enable debug and look at previous messages\n")
prog;
exit 1
);
let status_code = List.hd lines in
let bad_status_code = function
| "" -> true
| s when s.[0] = '4' -> true (* 4xx *)
| s when s.[0] = '5' -> true (* 5xx *)
| _ -> false
in
if bad_status_code status_code then (
eprintf (f_"%s: failed to download %s: HTTP status code %s\n")
prog uri status_code;
exit 1
);
(* Now download the file. *)
let cmd = sprintf "%s%s%s -g -o %s %s"
outenv
t.curl
(if t.verbose then "" else if progress_bar then " -#" else " -s -S")
(quote filename_new) (quote uri) in
if t.verbose then eprintf "%s\n%!" cmd;
let r = Sys.command cmd in
if r <> 0 then (
eprintf (f_"%s: curl (download) command failed downloading '%s'\n")
prog uri;
exit 1
)
);
(* Rename the file if curl was successful. *)
(* Rename the file if the download was successful. *)
rename filename_new filename
and proxy_envvar protocol = function
| UnsetProxy ->
(match protocol with
| "http" -> "env http_proxy= no_proxy=* "
| "https" -> "env https_proxy= no_proxy=* "
| "ftp" -> "env ftp_proxy= no_proxy=* "
| _ -> "env no_proxy=* "
)
| SystemProxy ->
(* No changes required. *)
""
| ForcedProxy proxy ->
let proxy = Filename.quote proxy in
(match protocol with
| "http" -> sprintf "env http_proxy=%s no_proxy= " proxy
| "https" -> sprintf "env https_proxy=%s no_proxy= " proxy
| "ftp" -> sprintf "env ftp_proxy=%s no_proxy= " proxy
| _ -> ""
)

View File

@@ -18,30 +18,36 @@
(** This module is a wrapper around curl, plus local caching. *)
val cache_of_name : string -> string -> int -> string
(** [cache_of_name cachedir name revision] returns the filename
of the cached file. (Note: It doesn't check if the filename
exists, this is just a simple string transformation). *)
type uri = string
type filename = string
type t
(** The abstract data type. *)
val create : debug:bool -> curl:string -> cache:string option -> t
(** Type of proxy. *)
type proxy_mode =
| UnsetProxy (* The proxy is forced off. *)
| SystemProxy (* The proxy is not changed (follows the
* system configuration).
*)
| ForcedProxy of string (* The proxy is forced to the specified URL. *)
val create : verbose:bool -> curl:string -> cache:Cache.t option -> t
(** Create the abstract type. *)
val download : t -> ?template:(string*int) -> ?progress_bar:bool -> uri -> (filename * bool)
val download : prog:string -> t -> ?template:(string*string*int) -> ?progress_bar:bool -> ?proxy:proxy_mode -> uri -> (filename * bool)
(** Download the URI, returning the downloaded filename and a
temporary file flag. The temporary file flag is [true] iff
the downloaded file is temporary and should be deleted by the
caller (otherwise it's in the cache and you shouldn't delete it).
For templates, you must supply [~template:(name, revision)]. This
causes the cache to be used (if possible). Name and revision are
used for cache control (see the man page for details).
For templates, you must supply [~template:(name, arch, revision)].
This causes the cache to be used (if possible). Name, arch(itecture)
and revision are used for cache control (see the man page for details).
If [~progress_bar:true] then display a progress bar if the file
doesn't come from the cache. In debug mode, progress messages
are always displayed. *)
doesn't come from the cache. In verbose mode, progress messages
are always displayed.
[proxy] specifies the type of proxy to be used in the transfer,
if possible. *)

View File

@@ -23,15 +23,13 @@ module G = Guestfs
open Printf
let rex_numbers = Str.regexp "^\\([0-9]+\\)\\(.*\\)$"
let rex_letters = Str.regexp_case_fold "^\\([a-z]+\\)\\(.*\\)$"
(* Originally:
* http://rwmj.wordpress.com/2013/09/13/get-kernel-and-initramfs-from-a-disk-image/
*)
let rec get_kernel ~debug ?format ?output disk =
let rec get_kernel ~trace ~verbose ?format ?output disk =
let g = new G.guestfs () in
if debug then g#set_trace true;
if trace then g#set_trace true;
if verbose then g#set_verbose true;
g#add_drive_opts ?format ~readonly:true disk;
g#launch ();
@@ -41,7 +39,7 @@ let rec get_kernel ~debug ?format ?output disk =
exit 1
);
if Array.length roots > 1 then (
eprintf (f_"virt-builder: get-kernel: daual/mult-boot images are not supported by this tool\n");
eprintf (f_"virt-builder: get-kernel: dual/multi-boot images are not supported by this tool\n");
exit 1
);
let root = roots.(0) in
@@ -96,26 +94,3 @@ let rec get_kernel ~debug ?format ?output disk =
(* Shutdown. *)
g#shutdown ();
g#close ()
and compare_version v1 v2 =
compare (split_version v1) (split_version v2)
and split_version = function
| "" -> []
| str ->
let first, rest =
if Str.string_match rex_numbers str 0 then (
let n = Str.matched_group 1 str in
let rest = Str.matched_group 2 str in
let n =
try `Number (int_of_string n)
with Failure "int_of_string" -> `String n in
n, rest
)
else if Str.string_match rex_letters str 0 then
`String (Str.matched_group 1 str), Str.matched_group 2 str
else (
let len = String.length str in
`Char str.[0], String.sub str 1 (len-1)
) in
first :: split_version rest

View File

@@ -16,4 +16,4 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*)
val get_kernel : debug:bool -> ?format:string -> ?output:string -> string -> unit
val get_kernel : trace:bool -> verbose:bool -> ?format:string -> ?output:string -> string -> unit

176
builder/index-parse.y Normal file
View File

@@ -0,0 +1,176 @@
/* libguestfs virt-builder tool -*- fundamental -*-
* Copyright (C) 2013 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 "index-struct.h"
#include "index-parse.h"
#define YY_EXTRA_TYPE struct parse_context *
extern void yyerror (YYLTYPE * yylloc, yyscan_t scanner, struct parse_context *context, const char *msg);
extern int yylex (YYSTYPE * yylval, YYLTYPE * yylloc, yyscan_t scanner);
extern void scanner_init (yyscan_t *scanner, struct parse_context *context, FILE *in);
extern void scanner_destroy (yyscan_t scanner);
/* Join two strings with \n */
static char *
concat_newline (const char *str1, const char *str2)
{
size_t len1, len2, len;
char *ret;
if (str2 == NULL)
return strdup (str1);
len1 = strlen (str1);
len2 = strlen (str2);
len = len1 + 1 /* \n */ + len2 + 1 /* \0 */;
ret = malloc (len);
memcpy (ret, str1, len1);
ret[len1] = '\n';
memcpy (ret + len1 + 1, str2, len2);
ret[len-1] = '\0';
return ret;
}
%}
%code requires {
#ifndef YY_TYPEDEF_YY_SCANNER_T
#define YY_TYPEDEF_YY_SCANNER_T
typedef void *yyscan_t;
#endif
}
%locations
%union {
struct section *section;
struct field *field;
char *str;
}
%token <str> SECTION_HEADER
%token <field> FIELD
%token <str> VALUE_CONT
%token EMPTY_LINE
%token PGP_PROLOGUE
%token PGP_EPILOGUE
%token UNKNOWN_LINE
%type <section> sections section
%type <field> fields field
%type <str> continuations
%pure-parser
%lex-param { yyscan_t scanner }
%parse-param { yyscan_t scanner }
%parse-param { struct parse_context *context }
%destructor { section_free ($$); } <sections>
%destructor { section_free ($$); } <section>
%destructor { field_free ($$); } <fields>
%destructor { field_free ($$); } <field>
%%
index:
sections
{ context->parsed_index = $1; }
| PGP_PROLOGUE sections PGP_EPILOGUE
{ context->parsed_index = $2; }
sections:
section emptylines
{ $$ = $1; }
| section EMPTY_LINE emptylines sections
{ $$ = $1; $$->next = $4; }
| emptylines
{ $$ = NULL; }
section:
SECTION_HEADER fields
{ $$ = malloc (sizeof (struct section));
$$->next = NULL;
$$->name = $1;
$$->fields = $2; }
fields:
/* empty */
{ $$ = NULL; }
| field fields
{ $$ = $1; $$->next = $2; }
field: FIELD continuations
{ $$ = $1;
char *old_value = $$->value;
$$->value = concat_newline (old_value, $2);
free (old_value);
free ($2); }
continuations:
/* empty */
{ $$ = NULL; }
| VALUE_CONT continuations
{ $$ = concat_newline ($1, $2);
free ($1);
free ($2); }
emptylines:
/* empty */
{}
| EMPTY_LINE emptylines
{}
%%
void
yyerror (YYLTYPE * yylloc, yyscan_t scanner, struct parse_context *context, const char *msg)
{
int has_suffix = context->error_suffix != NULL && context->error_suffix[0] != 0;
fprintf (stderr, "%s%s%s%ssyntax error at line %d: %s%s%s\n",
context->program_name ? context->program_name : "",
context->program_name ? ": " : "",
context->input_file ? context->input_file : "",
context->input_file ? ": " : "",
yylloc->first_line, msg,
has_suffix ? " " : "",
has_suffix ? context->error_suffix : "");
}
int
do_parse (struct parse_context *context, FILE *in)
{
yyscan_t scanner;
int res;
scanner_init (&scanner, context, in);
res = yyparse (scanner, context);
scanner_destroy (scanner);
return res;
}

119
builder/index-parser-c.c Normal file
View File

@@ -0,0 +1,119 @@
/* virt-builder
* Copyright (C) 2013 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 interface between the C/lex/yacc index file
* parser, and the OCaml world. See index_parser.ml for the OCaml
* type definition.
*/
#include <config.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <unistd.h>
#include <caml/alloc.h>
#include <caml/fail.h>
#include <caml/memory.h>
#include <caml/mlvalues.h>
#ifdef HAVE_CAML_UNIXSUPPORT_H
#include <caml/unixsupport.h>
#else
#define Nothing ((value) 0)
extern void unix_error (int errcode, char * cmdname, value arg) Noreturn;
#endif
#include "index-struct.h"
#include "index-parse.h"
extern int do_parse (struct parse_context *context, FILE *in);
value
virt_builder_parse_index (value progv, value error_suffixv, value filenamev)
{
CAMLparam2 (progv, filenamev);
CAMLlocal5 (rv, v, sv, sv2, fv);
struct section *sections;
size_t i, nr_sections;
struct parse_context context;
FILE *in;
parse_context_init (&context);
context.program_name = String_val (progv);
context.input_file = String_val (filenamev);
context.error_suffix = String_val (error_suffixv);
in = fopen (String_val (filenamev), "r");
if (in == NULL)
unix_error (errno, (char *) "fopen", filenamev);
if (do_parse (&context, in) != 0) {
fclose (in);
caml_invalid_argument ("parse error");
}
if (fclose (in) == EOF)
unix_error (errno, (char *) "fclose", filenamev);
/* Convert the parsed data to OCaml structures. */
nr_sections = 0;
for (sections = context.parsed_index; sections != NULL; sections = sections->next)
nr_sections++;
rv = caml_alloc (nr_sections, 0);
for (i = 0, sections = context.parsed_index; sections != NULL;
i++, sections = sections->next) {
struct field *fields;
size_t j, nr_fields;
nr_fields = 0;
for (fields = sections->fields; fields != NULL; fields = fields->next)
nr_fields++;
fv = caml_alloc (nr_fields, 0);
for (j = 0, fields = sections->fields; fields != NULL;
j++, fields = fields->next) {
v = caml_alloc_tuple (3);
sv = caml_copy_string (fields->key);
Store_field (v, 0, sv); /* (key, Some subkey, value) */
if (fields->subkey) {
sv2 = caml_copy_string (fields->subkey);
sv = caml_alloc (1, 0);
Store_field (sv, 0, sv2);
} else
sv = Val_int (0);
Store_field (v, 1, sv);
sv = caml_copy_string (fields->value);
Store_field (v, 2, sv);
Store_field (fv, j, v); /* assign to return array of fields */
}
v = caml_alloc_tuple (2);
sv = caml_copy_string (sections->name);
Store_field (v, 0, sv); /* (name, fields) */
Store_field (v, 1, fv);
Store_field (rv, i, v); /* assign to return array of sections */
}
/* Free parsed data. */
parse_context_free (&context);
CAMLreturn (rv);
}

128
builder/index-scan.l Normal file
View File

@@ -0,0 +1,128 @@
/* libguestfs virt-builder tool -*- fundamental -*-
* Copyright (C) 2013 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 "index-struct.h"
#include "index-parse.h"
#define YY_EXTRA_TYPE struct parse_context *
#define YY_USER_ACTION yylloc->first_line = yylloc->last_line = yylineno;
%}
%option nounput
%option noyywrap
%option yylineno
%option reentrant
%option bison-bridge
%option bison-locations
%%
/* Apart from the PGP prologue/epilogue which is a hack, the
* scanning strategy is to deal with the file strictly line by
* line, and pass those lines up to the parser which deals with
* whether they appear in the right order to be meaningful.
* Note that flex does longest-match.
*/
/* Ignore comments - '#' MUST appear at the start of a line. */
^"#".*\n { yyextra->seen_comments++; }
/* An empty line is significant. */
^\n { return EMPTY_LINE; }
/* [...] marks beginning of a section. */
^"["[-A-Za-z0-9._]+"]"\n {
yylval->str = strndup (yytext+1, yyleng-3);
return SECTION_HEADER;
}
/* field=value or field[subfield]=value */
^[A-Za-z0-9_.]+("["[A-Za-z0-9_,.]+"]")?"=".*\n {
size_t i = strcspn (yytext, "=[");
yylval->field = malloc (sizeof (struct field));
yylval->field->next = NULL;
yylval->field->key = strndup (yytext, i);
if (yytext[i] == '[') {
size_t j = strcspn (yytext+i+1, "]");
yylval->field->subkey = strndup (yytext+i+1, j);
i += 1+j+1;
} else {
yylval->field->subkey = NULL;
}
/* Note we chop the final \n off here. */
yylval->field->value = strndup (yytext+i+1, yyleng-(i+2));
return FIELD;
}
/* Continuation line for multi-line values. */
^[[:blank:]].*\n {
yylval->str = strndup (yytext+1, yyleng-2);
return VALUE_CONT;
}
/* Hack to eat the PGP prologue. */
^"-----BEGIN PGP SIGNED MESSAGE-----\n" {
int c, prevnl = 0;
/* Eat everything to the first blank line. */
while ((c = input (yyscanner)) != EOF) {
if (c == '\n' && prevnl)
break;
prevnl = c == '\n';
}
return PGP_PROLOGUE;
}
/* Hack to eat the PGP epilogue. */
^"-----BEGIN PGP SIGNATURE-----\n" {
/* Eat everything to the end of the file. */
while (input (yyscanner) != EOF)
;
return PGP_EPILOGUE;
}
/* anything else is an error */
. {
return UNKNOWN_LINE;
}
%%
void
scanner_init (yyscan_t *scanner, struct parse_context *context, FILE *in)
{
yylex_init (scanner);
yyset_extra (context, *scanner);
yyset_in (in, *scanner);
}
void
scanner_destroy (yyscan_t scanner)
{
yylex_destroy (scanner);
}

60
builder/index-struct.c Normal file
View File

@@ -0,0 +1,60 @@
/* libguestfs virt-builder tool
* Copyright (C) 2013 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 "index-struct.h"
void
parse_context_init (struct parse_context *context)
{
memset (context, 0, sizeof *context);
}
void
parse_context_free (struct parse_context *context)
{
section_free (context->parsed_index);
}
void
section_free (struct section *section)
{
if (section) {
section_free (section->next);
free (section->name);
field_free (section->fields);
free (section);
}
}
void
field_free (struct field *field)
{
if (field) {
field_free (field->next);
free (field->key);
free (field->subkey);
free (field->value);
free (field);
}
}

67
builder/index-struct.h Normal file
View File

@@ -0,0 +1,67 @@
/* libguestfs virt-builder tool
* Copyright (C) 2013 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.
*/
/* The data structures produced when parsing the index file. */
#ifndef INDEX_STRUCT_H
#define INDEX_STRUCT_H
/* A section or list of sections. */
struct section {
struct section *next;
char *name;
struct field *fields;
};
/* A field or list of fields. */
struct field {
struct field *next;
char *key;
char *subkey;
char *value;
};
/* A struct holding the data needed during the parsing. */
struct parse_context {
struct section *parsed_index; /* The result of the parsing. */
/* yyparse sets this if any comments were seen. Required for checking
* compatibility with virt-builder 1.24.
*/
int seen_comments;
const char *input_file;
const char *program_name;
const char *error_suffix;
};
/* Initialize the content of a parse_context. */
extern void parse_context_init (struct parse_context *state);
/* Free the content of a parse_context. The actual pointer is not freed. */
extern void parse_context_free (struct parse_context *state);
/* Free the content of a section, recursively freeing also its fields.
* The actual pointer is not freed.
*/
extern void section_free (struct section *section);
/* Free the content of a field, recursively freeing also its next field.
* The actual pointer is not freed.
*/
extern void field_free (struct field *field);
#endif /* INDEX_STRUCT_H */

185
builder/index-validate.c Normal file
View File

@@ -0,0 +1,185 @@
/* libguestfs virt-builder tool
* Copyright (C) 2013 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 <limits.h>
#include <getopt.h>
#include <errno.h>
#include <libintl.h>
#include <guestfs.h>
#include "guestfs-internal-frontend.h"
#include "index-struct.h"
#include "index-parse.h"
extern int do_parse (struct parse_context *context, FILE *in);
static void
usage (int exit_status)
{
printf ("%s index\n", program_name);
exit (exit_status);
}
int
main (int argc, char *argv[])
{
enum { HELP_OPTION = CHAR_MAX + 1 };
static const char *options = "V";
static const struct option long_options[] = {
{ "help", 0, 0, HELP_OPTION },
{ "compat-1.24.0", 0, 0, 0 },
{ "compat-1.24.1", 0, 0, 0 },
{ "version", 0, 0, 'V' },
{ 0, 0, 0, 0 }
};
int c;
int option_index;
int compat_1_24_0 = 0;
int compat_1_24_1 = 0;
const char *input;
struct section *sections;
struct parse_context context;
FILE *in;
int ret;
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEBASEDIR);
textdomain (PACKAGE);
parse_context_init (&context);
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, "compat-1.24.0"))
compat_1_24_0 = compat_1_24_1 = 1;
else if (STREQ (long_options[option_index].name, "compat-1.24.1"))
compat_1_24_1 = 1;
else {
fprintf (stderr, _("%s: unknown long option: %s (%d)\n"),
program_name, long_options[option_index].name, option_index);
exit (EXIT_FAILURE);
}
break;
case 'V':
printf ("%s %s\n", PACKAGE_NAME, PACKAGE_VERSION);
exit (EXIT_SUCCESS);
case HELP_OPTION:
usage (EXIT_SUCCESS);
default:
usage (EXIT_FAILURE);
}
}
if (optind != argc-1)
usage (EXIT_FAILURE);
input = argv[optind++];
in = fopen (input, "r");
if (in == NULL) {
perror (input);
exit (EXIT_FAILURE);
}
ret = do_parse (&context, in);
if (fclose (in) == EOF) {
fprintf (stderr, _("%s: %s: error closing input file: %m (ignored)\n"),
program_name, input);
}
if (ret != 0) {
parse_context_free (&context);
fprintf (stderr, _("%s: '%s' could not be validated, see errors above\n"),
program_name, input);
exit (EXIT_FAILURE);
}
if (compat_1_24_1 && context.seen_comments) {
parse_context_free (&context);
fprintf (stderr, _("%s: %s contains comments which will not work with virt-builder 1.24.1\n"),
program_name, input);
exit (EXIT_FAILURE);
}
/* Iterate over the parsed sections, semantically validating it. */
for (sections = context.parsed_index; sections != NULL; sections = sections->next) {
int seen_sig = 0;
struct field *fields;
if (compat_1_24_0) {
if (strchr (sections->name, '_')) {
parse_context_free (&context);
fprintf (stderr, _("%s: %s: section [%s] has invalid characters which will not work with virt-builder 1.24.0\n"),
program_name, input, sections->name);
exit (EXIT_FAILURE);
}
}
for (fields = sections->fields; fields != NULL; fields = fields->next) {
if (compat_1_24_0) {
if (strchr (fields->key, '[') ||
strchr (fields->key, ']')) {
parse_context_free (&context);
fprintf (stderr, _("%s: %s: section [%s], field '%s' has invalid characters which will not work with virt-builder 1.24.0\n"),
program_name, input, sections->name, fields->key);
exit (EXIT_FAILURE);
}
}
if (compat_1_24_1) {
if (strchr (fields->key, '.') ||
strchr (fields->key, ',')) {
parse_context_free (&context);
fprintf (stderr, _("%s: %s: section [%s], field '%s' has invalid characters which will not work with virt-builder 1.24.1\n"),
program_name, input, sections->name, fields->key);
exit (EXIT_FAILURE);
}
}
if (STREQ (fields->key, "sig"))
seen_sig = 1;
}
if (compat_1_24_0 && !seen_sig) {
parse_context_free (&context);
fprintf (stderr, _("%s: %s: section [%s] is missing a 'sig' field which will not work with virt-builder 1.24.0\n"),
program_name, input, sections->name);
exit (EXIT_FAILURE);
}
}
/* Free the parsed data. */
parse_context_free (&context);
printf ("%s validated OK\n", input);
exit (EXIT_SUCCESS);
}

View File

@@ -27,21 +27,29 @@ and entry = {
printable_name : string option; (* the name= field *)
osinfo : string option;
file_uri : string;
signature_uri : string option;
arch : string;
signature_uri : string option; (* deprecated, will be removed in 1.26 *)
checksum_sha512 : string option;
revision : int;
format : string option;
size : int64;
compressed_size : int64 option;
expand : string option;
lvexpand : string option;
notes : string option;
notes : (string * string) list;
hidden : bool;
aliases : string list option;
sigchecker : Sigchecker.t;
proxy : Downloader.proxy_mode;
}
let print_entry chan (name, { printable_name = printable_name;
file_uri = file_uri;
arch = arch;
osinfo = osinfo;
signature_uri = signature_uri;
checksum_sha512 = checksum_sha512;
revision = revision;
format = format;
size = size;
@@ -49,6 +57,7 @@ let print_entry chan (name, { printable_name = printable_name;
expand = expand;
lvexpand = lvexpand;
notes = notes;
aliases = aliases;
hidden = hidden }) =
let fp fs = fprintf chan fs in
fp "[%s]\n" name;
@@ -61,10 +70,15 @@ let print_entry chan (name, { printable_name = printable_name;
| Some id -> fp "osinfo=%s\n" id
);
fp "file=%s\n" file_uri;
fp "arch=%s\n" arch;
(match signature_uri with
| None -> ()
| Some uri -> fp "sig=%s\n" uri
);
(match checksum_sha512 with
| None -> ()
| Some uri -> fp "checksum[sha512]=%s\n" uri
);
fp "revision=%d\n" revision;
(match format with
| None -> ()
@@ -83,20 +97,20 @@ let print_entry chan (name, { printable_name = printable_name;
| None -> ()
| Some lvexpand -> fp "lvexpand=%s\n" lvexpand
);
(match notes with
List.iter (
fun (lang, notes) ->
match lang with
| "" -> fp "notes=%s\n" notes
| lang -> fp "notes[%s]=%s\n" lang notes
) notes;
(match aliases with
| None -> ()
| Some notes -> fp "notes=%s\n" notes
| Some l -> fp "aliases=%s\n" (String.concat " " l)
);
if hidden then fp "hidden=true\n"
let fieldname_rex = Str.regexp "^\\([a-z_]+\\)=\\(.*\\)$"
let get_index ~debug ~downloader ~sigchecker source =
let rec corrupt_line line =
eprintf (f_"virt-builder: error parsing index near this line:\n\n%s\n")
line;
corrupt_file ()
and corrupt_file () =
let get_index ~prog ~verbose ~downloader ~sigchecker ~proxy source =
let corrupt_file () =
eprintf (f_"\nThe index file downloaded from '%s' is corrupt.\nYou need to ask the supplier of this file to fix it and upload a fixed version.\n")
source;
exit 1
@@ -104,162 +118,55 @@ let get_index ~debug ~downloader ~sigchecker source =
let rec get_index () =
(* Get the index page. *)
let tmpfile, delete_tmpfile = Downloader.download downloader source in
let tmpfile, delete_tmpfile = Downloader.download ~prog downloader ~proxy source in
(* Check index file signature (also verifies it was fully
* downloaded and not corrupted in transit).
*)
Sigchecker.verify sigchecker tmpfile;
(* Check the index page is not too huge. *)
let st = stat tmpfile in
if st.st_size > 1_000_000 then (
eprintf (f_"virt-builder: index page '%s' is too large (size %d bytes)\n")
source st.st_size;
exit 1
);
(* Load the file into memory. *)
let index = read_whole_file tmpfile in
(* Try parsing the file. *)
let sections = Ini_reader.read_ini ~prog tmpfile in
if delete_tmpfile then
(try Unix.unlink tmpfile with _ -> ());
(* Split file into lines. *)
let index = string_nsplit "\n" index in
(* If there is a signature (checked above) then remove it. *)
let index =
match index with
| "-----BEGIN PGP SIGNED MESSAGE-----" :: lines ->
(* Ignore all lines until we get to first blank. *)
let lines = dropwhile ((<>) "") lines in
(* Ignore the blank line too. *)
let lines = List.tl lines in
(* Take lines until we get to the end signature. *)
let lines = takewhile ((<>) "-----BEGIN PGP SIGNATURE-----") lines in
lines
| _ -> index in
(* Split into sections around each /^[/ *)
let rec loop = function
| [] -> []
| x :: xs when String.length x >= 1 && x.[0] = '[' ->
let lines = takewhile ((<>) "") xs in
let rest = dropwhile ((<>) "") xs in
if rest = [] then
[x, lines]
else (
let rest = List.tl rest in
let rest = loop rest in
(x, lines) :: rest
)
| x :: _ -> corrupt_line x
in
let sections = loop index in
(* Parse the fields in each section. *)
let isspace = function ' ' | '\t' -> true | _ -> false in
let starts_space str = String.length str >= 1 && isspace str.[0] in
let rec loop = function
| [] -> []
| x :: xs when not (starts_space x) && String.contains x '=' ->
let xs' = takewhile starts_space xs in
let ys = dropwhile starts_space xs in
(x :: xs') :: loop ys
| x :: _ -> corrupt_line x
in
let sections = List.map (fun (n, lines) -> n, loop lines) sections in
if debug then (
eprintf "index file (%s) after splitting:\n" source;
List.iter (
fun (n, fields) ->
eprintf " os-version: %s\n" n;
let i = ref 0 in
List.iter (
fun field ->
eprintf " %d: " !i;
List.iter prerr_endline field;
incr i
) fields
) sections
);
(* Now we've parsed the file into the correct sections, we
* interpret the meaning of the fields.
*)
let sections = List.map (
(* Check for repeated os-version+arch combination. *)
let name_arch_map = List.map (
fun (n, fields) ->
let len = String.length n in
if len < 3 || n.[0] <> '[' || n.[len-1] <> ']' then
corrupt_line n;
let n = String.sub n 1 (len-2) in
let fields = List.map (
function
| [] -> assert false (* can never happen, I think? *)
| x :: xs when Str.string_match fieldname_rex x 0 ->
let field = Str.matched_group 1 x in
let rest_of_line = Str.matched_group 2 x in
let allow_multiline =
match field with
| "name" -> false
| "osinfo" -> false
| "file" -> false
| "sig" -> false
| "revision" -> false
| "format" -> false
| "size" -> false
| "compressed_size" -> false
| "expand" -> false
| "lvexpand" -> false
| "notes" -> true
| "hidden" -> false
| _ ->
eprintf "warning: unknown field '%s' in index (ignored)\n%!"
field;
true in
let value =
if not allow_multiline then (
if xs <> [] then (
eprintf (f_"virt-builder: field '%s' cannot span multiple lines\n")
field;
corrupt_line (List.hd xs)
);
rest_of_line
) else (
String.concat "\n" (rest_of_line :: xs)
) in
field, value
| x :: _ ->
corrupt_line x
) fields in
(n, fields)
let rec find_arch = function
| ("arch", None, value) :: y -> value
| _ :: y -> find_arch y
| [] -> ""
in
n, (find_arch fields)
) sections in
(* Check for repeated os-version names. *)
let nseen = Hashtbl.create 13 in
List.iter (
fun (n, _) ->
if Hashtbl.mem nseen n then (
eprintf (f_"virt-builder: index is corrupt: os-version '%s' appears two or more times\n") n;
fun (n, arch) ->
let id = n, arch in
if Hashtbl.mem nseen id then (
eprintf (f_"virt-builder: index is corrupt: os-version '%s' with architecture '%s' appears two or more times\n") n arch;
corrupt_file ()
);
Hashtbl.add nseen n true
) sections;
Hashtbl.add nseen id true
) name_arch_map;
(* Check for repeated fields. *)
List.iter (
fun (n, fields) ->
let fseen = Hashtbl.create 13 in
List.iter (
fun (field, _) ->
if Hashtbl.mem fseen field then (
eprintf (f_"virt-builder: index is corrupt: %s: field '%s' appears two or more times\n") n field;
fun (field, subkey, _) ->
let hashkey = (field, subkey) in
if Hashtbl.mem fseen hashkey then (
(match subkey with
| Some value ->
eprintf (f_"virt-builder: index is corrupt: %s: field '%s[%s]' appears two or more times\n") n field value
| None ->
eprintf (f_"virt-builder: index is corrupt: %s: field '%s' appears two or more times\n") n field);
corrupt_file ()
);
Hashtbl.add fseen field true
Hashtbl.add fseen hashkey true
) fields
) sections;
@@ -267,20 +174,31 @@ let get_index ~debug ~downloader ~sigchecker source =
let entries =
List.map (
fun (n, fields) ->
let fields = List.map (fun (k, sk, v) -> (k, sk), v) fields in
let printable_name =
try Some (List.assoc "name" fields) with Not_found -> None in
try Some (List.assoc ("name", None) fields) with Not_found -> None in
let osinfo =
try Some (List.assoc "osinfo" fields) with Not_found -> None in
try Some (List.assoc ("osinfo", None) fields) with Not_found -> None in
let file_uri =
try make_absolute_uri (List.assoc "file" fields)
try make_absolute_uri (List.assoc ("file", None) fields)
with Not_found ->
eprintf (f_"virt-builder: no 'file' (URI) entry for '%s'\n") n;
corrupt_file () in
let arch =
try List.assoc ("arch", None) fields
with Not_found ->
eprintf (f_"virt-builder: no 'arch' entry for '%s'\n") n;
corrupt_file () in
let signature_uri =
try Some (make_absolute_uri (List.assoc "sig" fields))
try Some (make_absolute_uri (List.assoc ("sig", None) fields))
with Not_found -> None in
let checksum_sha512 =
try Some (List.assoc ("checksum", Some "sha512") fields)
with Not_found ->
try Some (List.assoc ("checksum", None) fields)
with Not_found -> None in
let revision =
try int_of_string (List.assoc "revision" fields)
try int_of_string (List.assoc ("revision", None) fields)
with
| Not_found -> 1
| Failure "int_of_string" ->
@@ -288,9 +206,9 @@ let get_index ~debug ~downloader ~sigchecker source =
n;
corrupt_file () in
let format =
try Some (List.assoc "format" fields) with Not_found -> None in
try Some (List.assoc ("format", None) fields) with Not_found -> None in
let size =
try Int64.of_string (List.assoc "size" fields)
try Int64.of_string (List.assoc ("size", None) fields)
with
| Not_found ->
eprintf (f_"virt-builder: no 'size' field for '%s'\n") n;
@@ -300,7 +218,7 @@ let get_index ~debug ~downloader ~sigchecker source =
n;
corrupt_file () in
let compressed_size =
try Some (Int64.of_string (List.assoc "compressed_size" fields))
try Some (Int64.of_string (List.assoc ("compressed_size", None) fields))
with
| Not_found ->
None
@@ -309,24 +227,44 @@ let get_index ~debug ~downloader ~sigchecker source =
n;
corrupt_file () in
let expand =
try Some (List.assoc "expand" fields) with Not_found -> None in
try Some (List.assoc ("expand", None) fields) with Not_found -> None in
let lvexpand =
try Some (List.assoc "lvexpand" fields) with Not_found -> None in
try Some (List.assoc ("lvexpand", None) fields) with Not_found -> None in
let notes =
try Some (List.assoc "notes" fields) with Not_found -> None in
let rec loop = function
| [] -> []
| (("notes", subkey), value) :: xs ->
let subkey = match subkey with
| None -> ""
| Some v -> v in
(subkey, value) :: loop xs
| _ :: xs -> loop xs in
List.sort (
fun (k1, _) (k2, _) ->
String.compare k1 k2
) (loop fields) in
let hidden =
try bool_of_string (List.assoc "hidden" fields)
try bool_of_string (List.assoc ("hidden", None) fields)
with
| Not_found -> false
| Failure "bool_of_string" ->
eprintf (f_"virt-builder: cannot parse 'hidden' field for '%s'\n")
n;
corrupt_file () in
let aliases =
let l =
try string_nsplit " " (List.assoc ("aliases", None) fields)
with Not_found -> [] in
match l with
| [] -> None
| l -> Some l in
let entry = { printable_name = printable_name;
osinfo = osinfo;
file_uri = file_uri;
arch = arch;
signature_uri = signature_uri;
checksum_sha512 = checksum_sha512;
revision = revision;
format = format;
size = size;
@@ -334,12 +272,15 @@ let get_index ~debug ~downloader ~sigchecker source =
expand = expand;
lvexpand = lvexpand;
notes = notes;
hidden = hidden } in
hidden = hidden;
aliases = aliases;
proxy = proxy;
sigchecker = sigchecker } in
n, entry
) sections in
if debug then (
eprintf "index file (%s) after parsing:\n" source;
if verbose then (
eprintf "index file (%s) after parsing (C parser):\n" source;
List.iter (print_entry Pervasives.stderr) entries
);

View File

@@ -21,15 +21,21 @@ and entry = {
printable_name : string option; (* the name= field *)
osinfo : string option;
file_uri : string;
signature_uri : string option;
arch : string;
signature_uri : string option; (* deprecated, will be removed in 1.26 *)
checksum_sha512 : string option;
revision : int;
format : string option;
size : int64;
compressed_size : int64 option;
expand : string option;
lvexpand : string option;
notes : string option;
notes : (string * string) list;
hidden : bool;
aliases : string list option;
sigchecker : Sigchecker.t;
proxy : Downloader.proxy_mode;
}
val get_index : debug:bool -> downloader:Downloader.t -> sigchecker:Sigchecker.t -> string -> index
val get_index : prog:string -> verbose:bool -> downloader:Downloader.t -> sigchecker:Sigchecker.t -> proxy:Downloader.proxy_mode -> string -> index

38
builder/ini_reader.ml Normal file
View File

@@ -0,0 +1,38 @@
(* virt-builder
* Copyright (C) 2013-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.
*)
type sections = section list
and section = string * fields (* [name] + fields *)
and fields = field list
and field = string * string option * string (* key + subkey + value *)
(* Types returned by the C index parser. *)
type c_sections = c_section array
and c_section = string * c_fields (* [name] + fields *)
and c_fields = field array
(* Calls yyparse in the C code. *)
external parse_index : prog:string -> error_suffix:string -> string -> c_sections = "virt_builder_parse_index"
let read_ini ~prog ?(error_suffix = "") file =
let sections = parse_index ~prog ~error_suffix file in
let sections = Array.to_list sections in
List.map (
fun (n, fields) ->
n, Array.to_list fields
) sections

24
builder/ini_reader.mli Normal file
View File

@@ -0,0 +1,24 @@
(* virt-builder
* Copyright (C) 2013-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.
*)
type sections = section list
and section = string * fields (* [name] + fields *)
and fields = field list
and field = string * string option * string (* key + subkey + value *)
val read_ini : prog:string -> ?error_suffix:string -> string -> sections

57
builder/languages.ml Normal file
View File

@@ -0,0 +1,57 @@
(* virt-builder
* Copyright (C) 2013-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.
*)
open Common_utils
let split_locale loc =
let regex = Str.regexp "^\\([A-Za-z]+\\)\\(_\\([A-Za-z]+\\)\\)?\\(\\.\\([A-Za-z0-9-]+\\)\\)?\\(@\\([A-Za-z]+\\)\\)?$" in
let l = ref [] in
if Str.string_match regex loc 0 then (
let match_or_empty n =
try Str.matched_group n loc with
| Not_found -> ""
in
let lang = Str.matched_group 1 loc in
let territory = match_or_empty 3 in
(match territory with
| "" -> ()
| territory -> l := (lang ^ "_" ^ territory) :: !l);
l := lang :: !l;
);
l := "" :: !l;
List.rev !l
let languages () =
match Setlocale.setlocale Setlocale.LC_MESSAGES None with
| None -> [""]
| Some locale -> split_locale locale
let find_notes languages notes =
let notes = List.fold_left (
fun acc lang ->
let res = List.filter (
fun (langkey, _) ->
match langkey with
| "C" -> lang = ""
| langkey -> langkey = lang
) notes in
match res with
| (_, noteskey) :: _ -> noteskey :: acc
| [] -> acc
) [] languages in
List.rev notes

21
builder/languages.mli Normal file
View File

@@ -0,0 +1,21 @@
(* virt-builder
* 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.
*)
val languages : unit -> string list
val find_notes : string list -> (string * string) list -> string list

View File

@@ -0,0 +1,3 @@
[libguestfs.org]
uri=http://libguestfs.org/download/builder/index.asc
gpgkey=file://@SYSCONFDIR@/xdg/virt-builder/repos.d/libguestfs.gpg

64
builder/libguestfs.gpg Normal file
View File

@@ -0,0 +1,64 @@
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.14 (GNU/Linux)
mQINBE6UMMEBEADM811hfTulaF4JpkVpAI10FImyb4ArvOiu8NdcUwTFo+cyWno3
U85B86H1Bsk/LgLTYtthSrTgsCtdxy+i5OaMjxZDIwKQ2+IYI3FCn9T3Mn28Idyh
kLHzrO9ph0Dv0BNfrlDZhQEC53aAFe/QxN7+A49BNBV7D1VAOOCsHjxMEDzcZkCa
oCrtXw1aNm2vkkj5ukbfukHAyLcQL7kow0qKPSVa1G4lfQP0WiG259Ydy+sUmbVb
TGdb6MEC84PQRDuw6/ZeoV04tn7ZNtQEMOS0uiciHOGfr2hBxQf9VIPNrHg42yaL
dOv51D99GuaxZ9E0HSoH/RwB1oXgd6rFdqVNYaBIQnnkwJANUEeGBArtIOZNCADT
Bt8vkSDm+lLEAFS+V8CACyW/LMIrGCvLdHeqtoAv0GDVyR2GPxldYfdtEmCUMWcb
Jlf71V9iAse2gUdoiHp5FfpGMkA5j7idKuxIws11XxRZJXXbBqiBqmVEAQ/v0m6p
kdo0MYTHydmecLuUK2bAGhpysfX97EfTSrxfrYphYWjTfKRD9GrADeZNfuz1DbKs
7LSqVaQJSjQrfgAwcnZLRaU0V4P5zxiz50gz1Aj3AZRL+Y3meZenzZTXcLFdnusg
wUfhhCuL3tluMtEh6tznumyxb43WO1yLwj6J6LtveiuJN1Z+KSQ6OieZcwARAQAB
tCVSaWNoYXJkIFcuTS4gSm9uZXMgPHJpY2hAYW5uZXhpYS5vcmc+iQI4BBMBAgAi
BQJOlDDBAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCRc49z4bdooHQY
D/wJLklSZNyXIW+rG5sUbg7j9cTIF5p/lB9kI2yx6KodJp/2knKyvnmzz0gBw/OE
HL4E4UW26oWKo+36I8wkBnuGa6UtANeITcJqFE19VpHEXHsxre64jNQnO8/w748W
1ROW+Ry43xmrlRWKuCm4oPYUzlp0fq9ATAne8eblfG+NOs8DYuA8xZNQzFaI2kDC
QLD4YoXLoNsP27Koga36b0KwxPFD9tyVZiu9XDH/3hMN7Nb15B66PFr+HcMmQ67G
nUIN5ulcIwj38i40cyaTs1VRheOzTHXE/a6Q2AhMKiKqOoEjQ73/mV7cAVoPtM3o
83Q/8aVKBH0bVRwAeV1tju6b14fqKoG0zNBEcXdlSkht6ScxJYIc/LPUxAMDwgSE
OWshjmeRzKXypBbHn/DP8QVyM2gk5wY+mMSH7MpR0p/hgj+rFO8H9L7pC4dCog3E
qzrYhRN+TaP6MPH3WkOwPH4d4IfQRFnHp+VPYPijKEiLrUl/o8k3DyAanAPBpJ/x
na4wXAjlFBctOq6g+SrCUiHpwk7b2YNwGgr5Vl3GmZELzK/G8gg3uJYKQ9Bpv16t
WWOz+IFiOFa0UULeo0QPmFAIMZiDojNsY1SwBKB3ZL1YWZezgMdQAbpze/IXoSt7
zxWJoKH2jK7q9mvFiaY12l2YnKuCcegWVAViLxRpBnrbz7QmUmljaGFyZCBXLk0u
IEpvbmVzIDxyam9uZXNAcmVkaGF0LmNvbT6JAjgEEwECACIFAk6UOQsCGwMGCwkI
BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEJFzj3Pht2igIUYQAKomI0edLakahsUQ
MxOZuhBbXJ4/VWF8bXYChDNPKvJp5nB7fBXujJ+39cIUM5fe2ViO6qSDpFC29imx
F5pPbAqspZBPBkLLiZLji8R42hGarntdtTW0UWSBpq+nC5+G1psrnATI3uXGNxKQ
R99c5HoMY7dBC2Y8TCGE64NINZ/XVh472s6IGLPn8MTn26YdRKC9BrVkCFMP2OBr
6D4IprnyTAWAzb68ew20QmyWO+NBi9MplaDNQVl8PIOgfpyWlkgX1z9m67pcSDkw
46hksp0yuOD1VwR4iVZ2/CmIsGRUlx41vWD6BIp9KxKyDIU1CYTRhq72dahHsl/8
BjCndV5PO0GphqfCzmCv4DXjUwmrMTbH/GFnt5rfwcMcXUgcK0vV9vQ2SOU56Zd1
fb27ZCFJKZc0Fu8krwFldCp/NYILf6ogUL/C1hfuCGSSuyDVY16Gg3dla1x+6zpF
asnWQlaw8xT5LlMWvTZs5WsoSVHu7dVZWlgxINP++hlZrTz/S8l38yyQ15YFFl3W
9M7dzkegOeDTPfx6B89WgfvfJjA/D0/FYxxWPXEtrn9DlJ4daEJqNsrvfLErz9R8
4IQmfmhR93j+rdotner+6keC/wVByEfbW1wmXtmFKXQ6srdpj8VKRFrvkyXVgepM
DypLgRH2v7lL2kdWhUu2y4EAgrwzuQINBE6UMMEBEADxQxMgUuDrw5GT4tqARTPI
SSdNcUsRxRhVA8srYOyECliE+B3TwcRDFBs+MyPFJVEuX8fi4eGj/AK5t1GHerfk
orUGlz72q4c7LLhkfZrsuJbk2dgkjvldKJnIazQJa6epGLqdsE5RlmSgwedIbtMd
naGJBQH8aKP/Wi1+wUxsm5N3p7+R2WRx48VfpEhYB+Zf/FkFm1Ycjwh57KQ0+OHw
ykf8VfMisxuH30tDxOCV+VptWKfOF2rDNdaNPWhij2YIjhJXRpkuRR+1PpI4jLaD
JxcVZmG/0zucacupUN2g5OUH59ySU/totD6YMnmp3FONoyF1uIEJo6Vs30npHGkO
XgBo3Pxt7oLJeykLPtdSLgm3cwXIYMWarVsAkKNXitQIVGpVRLeaK373VwmXFqoi
M2SMHeawTUdOORFjpQzkknlJWM1TmUVtHHKt8Pl9+/5+wXKyt2IDdcUkMrB6K5qF
fb7EwVhoI8ehJQK+eeDCjFwCAiwB3iV8JlyW+tEU7JuyXOQlwY1VWm/WqMD8gaRi
rT+RFDFliZ3tQbW2pqUoZBROV5HN4tieDfwxGKCvk6Tsdb30zA9DPQp93+238bYf
312sg9R+CD0AqxoxFG5FJu4HShcPRrPnYtRZqKRe40GDWvBEArXZprwL1qrP+Kl/
mRrEQpxAGIoFG8HbVvD3EQARAQABiQIfBBgBAgAJBQJOlDDBAhsMAAoJEJFzj3Ph
t2igSLQP/2uIrAY2CDr0kWBJiD3TztiHy8IdxwUpyTBTebwmAbi44/EvtJfIisrG
YjKIEv/w0E61gO7O1JBG4+IG93W+v9fTT/e39JMyxsYqoZZHUhP11Okx5grDS5b0
O8VXOmXVRMdVNfstRBr10HD9uNDq7ruKD18TxYTwN0GPD4gj1dbHQDR77Tr5cyBs
6Ou5PBOH4r3qcqf/cJUSMeUUu75xLwixux6E7tD2S+t6F07wlWxntUcPtzyAHj20
J89orUC+dT6r6MypBoI0jdJCp9JPGtR7i+fE5Gm4E5+AUSubLPtZGRY9Um2eMoS2
DnQpGOKx1VvsixR/Kw44j2tRAvmYMS4iDKcuZU+nZ+xokAgObILj/b9n/Qe2/fXy
CFdcgSvbm+dV1fZxsdMF/P9OU8aqdT9A9Fv5y+cDMEg4DVnhwMJTxGh/TCkw/H+A
frHEtRc98lSQN5odpITNG17mG6JOdHM+wA57qHH0uy4+5RsbyAJahcdBcmObK/RF
i4WZlThpbHftX5O/LH98aYQ2fJayIxv1EAjzOBOQ0MfBHI0KCJR1pysEisX28sJA
Ic73gnJJ3BLZbqfBRgxjNMNroxC+5Tw6uPGFHa3YnuIAxxw0HcDVZ9vnTWBWFPGw
ZvXkQ3FVJwZoLmHw47vvlVpLD/4gi1SuHWieRvZ+UdDq00E348pm
=neBW
-----END PGP PUBLIC KEY BLOCK-----

View File

@@ -21,46 +21,168 @@ open Common_utils
open Printf
let list_entries ?(list_long = false) ~source index =
if list_long then (
printf (f_"Source URI: %s\n") source;
printf "\n"
);
let rec list_entries ~list_format ~sources index =
match list_format with
| `Short -> list_entries_short index
| `Long -> list_entries_long ~sources index
| `Json -> list_entries_json ~sources index
and list_entries_short index =
List.iter (
fun (name, { Index_parser.printable_name = printable_name;
arch = arch;
hidden = hidden }) ->
if not hidden then (
printf "%-24s" name;
printf " %-10s" arch;
(match printable_name with
| None -> ()
| Some s -> printf " %s" s
);
printf "\n"
)
) index
and list_entries_long ~sources index =
let langs = Languages.languages () in
List.iter (
fun (source, key, proxy) ->
printf (f_"Source URI: %s\n") source;
(match key with
| Sigchecker.No_Key -> ()
| Sigchecker.Fingerprint fp ->
printf (f_"Fingerprint: %s\n") fp;
| Sigchecker.KeyFile kf ->
printf (f_"Key: %s\n") kf;
);
printf "\n"
) sources;
List.iter (
fun (name, { Index_parser.printable_name = printable_name;
arch = arch;
size = size;
compressed_size = compressed_size;
notes = notes;
aliases = aliases;
hidden = hidden }) ->
if not hidden then (
if not list_long then ( (* Short *)
printf "%-24s" name;
(match printable_name with
| None -> ()
| Some s -> printf " %s" s
);
printf "\n"
)
else ( (* Long *)
printf "%-24s %s\n" "os-version:" name;
(match printable_name with
| None -> ()
| Some name -> printf "%-24s %s\n" (s_"Full name:") name;
);
printf "%-24s %s\n" (s_"Minimum/default size:") (human_size size);
(match compressed_size with
| None -> ()
| Some size ->
printf "%-24s %s\n" (s_"Download size:") (human_size size);
);
(match notes with
| None -> ()
| Some notes ->
printf "\n";
printf "Notes:\n %s\n" notes
);
printf "\n"
)
printf "%-24s %s\n" "os-version:" name;
(match printable_name with
| None -> ()
| Some name -> printf "%-24s %s\n" (s_"Full name:") name;
);
printf "%-24s %s\n" (s_"Architecture:") arch;
printf "%-24s %s\n" (s_"Minimum/default size:") (human_size size);
(match compressed_size with
| None -> ()
| Some size ->
printf "%-24s %s\n" (s_"Download size:") (human_size size);
);
(match aliases with
| None -> ()
| Some l -> printf "%-24s %s\n" (s_"Aliases:")
(String.concat " " l);
);
let notes = Languages.find_notes langs notes in
(match notes with
| notes :: _ ->
printf "\n";
printf (f_"Notes:\n\n%s\n") notes
| [] -> ()
);
printf "\n"
)
) index
and list_entries_json ~sources index =
let trailing_comma index size =
if index = size - 1 then "" else "," in
let json_string_of_bool b =
if b then "true" else "false" in
let json_string_escape str =
let res = ref "" in
for i = 0 to String.length str - 1 do
res := !res ^ (match str.[i] with
| '"' -> "\\\""
| '\\' -> "\\\\"
| '\b' -> "\\b"
| '\n' -> "\\n"
| '\r' -> "\\r"
| '\t' -> "\\t"
| c -> String.make 1 c)
done;
!res in
let json_optional_printf_string key = function
| None -> ()
| Some str ->
printf " \"%s\": \"%s\",\n" key (json_string_escape str) in
let json_optional_printf_int64 key = function
| None -> ()
| Some n ->
printf " \"%s\": \"%Ld\",\n" key n in
let json_optional_printf_stringlist key = function
| None -> ()
| Some l ->
printf " \"%s\": [" key;
iteri (
fun i alias ->
printf " \"%s\"%s" alias (trailing_comma i (List.length l))
) l;
printf " ],\n" in
let print_notes = function
| [] -> ()
| notes ->
printf " \"notes\": {\n";
iteri (
fun i (lang, langnotes) ->
let lang =
match lang with
| "" -> "C"
| x -> x in
printf " \"%s\": \"%s\"%s\n"
(json_string_escape lang) (json_string_escape langnotes)
(trailing_comma i (List.length notes))
) notes;
printf " },\n" in
printf "{\n";
printf " \"version\": %d,\n" 1;
printf " \"sources\": [\n";
iteri (
fun i (source, key, proxy) ->
printf " {\n";
(match key with
| Sigchecker.No_Key -> ()
| Sigchecker.Fingerprint fp ->
printf " \"fingerprint\": \"%s\",\n" fp;
| Sigchecker.KeyFile kf ->
printf " \"key\": \"%s\",\n" kf;
);
printf " \"uri\": \"%s\"\n" source;
printf " }%s\n" (trailing_comma i (List.length sources))
) sources;
printf " ],\n";
printf " \"templates\": [\n";
iteri (
fun i (name, { Index_parser.printable_name = printable_name;
arch = arch;
size = size;
compressed_size = compressed_size;
notes = notes;
aliases = aliases;
hidden = hidden }) ->
printf " {\n";
printf " \"os-version\": \"%s\",\n" name;
json_optional_printf_string "full-name" printable_name;
printf " \"arch\": \"%s\",\n" arch;
printf " \"size\": %Ld,\n" size;
json_optional_printf_int64 "compressed-size" compressed_size;
print_notes notes;
json_optional_printf_stringlist "aliases" aliases;
printf " \"hidden\": %s\n" (json_string_of_bool hidden);
printf " }%s\n" (trailing_comma i (List.length index))
) index;
printf " ]\n";
printf "}\n"

View File

@@ -16,4 +16,4 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*)
val list_entries : ?list_long:bool -> source:string -> Index_parser.index -> unit
val list_entries : list_format:([ `Short | `Long | `Json ]) -> sources:(string * Sigchecker.gpgkey_type * Downloader.proxy_mode) list -> Index_parser.index -> unit

41
builder/paths.ml Normal file
View File

@@ -0,0 +1,41 @@
(* virt-builder
* 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.
*)
open Common_utils
let xdg_cache_home =
try Some (Sys.getenv "XDG_CACHE_HOME" // "virt-builder")
with Not_found ->
try Some (Sys.getenv "HOME" // ".cache" // "virt-builder")
with Not_found ->
None (* no cache directory *)
let xdg_config_home ~prog =
try Some (Sys.getenv "XDG_CONFIG_HOME" // prog)
with Not_found ->
try Some (Sys.getenv "HOME" // ".config" // prog)
with Not_found ->
None (* no config directory *)
let xdg_config_dirs ~prog =
let dirs =
try Sys.getenv "XDG_CONFIG_DIRS"
with Not_found -> "/etc/xdg" in
let dirs = string_nsplit ":" dirs in
let dirs = List.filter (fun x -> x <> "") dirs in
List.map (fun x -> x // prog) dirs

668
builder/pxzcat-c.c Normal file
View File

@@ -0,0 +1,668 @@
/* virt-builder
* Copyright (C) 2013 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 <unistd.h>
#include <fcntl.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <pthread.h>
#include <caml/alloc.h>
#include <caml/fail.h>
#include <caml/memory.h>
#include <caml/mlvalues.h>
#include "ignore-value.h"
#if HAVE_LIBLZMA
#include <lzma.h>
#endif
#ifdef HAVE_CAML_UNIXSUPPORT_H
#include <caml/unixsupport.h>
#else
#define Nothing ((value) 0)
extern void unix_error (int errcode, char * cmdname, value arg) Noreturn;
#endif
#if defined (HAVE_LIBLZMA) && \
defined (HAVE_LZMA_INDEX_STREAM_FLAGS) && \
defined (HAVE_LZMA_INDEX_STREAM_PADDING)
#define PARALLEL_XZCAT 1
#else
#define PARALLEL_XZCAT 0
#endif
value
virt_builder_using_parallel_xzcat (value unitv)
{
return PARALLEL_XZCAT ? Val_true : Val_false;
}
#if PARALLEL_XZCAT
static void pxzcat (value filenamev, value outputfilev, unsigned nr_threads);
#endif /* PARALLEL_XZCAT */
value
virt_builder_pxzcat (value inputfilev, value outputfilev)
{
CAMLparam2 (inputfilev, outputfilev);
#if PARALLEL_XZCAT
/* Parallel implementation of xzcat (pxzcat). */
/* XXX Make number of threads configurable? */
long i;
unsigned nr_threads;
i = sysconf (_SC_NPROCESSORS_ONLN);
if (i <= 0) {
perror ("could not get number of cores");
i = 1;
}
nr_threads = (unsigned) i;
/* NB: This might throw an exception if something fails. If it
* does, this function won't return as a regular C function.
*/
pxzcat (inputfilev, outputfilev, nr_threads);
#else /* !PARALLEL_XZCAT */
/* Fallback: use regular xzcat. */
int fd;
pid_t pid;
int status;
fd = open (String_val (outputfilev), O_WRONLY|O_CREAT|O_TRUNC|O_NOCTTY, 0666);
if (fd == -1)
unix_error (errno, "open", outputfilev);
pid = fork ();
if (pid == -1) {
int err = errno;
close (fd);
unix_error (err, "fork", Nothing);
}
if (pid == 0) { /* child - run xzcat */
dup2 (fd, 1);
execlp (XZCAT, XZCAT, String_val (inputfilev), NULL);
perror (XZCAT);
_exit (EXIT_FAILURE);
}
close (fd);
if (waitpid (pid, &status, 0) == -1)
unix_error (errno, "waitpid", Nothing);
if (!WIFEXITED (status) || WEXITSTATUS (status) != 0)
caml_failwith (XZCAT " program failed, see earlier error messages");
#endif /* !PARALLEL_XZCAT */
CAMLreturn (Val_unit);
}
#if PARALLEL_XZCAT
#define DEBUG 0
#if DEBUG
#define debug(fs,...) fprintf (stderr, "pxzcat: debug: " fs "\n", ## __VA_ARGS__)
#else
#define debug(fs,...) /* nothing */
#endif
/* Size of buffers used in decompression loop. */
#define BUFFER_SIZE (64*1024)
#define XZ_HEADER_MAGIC "\xfd" "7zXZ\0"
#define XZ_HEADER_MAGIC_LEN 6
#define XZ_FOOTER_MAGIC "YZ"
#define XZ_FOOTER_MAGIC_LEN 2
static int check_header_magic (int fd);
static lzma_index *parse_indexes (value filenamev, int fd);
static void iter_blocks (lzma_index *idx, unsigned nr_threads, value filenamev, int fd, value outputfilev, int ofd);
static void
pxzcat (value filenamev, value outputfilev, unsigned nr_threads)
{
int fd, ofd;
uint64_t size;
lzma_index *idx;
/* Open the file. */
fd = open (String_val (filenamev), O_RDONLY);
if (fd == -1)
unix_error (errno, "open", filenamev);
/* Check file magic. */
if (!check_header_magic (fd)) {
close (fd);
caml_invalid_argument ("input file is not an xz file");
}
/* Read and parse the indexes. */
idx = parse_indexes (filenamev, fd);
/* Get the file uncompressed size, create the output file. */
size = lzma_index_uncompressed_size (idx);
debug ("uncompressed size = %" PRIu64 " bytes", size);
/* Avoid annoying ext4 auto_da_alloc which causes a flush on close
* unless we are very careful about not truncating a regular file
* from non-zero size to zero size. (Thanks Eric Sandeen)
*/
ofd = open (String_val (outputfilev), O_WRONLY|O_CREAT|O_NOCTTY, 0644);
if (ofd == -1) {
int err = errno;
close (fd);
unix_error (err, "open", outputfilev);
}
if (ftruncate (ofd, 1) == -1) {
int err = errno;
close (fd);
unix_error (err, "ftruncate", outputfilev);
}
if (lseek (ofd, 0, SEEK_SET) == -1) {
int err = errno;
close (fd);
unix_error (err, "lseek", outputfilev);
}
if (write (ofd, "\0", 1) == -1) {
int err = errno;
close (fd);
unix_error (err, "write", outputfilev);
}
if (ftruncate (ofd, size) == -1) {
int err = errno;
close (fd);
unix_error (err, "ftruncate", outputfilev);
}
/* Tell the kernel we won't read the output file. */
ignore_value (posix_fadvise (fd, 0, 0, POSIX_FADV_RANDOM|POSIX_FADV_DONTNEED));
/* Iterate over blocks. */
iter_blocks (idx, nr_threads, filenamev, fd, outputfilev, ofd);
lzma_index_end (idx, NULL);
if (close (fd) == -1)
unix_error (errno, "close", filenamev);
}
static int
check_header_magic (int fd)
{
char buf[XZ_HEADER_MAGIC_LEN];
if (lseek (fd, 0, SEEK_SET) == -1)
return 0;
if (read (fd, buf, XZ_HEADER_MAGIC_LEN) != XZ_HEADER_MAGIC_LEN)
return 0;
if (memcmp (buf, XZ_HEADER_MAGIC, XZ_HEADER_MAGIC_LEN) != 0)
return 0;
return 1;
}
/* For explanation of this function, see src/xz/list.c:parse_indexes
* in the xz sources.
*/
static lzma_index *
parse_indexes (value filenamev, int fd)
{
lzma_ret r;
off_t pos, index_size;
uint8_t footer[LZMA_STREAM_HEADER_SIZE];
uint8_t header[LZMA_STREAM_HEADER_SIZE];
lzma_stream_flags footer_flags;
lzma_stream_flags header_flags;
lzma_stream strm = LZMA_STREAM_INIT;
ssize_t n;
lzma_index *combined_index = NULL;
lzma_index *this_index = NULL;
lzma_vli stream_padding = 0;
size_t nr_streams = 0;
/* Check file size is a multiple of 4 bytes. */
pos = lseek (fd, 0, SEEK_END);
if (pos == (off_t) -1)
unix_error (errno, "lseek", filenamev);
if ((pos & 3) != 0)
caml_invalid_argument ("input not an xz file: size is not a multiple of 4 bytes");
/* Jump backwards through the file identifying each stream. */
while (pos > 0) {
debug ("looping through streams: pos = %" PRIu64, (uint64_t) pos);
if (pos < LZMA_STREAM_HEADER_SIZE)
caml_invalid_argument ("corrupted xz file");
if (lseek (fd, -LZMA_STREAM_HEADER_SIZE, SEEK_CUR) == -1)
unix_error (errno, "lseek", filenamev);
if (read (fd, footer, LZMA_STREAM_HEADER_SIZE) != LZMA_STREAM_HEADER_SIZE)
unix_error (errno, "read", filenamev);
/* Skip stream padding. */
if (footer[8] == 0 && footer[9] == 0 &&
footer[10] == 0 && footer[11] == 0) {
stream_padding += 4;
pos -= 4;
continue;
}
pos -= LZMA_STREAM_HEADER_SIZE;
nr_streams++;
debug ("decode stream footer at pos = %" PRIu64, (uint64_t) pos);
/* Does the stream footer look reasonable? */
r = lzma_stream_footer_decode (&footer_flags, footer);
if (r != LZMA_OK) {
fprintf (stderr, "invalid stream footer - error %d\n", r);
caml_invalid_argument ("invalid stream footer");
}
debug ("backward_size = %" PRIu64, (uint64_t) footer_flags.backward_size);
index_size = footer_flags.backward_size;
if (pos < index_size + LZMA_STREAM_HEADER_SIZE)
caml_invalid_argument ("invalid stream footer");
pos -= index_size;
debug ("decode index at pos = %" PRIu64, (uint64_t) pos);
/* Seek backwards to the index of this stream. */
if (lseek (fd, pos, SEEK_SET) == -1)
unix_error (errno, "lseek", filenamev);
/* Decode the index. */
r = lzma_index_decoder (&strm, &this_index, UINT64_MAX);
if (r != LZMA_OK) {
fprintf (stderr, "invalid stream index - error %d\n", r);
caml_invalid_argument ("invalid stream index");
}
do {
uint8_t buf[BUFSIZ];
strm.avail_in = index_size;
if (strm.avail_in > BUFSIZ)
strm.avail_in = BUFSIZ;
n = read (fd, &buf, strm.avail_in);
if (n == -1)
unix_error (errno, "read", filenamev);
index_size -= strm.avail_in;
strm.next_in = buf;
r = lzma_code (&strm, LZMA_RUN);
} while (r == LZMA_OK);
if (r != LZMA_STREAM_END) {
fprintf (stderr, "could not parse index - error %d\n", r);
caml_invalid_argument ("could not parse index");
}
pos -= lzma_index_total_size (this_index) + LZMA_STREAM_HEADER_SIZE;
debug ("decode stream header at pos = %" PRIu64, (uint64_t) pos);
/* Read and decode the stream header. */
if (lseek (fd, pos, SEEK_SET) == -1)
unix_error (errno, "lseek", filenamev);
if (read (fd, header, LZMA_STREAM_HEADER_SIZE) != LZMA_STREAM_HEADER_SIZE)
unix_error (errno, "read stream header", filenamev);
r = lzma_stream_header_decode (&header_flags, header);
if (r != LZMA_OK) {
fprintf (stderr, "invalid stream header - error %d\n", r);
caml_invalid_argument ("invalid stream header");
}
/* Header and footer of the stream should be equal. */
r = lzma_stream_flags_compare (&header_flags, &footer_flags);
if (r != LZMA_OK) {
fprintf (stderr, "header and footer of stream are not equal - error %d\n",
r);
caml_invalid_argument ("header and footer of stream are not equal");
}
/* Store the decoded stream flags in this_index. */
r = lzma_index_stream_flags (this_index, &footer_flags);
if (r != LZMA_OK) {
fprintf (stderr, "cannot read stream_flags from index - error %d\n", r);
caml_invalid_argument ("cannot read stream_flags from index");
}
/* Store the amount of stream padding so far. Needed to calculate
* compressed offsets correctly in multi-stream files.
*/
r = lzma_index_stream_padding (this_index, stream_padding);
if (r != LZMA_OK) {
fprintf (stderr, "cannot set stream_padding in index - error %d\n", r);
caml_invalid_argument ("cannot set stream_padding in index");
}
if (combined_index != NULL) {
r = lzma_index_cat (this_index, combined_index, NULL);
if (r != LZMA_OK) {
fprintf (stderr, "cannot combine indexes - error %d\n", r);
caml_invalid_argument ("cannot combine indexes");
}
}
combined_index = this_index;
this_index = NULL;
}
lzma_end (&strm);
return combined_index;
}
/* Return true iff the buffer is all zero bytes.
*
* Note that gcc is smart enough to optimize this properly:
* http://stackoverflow.com/questions/1493936/faster-means-of-checking-for-an-empty-buffer-in-c/1493989#1493989
*/
static inline int
is_zero (const unsigned char *buffer, size_t size)
{
size_t i;
for (i = 0; i < size; ++i) {
if (buffer[i] != 0)
return 0;
}
return 1;
}
struct global_state {
/* Current iterator. Threads update this, but it is protected by a
* mutex, and each thread takes a copy of it when working on it.
*/
lzma_index_iter iter;
lzma_bool iter_finished;
pthread_mutex_t iter_mutex;
/* Note that all threads are accessing these fds, so you have
* to use pread/pwrite instead of lseek!
*/
/* Input file. */
const char *filename;
int fd;
/* Output file. */
const char *outputfile;
int ofd;
};
struct per_thread_state {
unsigned thread_num;
struct global_state *global;
int status;
};
/* Create threads to iterate over the blocks and uncompress. */
static void *worker_thread (void *vp);
static void
iter_blocks (lzma_index *idx, unsigned nr_threads,
value filenamev, int fd, value outputfilev, int ofd)
{
struct global_state global;
struct per_thread_state per_thread[nr_threads];
pthread_t thread[nr_threads];
unsigned u, nr_errors;
int err;
void *status;
lzma_index_iter_init (&global.iter, idx);
global.iter_finished = 0;
err = pthread_mutex_init (&global.iter_mutex, NULL);
if (err != 0)
unix_error (err, "pthread_mutex_init", Nothing);
global.filename = String_val (filenamev);
global.fd = fd;
global.outputfile = String_val (outputfilev);
global.ofd = ofd;
for (u = 0; u < nr_threads; ++u) {
per_thread[u].thread_num = u;
per_thread[u].global = &global;
}
/* Start the threads. */
for (u = 0; u < nr_threads; ++u) {
err = pthread_create (&thread[u], NULL, worker_thread, &per_thread[u]);
if (err != 0)
unix_error (err, "pthread_create", Nothing);
}
/* Wait for the threads to exit. */
nr_errors = 0;
for (u = 0; u < nr_threads; ++u) {
err = pthread_join (thread[u], &status);
if (err != 0) {
fprintf (stderr, "pthread_join (%u): %s\n", u, strerror (err));
nr_errors++;
}
if (*(int *)status == -1)
nr_errors++;
}
if (nr_errors > 0)
caml_invalid_argument ("some threads failed, see earlier errors");
}
/* Iterate over the blocks and uncompress. */
static void *
worker_thread (void *vp)
{
struct per_thread_state *state = vp;
struct global_state *global = state->global;
lzma_index_iter iter;
int err;
off_t position, oposition;
uint8_t header[LZMA_BLOCK_HEADER_SIZE_MAX];
ssize_t n;
lzma_block block;
lzma_filter filters[LZMA_FILTERS_MAX + 1];
lzma_ret r;
lzma_stream strm = LZMA_STREAM_INIT;
uint8_t buf[BUFFER_SIZE];
unsigned char outbuf[BUFFER_SIZE];
size_t i;
lzma_bool iter_finished;
state->status = -1;
for (;;) {
/* Get the next block. */
err = pthread_mutex_lock (&global->iter_mutex);
if (err != 0) abort ();
iter_finished = global->iter_finished;
if (!iter_finished) {
iter_finished = global->iter_finished =
lzma_index_iter_next (&global->iter, LZMA_INDEX_ITER_NONEMPTY_BLOCK);
if (!iter_finished)
/* Take a local copy of this iterator since another thread will
* update the global version.
*/
iter = global->iter;
}
err = pthread_mutex_unlock (&global->iter_mutex);
if (err != 0) abort ();
if (iter_finished)
break;
/* Read the block header. Start by reading a single byte which
* tell us how big the block header is.
*/
position = iter.block.compressed_file_offset;
n = pread (global->fd, header, 1, position);
if (n == 0) {
fprintf (stderr,
"%s: read: unexpected end of file reading block header byte\n",
global->filename);
return &state->status;
}
if (n == -1) {
perror (String_val (global->filename));
return &state->status;
}
position++;
if (header[0] == '\0') {
fprintf (stderr,
"%s: read: unexpected invalid block in file, header[0] = 0\n",
global->filename);
return &state->status;
}
block.version = 0;
block.check = iter.stream.flags->check;
block.filters = filters;
block.header_size = lzma_block_header_size_decode (header[0]);
/* Now read and decode the block header. */
n = pread (global->fd, &header[1], block.header_size-1, position);
if (n >= 0 && n != block.header_size-1) {
fprintf (stderr,
"%s: read: unexpected end of file reading block header\n",
global->filename);
return &state->status;
}
if (n == -1) {
perror (global->filename);
return &state->status;
}
position += n;
r = lzma_block_header_decode (&block, NULL, header);
if (r != LZMA_OK) {
fprintf (stderr, "%s: invalid block header (error %d)\n",
global->filename, r);
return &state->status;
}
/* What this actually does is it checks that the block header
* matches the index.
*/
r = lzma_block_compressed_size (&block, iter.block.unpadded_size);
if (r != LZMA_OK) {
fprintf (stderr,
"%s: cannot calculate compressed size (error %d)\n",
global->filename, r);
return &state->status;
}
/* Where we will start writing to. */
oposition = iter.block.uncompressed_file_offset;
/* Read the block data and uncompress it. */
r = lzma_block_decoder (&strm, &block);
if (r != LZMA_OK) {
fprintf (stderr, "%s: invalid block (error %d)\n", global->filename, r);
return &state->status;
}
strm.next_in = NULL;
strm.avail_in = 0;
strm.next_out = outbuf;
strm.avail_out = sizeof outbuf;
for (;;) {
lzma_action action = LZMA_RUN;
if (strm.avail_in == 0) {
strm.next_in = buf;
n = pread (global->fd, buf, sizeof buf, position);
if (n == -1) {
perror (global->filename);
return &state->status;
}
position += n;
strm.avail_in = n;
if (n == 0)
action = LZMA_FINISH;
}
r = lzma_code (&strm, action);
if (strm.avail_out == 0 || r == LZMA_STREAM_END) {
size_t wsz = sizeof outbuf - strm.avail_out;
/* Don't write if the block is all zero, to preserve output file
* sparseness. However we have to update oposition.
*/
if (!is_zero (outbuf, wsz)) {
if (pwrite (global->ofd, outbuf, wsz, oposition) != wsz) {
/* XXX Handle short writes. */
perror (global->filename);
return &state->status;
}
}
oposition += wsz;
strm.next_out = outbuf;
strm.avail_out = sizeof outbuf;
}
if (r == LZMA_STREAM_END)
break;
if (r != LZMA_OK) {
fprintf (stderr,
"%s: could not parse block data (error %d)\n",
global->filename, r);
return &state->status;
}
}
lzma_end (&strm);
for (i = 0; filters[i].id != LZMA_VLI_UNKNOWN; ++i)
free (filters[i].options);
}
state->status = 0;
return &state->status;
}
#endif /* PARALLEL_XZCAT */

20
builder/pxzcat.ml Normal file
View File

@@ -0,0 +1,20 @@
(* virt-builder
* Copyright (C) 2013 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.
*)
external pxzcat : string -> string -> unit = "virt_builder_pxzcat"
external using_parallel_xzcat : unit -> bool = "virt_builder_using_parallel_xzcat" "noalloc"

34
builder/pxzcat.mli Normal file
View File

@@ -0,0 +1,34 @@
(* virt-builder
* Copyright (C) 2013 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.
*)
(** {1 Parallel xzcat (or fall back to regular xzcat).}
Eventually regular xzcat will be able to work in parallel and this
code can go away.
*)
val pxzcat : string -> string -> unit
(** [pxzcat input output] uncompresses the file [input] to the file
[output]. The input and output must both be seekable.
If liblzma was found at compile time, this uses an internal
implementation of parallel xzcat. Otherwise regular xzcat is
used. *)
val using_parallel_xzcat : unit -> bool
(** Returns [true] iff the implementation uses parallel xzcat. *)

59
builder/setlocale-c.c Normal file
View File

@@ -0,0 +1,59 @@
/* virt-builder
* 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.
*/
#include <config.h>
#include <locale.h>
#include <caml/alloc.h>
#include <caml/fail.h>
#include <caml/memory.h>
#include <caml/mlvalues.h>
static const int lc_string_table[7] = {
LC_ALL,
LC_CTYPE,
LC_NUMERIC,
LC_TIME,
LC_COLLATE,
LC_MONETARY,
LC_MESSAGES
};
#define Val_none (Val_int (0))
value
virt_builder_setlocale (value val_category, value val_name)
{
CAMLparam2 (val_category, val_name);
CAMLlocal2 (rv, rv2);
char *ret, *locstring;
int category;
category = lc_string_table[Int_val (val_category)];
locstring = val_name == Val_none ? NULL : String_val (Field (val_name, 0));
ret = setlocale (category, locstring);
if (ret) {
rv2 = caml_copy_string (ret);
rv = caml_alloc (1, 0);
Store_field (rv, 0, rv2);
} else
rv = Val_none;
CAMLreturn (rv);
}

29
builder/setlocale.ml Normal file
View File

@@ -0,0 +1,29 @@
(* virt-builder
* 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.
*)
type localecategory =
| LC_ALL
| LC_CTYPE
| LC_NUMERIC
| LC_TIME
| LC_COLLATE
| LC_MONETARY
| LC_MESSAGES
;;
external setlocale : localecategory -> string option -> string option = "virt_builder_setlocale"

30
builder/setlocale.mli Normal file
View File

@@ -0,0 +1,30 @@
(* virt-builder
* 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.
*)
type localecategory =
| LC_ALL
| LC_CTYPE
| LC_NUMERIC
| LC_TIME
| LC_COLLATE
| LC_MONETARY
| LC_MESSAGES
;;
val setlocale : localecategory -> string option -> string option
(** [setlocale category newlocale] Tiny wrapper to the C [setlocale]. *)

View File

@@ -24,96 +24,98 @@ open Unix
let quote = Filename.quote
(* These are the public key and fingerprint belonging to
* Richard W.M. Jones who signs the templates on
* http://libguestfs.org/download/builder.
*)
let default_fingerprint = "F777 4FB1 AD07 4A7E 8C87 67EA 9173 8F73 E1B7 68A0"
let default_pubkey = "\
-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: GnuPG v1.4.14 (GNU/Linux)
mQINBE6UMMEBEADM811hfTulaF4JpkVpAI10FImyb4ArvOiu8NdcUwTFo+cyWno3
U85B86H1Bsk/LgLTYtthSrTgsCtdxy+i5OaMjxZDIwKQ2+IYI3FCn9T3Mn28Idyh
kLHzrO9ph0Dv0BNfrlDZhQEC53aAFe/QxN7+A49BNBV7D1VAOOCsHjxMEDzcZkCa
oCrtXw1aNm2vkkj5ukbfukHAyLcQL7kow0qKPSVa1G4lfQP0WiG259Ydy+sUmbVb
TGdb6MEC84PQRDuw6/ZeoV04tn7ZNtQEMOS0uiciHOGfr2hBxQf9VIPNrHg42yaL
dOv51D99GuaxZ9E0HSoH/RwB1oXgd6rFdqVNYaBIQnnkwJANUEeGBArtIOZNCADT
Bt8vkSDm+lLEAFS+V8CACyW/LMIrGCvLdHeqtoAv0GDVyR2GPxldYfdtEmCUMWcb
Jlf71V9iAse2gUdoiHp5FfpGMkA5j7idKuxIws11XxRZJXXbBqiBqmVEAQ/v0m6p
kdo0MYTHydmecLuUK2bAGhpysfX97EfTSrxfrYphYWjTfKRD9GrADeZNfuz1DbKs
7LSqVaQJSjQrfgAwcnZLRaU0V4P5zxiz50gz1Aj3AZRL+Y3meZenzZTXcLFdnusg
wUfhhCuL3tluMtEh6tznumyxb43WO1yLwj6J6LtveiuJN1Z+KSQ6OieZcwARAQAB
tCVSaWNoYXJkIFcuTS4gSm9uZXMgPHJpY2hAYW5uZXhpYS5vcmc+iQI4BBMBAgAi
BQJOlDDBAhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRCRc49z4bdooHQY
D/wJLklSZNyXIW+rG5sUbg7j9cTIF5p/lB9kI2yx6KodJp/2knKyvnmzz0gBw/OE
HL4E4UW26oWKo+36I8wkBnuGa6UtANeITcJqFE19VpHEXHsxre64jNQnO8/w748W
1ROW+Ry43xmrlRWKuCm4oPYUzlp0fq9ATAne8eblfG+NOs8DYuA8xZNQzFaI2kDC
QLD4YoXLoNsP27Koga36b0KwxPFD9tyVZiu9XDH/3hMN7Nb15B66PFr+HcMmQ67G
nUIN5ulcIwj38i40cyaTs1VRheOzTHXE/a6Q2AhMKiKqOoEjQ73/mV7cAVoPtM3o
83Q/8aVKBH0bVRwAeV1tju6b14fqKoG0zNBEcXdlSkht6ScxJYIc/LPUxAMDwgSE
OWshjmeRzKXypBbHn/DP8QVyM2gk5wY+mMSH7MpR0p/hgj+rFO8H9L7pC4dCog3E
qzrYhRN+TaP6MPH3WkOwPH4d4IfQRFnHp+VPYPijKEiLrUl/o8k3DyAanAPBpJ/x
na4wXAjlFBctOq6g+SrCUiHpwk7b2YNwGgr5Vl3GmZELzK/G8gg3uJYKQ9Bpv16t
WWOz+IFiOFa0UULeo0QPmFAIMZiDojNsY1SwBKB3ZL1YWZezgMdQAbpze/IXoSt7
zxWJoKH2jK7q9mvFiaY12l2YnKuCcegWVAViLxRpBnrbz7QmUmljaGFyZCBXLk0u
IEpvbmVzIDxyam9uZXNAcmVkaGF0LmNvbT6JAjgEEwECACIFAk6UOQsCGwMGCwkI
BwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEJFzj3Pht2igIUYQAKomI0edLakahsUQ
MxOZuhBbXJ4/VWF8bXYChDNPKvJp5nB7fBXujJ+39cIUM5fe2ViO6qSDpFC29imx
F5pPbAqspZBPBkLLiZLji8R42hGarntdtTW0UWSBpq+nC5+G1psrnATI3uXGNxKQ
R99c5HoMY7dBC2Y8TCGE64NINZ/XVh472s6IGLPn8MTn26YdRKC9BrVkCFMP2OBr
6D4IprnyTAWAzb68ew20QmyWO+NBi9MplaDNQVl8PIOgfpyWlkgX1z9m67pcSDkw
46hksp0yuOD1VwR4iVZ2/CmIsGRUlx41vWD6BIp9KxKyDIU1CYTRhq72dahHsl/8
BjCndV5PO0GphqfCzmCv4DXjUwmrMTbH/GFnt5rfwcMcXUgcK0vV9vQ2SOU56Zd1
fb27ZCFJKZc0Fu8krwFldCp/NYILf6ogUL/C1hfuCGSSuyDVY16Gg3dla1x+6zpF
asnWQlaw8xT5LlMWvTZs5WsoSVHu7dVZWlgxINP++hlZrTz/S8l38yyQ15YFFl3W
9M7dzkegOeDTPfx6B89WgfvfJjA/D0/FYxxWPXEtrn9DlJ4daEJqNsrvfLErz9R8
4IQmfmhR93j+rdotner+6keC/wVByEfbW1wmXtmFKXQ6srdpj8VKRFrvkyXVgepM
DypLgRH2v7lL2kdWhUu2y4EAgrwzuQINBE6UMMEBEADxQxMgUuDrw5GT4tqARTPI
SSdNcUsRxRhVA8srYOyECliE+B3TwcRDFBs+MyPFJVEuX8fi4eGj/AK5t1GHerfk
orUGlz72q4c7LLhkfZrsuJbk2dgkjvldKJnIazQJa6epGLqdsE5RlmSgwedIbtMd
naGJBQH8aKP/Wi1+wUxsm5N3p7+R2WRx48VfpEhYB+Zf/FkFm1Ycjwh57KQ0+OHw
ykf8VfMisxuH30tDxOCV+VptWKfOF2rDNdaNPWhij2YIjhJXRpkuRR+1PpI4jLaD
JxcVZmG/0zucacupUN2g5OUH59ySU/totD6YMnmp3FONoyF1uIEJo6Vs30npHGkO
XgBo3Pxt7oLJeykLPtdSLgm3cwXIYMWarVsAkKNXitQIVGpVRLeaK373VwmXFqoi
M2SMHeawTUdOORFjpQzkknlJWM1TmUVtHHKt8Pl9+/5+wXKyt2IDdcUkMrB6K5qF
fb7EwVhoI8ehJQK+eeDCjFwCAiwB3iV8JlyW+tEU7JuyXOQlwY1VWm/WqMD8gaRi
rT+RFDFliZ3tQbW2pqUoZBROV5HN4tieDfwxGKCvk6Tsdb30zA9DPQp93+238bYf
312sg9R+CD0AqxoxFG5FJu4HShcPRrPnYtRZqKRe40GDWvBEArXZprwL1qrP+Kl/
mRrEQpxAGIoFG8HbVvD3EQARAQABiQIfBBgBAgAJBQJOlDDBAhsMAAoJEJFzj3Ph
t2igSLQP/2uIrAY2CDr0kWBJiD3TztiHy8IdxwUpyTBTebwmAbi44/EvtJfIisrG
YjKIEv/w0E61gO7O1JBG4+IG93W+v9fTT/e39JMyxsYqoZZHUhP11Okx5grDS5b0
O8VXOmXVRMdVNfstRBr10HD9uNDq7ruKD18TxYTwN0GPD4gj1dbHQDR77Tr5cyBs
6Ou5PBOH4r3qcqf/cJUSMeUUu75xLwixux6E7tD2S+t6F07wlWxntUcPtzyAHj20
J89orUC+dT6r6MypBoI0jdJCp9JPGtR7i+fE5Gm4E5+AUSubLPtZGRY9Um2eMoS2
DnQpGOKx1VvsixR/Kw44j2tRAvmYMS4iDKcuZU+nZ+xokAgObILj/b9n/Qe2/fXy
CFdcgSvbm+dV1fZxsdMF/P9OU8aqdT9A9Fv5y+cDMEg4DVnhwMJTxGh/TCkw/H+A
frHEtRc98lSQN5odpITNG17mG6JOdHM+wA57qHH0uy4+5RsbyAJahcdBcmObK/RF
i4WZlThpbHftX5O/LH98aYQ2fJayIxv1EAjzOBOQ0MfBHI0KCJR1pysEisX28sJA
Ic73gnJJ3BLZbqfBRgxjNMNroxC+5Tw6uPGFHa3YnuIAxxw0HcDVZ9vnTWBWFPGw
ZvXkQ3FVJwZoLmHw47vvlVpLD/4gi1SuHWieRvZ+UdDq00E348pm
=neBW
-----END PGP PUBLIC KEY BLOCK-----
"
let key_imported = ref false
type gpgkey_type =
| No_Key
| Fingerprint of string
| KeyFile of string
type t = {
debug : bool;
verbose : bool;
gpg : string;
fingerprint : string;
check_signature : bool;
gpghome : string;
}
let create ~debug ~gpg ?(fingerprint = default_fingerprint) ~check_signature =
(* Import the specified key file. *)
let import_keyfile ~gpg ~gpghome ~verbose keyfile =
let status_file = Filename.temp_file "vbstat" ".txt" in
unlink_on_exit status_file;
let cmd = sprintf "%s --homedir %s --status-file %s --import %s%s"
gpg gpghome (quote status_file) (quote keyfile)
(if verbose then "" else " >/dev/null 2>&1") in
if verbose then eprintf "%s\n%!" cmd;
let r = Sys.command cmd in
if r <> 0 then (
eprintf (f_"virt-builder: error: could not import public key\nUse the '-v' option and look for earlier error messages.\n");
exit 1
);
status_file
let rec create ~verbose ~gpg ~gpgkey ~check_signature =
(* Create a temporary directory for gnupg. *)
let tmpdir = Mkdtemp.temp_dir "vb.gpghome." "" in
rmdir_on_exit tmpdir;
(* Make sure we have no check_signature=true with no actual key. *)
let check_signature, gpgkey =
match check_signature, gpgkey with
| true, No_Key -> false, No_Key
| x, y -> x, y in
let fingerprint =
if check_signature then (
(* Run gpg so it can setup its own home directory, failing if it
* cannot.
*)
let cmd = sprintf "%s --homedir %s --list-keys%s"
gpg tmpdir (if verbose then "" else " >/dev/null 2>&1") in
if verbose then eprintf "%s\n%!" cmd;
let r = Sys.command cmd in
if r <> 0 then (
eprintf (f_"virt-builder: error: GPG failure: could not run GPG the first time\nUse the '-v' option and look for earlier error messages.\n");
exit 1
);
match gpgkey with
| No_Key ->
assert false
| KeyFile kf ->
let status_file = import_keyfile gpg tmpdir verbose kf in
let status = read_whole_file status_file in
let status = string_nsplit "\n" status in
let fingerprint = ref "" in
List.iter (
fun line ->
let line = string_nsplit " " line in
match line with
| "[GNUPG:]" :: "IMPORT_OK" :: _ :: fp :: _ -> fingerprint := fp
| _ -> ()
) status;
!fingerprint
| Fingerprint fp ->
let filename = Filename.temp_file "vbpubkey" ".asc" in
unlink_on_exit filename;
let cmd = sprintf "%s --yes --armor --output %s --export %s%s"
gpg (quote filename) (quote fp)
(if verbose then "" else " >/dev/null 2>&1") in
if verbose then eprintf "%s\n%!" cmd;
let r = Sys.command cmd in
if r <> 0 then (
eprintf (f_"virt-builder: error: could not export public key\nUse the '-v' option and look for earlier error messages.\n");
exit 1
);
ignore (import_keyfile gpg tmpdir verbose filename);
fp
) else
"" in
{
debug = debug;
verbose = verbose;
gpg = gpg;
fingerprint = fingerprint;
check_signature = check_signature;
gpghome = tmpdir;
}
(* Compare two strings of hex digits ignoring whitespace and case. *)
let rec equal_fingerprints fp1 fp2 =
and equal_fingerprints fp1 fp2 =
let len1 = String.length fp1 and len2 = String.length fp2 in
let rec loop i j =
if i = len1 && j = len2 then true (* match! *)
@@ -154,14 +156,14 @@ and verify_detached t filename sigfile =
)
and do_verify t args =
import_key t;
let status_file = Filename.temp_file "vbstat" ".txt" in
unlink_on_exit status_file;
let cmd =
sprintf "%s --verify%s --status-file %s %s"
t.gpg (if t.debug then "" else " -q --logger-file /dev/null")
sprintf "%s --homedir %s --verify%s --status-file %s %s"
t.gpg t.gpghome
(if t.verbose then "" else " -q --logger-file /dev/null")
(quote status_file) args in
if t.debug then eprintf "%s\n%!" cmd;
if t.verbose then eprintf "%s\n%!" cmd;
let r = Sys.command cmd in
if r <> 0 then (
eprintf (f_"virt-builder: error: GPG failure: could not verify digital signature of file\nTry:\n - Use the '-v' option and look for earlier error messages.\n - Delete the cache: virt-builder --delete-cache\n - Check no one has tampered with the website or your network!\n");
@@ -170,7 +172,6 @@ and do_verify t args =
(* Check the fingerprint is who it should be. *)
let status = read_whole_file status_file in
unlink status_file;
let status = string_nsplit "\n" status in
let fingerprint = ref "" in
@@ -183,27 +184,36 @@ and do_verify t args =
) status;
if not (equal_fingerprints !fingerprint t.fingerprint) then (
eprintf (f_"virt-builder: error: fingerprint of signature does not match the expected fingerprint!\n found fingerprint: %s\n expected fingerprint: %s\n")
eprintf (f_"virt-builder: error: fingerprint of signature does not match the expected fingerprint!\n found fingerprint: %s\n expected fingerprint: %s\n")
!fingerprint t.fingerprint;
exit 1
)
(* Import the default public key, if it's the default fingerprint. *)
and import_key t =
if not !key_imported && equal_fingerprints t.fingerprint default_fingerprint
then (
let filename, chan = Filename.open_temp_file "vbpubkey" ".asc" in
output_string chan default_pubkey;
close_out chan;
type csum_t = SHA512 of string
let cmd = sprintf "%s --import %s%s"
t.gpg (quote filename)
(if t.debug then "" else " >/dev/null 2>&1") in
let r = Sys.command cmd in
if r <> 0 then (
eprintf (f_"virt-builder: error: could not import public key\nUse the '-v' option and look for earlier error messages.\n");
exit 1
);
unlink filename;
key_imported := true
let verify_checksum t (SHA512 csum) filename =
let csum_file = Filename.temp_file "vbcsum" ".txt" in
unlink_on_exit csum_file;
let cmd = sprintf "sha512sum %s | awk '{print $1}' > %s"
(quote filename) (quote csum_file) in
if t.verbose then eprintf "%s\n%!" cmd;
let r = Sys.command cmd in
if r <> 0 then (
eprintf (f_"virt-builder: error: could not run sha512sum command to verify checksum\n");
exit 1
);
let csum_actual = read_whole_file csum_file in
let csum_actual =
let len = String.length csum_actual in
if len > 0 && csum_actual.[len-1] = '\n' then
String.sub csum_actual 0 (len-1)
else
csum_actual in
if csum <> csum_actual then (
eprintf (f_"virt-builder: error: checksum of template did not match the expected checksum!\n found checksum: %s\n expected checksum: %s\nTry:\n - Use the '-v' option and look for earlier error messages.\n - Delete the cache: virt-builder --delete-cache\n - Check no one has tampered with the website or your network!\n")
csum_actual csum;
exit 1
)

View File

@@ -18,7 +18,12 @@
type t
val create : debug:bool -> gpg:string -> ?fingerprint:string -> check_signature:bool -> t
type gpgkey_type =
| No_Key
| Fingerprint of string
| KeyFile of string
val create : verbose:bool -> gpg:string -> gpgkey:gpgkey_type -> check_signature:bool -> t
val verify : t -> string -> unit
(** Verify the file is signed (if check_signature is true). *)
@@ -26,3 +31,9 @@ val verify : t -> string -> unit
val verify_detached : t -> string -> string option -> unit
(** Verify the file is signed against the detached signature
(if check_signature is true). *)
type csum_t = SHA512 of string
val verify_checksum : t -> csum_t -> string -> unit
(** Verify the checksum of the file. This is always verified even if
check_signature if false. *)

139
builder/sources.ml Normal file
View File

@@ -0,0 +1,139 @@
(* virt-builder
* 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.
*)
open Common_gettext.Gettext
open Common_utils
open Printf
open Unix
type source = {
name : string;
uri : string;
gpgkey : string option;
proxy : Downloader.proxy_mode;
}
module StringSet = Set.Make (String)
let parse_conf ~prog ~verbose file =
if verbose then (
eprintf (f_"%s: trying to read %s\n") prog file;
);
let sections = Ini_reader.read_ini ~prog ~error_suffix:"[ignored]" file in
let sources = List.fold_right (
fun (n, fields) acc ->
let give_source n fields =
let fields = List.map (fun (k, sk, v) -> (k, sk), v) fields in
let uri =
try List.assoc ("uri", None) fields
with Not_found as ex ->
eprintf (f_"%s: no 'uri' entry for '%s' in %s, skipping it\n") prog n file;
raise ex in
let gpgkey =
let k =
try Some (URI.parse_uri (List.assoc ("gpgkey", None) fields)) with
| Not_found -> None
| Invalid_argument "URI.parse_uri" as ex ->
if verbose then (
eprintf (f_"%s: '%s' has invalid gpgkey URI\n") prog n;
);
raise ex in
match k with
| None -> None
| Some uri ->
(match uri.URI.protocol with
| "file" -> Some uri.URI.path
| _ ->
if verbose then (
eprintf (f_"%s: '%s' has non-local gpgkey URI\n") prog n;
);
None
) in
let proxy =
try
(match (List.assoc ("proxy", None) fields) with
| "no" | "off" -> Downloader.UnsetProxy
| "system" -> Downloader.SystemProxy
| _ as proxy -> Downloader.ForcedProxy proxy
)
with
Not_found -> Downloader.SystemProxy in
{
name = n; uri = uri; gpgkey = gpgkey; proxy = proxy;
}
in
try (give_source n fields) :: acc
with Not_found | Invalid_argument _ -> acc
) sections [] in
if verbose then (
eprintf (f_"%s: ... read %d sources\n") prog (List.length sources);
);
sources
let merge_sources current_sources new_sources =
List.fold_right (
fun source acc ->
if List.exists (fun { name = n } -> n = source.name) acc then
acc
else
source :: acc
) new_sources current_sources
let filter_filenames filename =
Filename.check_suffix filename ".conf"
let read_sources ~prog ~verbose =
let dirs = Paths.xdg_config_dirs ~prog in
let dirs =
match Paths.xdg_config_home ~prog with
| None -> dirs
| Some dir -> dir :: dirs in
let dirs = List.map (fun x -> x // "repos.d") dirs in
let fnseen = ref StringSet.empty in
List.fold_left (
fun acc dir ->
let files =
try List.filter filter_filenames (Array.to_list (Sys.readdir dir))
with Sys_error _ -> [] in
let files = List.filter (fun x -> StringSet.mem x !fnseen <> true) files in
List.fold_left (
fun acc file ->
try (
let s = merge_sources acc (parse_conf ~prog ~verbose (dir // file)) in
(* Add the current file name to the set only if its parsing
* was successful.
*)
fnseen := StringSet.add file !fnseen;
s
) with
| Unix_error (code, fname, _) ->
if verbose then (
eprintf (f_"%s: file error: %s: %s\n") prog fname (error_message code)
);
acc
| Invalid_argument msg ->
if verbose then (
eprintf (f_"%s: internal error: invalid argument: %s\n") prog msg
);
acc
) acc files
) [] dirs

26
builder/sources.mli Normal file
View File

@@ -0,0 +1,26 @@
(* virt-builder
* 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.
*)
type source = {
name : string;
uri : string;
gpgkey : string option;
proxy : Downloader.proxy_mode;
}
val read_sources : prog:string -> verbose:bool -> source list

View File

@@ -0,0 +1,2 @@
[test-index]
uri=file://@abs_top_builddir@/builder/test-index

66
builder/test-index Normal file
View File

@@ -0,0 +1,66 @@
[phony-debian]
name=Phony Debian
arch=x86_64
file=debian.xz
format=raw
size=536870912
expand=/dev/sda2
lvexpand=/dev/debian/root
notes=Phony Debian look-alike used for testing.
[phony-fedora]
name=Phony Fedora
arch=x86_64
file=fedora.xz
format=raw
size=1073741824
expand=/dev/sda2
lvexpand=/dev/VG/Root
notes=Phony Fedora look-alike used for testing.
[phony-fedora-qcow2]
name=Phony Fedora qcow2
arch=x86_64
file=fedora.qcow2.xz
format=qcow2
size=1073741824
expand=/dev/sda2
lvexpand=/dev/VG/Root
notes=Phony Fedora look-alike used for testing.
[phony-fedora-qcow2-uncompressed]
name=Phony Fedora qcow2 uncompressed
arch=x86_64
file=fedora.qcow2
format=qcow2
size=1073741824
expand=/dev/sda2
lvexpand=/dev/VG/Root
notes=Phony Fedora look-alike used for testing.
[phony-fedora-no-format]
name=Phony Fedora
arch=x86_64
file=fedora.qcow2.xz
size=1073741824
expand=/dev/sda2
lvexpand=/dev/VG/Root
notes=Phony Fedora look-alike used for testing.
[phony-ubuntu]
name=Phony Ubuntu
arch=x86_64
file=ubuntu.xz
format=raw
size=536870912
expand=/dev/sda2
notes=Phony Ubuntu look-alike used for testing.
[phony-windows]
name=Phony Windows
arch=x86_64
file=windows.xz
format=raw
size=536870912
expand=/dev/sda2
notes=Phony Windows look-alike used for testing.

View File

@@ -1,33 +0,0 @@
[phony-debian]
name=Phony Debian
file=debian.xz
format=raw
size=536870912
expand=/dev/sda2
lvexpand=/dev/debian/root
notes=Phony Debian look-alike used for testing.
[phony-fedora]
name=Phony Fedora
file=fedora.xz
format=raw
size=1073741824
expand=/dev/sda2
lvexpand=/dev/VG/Root
notes=Phony Fedora look-alike used for testing.
[phony-ubuntu]
name=Phony Ubuntu
file=ubuntu.xz
format=raw
size=536870912
expand=/dev/sda2
notes=Phony Ubuntu look-alike used for testing.
[phony-windows]
name=Phony Windows
file=windows.xz
format=raw
size=536870912
expand=/dev/sda2
notes=Phony Windows look-alike used for testing.

View File

@@ -21,16 +21,20 @@
export LANG=C
set -e
abs_srcdir=$(cd $srcdir && pwd)
abs_builddir=$(pwd)
export VIRT_BUILDER_SOURCE=file://$abs_srcdir/test-index
export XDG_CONFIG_HOME=
export XDG_CONFIG_DIRS="$abs_builddir/test-config"
short_list=$(./virt-builder --no-check-signature --no-cache --list)
short_list=$($VG ./virt-builder --no-check-signature --no-cache --list)
if [ "$short_list" != "phony-debian Phony Debian
phony-fedora Phony Fedora
phony-ubuntu Phony Ubuntu
phony-windows Phony Windows" ]; then
if [ "$short_list" != "phony-debian x86_64 Phony Debian
phony-fedora x86_64 Phony Fedora
phony-fedora-qcow2 x86_64 Phony Fedora qcow2
phony-fedora-qcow2-uncompressed x86_64 Phony Fedora qcow2 uncompressed
phony-fedora-no-format x86_64 Phony Fedora
phony-ubuntu x86_64 Phony Ubuntu
phony-windows x86_64 Phony Windows" ]; then
echo "$0: unexpected --list output:"
echo "$short_list"
exit 1
@@ -38,36 +42,158 @@ fi
long_list=$(./virt-builder --no-check-signature --no-cache --list --long)
if [ "$long_list" != "Source URI: $VIRT_BUILDER_SOURCE
if [ "$long_list" != "Source URI: file://$abs_builddir/test-index
os-version: phony-debian
Full name: Phony Debian
Architecture: x86_64
Minimum/default size: 512.0M
Notes:
Phony Debian look-alike used for testing.
Phony Debian look-alike used for testing.
os-version: phony-fedora
Full name: Phony Fedora
Architecture: x86_64
Minimum/default size: 1.0G
Notes:
Phony Fedora look-alike used for testing.
Phony Fedora look-alike used for testing.
os-version: phony-fedora-qcow2
Full name: Phony Fedora qcow2
Architecture: x86_64
Minimum/default size: 1.0G
Notes:
Phony Fedora look-alike used for testing.
os-version: phony-fedora-qcow2-uncompressed
Full name: Phony Fedora qcow2 uncompressed
Architecture: x86_64
Minimum/default size: 1.0G
Notes:
Phony Fedora look-alike used for testing.
os-version: phony-fedora-no-format
Full name: Phony Fedora
Architecture: x86_64
Minimum/default size: 1.0G
Notes:
Phony Fedora look-alike used for testing.
os-version: phony-ubuntu
Full name: Phony Ubuntu
Architecture: x86_64
Minimum/default size: 512.0M
Notes:
Phony Ubuntu look-alike used for testing.
Phony Ubuntu look-alike used for testing.
os-version: phony-windows
Full name: Phony Windows
Architecture: x86_64
Minimum/default size: 512.0M
Notes:
Phony Windows look-alike used for testing." ]; then
Phony Windows look-alike used for testing." ]; then
echo "$0: unexpected --list --long output:"
echo "$long_list"
exit 1
fi
json_list=$(./virt-builder --no-check-signature --no-cache --list --list-format json)
if [ "$json_list" != "{
\"version\": 1,
\"sources\": [
{
\"uri\": \"file://$abs_builddir/test-index\"
}
],
\"templates\": [
{
\"os-version\": \"phony-debian\",
\"full-name\": \"Phony Debian\",
\"arch\": \"x86_64\",
\"size\": 536870912,
\"notes\": {
\"C\": \"Phony Debian look-alike used for testing.\"
},
\"hidden\": false
},
{
\"os-version\": \"phony-fedora\",
\"full-name\": \"Phony Fedora\",
\"arch\": \"x86_64\",
\"size\": 1073741824,
\"notes\": {
\"C\": \"Phony Fedora look-alike used for testing.\"
},
\"hidden\": false
},
{
\"os-version\": \"phony-fedora-qcow2\",
\"full-name\": \"Phony Fedora qcow2\",
\"arch\": \"x86_64\",
\"size\": 1073741824,
\"notes\": {
\"C\": \"Phony Fedora look-alike used for testing.\"
},
\"hidden\": false
},
{
\"os-version\": \"phony-fedora-qcow2-uncompressed\",
\"full-name\": \"Phony Fedora qcow2 uncompressed\",
\"arch\": \"x86_64\",
\"size\": 1073741824,
\"notes\": {
\"C\": \"Phony Fedora look-alike used for testing.\"
},
\"hidden\": false
},
{
\"os-version\": \"phony-fedora-no-format\",
\"full-name\": \"Phony Fedora\",
\"arch\": \"x86_64\",
\"size\": 1073741824,
\"notes\": {
\"C\": \"Phony Fedora look-alike used for testing.\"
},
\"hidden\": false
},
{
\"os-version\": \"phony-ubuntu\",
\"full-name\": \"Phony Ubuntu\",
\"arch\": \"x86_64\",
\"size\": 536870912,
\"notes\": {
\"C\": \"Phony Ubuntu look-alike used for testing.\"
},
\"hidden\": false
},
{
\"os-version\": \"phony-windows\",
\"full-name\": \"Phony Windows\",
\"arch\": \"x86_64\",
\"size\": 536870912,
\"notes\": {
\"C\": \"Phony Windows look-alike used for testing.\"
},
\"hidden\": false
}
]
}" ]; then
echo "$0: unexpected --list --format json output:"
echo "$json_list"
exit 1
fi

View File

@@ -0,0 +1,52 @@
#!/bin/bash -
# libguestfs virt-builder test script
# Copyright (C) 2013 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.
export LANG=C
set -e
abs_builddir=$(pwd)
export XDG_CONFIG_HOME=
export XDG_CONFIG_DIRS="$abs_builddir/test-config"
if [ ! -f fedora.xz -o ! -f fedora.qcow2 -o ! -f fedora.qcow2.xz ]; then
echo "$0: test skipped because there is no fedora.xz, fedora.qcow2 or fedora.qcow2.xz in the build directory"
exit 77
fi
if [ "$(../fish/guestfish get-backend)" = "uml" ]; then
echo "$0: test skipped because backend is UML"
exit 77
fi
rm -f planner-output
for input in phony-fedora phony-fedora-qcow2 phony-fedora-qcow2-uncompressed phony-fedora-no-format; do
for size in none 1G 1.1G 2G; do
for format in none raw qcow2; do
args="--output planner-output --no-cache --no-check-signature"
if [ "$size" != "none" ]; then args="$args --size $size"; fi
if [ "$format" != "none" ]; then args="$args --format $format"; fi
echo $VG ./virt-builder $input $args
$VG ./virt-builder $input $args
done
done
done
rm planner-output

View File

@@ -19,9 +19,15 @@
export LANG=C
set -e
abs_srcdir=$(cd $srcdir && pwd)
abs_builddir=$(pwd)
export VIRT_BUILDER_SOURCE=file://$abs_srcdir/test-index
export XDG_CONFIG_HOME=
export XDG_CONFIG_DIRS="$abs_builddir/test-config"
if [ -n "$SKIP_TEST_VIRT_BUILDER_SH" ]; then
echo "$0: skipping test because environment variable is set."
exit 77
fi
if [ ! -f fedora.xz ]; then
echo "$0: test skipped because there is no fedora.xz in the build directory"
@@ -49,16 +55,68 @@ rm -f $output
# Note we cannot test --install, --run since the phony Fedora doesn't
# have a real OS inside just some configuration files. Just about
# every other option is fair game.
./virt-builder phony-fedora \
$VG ./virt-builder phony-fedora \
-v --no-cache --no-check-signature $no_network \
-o $output --size 2G --format $format \
--arch x86_64 \
--hostname test.example.com \
--timezone Europe/London \
--root-password password:123456 \
--mkdir /etc/foo/bar/baz \
--write '/etc/foo/bar/baz/foo:Hello World' \
--upload Makefile:/Makefile \
--upload Makefile:/etc/foo/bar/baz \
--delete /Makefile \
--link /etc/foo/bar/baz/foo:/foo \
--link /etc/foo/bar/baz/foo:/foo1:/foo2:/foo3 \
--firstboot Makefile --firstboot-command 'echo "hello"' \
--firstboot-install "minicom,inkscape"
# XXX Test that the modifications were made.
# Check that some modifications were made.
$VG ../fish/guestfish --ro -i -a $output > test.out <<EOF
# Uploaded files
is-file /etc/foo/bar/baz/Makefile
cat /etc/foo/bar/baz/foo
is-symlink /foo
is-symlink /foo1
is-symlink /foo2
is-symlink /foo3
echo -----
# Hostname
cat /etc/sysconfig/network | grep HOSTNAME=
echo -----
# Timezone
is-file /usr/share/zoneinfo/Europe/London
is-symlink /etc/localtime
readlink /etc/localtime
echo -----
# Password
is-file /etc/shadow
cat /etc/shadow | sed -r '/^root:/!d;s,^(root:\\\$6\\\$).*,\\1,g'
EOF
if [ "$(cat test.out)" != "true
Hello World
true
true
true
true
-----
HOSTNAME=test.example.com
-----
true
true
/usr/share/zoneinfo/Europe/London
-----
true
root:\$6\$" ]; then
echo "$0: unexpected output:"
cat test.out
exit 1
fi
rm $output
rm test.out

View File

@@ -0,0 +1,8 @@
name=Phony Fedora
arch=x86_64
file=fedora.xz
format=raw
size=1073741824
expand=/dev/sda2
lvexpand=/dev/VG/Root
notes=Phony Fedora look-alike used for testing.

View File

View File

@@ -0,0 +1,2 @@
# All lines commented out.
# [foo]

View File

@@ -0,0 +1,24 @@
#!/bin/bash -
# test virt-index-validate
# 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.
export LANG=C
set -e
! $VG ./virt-index-validate test-virt-index-validate-bad-1
$VG ./virt-index-validate test-virt-index-validate-good-1
$VG ./virt-index-validate test-virt-index-validate-good-2

View File

@@ -0,0 +1,3 @@
[libguestfs.org]
uri=file://@abs_top_srcdir@/builder/website/index.asc
gpgkey=file://@abs_top_srcdir@/builder/libguestfs.gpg

55
builder/uname-c.c Normal file
View File

@@ -0,0 +1,55 @@
/* virt-builder
* 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.
*/
#include <config.h>
#include <errno.h>
#include <sys/utsname.h>
#include <caml/alloc.h>
#include <caml/fail.h>
#include <caml/memory.h>
#include <caml/mlvalues.h>
#ifdef HAVE_CAML_UNIXSUPPORT_H
#include <caml/unixsupport.h>
#else
#define Nothing ((value) 0)
extern void unix_error (int errcode, char * cmdname, value arg) Noreturn;
#endif
value
virt_builder_uname (value unit)
{
CAMLparam0 ();
CAMLlocal1 (rv);
struct utsname u;
if (uname (&u) < 0)
unix_error (errno, (char *) "uname", Val_int (0));
rv = caml_alloc (5, 0);
Store_field (rv, 0, caml_copy_string (u.sysname));
Store_field (rv, 1, caml_copy_string (u.nodename));
Store_field (rv, 2, caml_copy_string (u.release));
Store_field (rv, 3, caml_copy_string (u.version));
Store_field (rv, 4, caml_copy_string (u.machine));
CAMLreturn (rv);
}

27
builder/uname.ml Normal file
View File

@@ -0,0 +1,27 @@
(* virt-builder
* 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.
*)
type uname_struct = {
sysname : string;
nodename : string;
release : string;
version : string;
machine : string;
}
external uname : unit -> uname_struct = "virt_builder_uname"

28
builder/uname.mli Normal file
View File

@@ -0,0 +1,28 @@
(* virt-builder
* 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.
*)
type uname_struct = {
sysname : string;
nodename : string;
release : string;
version : string;
machine : string;
}
val uname : unit -> uname_struct
(** [uname] Tiny wrapper to the C [uname]. *)

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,90 @@
=head1 NAME
virt-index-validate - Validate virt-builder index file
=head1 SYNOPSIS
virt-index-validate index
=head1 DESCRIPTION
L<virt-builder(1)> uses an index file to store metadata about templates
that it knows how to use. This index file has a specific format which
virt-index-validate knows how to validate.
Note that virt-index-validate can validate either the signed or
unsigned index file (ie. either C<index> or C<index.asc>). It can
only validate a local file, not a URL.
=head1 OPTIONS
=over 4
=item B<--compat-1.24.0>
Check for compatibility with virt-builder 1.24.0. (Using this option
implies I<--compat-1.24.1>, so you don't need to use both.)
In particular:
=over 4
=item *
This version of virt-builder could not handle C<[...]>
(square brackets) in field names (eg. C<checksum[sha512]=...>).
=item *
It required detached signatures (C<sig=...>).
=back
=item B<--compat-1.24.1>
Check for compatibility with virt-builder E<ge> 1.24.1.
In particular:
=over 4
=item *
This version of virt-builder could not handle C<.> (period) in field
names or C<,> (comma) in subfield names.
=item *
It could not handle comments appearing in the file.
=back
=item B<--help>
Display help.
=item B<-V>
=item B<--version>
Display version number and exit.
=back
=head1 EXIT STATUS
This program returns 0 if the index file validates, or non-zero if
there was an error.
=head1 SEE ALSO
L<virt-builder(1)>,
L<http://libguestfs.org/>.
=head1 AUTHOR
Richard W.M. Jones L<http://people.redhat.com/~rjones/>
=head1 COPYRIGHT
Copyright (C) 2013 Red Hat Inc.

View File

@@ -0,0 +1,44 @@
# libguestfs virt-builder tool
# Copyright (C) 2013 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
EXTRA_DIST = \
.gitignore \
compress.sh \
test-guest.sh \
validate.sh \
README \
index \
index.asc \
centos.sh \
debian.preseed \
debian.sh \
fedora.sh \
rhel.sh \
scientificlinux.sh \
ubuntu.preseed \
ubuntu.sh
CLEANFILES = *~
# Validates the index file.
TESTS_ENVIRONMENT = $(top_builddir)/run --test
TESTS = validate.sh
check-valgrind:
$(MAKE) VG="$(top_builddir)/run @VG@" check

View File

@@ -25,7 +25,7 @@ directory.
ie:
./run ./builder/virt-builder fedora-20
./run virt-builder fedora-20
will fail unless you have downloaded fedora-20.xz here.

98
builder/website/centos.sh Executable file
View File

@@ -0,0 +1,98 @@
#!/bin/bash -
# virt-builder
# Copyright (C) 2013-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.
unset CDPATH
export LANG=C
set -e
set -x
if [ $# -ne 1 ]; then
echo "$0 VERSION"
exit 1
fi
version=$1
output=centos-$version
tmpname=tmp-$(tr -cd 'a-f0-9' < /dev/urandom | head -c 8)
case $version in
6)
# We rebuild this every time there is a new 6.x release, and bump
# the revision in the index.
tree=http://mirror.bytemark.co.uk/centos/$version/os/x86_64/
major=6
;;
7.*)
major=7
# XXX Need to fix the URL when 7.1 comes out.
tree=http://mirror.centos.org/centos-7/$major/os/x86_64/
;;
esac
rm -f $output $output.old $output.xz
# Generate the kickstart to a temporary file.
ks=$(mktemp)
cat > $ks <<'EOF'
install
text
reboot
lang en_US.UTF-8
keyboard us
network --bootproto dhcp
rootpw builder
firewall --enabled --ssh
selinux --enforcing
timezone --utc America/New_York
bootloader --location=mbr --append="console=tty0 console=ttyS0,115200 rd_NO_PLYMOUTH"
zerombr
clearpart --all --initlabel
part /boot --fstype=ext4 --size=512 --asprimary
part swap --size=1024 --asprimary
part / --fstype=ext4 --size=1024 --grow --asprimary
# Halt the system once configuration has finished.
poweroff
%packages
@core
%end
EOF
# Clean up function.
cleanup ()
{
rm -f $ks
virsh undefine $tmpname ||:
}
trap cleanup INT QUIT TERM EXIT ERR
virt-install \
--name=$tmpname \
--ram=2048 \
--cpu=host --vcpus=2 \
--os-type=linux --os-variant=rhel$major \
--initrd-inject=$ks \
--extra-args="ks=file:/`basename $ks` console=tty0 console=ttyS0,115200 proxy=$http_proxy" \
--disk $(pwd)/$output,size=6 \
--serial pty \
--location=$tree \
--nographics \
--noreboot
source $(dirname "$0")/compress.sh $output

View File

@@ -0,0 +1,38 @@
#!/bin/bash -
# virt-builder
# Copyright (C) 2013 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.
# Common code which syspreps, sparsifies and compresses the templates.
output=$1
# Sysprep (removes logfiles and so on).
# Note this also touches /.autorelabel so the further installation
# changes that we make will be labelled properly at first boot.
virt-sysprep -a $output
# Sparsify.
mv $output $output.old
virt-sparsify $output.old $output
rm $output.old
# Compress.
xz --best --block-size=16777216 $output
# Result. These can be copied into the index file directly.
echo -n compressed_size= ; stat -c %s $output.xz
echo -n checksum= ; sha512sum $output.xz | awk '{print $1}'

View File

@@ -1,17 +0,0 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (GNU/Linux)
iQIcBAABAgAGBQJSWY5TAAoJEJFzj3Pht2igCvMQAMVm82+6OLoQjWZ5MA14KFfF
I7/uJ5PRGDPoI+IjvSaVN3v7ZZxFSRbTdV51GaBjryxRGCVqpVF5b2sAgaFCzhSZ
DMuVNHUSH6Tjo/IER0B1/GCvTQYu0O/xgZHY5V3JeXDhXb+99PMFUKT5OD9RQD9E
ln41vI5wmFBxJuJKWBnQc8XI22FNFJN/yK4ZPbtd7fNSihWEmH95DNBsYlaAmYP1
ZYH4FeOIm0wXMiqF1GnLDduwFmQgNepGwaBAGJ3TYLhwRzgCfQxX3VW7/uHr+V9M
7P1SoBIzXztLvw2fS3ZY5/R7LIfTjEWDUkol7lTr+cqiqy6/hAPiOTDEVGP3DBzJ
OhjspK5gvscrXMGKj9P9O5sKJvbrxGFmAzwIhpwMc3WnimwOCGzCsKGMe6Ve6eqr
TKxpehsEacgNiBDpb7BSHNCJ6JcNwJKPzXTBRn85a3dr56K5olGbywZKRbzp8h1U
vVDBc1h7MP0xWTkIsriNHhNThAgGhsQc0ONCIGEX6ISXvSC97GHjB8kFP1ajpHJl
M0umRIHEneTIP0R+fIrbEAZyjr1SQW9o+vk2q2QK8GMhvGAHlEF3ubIisu1/OILU
C3GfuqqVU6dLQSzzuiD0Edl/kc+UJGaYHShhiRR/E9z9TnW1KnTcHG9dvY2CscfB
T+vKXH6tyXSsguuD1HiG
=ulbl
-----END PGP SIGNATURE-----

View File

@@ -1,385 +0,0 @@
#### Contents of the preconfiguration file (for wheezy)
### Localization
# Preseeding only locale sets language, country and locale.
d-i debian-installer/locale string en_US
# The values can also be preseeded individually for greater flexibility.
#d-i debian-installer/language string en
#d-i debian-installer/country string NL
#d-i debian-installer/locale string en_GB.UTF-8
# Optionally specify additional locales to be generated.
#d-i localechooser/supported-locales multiselect en_US.UTF-8, nl_NL.UTF-8
# Keyboard selection.
# keymap is an alias for keyboard-configuration/xkb-keymap
d-i keymap select us
# d-i keyboard-configuration/toggle select No toggling
### Network configuration
# Disable network configuration entirely. This is useful for cdrom
# installations on non-networked devices where the network questions,
# warning and long timeouts are a nuisance.
d-i netcfg/enable boolean true
# netcfg will choose an interface that has link if possible. This makes it
# skip displaying a list if there is more than one interface.
d-i netcfg/choose_interface select auto
# To pick a particular interface instead:
#d-i netcfg/choose_interface select eth1
# To set a different link detection timeout (default is 3 seconds).
# Values are interpreted as seconds.
#d-i netcfg/link_detection_timeout string 10
# If you have a slow dhcp server and the installer times out waiting for
# it, this might be useful.
#d-i netcfg/dhcp_timeout string 60
#d-i netcfg/dhcpv6_timeout string 60
# If you prefer to configure the network manually, uncomment this line and
# the static network configuration below.
#d-i netcfg/disable_autoconfig boolean true
# If you want the preconfiguration file to work on systems both with and
# without a dhcp server, uncomment these lines and the static network
# configuration below.
#d-i netcfg/dhcp_failed note
#d-i netcfg/dhcp_options select Configure network manually
# Static network configuration.
#
# IPv4 example
#d-i netcfg/get_ipaddress string 192.168.1.42
#d-i netcfg/get_netmask string 255.255.255.0
#d-i netcfg/get_gateway string 192.168.1.1
#d-i netcfg/get_nameservers string 192.168.1.1
#d-i netcfg/confirm_static boolean true
#
# IPv6 example
#d-i netcfg/get_ipaddress string fc00::2
#d-i netcfg/get_netmask string ffff:ffff:ffff:ffff::
#d-i netcfg/get_gateway string fc00::1
#d-i netcfg/get_nameservers string fc00::1
#d-i netcfg/confirm_static boolean true
# Any hostname and domain names assigned from dhcp take precedence over
# values set here. However, setting the values still prevents the questions
# from being shown, even if values come from dhcp.
d-i netcfg/get_hostname string unassigned-hostname
d-i netcfg/get_domain string unassigned-domain
# If you want to force a hostname, regardless of what either the DHCP
# server returns or what the reverse DNS entry for the IP is, uncomment
# and adjust the following line.
#d-i netcfg/hostname string somehost
# Disable that annoying WEP key dialog.
d-i netcfg/wireless_wep string
# The wacky dhcp hostname that some ISPs use as a password of sorts.
#d-i netcfg/dhcp_hostname string radish
# If non-free firmware is needed for the network or other hardware, you can
# configure the installer to always try to load it, without prompting. Or
# change to false to disable asking.
#d-i hw-detect/load_firmware boolean true
### Network console
# Use the following settings if you wish to make use of the network-console
# component for remote installation over SSH. This only makes sense if you
# intend to perform the remainder of the installation manually.
#d-i anna/choose_modules string network-console
#d-i network-console/authorized_keys_url string http://10.0.0.1/openssh-key
#d-i network-console/password password r00tme
#d-i network-console/password-again password r00tme
### Mirror settings
# If you select ftp, the mirror/country string does not need to be set.
#d-i mirror/protocol string ftp
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.uk.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string @CACHE@
# Suite to install.
#d-i mirror/suite string testing
# Suite to use for loading installer components (optional).
#d-i mirror/udeb/suite string testing
### Account setup
# Skip creation of a root account (normal user account will be able to
# use sudo).
#d-i passwd/root-login boolean false
# Alternatively, to skip creation of a normal user account.
d-i passwd/make-user boolean false
# Root password, either in clear text
d-i passwd/root-password password builder
d-i passwd/root-password-again password builder
# or encrypted using an MD5 hash.
#d-i passwd/root-password-crypted password [MD5 hash]
# To create a normal user account.
#d-i passwd/user-fullname string Debian User
#d-i passwd/username string debian
# Normal user's password, either in clear text
#d-i passwd/user-password password insecure
#d-i passwd/user-password-again password insecure
# or encrypted using an MD5 hash.
#d-i passwd/user-password-crypted password [MD5 hash]
# Create the first user with the specified UID instead of the default.
#d-i passwd/user-uid string 1010
# The user account will be added to some standard initial groups. To
# override that, use this.
#d-i passwd/user-default-groups string audio cdrom video
### Clock and time zone setup
# Controls whether or not the hardware clock is set to UTC.
d-i clock-setup/utc boolean true
# You may set this to any valid setting for $TZ; see the contents of
# /usr/share/zoneinfo/ for valid values.
d-i time/zone string US/Eastern
# Controls whether to use NTP to set the clock during the install
d-i clock-setup/ntp boolean true
# NTP server to use. The default is almost always fine here.
#d-i clock-setup/ntp-server string ntp.example.com
### Partitioning
## Partitioning example
# If the system has free space you can choose to only partition that space.
# This is only honoured if partman-auto/method (below) is not set.
#d-i partman-auto/init_automatically_partition select biggest_free
# Alternatively, you may specify a disk to partition. If the system has only
# one disk the installer will default to using that, but otherwise the device
# name must be given in traditional, non-devfs format (so e.g. /dev/hda or
# /dev/sda, and not e.g. /dev/discs/disc0/disc).
# For example, to use the first SCSI/SATA hard disk:
#d-i partman-auto/disk string /dev/sda
# In addition, you'll need to specify the method to use.
# The presently available methods are:
# - regular: use the usual partition types for your architecture
# - lvm: use LVM to partition the disk
# - crypto: use LVM within an encrypted partition
d-i partman-auto/method string regular
# If one of the disks that are going to be automatically partitioned
# contains an old LVM configuration, the user will normally receive a
# warning. This can be preseeded away...
d-i partman-lvm/device_remove_lvm boolean true
# The same applies to pre-existing software RAID array:
d-i partman-md/device_remove_md boolean true
# And the same goes for the confirmation to write the lvm partitions.
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
# You can choose one of the three predefined partitioning recipes:
# - atomic: all files in one partition
# - home: separate /home partition
# - multi: separate /home, /usr, /var, and /tmp partitions
d-i partman-auto/choose_recipe select atomic
# Or provide a recipe of your own...
# If you have a way to get a recipe file into the d-i environment, you can
# just point at it.
#d-i partman-auto/expert_recipe_file string /hd-media/recipe
# If not, you can put an entire recipe into the preconfiguration file in one
# (logical) line. This example creates a small /boot partition, suitable
# swap, and uses the rest of the space for the root partition:
#d-i partman-auto/expert_recipe string \
# boot-root :: \
# 40 50 100 ext3 \
# $primary{ } $bootable{ } \
# method{ format } format{ } \
# use_filesystem{ } filesystem{ ext3 } \
# mountpoint{ /boot } \
# . \
# 500 10000 1000000000 ext3 \
# method{ format } format{ } \
# use_filesystem{ } filesystem{ ext3 } \
# mountpoint{ / } \
# . \
# 64 512 300% linux-swap \
# method{ swap } format{ } \
# .
# The full recipe format is documented in the file partman-auto-recipe.txt
# included in the 'debian-installer' package or available from D-I source
# repository. This also documents how to specify settings such as file
# system labels, volume group names and which physical devices to include
# in a volume group.
# This makes partman automatically partition without confirmation, provided
# that you told it what to do using one of the methods above.
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
## Partitioning using RAID
# The method should be set to "raid".
#d-i partman-auto/method string raid
# Specify the disks to be partitioned. They will all get the same layout,
# so this will only work if the disks are the same size.
#d-i partman-auto/disk string /dev/sda /dev/sdb
# Next you need to specify the physical partitions that will be used.
#d-i partman-auto/expert_recipe string \
# multiraid :: \
# 1000 5000 4000 raid \
# $primary{ } method{ raid } \
# . \
# 64 512 300% raid \
# method{ raid } \
# . \
# 500 10000 1000000000 raid \
# method{ raid } \
# .
# Last you need to specify how the previously defined partitions will be
# used in the RAID setup. Remember to use the correct partition numbers
# for logical partitions. RAID levels 0, 1, 5, 6 and 10 are supported;
# devices are separated using "#".
# Parameters are:
# <raidtype> <devcount> <sparecount> <fstype> <mountpoint> \
# <devices> <sparedevices>
#d-i partman-auto-raid/recipe string \
# 1 2 0 ext3 / \
# /dev/sda1#/dev/sdb1 \
# . \
# 1 2 0 swap - \
# /dev/sda5#/dev/sdb5 \
# . \
# 0 2 0 ext3 /home \
# /dev/sda6#/dev/sdb6 \
# .
# For additional information see the file partman-auto-raid-recipe.txt
# included in the 'debian-installer' package or available from D-I source
# repository.
# This makes partman automatically partition without confirmation.
d-i partman-md/confirm boolean true
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
## Controlling how partitions are mounted
# The default is to mount by UUID, but you can also choose "traditional" to
# use traditional device names, or "label" to try filesystem labels before
# falling back to UUIDs.
#d-i partman/mount_style select uuid
### Base system installation
# Configure APT to not install recommended packages by default. Use of this
# option can result in an incomplete system and should only be used by very
# experienced users.
#d-i base-installer/install-recommends boolean false
# The kernel image (meta) package to be installed; "none" can be used if no
# kernel is to be installed.
#d-i base-installer/kernel/image string linux-image-486
### Apt setup
# You can choose to install non-free and contrib software.
#d-i apt-setup/non-free boolean true
#d-i apt-setup/contrib boolean true
# Uncomment this if you don't want to use a network mirror.
#d-i apt-setup/use_mirror boolean false
# Select which update services to use; define the mirrors to be used.
# Values shown below are the normal defaults.
#d-i apt-setup/services-select multiselect security, volatile
#d-i apt-setup/security_host string security.debian.org
#d-i apt-setup/volatile_host string volatile.debian.org
# Additional repositories, local[0-9] available
#d-i apt-setup/local0/repository string \
# http://local.server/debian stable main
#d-i apt-setup/local0/comment string local server
# Enable deb-src lines
#d-i apt-setup/local0/source boolean true
# URL to the public key of the local repository; you must provide a key or
# apt will complain about the unauthenticated repository and so the
# sources.list line will be left commented out
#d-i apt-setup/local0/key string http://local.server/key
# By default the installer requires that repositories be authenticated
# using a known gpg key. This setting can be used to disable that
# authentication. Warning: Insecure, not recommended.
#d-i debian-installer/allow_unauthenticated boolean true
### Package selection
#tasksel tasksel/first multiselect standard, web-server
# If the desktop task is selected, install the kde and xfce desktops
# instead of the default gnome desktop.
#tasksel tasksel/desktop multiselect kde, xfce
# Individual additional packages to install
#d-i pkgsel/include string openssh-server build-essential
# Whether to upgrade packages after debootstrap.
# Allowed values: none, safe-upgrade, full-upgrade
#d-i pkgsel/upgrade select none
# Some versions of the installer can report back on what software you have
# installed, and what software you use. The default is not to report back,
# but sending reports helps the project determine what software is most
# popular and include it on CDs.
popularity-contest popularity-contest/participate boolean false
### Finishing up the installation
# During installations from serial console, the regular virtual consoles
# (VT1-VT6) are normally disabled in /etc/inittab. Uncomment the next
# line to prevent this.
#d-i finish-install/keep-consoles boolean true
# Avoid that last message about the install being complete.
d-i finish-install/reboot_in_progress note
# This will prevent the installer from ejecting the CD during the reboot,
# which is useful in some situations.
#d-i cdrom-detect/eject boolean false
# This is how to make the installer shutdown when finished, but not
# reboot into the installed system.
#d-i debian-installer/exit/halt boolean true
# This will power off the machine instead of just halting it.
#d-i debian-installer/exit/poweroff boolean true
### Preseeding other packages
# Depending on what software you choose to install, or if things go wrong
# during the installation process, it's possible that other questions may
# be asked. You can preseed those too, of course. To get a list of every
# possible question that could be asked during an install, do an
# installation, and then run these commands:
# debconf-get-selections --installer > file
# debconf-get-selections >> file
#### Advanced options
### Running custom commands during the installation
# d-i preseeding is inherently not secure. Nothing in the installer checks
# for attempts at buffer overflows or other exploits of the values of a
# preconfiguration file like this one. Only use preconfiguration files from
# trusted locations! To drive that home, and because it's generally useful,
# here's a way to run any shell command you'd like inside the installer,
# automatically.
# This first command is run as early as possible, just after
# preseeding is read.
#d-i preseed/early_command string anna-install some-udeb
# This command is run immediately before the partitioner starts. It may be
# useful to apply dynamic partitioner preseeding that depends on the state
# of the disks (which may not be visible when preseed/early_command runs).
#d-i partman/early_command \
# string debconf-set partman-auto/disk "$(list-devices disk | head -n1)"
# This command is run just before the install finishes, but when there is
# still a usable /target directory. You can chroot to /target and use it
# directly, or use the apt-install and in-target commands to easily install
# packages and run commands in the target system.
#d-i preseed/late_command string apt-install zsh; in-target chsh -s /bin/zsh

View File

@@ -1,17 +0,0 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (GNU/Linux)
iQIcBAABAgAGBQJSTbVGAAoJEJFzj3Pht2igBfsP/2EdkKhGLoFW8SxHv8rbxYtS
VlbC5OaLhSosCerrZnna1qeKuR4i1CoDT08WfYRD5JQ4WnsaeckRWANcl9VKU1rL
Efc1RCis815b4YbsA/acmc9pT7XxduF0GiV/NYWsFnZj+K/NI7UrgX0aolC21ZvZ
uVnJ1Be5GICa0CXgNfwkFHb2gCBIaPhasxGaFuAspzWyQ8fVsfiDTxuO2jtJJJc/
l00oZ0JMW0f30ux9K9PXF0rdIEX7h13RxZVLcw55Nfl389gQK5yVmyCLvcmsSZ6a
K9O1ffPenRD5E1kpAy1xwDUz+7uUyqa5hXyxjB7qaCwIUGvF3FBIuePmK0XXPkh0
NF73sb3DXKTJgT1t2LmKg4QprX/8b97ZfrMIpu5KRF7WnxqdGeaNK87lnZQFMxRW
kgCXzdJ9qfilOMcAkj6omHw6Fj7NXwS8+t6fNZwCsLx6uHKRx2lllG6yxbkoT/VS
Gs2CSHVOZ94ByaiIUTzOzonwcjy0e7eqLzqIJETcuCedLNKoNW2mpwA23dae8U9q
x2r9l/C6z27Ofn23wJrbWM/hwrofH249N+nxALqwb3joPxtdsMFVE+GW8GF0dBl8
KJAIponJ2FWssiL2YsDk8EfvgsQKQVWuPOMCmczl+CVpPr+sslpO0RabGOIvjyOO
4B5d0Kq92X8Rlx7KAln8
=DdNg
-----END PGP SIGNATURE-----

View File

@@ -20,57 +20,59 @@
# http://honk.sigxcpu.org/con/Preseeding_Debian_virtual_machines_with_virt_install.html
# https://wiki.debian.org/DebianInstaller/Preseed
unset CDPATH
export LANG=C
set -e
set -x
if [ $# -ne 2 ]; then
echo "$0 VERSION DIST"
exit 1
fi
# Some configuration.
export http_proxy=http://cache.home.annexia.org:3128
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
location=http://ftp.uk.debian.org/debian/dists/squeeze/main/installer-amd64
version=$1
dist=$2
location=http://ftp.uk.debian.org/debian/dists/$dist/main/installer-amd64
output=debian-$version
tmpname=tmp-$(tr -cd 'a-f0-9' < /dev/urandom | head -c 8)
rm -f $output $output.old $output.xz
# Make sure it's being run from the correct directory.
if [ ! -f debian-6.preseed ]; then
if [ ! -f debian.preseed ]; then
echo "You are running this script from the wrong directory."
exit 1
fi
pwd=`pwd`
# Note that the injected file must be called "/preseed.cfg" in order
# for d-i to pick it up.
sed -e "s,@CACHE@,$http_proxy,g" < debian-6.preseed > preseed.cfg
sed -e "s,@CACHE@,$http_proxy,g" < debian.preseed > preseed.cfg
virsh undefine tmpd6 ||:
rm -f debian-6 debian-6.old
# Clean up function.
cleanup ()
{
rm -f preseed.cfg
virsh undefine $tmpname ||:
}
trap cleanup INT QUIT TERM EXIT ERR
virt-install \
--name tmpd6 \
--name=$tmpname \
--ram=1024 \
--os-type=linux --os-variant=debiansqueeze \
--initrd-inject=$pwd/preseed.cfg \
--os-type=linux --os-variant=debian$dist \
--initrd-inject=$(pwd)/preseed.cfg \
--extra-args="auto console=tty0 console=ttyS0,115200" \
--disk=$pwd/debian-6,size=4 \
--disk=$(pwd)/$output,size=4 \
--serial pty \
--location=$location \
--nographics \
--noreboot
# The virt-install command should exit after complete installation.
# Remove the guest, we don't want it to be defined in libvirt.
virsh undefine tmpd6
rm preseed.cfg
# Remove apt proxy configuration (thanks: Daniel Miranda).
guestfish -a $output -i <<EOF
rm /etc/apt/apt.conf
touch /etc/apt/apt.conf
EOF
# Sysprep (removes logfiles and so on).
virt-sysprep -a debian-6
# Sparsify.
mv debian-6 debian-6.old
virt-sparsify debian-6.old debian-6
rm debian-6.old
# Compress.
rm -f debian-6.xz
xz --best --block-size=$((16*1024*1024)) debian-6
# Result:
ls -lh debian-6.xz
source $(dirname "$0")/compress.sh $output

View File

@@ -1,75 +0,0 @@
#!/bin/bash -
# virt-builder
# Copyright (C) 2013 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
set -x
# Some configuration.
export http_proxy=http://cache.home.annexia.org:3128
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
tree=http://mirror.bytemark.co.uk/fedora/linux/releases/18/Fedora/x86_64/os/
# Currently you have to run this script as root.
if [ `id -u` -ne 0 ]; then
echo "You have to run this script as root."
exit 1
fi
# Make sure it's being run from the correct directory.
if [ ! -f fedora-18.ks ]; then
echo "You are running this script from the wrong directory."
exit 1
fi
pwd=`pwd`
virsh undefine tmpf18 ||:
rm -f fedora-18 fedora-18.old
virt-install \
--name=tmpf18 \
--ram 2048 \
--cpu=host --vcpus=2 \
--os-type=linux --os-variant=fedora18 \
--initrd-inject=$pwd/fedora-18.ks \
--extra-args="ks=file:/fedora-18.ks console=tty0 console=ttyS0,115200 proxy=$http_proxy" \
--disk $pwd/fedora-18,size=6 \
--location=$tree \
--nographics \
--noreboot
# The virt-install command should exit after complete installation.
# Remove the guest, we don't want it to be defined in libvirt.
virsh undefine tmpf18
# Sysprep (removes logfiles and so on).
# Note this also touches /.autorelabel so the further installation
# changes that we make will be labelled properly at first boot.
virt-sysprep -a fedora-18
# Sparsify.
mv fedora-18 fedora-18.old
virt-sparsify fedora-18.old fedora-18
rm fedora-18.old
# Compress.
rm -f fedora-18.xz
xz --best --block-size=16777216 fedora-18
# Result:
ls -lh fedora-18.xz

View File

@@ -1,17 +0,0 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (GNU/Linux)
iQIcBAABAgAGBQJSSt3OAAoJEJFzj3Pht2ig8x4QAKoQVfMWxXiFvV3lrHUVsjpG
n+fDcoFJqMKeE/kMLhmlmzF+QDz1qRs3Xlypy7C8B5ii5jbFVCv6q5edeEWrVYE3
HZOeNgUgmVJEiCSgScEXPpVMAOL/zppJ2PjAbg7CNLHQ64HweNkv6F1ePg4NCIoA
Op5yIvzm0gUHN9ONfsJRBLlZGQRu8bdsNhdYOAr3rmdxhuuunIi/17qNrT6eaWFO
2pnGFIyYMn9q2ReXBG8mFIkHlac9ZpT2sR7EKY3LBt0FvGz0qQrNM+9M9bQBwbIQ
dD/IRfSUUQqjCLYLqiFvFVC/pqAAcR1G2rQ20jRLPkpSUFceFL/K5ueI2flEPEJk
mF6WR4MsN4lX4w0iiJvpWwE0jqlLVQ1GnhoE2GDZEHgkth/4l+0pN0Jos8OKINDJ
wB4W1Xc2aXNXaD1JAaebu+CthZNnFEXpa5TrXMFAOnBY4oQ4DgOt/ad1s9Ju4zLX
EI+Zn0Q++l+iMyU2InXnTHoaTagqKqtngvHWGmSuK55dM8jW9HoYsjZZl0oC0lVz
GbXQ/1t1loTBqh+crr4kcP0oKvRFT9YPASadUVThmeYlxOyhvQ0e30IBdz0Te1OR
rqfymVGR8NsGdLW+jCKOfbLEaYShTksTnUmr+yF5w5D2uzZHqZasE7cpwPXAEhuZ
TF7ZoSqz1utSQF9/xBnz
=L4x6
-----END PGP SIGNATURE-----

View File

@@ -1,75 +0,0 @@
#!/bin/bash -
# virt-builder
# Copyright (C) 2013 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
set -x
# Some configuration.
export http_proxy=http://cache.home.annexia.org:3128
export https_proxy=$http_proxy
export ftp_proxy=$http_proxy
tree=http://mirror.bytemark.co.uk/fedora/linux/releases/19/Fedora/x86_64/os/
# Currently you have to run this script as root.
if [ `id -u` -ne 0 ]; then
echo "You have to run this script as root."
exit 1
fi
# Make sure it's being run from the correct directory.
if [ ! -f fedora-19.ks ]; then
echo "You are running this script from the wrong directory."
exit 1
fi
pwd=`pwd`
virsh undefine tmpf19 ||:
rm -f fedora-19 fedora-19.old
virt-install \
--name=tmpf19 \
--ram 2048 \
--cpu=host --vcpus=2 \
--os-type=linux --os-variant=fedora19 \
--initrd-inject=$pwd/fedora-19.ks \
--extra-args="ks=file:/fedora-19.ks console=tty0 console=ttyS0,115200 proxy=$http_proxy" \
--disk $pwd/fedora-19,size=4 \
--location=$tree \
--nographics \
--noreboot
# The virt-install command should exit after complete installation.
# Remove the guest, we don't want it to be defined in libvirt.
virsh undefine tmpf19
# Sysprep (removes logfiles and so on).
# Note this also touches /.autorelabel so the further installation
# changes that we make will be labelled properly at first boot.
virt-sysprep -a fedora-19
# Sparsify.
mv fedora-19 fedora-19.old
virt-sparsify fedora-19.old fedora-19
rm fedora-19.old
# Compress.
rm -f fedora-19.xz
xz --best --block-size=16777216 fedora-19
# Result:
ls -lh fedora-19.xz

View File

@@ -1,17 +0,0 @@
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (GNU/Linux)
iQIcBAABAgAGBQJSSt3WAAoJEJFzj3Pht2igSeMQAI42FK1YU6Fr/LreD9/BdjNH
TUJ3L/B3ZMJwlMT+F4cX9r1uVD5udzpXdClUEcKgdwPdqzPsQvuwLSBS4fn38nZM
mryzNeUjbcNPSPSY6bj/MNuYNlYNaWShhL6UjHBD6XYIhAs6hYp0RGcogcpgRU9Z
0peHFyJBp+uUqCpnBDz00zJht49mgT6ovUA3cGd/vPhHrsrJUusgzzi46X3F90+H
9eRoe6/xzCbmbiD7HUlARnMK8ec0b7H/CWsNNCd0v9KBNyW9QROkbwBMtRcWtQZW
p9h9JGT2N3AmIqRbUbKwfWxGN6AfK+Xtl9YjJb/ugwSlw0Pif055EKNeUZjGUUzk
V4YA9b1Z6mncyL4wxV8VD9w8en+dr5Iu6ga02r7Xr0rIHuTQyQQaKfHvNoWZFmhq
WI2xsSBLr1EYfLEetdqUkEo2f2gpy7f6UKL1bsHi/6oqA3NaOOXiPdVlbVDNOQFe
kXPfjz/8hnzQ/8O/zIiSiDefQObdM4DQDTk5ha/vOu4pt5XevHkusaciPNGUAhx1
JmxEmPF6sqg2Y0xmeFZB2ab5s6VL/CfVGBF5ZFq7QmDj9eNFjrElfv+uN9NqD+ll
YlR/g3f7vFLHSG64ez4yV/Hgmfv1+4DMGi9MNmhFF3u0W5AIxznTsQzj1KFhbvmV
8QUyTDG7lGNqsgsSgb7W
=l9GJ
-----END PGP SIGNATURE-----

96
builder/website/fedora.sh Executable file
View File

@@ -0,0 +1,96 @@
#!/bin/bash -
# virt-builder
# Copyright (C) 2013 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 was used to create the Fedora templates used by
# virt-builder.
unset CDPATH
export LANG=C
set -e
set -x
if [ $# -ne 1 ]; then
echo "$0 VERSION"
exit 1
fi
version=$1
tree=http://mirror.bytemark.co.uk/fedora/linux/releases/$version/Fedora/x86_64/os/
output=fedora-$version
tmpname=tmp-$(tr -cd 'a-f0-9' < /dev/urandom | head -c 8)
rm -f $output $output.old $output.xz
# Generate the kickstart to a temporary file.
ks=$(mktemp)
cat > $ks <<'EOF'
install
text
reboot
lang en_US.UTF-8
keyboard us
network --bootproto dhcp
rootpw builder
firewall --enabled --ssh
selinux --enforcing
timezone --utc America/New_York
bootloader --location=mbr --append="console=tty0 console=ttyS0,115200 rd_NO_PLYMOUTH"
zerombr
clearpart --all --initlabel
autopart --type=plain
# Halt the system once configuration has finished.
poweroff
%packages
@core
%end
%post
# Enable Xen domU support:
pushd /etc/dracut.conf.d
echo 'add_drivers+="xen:vbd xen:vif"' > virt-builder-xen-drivers.conf
popd
# Rerun dracut for the installed kernel (not the running kernel):
KERNEL_VERSION=$(rpm -q kernel --qf '%{version}-%{release}.%{arch}\n')
dracut -f /boot/initramfs-$KERNEL_VERSION.img $KERNEL_VERSION
%end
EOF
# Clean up function.
cleanup ()
{
rm -f $ks
virsh undefine $tmpname ||:
}
trap cleanup INT QUIT TERM EXIT ERR
virt-install \
--name=$tmpname \
--ram=2048 \
--cpu=host --vcpus=2 \
--os-type=linux --os-variant=fedora18 \
--initrd-inject=$ks \
--extra-args="ks=file:/`basename $ks` console=tty0 console=ttyS0,115200 proxy=$http_proxy" \
--disk $(pwd)/$output,size=6 \
--serial pty \
--location=$tree \
--nographics \
--noreboot
source $(dirname "$0")/compress.sh $output

View File

@@ -1,17 +1,84 @@
[centos-6]
name=CentOS 6.5
osinfo=centos6.5
arch=x86_64
file=centos-6.xz
revision=5
checksum=8f08505ec708b04a25bbd21816cdda8a5eff8bbf85fec3caff6d7a9a7bfba07dafa707e60772f5676c437a6d3381cd26b4e48bc82a232bc940ca9dcddcff7a85
format=raw
size=6442450944
compressed_size=197139324
expand=/dev/sda3
notes=CentOS 6.5
This CentOS image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs source tree:
builder/website/centos.sh
Note that `virt-builder centos-6' will always install the latest
6.x release.
[centos-7.0]
name=CentOS 7.0
osinfo=centos7.0
arch=x86_64
file=centos-7.0.xz
checksum=cf9ae295f633fbd04e575eeca16f372e933c70c3107c44eb06864760d04354aa94b4f356bfc9a598c138e687304a52e96777e4467e7db1ec0cb5b2d2ec61affc
format=raw
size=6442450944
compressed_size=213203844
expand=/dev/sda3
notes=CentOS 7.0
This CentOS image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs source tree:
builder/website/centos.sh
[cirros-0.3.1]
name=CirrOS 0.3.1
arch=x86_64
file=cirros-0.3.1.xz
checksum=096209f00eb62d5722accf3d22ca3a4ee5baaac6d7d4ce0be93b56bbd1c8ab2e3eb4f5db1deffcb570e2c3d41f4d721798a1c499675346cee9546554a4b10388
format=raw
size=41126400
compressed_size=11419004
expand=/dev/sda1
notes=CirrOS 0.3.1
CirrOS is a commonly used test image, ideal because it is very
small and boots into a minimally usable Linux system.
Note this is not a real Linux distribution, and several virt-builder
features such as installing packages will not (and cannot) work.
This CirrOS image comes from https://launchpad.net/cirros
[debian-6]
name=Debian 6 (Squeeze)
osinfo=debian6
arch=x86_64
file=debian-6.xz
sig=debian-6.xz.sig
revision=2
checksum=bff9c28da0375fde65fa238d7a2ea644cbfad0ea3246783a2f44a98f2374850987679c3f1032a632d3c6238de8d9e43291d07a82efc1e824945000e206b9f6cc
format=raw
size=4294967296
compressed_size=141531780
compressed_size=139615908
expand=/dev/sda1
notes=This is a default Debian 6 (Squeeze) install.
notes=Debian 6 (Squeeze).
This is a default Debian install.
The preseed and virt-install scripts that produced this image
can be found in the libguestfs git tree:
libguestfs.git/builder/website/debian-6.preseed
libguestfs.git/builder/website/debian-6.sh
can be found in the libguestfs source tree:
builder/website/debian.preseed
builder/website/debian.sh
This image is so very minimal that it only includes an ssh
server and no virtual consoles. To enable virtual consoles
@@ -19,21 +86,31 @@ notes=This is a default Debian 6 (Squeeze) install.
virt-builder debian-6 \
--edit '/etc/inittab: s,^#([1-9].*respawn.*/sbin/getty.*),$1,'
This image does not contain SSH host keys. To regenerate them use:
--firstboot-command "dpkg-reconfigure openssh-server"
[debian-7]
name=Debian 7 (Wheezy)
osinfo=debian7
arch=x86_64
file=debian-7.xz
sig=debian-7.xz.sig
revision=2
checksum=c980a7d878c086b14619b3b9f644ab131c1f88b87729062f2832de12a938ba9e5a511c49402a9d02b740a30876f51889d20e7d0ed4997755f542650b8485f013
format=raw
size=4294967296
compressed_size=149230076
compressed_size=150734028
expand=/dev/sda1
notes=This is a default Debian 7 (Wheezy) install.
notes=Debian 7 (Wheezy).
This is a default Debian install.
The preseed and virt-install scripts that produced this image
can be found in the libguestfs git tree:
libguestfs.git/builder/website/debian-7.preseed
libguestfs.git/builder/website/debian-7.sh
can be found in the libguestfs source tree:
builder/website/debian.preseed
builder/website/debian.sh
This image is so very minimal that it only includes an ssh
server and no virtual consoles. To enable virtual consoles
@@ -41,21 +118,29 @@ notes=This is a default Debian 7 (Wheezy) install.
virt-builder debian-7 \
--edit '/etc/inittab: s,^#([1-9].*respawn.*/sbin/getty.*),$1,'
This image does not contain SSH host keys. To regenerate them use:
--firstboot-command "dpkg-reconfigure openssh-server"
[fedora-18]
name=Fedora® 18
osinfo=fedora18
arch=x86_64
file=fedora-18.xz
sig=fedora-18.xz.sig
checksum=12435775193b69f6e22658aaa001d4ca9b15fd68a04b4b7e9be20b3b517e857e417dc3268a302979d4a702b20f25754025f7ae0e9fb7088419a4ca1669585e6f
format=raw
size=6442450944
compressed_size=148947524
expand=/dev/sda3
notes=This Fedora image contains only unmodified @Core group packages.
notes=Fedora 18.
This Fedora image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs git tree:
libguestfs.git/builder/website/fedora-18.ks
libguestfs.git/builder/website/fedora-18.sh
found in the libguestfs source tree:
builder/website/fedora.sh
Fedora and the Infinity design logo are trademarks of Red Hat, Inc.
Source and further information is available from http://fedoraproject.org/
@@ -63,65 +148,170 @@ notes=This Fedora image contains only unmodified @Core group packages.
[fedora-19]
name=Fedora® 19
osinfo=fedora19
arch=x86_64
file=fedora-19.xz
sig=fedora-19.xz.sig
revision=2
checksum=acecd8d4bca0d6a3f937e0c9386f3185c916df3eaf5f825988c73d41e946a6dc4fda06cdd74a12bc60932edd65846097547b11aca2309a61dd6d0e91ab9d16f3
format=raw
size=4294967296
compressed_size=172190964
compressed_size=169531628
expand=/dev/sda3
notes=This Fedora image contains only unmodified @Core group packages.
notes=Fedora 19.
This Fedora image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs git tree:
libguestfs.git/builder/website/fedora-19.ks
libguestfs.git/builder/website/fedora-19.sh
found in the libguestfs source tree:
builder/website/fedora.sh
Fedora and the Infinity design logo are trademarks of Red Hat, Inc.
Source and further information is available from http://fedoraproject.org/
[fedora-20]
name=Fedora® 20
osinfo=fedora20
arch=x86_64
file=fedora-20.xz
revision=2
checksum=983a1b33c34cb311ea3a283f06312d24dc81041b64ebc90e40ef2fd7587362acd1a5654b13252f9f57001870aa95495065537e730d5225b49389c1a0478cb028
format=raw
size=4294967296
compressed_size=181164220
expand=/dev/sda3
notes=Fedora 20.
This Fedora image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs source tree:
builder/website/fedora.sh
Fedora and the Infinity design logo are trademarks of Red Hat, Inc.
Source and further information is available from http://fedoraproject.org/
[rhel-7rc]
name=Red Hat Enterprise Linux® 7 Release Candidate
arch=x86_64
file=rhel-7rc.xz
checksum=c4252cfdf7482d4289de24f78e7fd1b9c9b6ff702d717a1c2a54a341b0565c03a5c8e95d32e1f23f7afe5ed2cf5b8e0f0ee3e16c1179e01348a54f82cb552c0f
format=raw
size=6442450944
compressed_size=210202084
expand=/dev/sda3
notes=Red Hat Enterprise Linux® 7 Release Candidate
This image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs source tree:
builder/website/rhel.sh
Red Hat Enterprise Linux is a trademark of Red Hat, Inc.
Source and further information is available from ftp://ftp.redhat.com
[scientificlinux-6]
name=Scientific Linux 6.5
osinfo=centos6.5
arch=x86_64
file=scientificlinux-6.xz
revision=5
checksum=be42b0e97d256ab5476079fe71411bebf59abe9c6ff4a7d27330aa5383fac9507472c06d11ef061d3c0e6695bec5ac9cfb7fbfd86fdbb5649e5cb535e2ac5b88
format=raw
size=6442450944
compressed_size=191667880
expand=/dev/sda3
notes=Scientific Linux 6.5
This Scientific Linux image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs source tree:
builder/website/scientificlinux.sh
Note that `virt-builder scientificlinux-6' will always install the
latest 6.x release.
[ubuntu-10.04]
name=Ubuntu 10.04 (Lucid)
osinfo=ubuntulucid
arch=x86_64
file=ubuntu-10.04.xz
sig=ubuntu-10.04.xz.sig
checksum=9e322782bc77c740ce956d57d0d89ec9ac9f2b890c474ac937f400db848df3e164683eaf4631b989f8b4771f64e0c0972452d1555a15c65714b5ceefb295fb7e
format=raw
size=4294967296
compressed_size=149728112
expand=/dev/sda1
notes=This is a minimal Ubuntu 10.04 (Lucid) install.
notes=Ubuntu 10.04 (Lucid).
This is a minimal Ubuntu 10.04 (Lucid) install.
Only the openssh-server package is selected in tasksel.
The preseed and virt-install scripts that produced this image
can be found in the libguestfs git tree:
libguestfs.git/builder/website/ubuntu-10.04.preseed
libguestfs.git/builder/website/ubuntu-10.04.sh
can be found in the libguestfs source tree:
builder/website/ubuntu.preseed
builder/website/ubuntu.sh
This image does not contain SSH host keys. To regenerate them use:
--firstboot-command "dpkg-reconfigure openssh-server"
[ubuntu-12.04]
name=Ubuntu 12.04 (Precise)
osinfo=ubuntuprecise
arch=x86_64
file=ubuntu-12.04.xz
sig=ubuntu-12.04.xz.sig
checksum=15eab4610a44bf28423c08982cec47f6c3d43f29834791440249916ed76cc2dfeaf0405fddc8627086257bbbdaa4016c8982ad9b269f57f8f625b0e70d09e4e0
format=raw
size=4294967296
compressed_size=168593316
expand=/dev/sda1
notes=This is a minimal Ubuntu 12.04 (Precise) install.
notes=Ubuntu 12.04 (Precise).
This is a minimal Ubuntu 12.04 (Precise) install.
Only the openssh-server package is selected in tasksel.
The preseed and virt-install scripts that produced this image
can be found in the libguestfs git tree:
libguestfs.git/builder/website/ubuntu-12.04.preseed
libguestfs.git/builder/website/ubuntu-12.04.sh
can be found in the libguestfs source tree:
builder/website/ubuntu.preseed
builder/website/ubuntu.sh
This image does not contain SSH host keys. To regenerate them use:
--firstboot-command "dpkg-reconfigure openssh-server"
[ubuntu-13.10]
name=Ubuntu 13.10 (Saucy)
osinfo=ubuntusaucy
file=ubuntu-13.10.xz
sig=ubuntu-13.10.xz.sig
[ubuntu-14.04]
name=Ubuntu 14.04 (Trusty)
osinfo=ubuntutrusty
arch=x86_64
file=ubuntu-14.04.xz
checksum=dbc5505c7cfbfb48275b09e91f781dfd7f8d521db577f0c31e0a70b13fbd18c8bcec97b1e274b28062ebc3aba70d68e64c84b9c9690ff7dfca9e81f813047e8a
format=raw
size=4294967296
compressed_size=196481392
compressed_size=206250764
expand=/dev/sda1
notes=This is a minimal Ubuntu 13.10 (Saucy) install.
notes=Ubuntu 14.04 (Trusty).
This is a minimal Ubuntu 14.04 (Trusty) install.
Only the openssh-server package is selected in tasksel.
The preseed and virt-install scripts that produced this image
can be found in the libguestfs git tree:
libguestfs.git/builder/website/ubuntu-13.10.preseed
libguestfs.git/builder/website/ubuntu-13.10.sh
can be found in the libguestfs source tree:
builder/website/ubuntu.preseed
builder/website/ubuntu.sh
This image does not contain SSH host keys. To regenerate them use:
--firstboot-command "dpkg-reconfigure openssh-server"
IMPORTANT NOTE: It seems to be impossible to create an Ubuntu >= 14.04
image using preseed without creating a user account. Therefore this
image contains a user account 'builder'. I have disabled it, so that
people who don't read release notes don't get caught out, but you might
still wish to delete it completely.

View File

@@ -1,20 +1,87 @@
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
[centos-6]
name=CentOS 6.5
osinfo=centos6.5
arch=x86_64
file=centos-6.xz
revision=5
checksum=8f08505ec708b04a25bbd21816cdda8a5eff8bbf85fec3caff6d7a9a7bfba07dafa707e60772f5676c437a6d3381cd26b4e48bc82a232bc940ca9dcddcff7a85
format=raw
size=6442450944
compressed_size=197139324
expand=/dev/sda3
notes=CentOS 6.5
This CentOS image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs source tree:
builder/website/centos.sh
Note that `virt-builder centos-6' will always install the latest
6.x release.
[centos-7.0]
name=CentOS 7.0
osinfo=centos7.0
arch=x86_64
file=centos-7.0.xz
checksum=cf9ae295f633fbd04e575eeca16f372e933c70c3107c44eb06864760d04354aa94b4f356bfc9a598c138e687304a52e96777e4467e7db1ec0cb5b2d2ec61affc
format=raw
size=6442450944
compressed_size=213203844
expand=/dev/sda3
notes=CentOS 7.0
This CentOS image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs source tree:
builder/website/centos.sh
[cirros-0.3.1]
name=CirrOS 0.3.1
arch=x86_64
file=cirros-0.3.1.xz
checksum=096209f00eb62d5722accf3d22ca3a4ee5baaac6d7d4ce0be93b56bbd1c8ab2e3eb4f5db1deffcb570e2c3d41f4d721798a1c499675346cee9546554a4b10388
format=raw
size=41126400
compressed_size=11419004
expand=/dev/sda1
notes=CirrOS 0.3.1
CirrOS is a commonly used test image, ideal because it is very
small and boots into a minimally usable Linux system.
Note this is not a real Linux distribution, and several virt-builder
features such as installing packages will not (and cannot) work.
This CirrOS image comes from https://launchpad.net/cirros
[debian-6]
name=Debian 6 (Squeeze)
osinfo=debian6
arch=x86_64
file=debian-6.xz
sig=debian-6.xz.sig
revision=2
checksum=bff9c28da0375fde65fa238d7a2ea644cbfad0ea3246783a2f44a98f2374850987679c3f1032a632d3c6238de8d9e43291d07a82efc1e824945000e206b9f6cc
format=raw
size=4294967296
compressed_size=141531780
compressed_size=139615908
expand=/dev/sda1
notes=This is a default Debian 6 (Squeeze) install.
notes=Debian 6 (Squeeze).
This is a default Debian install.
The preseed and virt-install scripts that produced this image
can be found in the libguestfs git tree:
libguestfs.git/builder/website/debian-6.preseed
libguestfs.git/builder/website/debian-6.sh
can be found in the libguestfs source tree:
builder/website/debian.preseed
builder/website/debian.sh
This image is so very minimal that it only includes an ssh
server and no virtual consoles. To enable virtual consoles
@@ -22,21 +89,31 @@ notes=This is a default Debian 6 (Squeeze) install.
virt-builder debian-6 \
--edit '/etc/inittab: s,^#([1-9].*respawn.*/sbin/getty.*),$1,'
This image does not contain SSH host keys. To regenerate them use:
--firstboot-command "dpkg-reconfigure openssh-server"
[debian-7]
name=Debian 7 (Wheezy)
osinfo=debian7
arch=x86_64
file=debian-7.xz
sig=debian-7.xz.sig
revision=2
checksum=c980a7d878c086b14619b3b9f644ab131c1f88b87729062f2832de12a938ba9e5a511c49402a9d02b740a30876f51889d20e7d0ed4997755f542650b8485f013
format=raw
size=4294967296
compressed_size=149230076
compressed_size=150734028
expand=/dev/sda1
notes=This is a default Debian 7 (Wheezy) install.
notes=Debian 7 (Wheezy).
This is a default Debian install.
The preseed and virt-install scripts that produced this image
can be found in the libguestfs git tree:
libguestfs.git/builder/website/debian-7.preseed
libguestfs.git/builder/website/debian-7.sh
can be found in the libguestfs source tree:
builder/website/debian.preseed
builder/website/debian.sh
This image is so very minimal that it only includes an ssh
server and no virtual consoles. To enable virtual consoles
@@ -44,21 +121,29 @@ notes=This is a default Debian 7 (Wheezy) install.
virt-builder debian-7 \
--edit '/etc/inittab: s,^#([1-9].*respawn.*/sbin/getty.*),$1,'
This image does not contain SSH host keys. To regenerate them use:
--firstboot-command "dpkg-reconfigure openssh-server"
[fedora-18]
name=Fedora® 18
osinfo=fedora18
arch=x86_64
file=fedora-18.xz
sig=fedora-18.xz.sig
checksum=12435775193b69f6e22658aaa001d4ca9b15fd68a04b4b7e9be20b3b517e857e417dc3268a302979d4a702b20f25754025f7ae0e9fb7088419a4ca1669585e6f
format=raw
size=6442450944
compressed_size=148947524
expand=/dev/sda3
notes=This Fedora image contains only unmodified @Core group packages.
notes=Fedora 18.
This Fedora image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs git tree:
libguestfs.git/builder/website/fedora-18.ks
libguestfs.git/builder/website/fedora-18.sh
found in the libguestfs source tree:
builder/website/fedora.sh
Fedora and the Infinity design logo are trademarks of Red Hat, Inc.
Source and further information is available from http://fedoraproject.org/
@@ -66,82 +151,187 @@ notes=This Fedora image contains only unmodified @Core group packages.
[fedora-19]
name=Fedora® 19
osinfo=fedora19
arch=x86_64
file=fedora-19.xz
sig=fedora-19.xz.sig
revision=2
checksum=acecd8d4bca0d6a3f937e0c9386f3185c916df3eaf5f825988c73d41e946a6dc4fda06cdd74a12bc60932edd65846097547b11aca2309a61dd6d0e91ab9d16f3
format=raw
size=4294967296
compressed_size=172190964
compressed_size=169531628
expand=/dev/sda3
notes=This Fedora image contains only unmodified @Core group packages.
notes=Fedora 19.
This Fedora image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs git tree:
libguestfs.git/builder/website/fedora-19.ks
libguestfs.git/builder/website/fedora-19.sh
found in the libguestfs source tree:
builder/website/fedora.sh
Fedora and the Infinity design logo are trademarks of Red Hat, Inc.
Source and further information is available from http://fedoraproject.org/
[fedora-20]
name=Fedora® 20
osinfo=fedora20
arch=x86_64
file=fedora-20.xz
revision=2
checksum=983a1b33c34cb311ea3a283f06312d24dc81041b64ebc90e40ef2fd7587362acd1a5654b13252f9f57001870aa95495065537e730d5225b49389c1a0478cb028
format=raw
size=4294967296
compressed_size=181164220
expand=/dev/sda3
notes=Fedora 20.
This Fedora image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs source tree:
builder/website/fedora.sh
Fedora and the Infinity design logo are trademarks of Red Hat, Inc.
Source and further information is available from http://fedoraproject.org/
[rhel-7rc]
name=Red Hat Enterprise Linux® 7 Release Candidate
arch=x86_64
file=rhel-7rc.xz
checksum=c4252cfdf7482d4289de24f78e7fd1b9c9b6ff702d717a1c2a54a341b0565c03a5c8e95d32e1f23f7afe5ed2cf5b8e0f0ee3e16c1179e01348a54f82cb552c0f
format=raw
size=6442450944
compressed_size=210202084
expand=/dev/sda3
notes=Red Hat Enterprise Linux® 7 Release Candidate
This image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs source tree:
builder/website/rhel.sh
Red Hat Enterprise Linux is a trademark of Red Hat, Inc.
Source and further information is available from ftp://ftp.redhat.com
[scientificlinux-6]
name=Scientific Linux 6.5
osinfo=centos6.5
arch=x86_64
file=scientificlinux-6.xz
revision=5
checksum=be42b0e97d256ab5476079fe71411bebf59abe9c6ff4a7d27330aa5383fac9507472c06d11ef061d3c0e6695bec5ac9cfb7fbfd86fdbb5649e5cb535e2ac5b88
format=raw
size=6442450944
compressed_size=191667880
expand=/dev/sda3
notes=Scientific Linux 6.5
This Scientific Linux image contains only unmodified @Core group packages.
It is thus very minimal. The kickstart and install script can be
found in the libguestfs source tree:
builder/website/scientificlinux.sh
Note that `virt-builder scientificlinux-6' will always install the
latest 6.x release.
[ubuntu-10.04]
name=Ubuntu 10.04 (Lucid)
osinfo=ubuntulucid
arch=x86_64
file=ubuntu-10.04.xz
sig=ubuntu-10.04.xz.sig
checksum=9e322782bc77c740ce956d57d0d89ec9ac9f2b890c474ac937f400db848df3e164683eaf4631b989f8b4771f64e0c0972452d1555a15c65714b5ceefb295fb7e
format=raw
size=4294967296
compressed_size=149728112
expand=/dev/sda1
notes=This is a minimal Ubuntu 10.04 (Lucid) install.
notes=Ubuntu 10.04 (Lucid).
This is a minimal Ubuntu 10.04 (Lucid) install.
Only the openssh-server package is selected in tasksel.
The preseed and virt-install scripts that produced this image
can be found in the libguestfs git tree:
libguestfs.git/builder/website/ubuntu-10.04.preseed
libguestfs.git/builder/website/ubuntu-10.04.sh
can be found in the libguestfs source tree:
builder/website/ubuntu.preseed
builder/website/ubuntu.sh
This image does not contain SSH host keys. To regenerate them use:
--firstboot-command "dpkg-reconfigure openssh-server"
[ubuntu-12.04]
name=Ubuntu 12.04 (Precise)
osinfo=ubuntuprecise
arch=x86_64
file=ubuntu-12.04.xz
sig=ubuntu-12.04.xz.sig
checksum=15eab4610a44bf28423c08982cec47f6c3d43f29834791440249916ed76cc2dfeaf0405fddc8627086257bbbdaa4016c8982ad9b269f57f8f625b0e70d09e4e0
format=raw
size=4294967296
compressed_size=168593316
expand=/dev/sda1
notes=This is a minimal Ubuntu 12.04 (Precise) install.
notes=Ubuntu 12.04 (Precise).
This is a minimal Ubuntu 12.04 (Precise) install.
Only the openssh-server package is selected in tasksel.
The preseed and virt-install scripts that produced this image
can be found in the libguestfs git tree:
libguestfs.git/builder/website/ubuntu-12.04.preseed
libguestfs.git/builder/website/ubuntu-12.04.sh
can be found in the libguestfs source tree:
builder/website/ubuntu.preseed
builder/website/ubuntu.sh
This image does not contain SSH host keys. To regenerate them use:
--firstboot-command "dpkg-reconfigure openssh-server"
[ubuntu-13.10]
name=Ubuntu 13.10 (Saucy)
osinfo=ubuntusaucy
file=ubuntu-13.10.xz
sig=ubuntu-13.10.xz.sig
[ubuntu-14.04]
name=Ubuntu 14.04 (Trusty)
osinfo=ubuntutrusty
arch=x86_64
file=ubuntu-14.04.xz
checksum=dbc5505c7cfbfb48275b09e91f781dfd7f8d521db577f0c31e0a70b13fbd18c8bcec97b1e274b28062ebc3aba70d68e64c84b9c9690ff7dfca9e81f813047e8a
format=raw
size=4294967296
compressed_size=196481392
compressed_size=206250764
expand=/dev/sda1
notes=This is a minimal Ubuntu 13.10 (Saucy) install.
notes=Ubuntu 14.04 (Trusty).
This is a minimal Ubuntu 14.04 (Trusty) install.
Only the openssh-server package is selected in tasksel.
The preseed and virt-install scripts that produced this image
can be found in the libguestfs git tree:
libguestfs.git/builder/website/ubuntu-13.10.preseed
libguestfs.git/builder/website/ubuntu-13.10.sh
can be found in the libguestfs source tree:
builder/website/ubuntu.preseed
builder/website/ubuntu.sh
This image does not contain SSH host keys. To regenerate them use:
--firstboot-command "dpkg-reconfigure openssh-server"
IMPORTANT NOTE: It seems to be impossible to create an Ubuntu >= 14.04
image using preseed without creating a user account. Therefore this
image contains a user account 'builder'. I have disabled it, so that
people who don't read release notes don't get caught out, but you might
still wish to delete it completely.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (GNU/Linux)
Version: GnuPG v1
iQIcBAEBAgAGBQJSWbIpAAoJEJFzj3Pht2igW1gP/2+vFhng/117EB8Wja2Yx9+f
xOhrJdJOyGXGFBzUTqVCY8vIdY0VNSJRV6UleKfXqMSNEuH91+hQKiIfTwz+aYLB
Q9eGJmsa+86JhanKk/TS37gJGHgvfeezKBAy7At5rFmQsXYxgjqSatu3qCM/S+Qk
F8fbdaSlAXGnfNCTCu4RAoA1HcoFSBL+5cJb6rfz5jWuw4pb+2Lb0sDWuBAjO1GI
xfuF9+VsltZm36Wv6zHJL2VT7WA0h7FaMCz/xzbqrGZfCPnQh/rJpvSI6Q+k/Vk4
oiwCiNYfvYuCrOFYqy0can6qCI/4/PJUU4bb+KEvPnksFF42ZGB6INGZWbSheUU2
dGI0usyHuzJBPNQn7LXq8+/fHR7XyWUXHIVF97s6o/LJ05+ObxbiQl/4/LQh7Ls/
ry0J6p9NdXCLazmM8R7OOthkmtsQVOh54OSYuvy69/wsPPuds01YDtQnmUN5hCt+
Ik9qedWmOQOy2/b1ZXBg9xYuvk4wng82P8ESIvMOvg3yr8gutYbx6C333BZU6ly3
D6/d284lJuTfzmiUNGCKWIPtNsCC3ZgjjELPz4OCT2aq7wYrfNJrV6+Kiau7sD8V
keC7nERZaRjPHxkScLaCBwBkMbMeDKP6syDkPja8rPw8/e3IA6taqzZ6vcq1+9Nh
Cdr5jKji1cChryROJR3U
=pp6M
iQIcBAEBAgAGBQJTu7WkAAoJEJFzj3Pht2igRNYQAKlLcgtJ9uMMmP70d93fT9dP
o1Ui29qpXYGEyD5hm+39Dy86FrUYGRbXIMZZX1mS4mkPYfD4zcD6sx0anhEkfSBq
wBGAQgMHDO1voFHJHpydmqDd3F60DRBycIZnGr9kDcpdwo/AgFcCGZWYSdBR5uSs
X1oIwZtWRy03rKBDBoCS/XQ68JP3rw9wjQHvOewMijmpVSYcTUQybBhSNsd9Yrdd
sulALoaJTjjWhQv8XDXI6iQSO9Q7+MWz08fLRqFv8tNkAeWSfIPchVtUHF0WvUVR
VnVVJEc/hb+MJoYEFAU84wRsryy9frii8C5d2y89oAJB7nX+axS1smkTDxBcZPEQ
mdAxkoZC1wFlryhgnNIQXDZBwxmIuMHUldExR8FZA8nmSh0SPWGrq9ofpZh0u8N1
oxSoauDrzWHJuhU15gR+1K3uoidVGTXHM+A4us/flJ0qNJ8+kZuxtSgvcXzha39K
uSmgk/APGnumKwr8VB9DaM6eC5VqKFnHKk3PttRS+G2bkdUHakcu5TWd0Fr2ISmW
RJRwQYodd2SLH/bJ3mdR99Uv5ObkzBzq9IIqCD3squPm9Qh6cQUOaJ1bgwMCuvQN
rx0y9K0CYBg6pPfNgEiRmtItqrJUgvgQEQBfQOQmbcXYTX089HNuTBTXLPWBLiRH
HE/+U5EuzjFGZzUasFmn
=bMpw
-----END PGP SIGNATURE-----

181
builder/website/rhel.sh Executable file
View File

@@ -0,0 +1,181 @@
#!/bin/bash -
# virt-builder
# Copyright (C) 2013 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
export LANG=C
set -e
set -x
# Hack for RWMJ
unset http_proxy
if [ $# -ne 1 ]; then
echo "$0 VERSION"
exit 1
fi
version=$1
output=rhel-$version
tmpname=tmp-$(tr -cd 'a-f0-9' < /dev/urandom | head -c 8)
guestroot=/dev/sda3
case $version in
5.*)
major=5
minor=`echo $version | awk -F. '{print $2}'`
topurl=http://download.devel.redhat.com/released/RHEL-$major-Server/U$minor
tree=$topurl/x86_64/os/Server
srpms=$topurl/source/SRPMS
bootfs=ext2
rootfs=ext4
guestroot=/dev/sda2
;;
6.*)
major=6
topurl=http://download.devel.redhat.com/released/RHEL-$major/$version
tree=$topurl/Server/x86_64/os
srpms=$topurl/source/SRPMS
optional=$topurl/Server/optional/x86_64/os
optionalsrpms=$topurl/Server/optional/source/SRPMS
bootfs=ext4
rootfs=ext4
;;
7.*)
major=7
topurl=http://download.devel.redhat.com/released/RHEL-$major/$version
tree=$topurl/Server/x86_64/os
srpms=$topurl/source/SRPMS
optional=$topurl/Server-optional/x86_64/os
optionalsrpms=$topurl/Server-optional/source/tree
bootfs=ext4
rootfs=xfs
;;
*)
echo "$0: version $version not supported by this script yet"
exit 1
esac
rm -f $output $output.old $output.xz
# Generate the kickstart to a temporary file.
ks=$(mktemp)
cat > $ks <<'EOF'
install
text
lang en_US.UTF-8
keyboard us
network --bootproto dhcp
rootpw builder
firewall --enabled --ssh
selinux --enforcing
timezone --utc America/New_York
EOF
if [ $major -eq 5 ]; then
cat >> $ks <<EOF
key --skip
EOF
fi
cat >> $ks <<EOF
bootloader --location=mbr --append="console=tty0 console=ttyS0,115200 rd_NO_PLYMOUTH"
zerombr
clearpart --all --initlabel
part /boot --fstype=$bootfs --size=512 --asprimary
part swap --size=1024 --asprimary
part / --fstype=$rootfs --size=1024 --grow --asprimary
# Halt the system once configuration has finished.
poweroff
%packages
@core
EOF
# RHEL 5 didn't understand the %end directive, but RHEL >= 6
# requires it.
if [ $major -ge 6 ]; then
cat >> $ks <<EOF
%end
EOF
fi
# Yum configuration.
yum=$(mktemp)
cat > $yum <<EOF
[rhel$major]
name=RHEL $major Server
baseurl=$tree
enabled=1
gpgcheck=0
keepcache=0
[rhel$major-source]
name=RHEL $major Server Source
baseurl=$srpms
enabled=0
gpgcheck=0
keepcache=0
EOF
if [ -n "$optional" ]; then
cat >> $yum <<EOF
[rhel$major-optional]
name=RHEL $major Server Optional
baseurl=$optional
enabled=1
gpgcheck=0
keepcache=0
[rhel$major-optional-source]
name=RHEL $major Server Optional
baseurl=$optionalsrpms
enabled=0
gpgcheck=0
keepcache=0
EOF
fi
# Clean up function.
cleanup ()
{
rm -f $ks
rm -f $yum
virsh undefine $tmpname ||:
}
trap cleanup INT QUIT TERM EXIT ERR
virt-install \
--name=$tmpname \
--ram=2048 \
--cpu=host --vcpus=2 \
--os-type=linux --os-variant=rhel$major \
--initrd-inject=$ks \
--extra-args="ks=file:/`basename $ks` console=tty0 console=ttyS0,115200" \
--disk $(pwd)/$output,size=6 \
--serial pty \
--location=$tree \
--nographics \
--noreboot
# We have to replace yum config so it doesn't try to use RHN (it
# won't be registered).
guestfish --rw -a $output -m $guestroot \
upload $yum /etc/yum.repos.d/download.devel.redhat.com.repo
source $(dirname "$0")/compress.sh $output

View File

@@ -0,0 +1,89 @@
#!/bin/bash -
# virt-builder
# Copyright (C) 2013 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
export LANG=C
set -e
set -x
if [ $# -ne 1 ]; then
echo "$0 VERSION"
exit 1
fi
version=$1
output=scientificlinux-$version
tmpname=tmp-$(tr -cd 'a-f0-9' < /dev/urandom | head -c 8)
major=$(echo $version | awk -F. '{print $1}')
# We rebuild this every time there is a new 6.x release, and bump
# the revision in the index.
tree=http://www.mirrorservice.org/sites/ftp.scientificlinux.org/linux/scientific/$version/x86_64/os
rm -f $output $output.old $output.xz
# Generate the kickstart to a temporary file.
ks=$(mktemp)
cat > $ks <<'EOF'
install
text
reboot
lang en_US.UTF-8
keyboard us
network --bootproto dhcp
rootpw builder
firewall --enabled --ssh
selinux --enforcing
timezone --utc America/New_York
bootloader --location=mbr --append="console=tty0 console=ttyS0,115200 rd_NO_PLYMOUTH"
zerombr
clearpart --all --initlabel
part /boot --fstype=ext4 --size=512 --asprimary
part swap --size=1024 --asprimary
part / --fstype=ext4 --size=1024 --grow --asprimary
# Halt the system once configuration has finished.
poweroff
%packages
@core
%end
EOF
# Clean up function.
cleanup ()
{
rm -f $ks
virsh undefine $tmpname ||:
}
trap cleanup INT QUIT TERM EXIT ERR
virt-install \
--name=$tmpname \
--ram=2048 \
--cpu=host --vcpus=2 \
--os-type=linux --os-variant=rhel$major \
--initrd-inject=$ks \
--extra-args="ks=file:/`basename $ks` console=tty0 console=ttyS0,115200 proxy=$http_proxy" \
--disk $(pwd)/$output,size=6 \
--serial pty \
--location=$tree \
--nographics \
--noreboot
source $(dirname "$0")/compress.sh $output

90
builder/website/test-guest.sh Executable file
View File

@@ -0,0 +1,90 @@
#!/bin/bash -
# virt-builder
# Copyright (C) 2013 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 not part of the automated test suite. It's a manual test
# run by the maintainer which must be run on each new guest to ensure
# that all the virt-builder features work on the new guest.
#
# Usage:
# ./run builder/website/test-guest.sh os-version [extra virt-builder args]
# Then read the instructions ...
export LANG=C
set -e
if [ ! -x builder/virt-builder ]; then
echo "$0: running the test from the wrong directory, or libguestfs has not been built"
exit 1
fi
if [ $# -lt 1 ]; then
echo "$0: missing os-version"
echo "try: ./run builder/virt-builder -l"
exit 1
fi
osversion="$1"
shift
output="$osversion.img"
builder/virt-builder "$osversion" \
--no-cache -v \
--size 10G \
--root-password password:123456 \
--hostname test.example.com \
--install scrub \
--edit '/etc/issue: s/(.*)/$lineno: $1/' \
--upload builder/virt-builder.pod:/virt-builder.pod \
--run-command 'echo RUN COMMAND 1 >> /run-command.log' \
--run-command 'echo RUN COMMAND 2 >> /run-command.log' \
--run-command 'echo RUN COMMAND 3 >> /run-command.log' \
--firstboot-command 'useradd -m -p "" rjones ; chage -d 0 rjones' \
--firstboot-command 'echo FIRSTBOOT COMMAND 1' \
--firstboot-command 'echo FIRSTBOOT COMMAND 2' \
--firstboot-command 'echo FIRSTBOOT COMMAND 3' \
"$@" |& tee "$osversion.log"
# Boot the guest.
qemu-system-x86_64 \
-m 1024 \
-drive "file=$output,format=raw,snapshot=on,if=ide" &
cat <<EOF
========================================
The "$osversion" guest is being booted.
The trace file is here: "$osversion.log"
Checklist:
1: Root password is 123456
2: Hostname is test.example.com
3: scrub package is installed
4: /etc/issue has line numbers
5: /virt-builder.pod exists and looks reasonable
6: /run-command.log exists and has 3 lines in correct order
7: /root/virt-sysprep-firstboot.log exists and has 3 entries in correct order
8: rjones account exists, with no password
9: rjones password must be changed at first login
10: /home/rjones exists and is populated
11: random-seed file was created or modified
========================================
EOF
#rm $output

View File

@@ -1,85 +0,0 @@
#!/bin/bash -
# libguestfs
# Copyright (C) 2013 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.
# The basic plan comes from:
# http://honk.sigxcpu.org/con/Preseeding_Debian_virtual_machines_with_virt_install.html
# https://wiki.debian.org/DebianInstaller/Preseed
# https://help.ubuntu.com/10.04/installation-guide/i386/preseed-using.html
set -e
set -x
# Some configuration.
#export http_proxy=http://squid.corp.redhat.com:3128
#export https_proxy=$http_proxy
#export ftp_proxy=$http_proxy
location=http://archive.ubuntu.net/ubuntu/dists/lucid/main/installer-amd64
# Currently you have to run this script as root.
if [ `id -u` -ne 0 ]; then
echo "You have to run this script as root."
exit 1
fi
# Make sure it's being run from the correct directory.
if [ ! -f ubuntu-10.04.preseed ]; then
echo "You are running this script from the wrong directory."
exit 1
fi
pwd=`pwd`
# Note that the injected file must be called "/preseed.cfg" in order
# for d-i to pick it up.
sed -e "s,@CACHE@,$http_proxy,g" < ubuntu-10.04.preseed > preseed.cfg
name=tmplucid
virsh undefine $name ||:
rm -f ubuntu-10.04 ubuntu-10.04.old
virt-install \
--name $name \
--ram=1024 \
--os-type=linux --os-variant=ubuntulucid \
--initrd-inject=$pwd/preseed.cfg \
--extra-args="auto console=tty0 console=ttyS0,115200" \
--disk=$pwd/ubuntu-10.04,size=4 \
--location=$location \
--nographics \
--noreboot
# The virt-install command should exit after complete installation.
# Remove the guest, we don't want it to be defined in libvirt.
virsh undefine $name
rm preseed.cfg
# Sysprep (removes logfiles and so on).
virt-sysprep -a ubuntu-10.04
# Sparsify.
mv ubuntu-10.04 ubuntu-10.04.old
virt-sparsify ubuntu-10.04.old ubuntu-10.04
rm ubuntu-10.04.old
# Compress.
rm -f ubuntu-10.04.xz
xz --best --block-size=16777216 ubuntu-10.04
# Result:
ls -lh ubuntu-10.04.xz

Some files were not shown because too many files have changed in this diff Show More