Add configurable refquota support
This commit is contained in:
parent
2820f4d824
commit
f6565eb6b9
|
@ -84,7 +84,7 @@ int addclub() {
|
||||||
if (!sudo_ok)
|
if (!sudo_ok)
|
||||||
logmsg("successfully added group sudo entry for %s", userid);
|
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)
|
if (!home_ok)
|
||||||
logmsg("successfully created home directory for %s", userid);
|
logmsg("successfully created home directory for %s", userid);
|
||||||
|
|
||||||
|
|
|
@ -13,10 +13,10 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "krb5.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 uid_str[16], gid_str[16];
|
||||||
char *zfs_argv[] = { "ssh", "ceo@ginseng", "/usr/sbin/zfsaddhomedir", \
|
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;
|
int ret = 0;
|
||||||
|
|
||||||
assert(homedir[0]);
|
assert(homedir[0]);
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
#include <sys/types.h>
|
#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 *);
|
||||||
|
|
|
@ -92,7 +92,7 @@ int addmember() {
|
||||||
if (!group_ok)
|
if (!group_ok)
|
||||||
logmsg("successfully created group for %s", userid);
|
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)
|
if (!home_ok)
|
||||||
logmsg("successfully created home directory for %s", userid);
|
logmsg("successfully created home directory for %s", userid);
|
||||||
|
|
||||||
|
|
11
src/config.c
11
src/config.c
|
@ -16,6 +16,7 @@ char *sudo_base = DEF_STR;
|
||||||
|
|
||||||
char *skeleton_dir = DEF_STR;
|
char *skeleton_dir = DEF_STR;
|
||||||
char *homedir_mode = DEF_STR;
|
char *homedir_mode = DEF_STR;
|
||||||
|
char *refquota = DEF_STR;
|
||||||
|
|
||||||
char *member_shell = DEF_STR;
|
char *member_shell = DEF_STR;
|
||||||
long member_min_id = DEF_LONG;
|
long member_min_id = DEF_LONG;
|
||||||
|
@ -45,16 +46,16 @@ char *sasl_mech = DEF_STR;
|
||||||
char *privileged_group = DEF_STR;
|
char *privileged_group = DEF_STR;
|
||||||
|
|
||||||
static char *strvarnames[] = { "server_url", "users_base", "admin_principal",
|
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",
|
"member_shell", "club_home", "club_shell", "realm", "admin_bind_userid",
|
||||||
"admin_bind_keytab", "groups_base", "privileged_group", "notify_hook",
|
"admin_bind_keytab", "groups_base", "privileged_group", "notify_hook",
|
||||||
"sasl_realm", "sasl_mech", "sudo_base", "member_home_acl",
|
"sasl_realm", "sasl_mech", "sudo_base", "member_home_acl",
|
||||||
"club_home_acl" };
|
"club_home_acl" };
|
||||||
static char **strvars[] = { &server_url, &users_base, &admin_principal,
|
static char **strvars[] = { &server_url, &users_base, &admin_principal,
|
||||||
&admin_keytab, &skeleton_dir, &homedir_mode, &member_home, &member_shell,
|
&admin_keytab, &skeleton_dir, &homedir_mode, &refquota, &member_home,
|
||||||
&club_home, &club_shell, &realm, &admin_bind_userid, &admin_bind_keytab,
|
&member_shell, &club_home, &club_shell, &realm, &admin_bind_userid,
|
||||||
&groups_base, &privileged_group, ¬ify_hook, &sasl_realm, &sasl_mech,
|
&admin_bind_keytab, &groups_base, &privileged_group, ¬ify_hook,
|
||||||
&sudo_base, &member_home_acl, &club_home_acl };
|
&sasl_realm, &sasl_mech, &sudo_base, &member_home_acl, &club_home_acl };
|
||||||
|
|
||||||
static char *longvarnames[] = { "member_min_id", "member_max_id",
|
static char *longvarnames[] = { "member_min_id", "member_max_id",
|
||||||
"club_min_id", "club_max_id" };
|
"club_min_id", "club_max_id" };
|
||||||
|
|
|
@ -1,11 +1,14 @@
|
||||||
#define CONFIG_FILE "/etc/csc/accounts.cf"
|
#define CONFIG_FILE "/etc/csc/accounts.cf"
|
||||||
|
|
||||||
extern char *server_url;
|
extern char *server_url;
|
||||||
|
|
||||||
extern char *users_base;
|
extern char *users_base;
|
||||||
extern char *groups_base;
|
extern char *groups_base;
|
||||||
extern char *sudo_base;
|
extern char *sudo_base;
|
||||||
|
|
||||||
extern char *skeleton_dir;
|
extern char *skeleton_dir;
|
||||||
|
extern char *homedir_mode;
|
||||||
|
extern char *refquota;
|
||||||
|
|
||||||
extern char *member_shell;
|
extern char *member_shell;
|
||||||
extern long member_min_id;
|
extern long member_min_id;
|
||||||
|
@ -23,8 +26,6 @@ extern char *club_home_dacl;
|
||||||
|
|
||||||
extern char *notify_hook;
|
extern char *notify_hook;
|
||||||
|
|
||||||
extern char *homedir_mode;
|
|
||||||
|
|
||||||
extern char *realm;
|
extern char *realm;
|
||||||
|
|
||||||
extern char *admin_principal;
|
extern char *admin_principal;
|
||||||
|
|
|
@ -9,31 +9,33 @@
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
if(argc < 6) {
|
if(argc < 7) {
|
||||||
fprintf(stderr, "Usage: zfsaddhomedir homedir skeldir uid gid mode acl\n");
|
fprintf(stderr, "Usage: zfsaddhomedir homedir refquota skeldir uid gid mode acl\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: check return of spawnv
|
// TODO: check return of spawnv
|
||||||
{
|
{
|
||||||
char *homedir = argv[1];
|
char *homedir = argv[1];
|
||||||
char *skeldir = argv[2];
|
char *skeldir = argv[3];
|
||||||
char *mode = argv[5];
|
char refquota[32];
|
||||||
char *acl = (argc >= 7) ? argv[6] : NULL;
|
char *mode = argv[6];
|
||||||
|
char *acl = (argc >= 8) ? argv[7] : NULL;
|
||||||
uid_t uid, gid;
|
uid_t uid, gid;
|
||||||
char *zfs_bin = "/usr/sbin/zfs";
|
char *zfs_bin = "/usr/sbin/zfs";
|
||||||
char *chmod_bin = "/usr/bin/chmod";
|
char *chmod_bin = "/usr/bin/chmod";
|
||||||
char *dataset = homedir + 1;
|
char *dataset = homedir + 1;
|
||||||
char *create_argv[] = { "zfs", "create", dataset, NULL };
|
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 *mode_argv[] = { "chmod", mode, homedir, NULL };
|
||||||
char *acl_argv[] = { "chmod", acl, homedir, NULL };
|
char *acl_argv[] = { "chmod", acl, homedir, NULL };
|
||||||
DIR *skel;
|
DIR *skel;
|
||||||
struct dirent *skelent;
|
struct dirent *skelent;
|
||||||
|
|
||||||
assert(homedir[0]);
|
assert(homedir[0]);
|
||||||
uid = atol(argv[3]);
|
uid = atol(argv[4]);
|
||||||
gid = atol(argv[4]);
|
gid = atol(argv[5]);
|
||||||
|
snprintf(refquota, sizeof(refquota), "refquota=%s", argv[2]);
|
||||||
|
|
||||||
if(spawnv(zfs_bin, create_argv))
|
if(spawnv(zfs_bin, create_argv))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
Loading…
Reference in New Issue