let format = ref "" in
let ignores = ref [] in
let lv_expands = ref [] in
+ let machine_readable = ref false in
let ntfsresize_force = ref false in
let output_format = ref "" in
let quiet = ref false in
"--LV-expand", Arg.String (add lv_expands), "lv -\"-";
"--lvexpand", Arg.String (add lv_expands), "lv -\"-";
"--LVexpand", Arg.String (add lv_expands), "lv -\"-";
+ "--machine-readable", Arg.Set machine_readable, " Make output machine readable";
"-n", Arg.Set dryrun, " Don't perform changes";
"--dryrun", Arg.Set dryrun, " -\"-";
"--dry-run", Arg.Set dryrun, " -\"-";
let format = match !format with "" -> None | str -> Some str in
let ignores = List.rev !ignores in
let lv_expands = List.rev !lv_expands in
+ let machine_readable = !machine_readable in
let ntfsresize_force = !ntfsresize_force in
let output_format = match !output_format with "" -> None | str -> Some str in
let quiet = !quiet in
let resizes_force = List.rev !resizes_force in
let shrink = match !shrink with "" -> None | str -> Some str in
+ (* No arguments and machine-readable mode? Print out some facts
+ * about what this binary supports. We only need to print out new
+ * things added since this option, or things which depend on features
+ * of the appliance.
+ *)
+ if !disks = [] && machine_readable then (
+ printf "virt-resize\n";
+ printf "ntfsresize-force\n";
+ printf "32bitok\n";
+ let g = new G.guestfs () in
+ g#add_drive_opts "/dev/null";
+ g#launch ();
+ if feature_available g [| "ntfsprogs"; "ntfs3g" |] then
+ printf "ntfs\n";
+ if feature_available g [| "btrfs" |] then
+ printf "btrfs\n";
+ exit 0
+ );
+
(* Verify we got exactly 2 disks. *)
let infile, outfile =
match List.rev !disks with
(* Build a data structure describing the source disk's partition layout. *)
type partition = {
p_name : string; (* Device name, like /dev/sda1. *)
- p_size : int64; (* Current size of this partition. *)
p_part : G.partition; (* Partition data from libguestfs. *)
p_bootable : bool; (* Is it bootable? *)
p_mbr_id : int option; (* MBR ID, if it has one. *)
with G.Error _ -> None in
let typ = get_partition_content name in
- { p_name = name; p_size = part.G.part_size; p_part = part;
+ { p_name = name; p_part = part;
p_bootable = bootable; p_mbr_id = mbr_id; p_type = typ;
p_operation = OpCopy; p_target_partnum = 0 }
) parts in
*)
List.iter (
function
- | { p_name = name; p_size = size; p_type = ContentPV pv_size }
+ | { p_name = name; p_part = { G.part_size = size };
+ p_type = ContentPV pv_size }
when size < pv_size ->
error "%s: partition size %Ld < physical volume size %Ld"
name size pv_size
- | { p_name = name; p_size = size; p_type = ContentFS (_, fs_size) }
+ | { p_name = name; p_part = { G.part_size = size };
+ p_type = ContentFS (_, fs_size) }
when size < fs_size ->
error "%s: partition size %Ld < filesystem size %Ld"
name size fs_size
*)
let mark_partition_for_resize ~option ?(force = false) p newsize =
let name = p.p_name in
- let oldsize = p.p_size in
+ let oldsize = p.p_part.G.part_size in
(match p.p_operation with
| OpResize _ ->
let p = find_partition ~option dev in
(* Parse the size field. *)
- let oldsize = p.p_size in
+ let oldsize = p.p_part.G.part_size in
let newsize = parse_size oldsize sizefield in
if newsize <= 0L then
fun total p ->
let newsize =
match p.p_operation with
- | OpCopy | OpIgnore -> p.p_size
+ | OpCopy | OpIgnore -> p.p_part.G.part_size
| OpDelete -> 0L
| OpResize newsize -> newsize in
total +^ newsize
let option = "--expand" in
let p = find_partition ~option dev in
- let oldsize = p.p_size in
+ let oldsize = p.p_part.G.part_size in
mark_partition_for_resize ~option p (oldsize +^ surplus)
);
(match shrink with
let option = "--shrink" in
let p = find_partition ~option dev in
- let oldsize = p.p_size in
+ let oldsize = p.p_part.G.part_size in
mark_partition_for_resize ~option p (oldsize +^ surplus)
)
)
printf "Summary of changes:\n\n";
List.iter (
- fun ({ p_name = name; p_size = oldsize } as p) ->
+ fun ({ p_name = name; p_part = { G.part_size = oldsize }} as p) ->
let text =
match p.p_operation with
| OpCopy ->
| OpDelete -> None (* do nothing *)
| OpIgnore | OpCopy -> (* new partition, same size *)
(* Size in sectors. *)
- let size = (p.p_size +^ sectsize -^ 1L) /^ sectsize in
+ let size = (p.p_part.G.part_size +^ sectsize -^ 1L) /^ sectsize in
Some (add_partition size)
| OpResize newsize -> (* new partition, resized *)
(* Size in sectors. *)
| ({ p_name = source; p_target_partnum = target_partnum;
p_operation = (OpCopy | OpResize _) } as p) :: ps
when target_partnum > 0 ->
- let oldsize = p.p_size in
+ let oldsize = p.p_part.G.part_size in
let newsize =
match p.p_operation with OpResize s -> s | _ -> oldsize in