Add configurable refquota support
authorDavid Bartley <dtbartle@csclub.uwaterloo.ca>
Wed, 28 May 2008 06:01:24 +0000 (02:01 -0400)
committerDavid Bartley <dtbartle@csclub.uwaterloo.ca>
Wed, 28 May 2008 06:01:24 +0000 (02:01 -0400)
src/addclub.c
src/addhomedir.c
src/addhomedir.h
src/addmember.c
src/config.c
src/config.h
src/zfsaddhomedir.c

index 8f5f164..69d0f3a 100644 (file)
@@ -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);
 
index 2a5084b..c342ffe 100644 (file)
 #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]);
index 9d3493d..6e0d091 100644 (file)
@@ -1,3 +1,3 @@
 #include <sys/types.h>
 
-int ceo_create_home(char *, uid_t, gid_t, char *, char *);
+int ceo_create_home(char *, char *, uid_t, gid_t, char *, char *);
index f229890..3aeace4 100644 (file)
@@ -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);
 
index 4afb369..285523d 100644 (file)
@@ -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, &notify_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, &notify_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" };
index e67d395..d3bc0ec 100644 (file)
@@ -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;
index 47673bd..f3431b3 100644 (file)
@@ -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;