[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[Libguestfs] example script for GObject

I tried using Javascript (gjs) with GObject-Introspection and did a port
of the create_disk example which is attached below.

Quite a bit of time was spent looking up stuff in the GLib reference and
guessing how certain idioms translate to gjs.

I used the traditional add_drive_opts method since I haven't been able
to find how to specify the optional arguments to add_drive_opts. How
does that work?


const Guestfs = imports.gi.Guestfs;
const Gio = imports.gi.Gio;

var output = "disk.img";

var g = new Guestfs.Session ();

// Create a raw-format sparse disk image, 512 MB in size.
var file = Gio.file_new_for_path (output);
var stream = file.replace (null, false, Gio.FileCreateFlags.NONE, null, null);
stream.truncate (512 * 1024 * 1024, null);

// Set the trace flag so that we can see each libguestfs call.
g.set_trace (1);

// Set the autosync flag so that the disk will be synchronized
// automatically when the libguestfs handle is closed.
g.set_autosync (1);

// Attach the disk image to libguestfs.
g.add_drive (file.get_path (), Guestfs.AddDriveOpts.OPTS_FORMAT, "raw");

// Run the libguestfs back-end.
g.launch ();

// Get the list of devices.  Because we only added one drive
// above, we expect that this list should contain a single
// element.
var devices = g.list_devices ();
if (devices.length != 1) {
    throw {
        name : "RuntimeError",
        message : "expected a single device from list-devices"

// Partition the disk as one single MBR partition.
g.part_disk (devices[0], "mbr");

// Get the list of partitions.  We expect a single element, which
// is the partition we have just created.
var partitions = g.list_partitions ();
if (partitions.length != 1) {
    throw {
        name : "RuntimeError",
        message : "expected a single partition from list-partitions"

// Create a filesystem on the partition.
g.mkfs ("ext4", partitions[0]);

// Now mount the filesystem so that we can add files.
g.mount_options ("", partitions[0], "/");

// Create some files and directories.
g.touch ("/empty");
var message = "Hello, world\n";
g.write ("/hello", message);
g.mkdir ("/foo");

// This one uploads the local file /etc/resolv.conf into
// the disk image.
g.upload ("/etc/resolv.conf", "/foo/resolv.conf", null);

// Because 'autosync' was set (above) we can just close the handle
// and the disk contents will be synchronized.  You can also do
// this manually by calling g.umount_all() and g.sync().
g.close ();

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]