From e7501a32cb096c1957aae0de934c0b563ff18a5f Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Sat, 15 Jul 2023 16:33:18 +0100 Subject: [PATCH] generator: customize: Add new StringTriplet for use by --chown MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The just added --chown option previously used StringPair, splitting the argument as ‘UID.GID:FILENAME’. However this will not work if we ever extend this with the ability to use user or group names, since they may contain dot (but not colon). Add a new StringTriplet type and split the argument string three ways. The new option becomes: virt-customize ... --chown UID:GID:FILENAME Include the following commit from the common submodule: commit e70d89a58dae068be2e19c7c21558707261af96a Author: Richard W.M. Jones Date: Sat Jul 15 16:42:06 2023 +0100 customize: Update generated files for --chown with StringTriplet Updates: commit d8e48bff212f9b0558480ffedf8158157360d0d5 (cherry picked from commit c08032ebe2763f5e9ce5b14e003721475219d390) --- common | 2 +- generator/customize.ml | 44 ++++++++++++++++++++++++++++++++---------- 2 files changed, 35 insertions(+), 11 deletions(-) Submodule common bbb54714..e70d89a5: diff --git a/common/mlcustomize/customize-options.pod b/common/mlcustomize/customize-options.pod index 22724600..e658a447 100644 --- a/common/mlcustomize/customize-options.pod +++ b/common/mlcustomize/customize-options.pod @@ -63,7 +63,7 @@ Change the permissions of C to C. I: C by default would be decimal, unless you prefix it with C<0> to get octal, ie. use C<0700> not C<700>. -=item B<--chown> UID.GID:PATH +=item B<--chown> UID:GID:PATH Change the owner user and group ID of a file or directory in the guest. Note: @@ -83,7 +83,7 @@ This will not work with Windows guests. For example: - virt-customize --chown '0.0:/var/log/audit.log' + virt-customize --chown '0:0:/var/log/audit.log' See also: I<--upload>. diff --git a/common/mlcustomize/customize-synopsis.pod b/common/mlcustomize/customize-synopsis.pod index e20b12d4..5031b015 100644 --- a/common/mlcustomize/customize-synopsis.pod +++ b/common/mlcustomize/customize-synopsis.pod @@ -1,5 +1,5 @@ [--append-line FILE:LINE] [--chmod PERMISSIONS:FILE] - [--chown UID.GID:PATH] [--commands-from-file FILENAME] + [--chown UID:GID:PATH] [--commands-from-file FILENAME] [--copy SOURCE:DEST] [--copy-in LOCALPATH:REMOTEDIR] [--delete PATH] [--edit FILE:EXPR] [--firstboot SCRIPT] [--firstboot-command 'CMD+ARGS'] [--firstboot-install PKG,PKG..] diff --git a/common/mlcustomize/customize_cmdline.ml b/common/mlcustomize/customize_cmdline.ml index fd3074ad..3ce901db 100644 --- a/common/mlcustomize/customize_cmdline.ml +++ b/common/mlcustomize/customize_cmdline.ml @@ -41,8 +41,8 @@ and op = [ (* --append-line FILE:LINE *) | `Chmod of string * string (* --chmod PERMISSIONS:FILE *) - | `Chown of string * string - (* --chown UID.GID:PATH *) + | `Chown of string * string * string + (* --chown UID:GID:PATH *) | `CommandsFromFile of string (* --commands-from-file FILENAME *) | `Copy of string * string @@ -154,8 +154,13 @@ let rec argspec () = option_name in let len = String.length arg in String.sub arg 0 i, String.sub arg (i+1) (len-(i+1)) - in - let split_string_list arg = + and split_string_triplet option_name arg = + match String.nsplit ~max:3 "," arg with + | [a; b; c] -> a, b, c + | _ -> + error (f_"invalid format for '--%s' parameter, see the man page") + option_name + and split_string_list arg = String.nsplit "," arg in let split_links_list option_name arg = @@ -192,14 +197,14 @@ let rec argspec () = ( [ L"chown" ], Getopt.String ( - s_"UID.GID:PATH", + s_"UID:GID:PATH", fun s -> - let p = split_string_pair "chown" s in + let p = split_string_triplet "chown" s in List.push_front (`Chown p) ops ), s_"Change the owner user and group ID of a file or directory" ), - Some "UID.GID:PATH", "Change the owner user and group ID of a file or directory in the guest.\nNote:\n\n=over 4\n\n=item *\n\nOnly numeric UIDs and GIDs will work, and these may not be the same\ninside the guest as on the host.\n\n=item *\n\nThis will not work with Windows guests.\n\n=back\n\nFor example:\n\n virt-customize --chown '0.0:/var/log/audit.log'\n\nSee also: I<--upload>."; + Some "UID:GID:PATH", "Change the owner user and group ID of a file or directory in the guest.\nNote:\n\n=over 4\n\n=item *\n\nOnly numeric UIDs and GIDs will work, and these may not be the same\ninside the guest as on the host.\n\n=item *\n\nThis will not work with Windows guests.\n\n=back\n\nFor example:\n\n virt-customize --chown '0:0:/var/log/audit.log'\n\nSee also: I<--upload>."; ( [ L"commands-from-file" ], Getopt.String ( diff --git a/common/mlcustomize/customize_cmdline.mli b/common/mlcustomize/customize_cmdline.mli index 5883bbe0..112b74dc 100644 --- a/common/mlcustomize/customize_cmdline.mli +++ b/common/mlcustomize/customize_cmdline.mli @@ -33,8 +33,8 @@ and op = [ (* --append-line FILE:LINE *) | `Chmod of string * string (* --chmod PERMISSIONS:FILE *) - | `Chown of string * string - (* --chown UID.GID:PATH *) + | `Chown of string * string * string + (* --chown UID:GID:PATH *) | `CommandsFromFile of string (* --commands-from-file FILENAME *) | `Copy of string * string diff --git a/generator/customize.ml b/generator/customize.ml index 8d3dec3e..fe87ef5e 100644 --- a/generator/customize.ml +++ b/generator/customize.ml @@ -41,6 +41,7 @@ and op_type = | Unit (* no argument *) | String of string (* string *) | StringPair of string (* string:string *) +| StringTriplet of string (* string:string:string *) | StringList of string (* string,string,... *) | TargetLinks of string (* target:link[:link...] *) | PasswordSelector of string (* password selector *) @@ -96,7 +97,7 @@ it with C<0> to get octal, ie. use C<0700> not C<700>."; }; { op_name = "chown"; - op_type = StringPair "UID.GID:PATH"; + op_type = StringTriplet "UID:GID:PATH"; op_discrim = "`Chown"; op_shortdesc = "Change the owner user and group ID of a file or directory"; op_pod_longdesc = "\ @@ -118,7 +119,7 @@ This will not work with Windows guests. For example: - virt-customize --chown '0.0:/var/log/audit.log' + virt-customize --chown '0:0:/var/log/audit.log' See also: I<--upload>."; }; @@ -761,8 +762,13 @@ let rec argspec () = option_name in let len = String.length arg in String.sub arg 0 i, String.sub arg (i+1) (len-(i+1)) - in - let split_string_list arg = + and split_string_triplet option_name arg = + match String.nsplit ~max:3 \",\" arg with + | [a; b; c] -> a, b, c + | _ -> + error (f_\"invalid format for '--%%s' parameter, see the man page\") + option_name + and split_string_list arg = String.nsplit \",\" arg in let split_links_list option_name arg = @@ -807,6 +813,19 @@ let rec argspec () = pr " s_\"%s\"\n" shortdesc; pr " ),\n"; pr " Some %S, %S;\n" v longdesc + | { op_type = StringTriplet v; op_name = name; op_discrim = discrim; + op_shortdesc = shortdesc; op_pod_longdesc = longdesc } -> + pr " (\n"; + pr " [ L\"%s\" ],\n" name; + pr " Getopt.String (\n"; + pr " s_\"%s\",\n" v; + pr " fun s ->\n"; + pr " let p = split_string_triplet \"%s\" s in\n" name; + pr " List.push_front (%s p) ops\n" discrim; + pr " ),\n"; + pr " s_\"%s\"\n" shortdesc; + pr " ),\n"; + pr " Some %S, %S;\n" v longdesc | { op_type = StringList v; op_name = name; op_discrim = discrim; op_shortdesc = shortdesc; op_pod_longdesc = longdesc } -> pr " (\n"; @@ -956,6 +975,7 @@ let rec argspec () = | { op_type = Unit; } | { op_type = String _; } | { op_type = StringPair _; } + | { op_type = StringTriplet _; } | { op_type = StringList _; } | { op_type = TargetLinks _; } | { op_type = PasswordSelector _; } @@ -1021,6 +1041,10 @@ type ops = { | { op_type = StringPair v; op_discrim = discrim; op_name = name } -> pr " | %s of string * string\n (* --%s %s *)\n" discrim name v + | { op_type = StringTriplet v; op_discrim = discrim; + op_name = name } -> + pr " | %s of string * string * string\n (* --%s %s *)\n" + discrim name v | { op_type = StringList v; op_discrim = discrim; op_name = name } -> pr " | %s of string list\n (* --%s %s *)\n" discrim name v @@ -1073,9 +1097,9 @@ let generate_customize_synopsis_pod () = function | { op_type = Unit; op_name = n } -> n, sprintf "[--%s]" n - | { op_type = String v | StringPair v | StringList v | TargetLinks v - | PasswordSelector v | UserPasswordSelector v | SSHKeySelector v - | StringFn (v, _) | SMPoolSelector v; + | { op_type = String v | StringPair v | StringTriplet v | StringList v + | TargetLinks v | PasswordSelector v | UserPasswordSelector v + | SSHKeySelector v | StringFn (v, _) | SMPoolSelector v; op_name = n } -> n, sprintf "[--%s %s]" n v ) ops @ @@ -1116,9 +1140,9 @@ let generate_customize_options_pod () = function | { op_type = Unit; op_name = n; op_pod_longdesc = ld } -> n, sprintf "B<--%s>" n, ld - | { op_type = String v | StringPair v | StringList v | TargetLinks v - | PasswordSelector v | UserPasswordSelector v | SSHKeySelector v - | StringFn (v, _) | SMPoolSelector v; + | { op_type = String v | StringPair v | StringTriplet v | StringList v + | TargetLinks v | PasswordSelector v | UserPasswordSelector v + | SSHKeySelector v | StringFn (v, _) | SMPoolSelector v; op_name = n; op_pod_longdesc = ld } -> n, sprintf "B<--%s> %s" n v, ld ) ops @