diff options
| -rw-r--r-- | README | 7 | ||||
| -rwxr-xr-x | dfly-update | 49 | 
2 files changed, 53 insertions, 3 deletions
@@ -31,10 +31,11 @@ the following steps:  1. mount the system image file (*.img);  2. backup the current kernel and world (including "/etc");  3. install the kernel and world using cpdup (similar to the installer); -4. identify the new/changed "/etc" files, rename the conflicting ones +4. create new users and groups; +5. identify the new/changed "/etc" files, rename the conflicting ones     with suffix ".__new__" and then copy over; -5. get obsolete files from "Makefile_upgrade.inc" and remove them; -6. umount, show the "*.__new__" files need manual merge. +6. get obsolete files from "Makefile_upgrade.inc" and remove them; +7. umount, show the "*.__new__" files need manual merge.  Usage  ----- diff --git a/dfly-update b/dfly-update index 971b1a2..5f4d370 100755 --- a/dfly-update +++ b/dfly-update @@ -36,6 +36,7 @@ EC_TAR=18  EC_MTREE=19  EC_CPDUP=20  EC_NOFILE=21 +EC_PW=22  # @@ -261,6 +262,53 @@ install_system() {      echo "  => DONE!"  } +# Add new users and groups +add_users() { +    [ $# -eq 0 ] || +        error ${EC_ARGS} "add_users: invalid arguments: $@" + +    local fpasswd="${MNT_DIR}/etc.hdd/master.passwd" +    local fgroup="${MNT_DIR}/etc.hdd/group" +    local _name _pw _uid _gid _gids item +    local _class _change _expire _gecos _home _shell _members +    echo "Adding new users and groups ..." + +    echo "  => Adding new users ..." +    _gids="" +    grep -Ev '^(#.*|\s*)$' ${fpasswd} | +            while IFS=':' read -r _name _pw _uid _gid _class \ +                                  _change _expire _gecos _home _shell; do +        pw usershow ${_name} -q >/dev/null && continue + +        # NOTE: There is circular dependence: 'groupadd' requires the members +        #       already exist, while 'useradd' requires the group exists. +        #       So first assign new users to the 'nogroup' group, and make +        #       adjustments after group creation. +        echo "   * ${_name}, ${_uid}, ${_gid}, ${_gecos}, ${_home}, ${_shell}" +        pw useradd ${_name} \ +            -u ${_uid} -g nogroup -d ${_home} -s ${_shell} \ +            -L "${_class}" -c "${_gecos}" || exit ${EC_PW} +        _gids="${_gids} ${_name}:${_gid}" +    done + +    echo "  => Adding new groups ..." +    grep -Ev '^(#.*|\s*)$' ${fgroup} | +            while IFS=':' read -r _name _pw _gid _members; do +        pw groupshow ${_name} -q >/dev/null && continue + +        echo "   * ${_name}, ${_gid}, ${_members}" +        pw groupadd ${_name} -g ${_gid} -M "${_members}" || exit ${EC_PW} +    done + +    echo "  => Adjusting the group of new users ..." +    for item in ${_gids}; do +        _name=${item%:*} +        _gid=${item#*:} +        echo "   * ${_name}, ${_gid}" +        pw usermod ${_name} -g ${_gid} || exit ${EC_PW} +    done +} +  # Upgrade the system with new configuration files  upgrade_system() {      [ $# -eq 0 ] || @@ -434,6 +482,7 @@ cmd_upgrade() {          error ${EC_ARGS} "cmd_upgrade: invalid arguments: $@"      install_system +    add_users      upgrade_system  }  | 
