New APIs: base64-in and base64-out for uploading/downloading base64 content.
[libguestfs.git] / TODO
diff --git a/TODO b/TODO
index 72e8cd4..56b429a 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,60 +1,61 @@
-Ideas for the Python bindings:
-https://www.redhat.com/archives/fedora-virt/2009-April/msg00114.html
+TODO list for libguestfs
+======================================================================
 
 
-----------------------------------------------------------------------
+This list contains random ideas and musings on features we could add
+to libguestfs in future.
 
 
-We badly need to actually implement the FTP server mentioned in the
-documentation.
+   - RWMJ
 
 
-Or: Implement a FUSE-based filesystem.  See the FUSE mountlo
-project which does something similar, albeit only to single
-filesystems:
+FUSE API
+--------
 
 
-http://sourceforge.net/project/showfiles.php?group_id=121684&package_id=150116
+The API needs more test coverage, particularly lesser-used system
+calls.
 
 
-----------------------------------------------------------------------
+The big unresolved issue is UID/GID mapping between guest filesystem
+IDs and the host.  It's not easy to automate this because you need
+extra details about the guest itself in order to get to its
+UID->username map (eg. /etc/passwd from the guest).
+
+BufferIn
+--------
+
+BufferIn should turn into <char *, int> and simple strings in other
+languages that can handle 8 bit clean strings.
 
 
-BufferIn and BufferOut should turn into <char *, int> and simple
-strings in other languages that can handle 8 bit clean strings.
 Limit on transfers would still be 2MB for these types.
  - then implement write-file properly
 Limit on transfers would still be 2MB for these types.
  - then implement write-file properly
- - and implement read-file
 
 
-----------------------------------------------------------------------
+febootstrap / debootstrap inside appliance
+------------------------------------------
 
 
-Implement febootstrap command.
+This was originally proposed as a way to install new operating systems
+in the appliance.  However no one has come up with a workable
+solution.
 
 
-----------------------------------------------------------------------
+Haskell bindings
+----------------
 
 Complete the Haskell bindings (see discussion on haskell-cafe).
 
 
 Complete the Haskell bindings (see discussion on haskell-cafe).
 
-----------------------------------------------------------------------
-
-Complete the bindings tests - must test the return values and
-error cases.
-
-----------------------------------------------------------------------
+Complete bind tests
+-------------------
 
 
-For virt-inspector:
+Complete the bind tests - must test the return values and error cases.
 
 
- - Make a libvirt XML config
+virt-inspector - make libvirt XML
+---------------------------------
 
 
- - Test over available OSes
+It should be possible to generate libvirt XML from virt-inspector
+data, at least partially.  This would be just another output type so:
 
 
- - Add 'reged' / NT registry support.
+ virt-inspector --libvirt guest.img
 
 
-----------------------------------------------------------------------
-
-Use virtio_blk by default.  It's faster and more natural.
-Unfortunately it seems like this will rename all devices - see next
-item.
-
-Note: virtio_blk *IS* supported by all our minimum platforms,
-ie. CentOS 5.3, Fedora 11, Debian.
-
-----------------------------------------------------------------------
+Note that recent versions of libvirt/virt-install allow guests to be
+imported, so this is not so useful any more.
 
 "Standalone/local mode"
 
 "Standalone/local mode"
+-----------------------
 
 Instead of running guestfsd (the daemon) inside qemu, there should be
 an option to just run guestfsd directly.
 
 Instead of running guestfsd (the daemon) inside qemu, there should be
 an option to just run guestfsd directly.
@@ -93,41 +94,17 @@ This is mainly useful from live CDs, ie. virt-p2v.
 Should we bother having the daemon at all and just link the guestfsd
 code directly into libguestfs?
 
 Should we bother having the daemon at all and just link the guestfsd
 code directly into libguestfs?
 
-----------------------------------------------------------------------
-
-PPC problems:
+Supermin appliance to febootstrap
+---------------------------------
 
 
-  ppc (32 bit) works with qemu from git, however there is no serial console
+Supermin appliance functionality should be moved into febootstrap.
 
 
-  ppc64 requires extra parameters:
-    -M mac99 -cpu ppc64
-  however it still fails:
-    invalid/unsupported opcode: 01 - 01 - 1a (06301e83) 00000000018c2738 1
-    invalid bits: 00400000 for opcode: 0b - 19 - 15 (2d746572) 0000000000009230
-
-  no serial console in ppc or ppc64 because no one can tell us what
-  console=ttyXX option to use
-
-----------------------------------------------------------------------
-
-Supermin appliance should be moved into febootstrap.
-
-----------------------------------------------------------------------
-
-Extra commands / functionality:
+Ideas for extra commands
+------------------------
 
   General glibc / core programs:
     chgrp
 
   General glibc / core programs:
     chgrp
-    grep (do it locally using pipe?)
-    dd (?)
-    ln / ln -s
-    readlink
-    utime / utimes / futimes / futimens / l..
     more mk*temp calls
     more mk*temp calls
-    readdir / readdir-and-stat
-    some sort of alloc/fallocate/posix_fallocate call to create empty space
-    realpath
-    trunc[ate??]
 
   ext2 properties:
     chattr
 
   ext2 properties:
     chattr
@@ -152,28 +129,145 @@ Extra commands / functionality:
     pivot_root
     fts(3) / ftw(3)
 
     pivot_root
     fts(3) / ftw(3)
 
-----------------------------------------------------------------------
+Other initrd-* commands
+-----------------------
 
 
-Allow swap space from the guest to be used.  Is it a good idea?
+Such as:
 
 
-----------------------------------------------------------------------
+initrd-extract
+initrd-replace
 
 
-Need a way to query a binary or library file for its architecture.
-Using objdump or readelf?
-What about non-ELF files (eg. Windows, BSD).
+Simple editing of configuration files
+-------------------------------------
 
 
-To do this properly requires some serious logic, eg. to cover Linux
-and Windows we'd need objdump and i686-pc-mingw32-objdump, and more to
-cover a.out, COFF and 64 bit Windows.  Therefore this cannot be done
-inside the daemon, and should be done by a separate, external program
-similar to virt-inspector.
+Some easy non-Augeas methods to edit configuration files.
+I'm thinking:
 
 
-Probably we should go all the way and have virt-inspector able to
-determine kernel and userspace architectures of guests.
+  replace /etc/file key value
 
 
-----------------------------------------------------------------------
+which would look in /etc/file for any instances of
 
 
-Other initrd-* commands, such as:
+  key=...
+  key ...
+  key:...
 
 
-initrd-extract
-initrd-replace
+and replace them with
+
+  key=value
+  key value
+  key:value
+
+That would solve about 50% of reconfiguration needs, and for the
+rest you'd use Augeas, 'download'+'upload' or 'edit'.
+
+RWMJ: I had a go at implementing this, but it's quite error-prone to
+do this sort of editing inside the C-based daemon code.  It's far
+better to do it with Augeas, or else to use an external language like
+Perl.
+
+Quick Perl scripts
+------------------
+
+Currently we can't do Perl "one-liners".  ie. The current syntax for
+any short Perl one-liner would be:
+
+  perl -MSys::Guestfs -e '$g = Sys::Guestfs->new(); $g->add_drive ("foo"); $g->launch; $g->mount ("/dev/sda1", "/"); ....'
+
+You can see we're well beyond a single line just getting to the point
+of adding drives and mounting.
+
+First suggestion:
+
+ $h = create ($filename, \"/dev/sda1\" => \"/\");
+
+ $h = create ([$file1, $file2], \"/dev/sda1\" => \"/\");
+
+To mount read-only, add C<ro =E<gt> 1> like this:
+
+ $h = create ($filename, \"/dev/sda1\" => \"/\", ro => 1);
+
+which is equivalent to the following sequence of calls:
+
+ $h = Sys::Guestfs->new ();
+ $h->set_autosync (1);
+ $h->add_drive_ro ($filename);
+ $h->launch ();
+ $h->mount_ro (\"/dev/sda1\", \"/\");
+
+Command-line form would be:
+
+ perl -MSys::Guestfs=:all -e '$_=create("guest.img", "/dev/sda1" => "/"); $_->cat ("/etc/fstab");'
+
+That's not brief enough for one-liners, so we could have an extra
+autogenerated module which creates a Sys::Guestfs handle singleton
+(the handle is an implicit global variable as in guestfish), eg:
+
+ perl -MSys::Guestfs::One -e 'inspect("guest.img"); cat ("/etc/fstab");'
+
+How would editing files work?
+
+ntfsclone
+---------
+
+Useful imaging tool:
+http://man.linux-ntfs.org/ntfsclone.8.html
+
+Standard images
+---------------
+
+Equip guestfish with some standard images that it can load
+quickly, eg:
+
+  load ext2
+
+Maybe it's better to create these on the fly?
+
+virt-rescue pty
+---------------
+
+See:
+http://search.cpan.org/~rgiersig/IO-Tty-1.08/Pty.pm
+http://www.perlmonks.org/index.pl?node_id=582185
+
+Note that pty requires cooperation inside the C code too (there are
+two sides to a pty, and one has to be handled after the fork).
+
+Windows-based daemon/appliance
+------------------------------
+
+See discussion on list:
+https://www.redhat.com/archives/libguestfs/2009-November/msg00165.html
+
+qemu locking
+------------
+
+Add -drive file=...,lock=exclusive and -drive file=...,lock=shared
+
+Change libguestfs and libvirt to do the right thing, so that multiple
+instances of qemu cannot stomp on each other.
+
+virt-disk-explore
+-----------------
+
+For multi-level disk images such as live CDs:
+http://rwmj.wordpress.com/2009/07/15/unpack-the-russian-doll-of-a-f11-live-cd/
+
+It's possible with libguestfs to recursively look for anything that
+might be a filesystem, mount-{,loop} it and look in those, revealing
+anything in a disk image.
+
+However this won't work easily for VM disk images in the disk image.
+One would have to download those to the host and launch another
+libguestfs instance.
+
+List, mount filesystems by UUID and label
+-----------------------------------------
+
+[See related:
+http://www.redhat.com/archives/libguestfs/2009-August/msg00031.html]
+
+List filesystems by UUID or label.
+
+Mount filesystems by UUID or label.  (I'm not really sure if we can do
+this at the moment but we ought to be able to do it, and perhaps make
+it easier by having a direct command).