From f6565eb6b9c2d699c84449a8b5739a22d2080e7a Mon Sep 17 00:00:00 2001 From: David Bartley Date: Wed, 28 May 2008 02:01:24 -0400 Subject: [PATCH] Add configurable refquota support --- src/addclub.c | 2 +- src/addhomedir.c | 4 ++-- src/addhomedir.h | 2 +- src/addmember.c | 2 +- src/config.c | 11 ++++++----- src/config.h | 5 +++-- src/zfsaddhomedir.c | 18 ++++++++++-------- 7 files changed, 24 insertions(+), 20 deletions(-) diff --git a/src/addclub.c b/src/addclub.c index 8f5f164..69d0f3a 100644 --- a/src/addclub.c +++ b/src/addclub.c @@ -84,7 +84,7 @@ int addclub() { if (!sudo_ok) logmsg("successfully added group sudo entry for %s", userid); - home_ok = user_ok || ceo_create_home(homedir, id, id, homedir_mode, acl_s); + home_ok = user_ok || ceo_create_home(homedir, refquota, id, id, homedir_mode, acl_s); if (!home_ok) logmsg("successfully created home directory for %s", userid); diff --git a/src/addhomedir.c b/src/addhomedir.c index 2a5084b..c342ffe 100644 --- a/src/addhomedir.c +++ b/src/addhomedir.c @@ -13,10 +13,10 @@ #include "config.h" #include "krb5.h" -int ceo_create_home(char *homedir, uid_t uid, gid_t gid, char *mode, char *acl) { +int ceo_create_home(char *homedir, char *refquota, uid_t uid, gid_t gid, char *mode, char *acl) { char uid_str[16], gid_str[16]; char *zfs_argv[] = { "ssh", "ceo@ginseng", "/usr/sbin/zfsaddhomedir", \ - homedir, skeleton_dir, uid_str, gid_str, mode, acl, NULL }; + homedir, refquota, skeleton_dir, uid_str, gid_str, mode, acl, NULL }; int ret = 0; assert(homedir[0]); diff --git a/src/addhomedir.h b/src/addhomedir.h index 9d3493d..6e0d091 100644 --- a/src/addhomedir.h +++ b/src/addhomedir.h @@ -1,3 +1,3 @@ #include -int ceo_create_home(char *, uid_t, gid_t, char *, char *); +int ceo_create_home(char *, char *, uid_t, gid_t, char *, char *); diff --git a/src/addmember.c b/src/addmember.c index f229890..3aeace4 100644 --- a/src/addmember.c +++ b/src/addmember.c @@ -92,7 +92,7 @@ int addmember() { if (!group_ok) logmsg("successfully created group for %s", userid); - home_ok = user_ok || ceo_create_home(homedir, id, id, homedir_mode, acl_s); + home_ok = user_ok || ceo_create_home(homedir, refquota, id, id, homedir_mode, acl_s); if (!home_ok) logmsg("successfully created home directory for %s", userid); diff --git a/src/config.c b/src/config.c index 4afb369..285523d 100644 --- a/src/config.c +++ b/src/config.c @@ -16,6 +16,7 @@ char *sudo_base = DEF_STR; char *skeleton_dir = DEF_STR; char *homedir_mode = DEF_STR; +char *refquota = DEF_STR; char *member_shell = DEF_STR; long member_min_id = DEF_LONG; @@ -45,16 +46,16 @@ char *sasl_mech = DEF_STR; char *privileged_group = DEF_STR; static char *strvarnames[] = { "server_url", "users_base", "admin_principal", - "admin_keytab", "skeleton_dir", "homedir_mode", "member_home", + "admin_keytab", "skeleton_dir", "homedir_mode", "refquota", "member_home", "member_shell", "club_home", "club_shell", "realm", "admin_bind_userid", "admin_bind_keytab", "groups_base", "privileged_group", "notify_hook", "sasl_realm", "sasl_mech", "sudo_base", "member_home_acl", "club_home_acl" }; static char **strvars[] = { &server_url, &users_base, &admin_principal, - &admin_keytab, &skeleton_dir, &homedir_mode, &member_home, &member_shell, - &club_home, &club_shell, &realm, &admin_bind_userid, &admin_bind_keytab, - &groups_base, &privileged_group, ¬ify_hook, &sasl_realm, &sasl_mech, - &sudo_base, &member_home_acl, &club_home_acl }; + &admin_keytab, &skeleton_dir, &homedir_mode, &refquota, &member_home, + &member_shell, &club_home, &club_shell, &realm, &admin_bind_userid, + &admin_bind_keytab, &groups_base, &privileged_group, ¬ify_hook, + &sasl_realm, &sasl_mech, &sudo_base, &member_home_acl, &club_home_acl }; static char *longvarnames[] = { "member_min_id", "member_max_id", "club_min_id", "club_max_id" }; diff --git a/src/config.h b/src/config.h index e67d395..d3bc0ec 100644 --- a/src/config.h +++ b/src/config.h @@ -1,11 +1,14 @@ #define CONFIG_FILE "/etc/csc/accounts.cf" extern char *server_url; + extern char *users_base; extern char *groups_base; extern char *sudo_base; extern char *skeleton_dir; +extern char *homedir_mode; +extern char *refquota; extern char *member_shell; extern long member_min_id; @@ -23,8 +26,6 @@ extern char *club_home_dacl; extern char *notify_hook; -extern char *homedir_mode; - extern char *realm; extern char *admin_principal; diff --git a/src/zfsaddhomedir.c b/src/zfsaddhomedir.c index 47673bd..f3431b3 100644 --- a/src/zfsaddhomedir.c +++ b/src/zfsaddhomedir.c @@ -9,31 +9,33 @@ #include "util.h" int main(int argc, char *argv[]) { - if(argc < 6) { - fprintf(stderr, "Usage: zfsaddhomedir homedir skeldir uid gid mode acl\n"); + if(argc < 7) { + fprintf(stderr, "Usage: zfsaddhomedir homedir refquota skeldir uid gid mode acl\n"); return 1; } // TODO: check return of spawnv { char *homedir = argv[1]; - char *skeldir = argv[2]; - char *mode = argv[5]; - char *acl = (argc >= 7) ? argv[6] : NULL; + char *skeldir = argv[3]; + char refquota[32]; + char *mode = argv[6]; + char *acl = (argc >= 8) ? argv[7] : NULL; uid_t uid, gid; char *zfs_bin = "/usr/sbin/zfs"; char *chmod_bin = "/usr/bin/chmod"; char *dataset = homedir + 1; char *create_argv[] = { "zfs", "create", dataset, NULL }; - char *quota_argv[] = { "zfs", "set", "refquota=3G", dataset, NULL }; + char *quota_argv[] = { "zfs", "set", refquota, dataset, NULL }; char *mode_argv[] = { "chmod", mode, homedir, NULL }; char *acl_argv[] = { "chmod", acl, homedir, NULL }; DIR *skel; struct dirent *skelent; assert(homedir[0]); - uid = atol(argv[3]); - gid = atol(argv[4]); + uid = atol(argv[4]); + gid = atol(argv[5]); + snprintf(refquota, sizeof(refquota), "refquota=%s", argv[2]); if(spawnv(zfs_bin, create_argv)) return 1;