Index: lib/getdef.c =================================================================== --- lib/getdef.c.orig +++ lib/getdef.c @@ -128,6 +128,8 @@ static struct itemdef def_table[] = { {"UID_MIN", NULL}, {"UMASK", NULL}, {"USERDEL_CMD", NULL}, + {"USERDEL_PRECMD", NULL}, + {"USERDEL_POSTCMD", NULL}, {"USERGROUPS_ENAB", NULL}, #ifndef USE_PAM PAMDEFS Index: etc/login.defs =================================================================== --- etc/login.defs.orig +++ etc/login.defs @@ -242,9 +242,25 @@ NONEXISTENT /nonexistent # It should remove any at/cron/print jobs etc. owned by # the user to be removed (passed as the first argument). # +# See also USERDEL_PRECMD and USERDEL_POSTCMD below. +# #USERDEL_CMD /usr/sbin/userdel_local # +# If defined, this command is run before removing a user. +# It should remove any at/cron/print jobs etc. owned by +# the user to be removed. +# +USERDEL_PRECMD /usr/sbin/userdel-pre.local + +# +# If defined, this command is run after removing a user. +# It should rebuild any NIS database etc. to remove the +# account from it. +# +USERDEL_POSTCMD /usr/sbin/userdel-post.local + +# # Enable setting of the umask group bits to be the same as owner bits # (examples: 022 -> 002, 077 -> 007) for non-root users, if the uid is # the same as gid, and username is the same as the primary group name. Index: src/userdel.c =================================================================== --- src/userdel.c.orig +++ src/userdel.c @@ -108,7 +108,7 @@ static void close_files (void); static void fail_exit (int); static void open_files (void); static void update_user (void); -static void user_cancel (const char *); +static void call_script (const char *, const char *); #ifdef EXTRA_CHECK_HOME_DIR static bool path_prefix (const char *, const char *); @@ -751,13 +751,13 @@ static void update_user (void) * cron, at, or print jobs. */ -static void user_cancel (const char *user) +static void call_script (const char *program, const char *user) { const char *cmd; const char *argv[3]; int status; - cmd = getdef_str ("USERDEL_CMD"); + cmd = getdef_str (program); if (NULL == cmd) { return; } @@ -1203,9 +1203,10 @@ int main (int argc, char **argv) } /* - * Do the hard stuff - open the files, create the user entries, - * create the home directory, then close and update the files. + * Do the hard stuff - open the files, remove the user entries, + * remove the home directory, then close and update the files. */ + call_script ("USERDEL_PRECMD", user_name); open_files (); update_user (); update_groups (); @@ -1326,7 +1327,7 @@ int main (int argc, char **argv) * the entry from /etc/passwd. */ if (prefix[0] == '\0') - user_cancel (user_name); + call_script ("USERDEL_CMD", user_name); close_files (); if (run_parts ("/etc/shadow-maint/userdel-post.d", user_name, "userdel")) { @@ -1341,6 +1342,9 @@ int main (int argc, char **argv) nscd_flush_cache ("group"); sssd_flush_cache (SSSD_DB_PASSWD | SSSD_DB_GROUP); + /* Call the post script, for example to rebuild NIS database */ + call_script ("USERDEL_POSTCMD", user_name); + return ((0 != errors) ? E_HOMEDIR : E_SUCCESS); }