[Libguestfs] [PATCH] sysprep: user-account: select which users to remove or keep

Richard W.M. Jones rjones at redhat.com
Tue Sep 2 14:20:37 UTC 2014


On Tue, Sep 02, 2014 at 04:00:40PM +0200, Pino Toscano wrote:
> Enhance the user-account sysprep operation, so it is possible to select
> which user accounts should be removed only (instead of all), or which to
> eventually keep.
> ---
>  sysprep/sysprep_operation_user_account.ml | 73 ++++++++++++++++++++++++++++---
>  1 file changed, 67 insertions(+), 6 deletions(-)
> 
> diff --git a/sysprep/sysprep_operation_user_account.ml b/sysprep/sysprep_operation_user_account.ml
> index fa93769..3d88ffc 100644
> --- a/sysprep/sysprep_operation_user_account.ml
> +++ b/sysprep/sysprep_operation_user_account.ml
> @@ -1,5 +1,6 @@
>  (* virt-sysprep
>   * Copyright (C) 2012 FUJITSU LIMITED
> + * 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
> @@ -25,6 +26,45 @@ open Common_gettext.Gettext
>  
>  module G = Guestfs
>  
> +module StringSet = Set.Make (String)
> +
> +let users_included = ref StringSet.empty
> +let users_excluded = ref StringSet.empty
> +let set_users users =
> +  let users = string_nsplit "," users in
> +  List.iter (
> +    fun user ->
> +      let op =
> +        if string_prefix user "-" then
> +          `Exclude (String.sub user 1 (String.length user - 1))
> +        else
> +          `Include user in
> +      match op with
> +      | `Include "" | `Exclude "" ->
> +        eprintf (f_"%s: --user-accounts: empty user name\n")
> +          prog;
> +        exit 1
> +      | `Include n ->
> +        users_included := StringSet.add n !users_included;
> +        users_excluded := StringSet.remove n !users_excluded
> +      | `Exclude n ->
> +        users_included := StringSet.remove n !users_included;
> +        users_excluded := StringSet.add n !users_excluded
> +  ) users
> +
> +let check_remove_user user =
> +  (* If an user is explicitly excluded, keep it. *)
> +  if StringSet.mem user !users_excluded then
> +    false
> +  (* If the list of included users is empty (thus no users were explicitly
> +   * included), or an user is explicitly included, remove it. *)
> +  else if StringSet.is_empty !users_included
> +          or StringSet.mem user !users_included then
> +    true
> +  (* Any other case, not a reason to remove it. *)
> +  else
> +    false
> +
>  let user_account_perform ~verbose ~quiet g root side_effects =
>    let typ = g#inspect_get_type root in
>    if typ <> "windows" then (
> @@ -39,11 +79,12 @@ let user_account_perform ~verbose ~quiet g root side_effects =
>          let uid = userpath ^ "/uid" in
>          let uid = g#aug_get uid in
>          let uid = int_of_string uid in
> -        if uid >= uid_min && uid <= uid_max then (
> +        let username =
> +          let i = String.rindex userpath '/' in
> +          String.sub userpath (i+1) (String.length userpath -i-1) in
> +        if uid >= uid_min && uid <= uid_max
> +           && check_remove_user username then (
>            g#aug_rm userpath;
> -          let username =
> -            let i = String.rindex userpath '/' in
> -            String.sub userpath (i+1) (String.length userpath -i-1) in
>            (* XXX Augeas doesn't yet have a lens for /etc/shadow, so the
>             * next line currently does nothing, but should start to
>             * work in a future version.
> @@ -62,12 +103,32 @@ let op = {
>      enabled_by_default = false;
>      heading = s_"Remove the user accounts in the guest";
>      pod_description = Some (s_"\
> -Remove all the user accounts and their home directories.
> -The \"root\" account is not removed.");
> +By default remove all the user accounts and their home directories.
> +The \"root\" account is not removed.
> +
> +See the I<--user-accounts> parameter for a way to specify
> +how to remove only some users, or to not remove some others.");
>      pod_notes = Some (s_"\
>  Currently this does not remove the user accounts from
>  C</etc/shadow>.  This is because there is no lens for
>  the shadow password file in Augeas.");
> +    extra_args = [
> +      { extra_argspec = "--user-accounts", Arg.String set_users, s_"users" ^ " " ^ s_"Users to remove/keep";
> +        extra_pod_argval = Some "USERS";
> +        extra_pod_description = s_"\
> +The user accounts to be removed (or not) from the guest.
> +The value of this option is a list of user names separated by comma,
> +where specifying an user means it is going to be removed,
> +while prepending C<-> in front of it name means it is not removed.
> +For example:
> +
> + --user-accounts bob,eve
> +
> +would only remove the user accounts C<bob> and C<eve>.
> +
> +This option can be specified multiple times."
> +      };
> +    ];
>      perform_on_filesystems = Some user_account_perform;
>  }
>  

ACK.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
Fedora Windows cross-compiler. Compile Windows programs, test, and
build Windows installers. Over 100 libraries supported.
http://fedoraproject.org/wiki/MinGW




More information about the Libguestfs mailing list