X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=bacula%2Fsrc%2Fdird%2Fua_dotcmds.c;h=60f9c62e090341d249a129d41b05b308cb450a34;hb=3d52afb93a3d89ac9d5aebf2052fc625a3274b75;hp=16ad9210da2e4d78cd4cc01d28b8429a59b3f6a7;hpb=cad047bfd4b1f3cbd28feebfc7529e5e98773769;p=bacula%2Fbacula diff --git a/bacula/src/dird/ua_dotcmds.c b/bacula/src/dird/ua_dotcmds.c index 16ad9210da..60f9c62e09 100644 --- a/bacula/src/dird/ua_dotcmds.c +++ b/bacula/src/dird/ua_dotcmds.c @@ -11,7 +11,7 @@ * Version $Id$ */ /* - Copyright (C) 2002-2005 Kern Sibbald + Copyright (C) 2002-2006 Kern Sibbald This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License @@ -34,9 +34,10 @@ extern int r_last; extern struct s_res resources[]; extern char my_name[]; extern const char *client_backups; +extern int console_msg_pending; /* Imported functions */ -extern int qmessagescmd(UAContext *ua, const char *cmd); +extern void do_messages(UAContext *ua, const char *cmd); extern int quit_cmd(UAContext *ua, const char *cmd); extern int qhelp_cmd(UAContext *ua, const char *cmd); extern int qstatus_cmd(UAContext *ua, const char *cmd); @@ -53,6 +54,7 @@ static int defaultscmd(UAContext *ua, const char *cmd); static int typescmd(UAContext *ua, const char *cmd); static int backupscmd(UAContext *ua, const char *cmd); static int levelscmd(UAContext *ua, const char *cmd); +static int getmsgscmd(UAContext *ua, const char *cmd); struct cmdstruct { const char *key; int (*func)(UAContext *ua, const char *cmd); const char *help; }; static struct cmdstruct commands[] = { @@ -68,7 +70,7 @@ static struct cmdstruct commands[] = { { N_(".status"), qstatus_cmd, NULL}, { N_(".storage"), storagecmd, NULL}, { N_(".defaults"), defaultscmd, NULL}, - { N_(".messages"), qmessagescmd, NULL}, + { N_(".messages"), getmsgscmd, NULL}, { N_(".help"), qhelp_cmd, NULL}, { N_(".quit"), quit_cmd, NULL}, { N_(".exit"), quit_cmd, NULL} @@ -110,6 +112,14 @@ int do_a_dot_command(UAContext *ua, const char *cmd) return stat; } +static int getmsgscmd(UAContext *ua, const char *cmd) +{ + if (console_msg_pending) { + do_messages(ua, cmd); + } + return 1; +} + /* * Create segmentation fault */ @@ -129,7 +139,9 @@ static int jobscmd(UAContext *ua, const char *cmd) JOB *job = NULL; LockRes(); while ( (job = (JOB *)GetNextRes(R_JOB, (RES *)job)) ) { - bsendmsg(ua, "%s\n", job->hdr.name); + if (acl_access_ok(ua, Job_ACL, job->hdr.name)) { + bsendmsg(ua, "%s\n", job->hdr.name); + } } UnlockRes(); return 1; @@ -140,7 +152,9 @@ static int filesetscmd(UAContext *ua, const char *cmd) FILESET *fs = NULL; LockRes(); while ( (fs = (FILESET *)GetNextRes(R_FILESET, (RES *)fs)) ) { - bsendmsg(ua, "%s\n", fs->hdr.name); + if (acl_access_ok(ua, FileSet_ACL, fs->hdr.name)) { + bsendmsg(ua, "%s\n", fs->hdr.name); + } } UnlockRes(); return 1; @@ -151,7 +165,9 @@ static int clientscmd(UAContext *ua, const char *cmd) CLIENT *client = NULL; LockRes(); while ( (client = (CLIENT *)GetNextRes(R_CLIENT, (RES *)client)) ) { - bsendmsg(ua, "%s\n", client->hdr.name); + if (acl_access_ok(ua, Client_ACL, client->hdr.name)) { + bsendmsg(ua, "%s\n", client->hdr.name); + } } UnlockRes(); return 1; @@ -173,7 +189,9 @@ static int poolscmd(UAContext *ua, const char *cmd) POOL *pool = NULL; LockRes(); while ( (pool = (POOL *)GetNextRes(R_POOL, (RES *)pool)) ) { - bsendmsg(ua, "%s\n", pool->hdr.name); + if (acl_access_ok(ua, Pool_ACL, pool->hdr.name)) { + bsendmsg(ua, "%s\n", pool->hdr.name); + } } UnlockRes(); return 1; @@ -184,7 +202,9 @@ static int storagecmd(UAContext *ua, const char *cmd) STORE *store = NULL; LockRes(); while ( (store = (STORE *)GetNextRes(R_STORAGE, (RES *)store)) ) { - bsendmsg(ua, "%s\n", store->hdr.name); + if (acl_access_ok(ua, Storage_ACL, store->hdr.name)) { + bsendmsg(ua, "%s\n", store->hdr.name); + } } UnlockRes(); return 1; @@ -216,6 +236,10 @@ static int backupscmd(UAContext *ua, const char *cmd) if (ua->argc != 3 || strcmp(ua->argk[1], "client") != 0 || strcmp(ua->argk[2], "fileset") != 0) { return 1; } + if (!acl_access_ok(ua, Client_ACL, ua->argv[1]) || + !acl_access_ok(ua, FileSet_ACL, ua->argv[2])) { + return 1; + } Mmsg(ua->cmd, client_backups, ua->argv[1], ua->argv[2]); if (!db_sql_query(ua->db, ua->cmd, client_backups_handler, (void *)ua)) { bsendmsg(ua, _("Query failed: %s. ERR=%s\n"), ua->cmd, db_strerror(ua->db)); @@ -236,15 +260,25 @@ static int levelscmd(UAContext *ua, const char *cmd) return 1; } - - /* * Return default values for a job */ static int defaultscmd(UAContext *ua, const char *cmd) { JOB *job; - if (ua->argc == 2 && strcmp(ua->argk[1], "job") == 0) { + CLIENT *client; + STORE *storage; + POOL *pool; + + if (ua->argc != 2 || !ua->argv[1]) { + return 1; + } + + /* Job defaults */ + if (strcmp(ua->argk[1], "job") == 0) { + if (!acl_access_ok(ua, Job_ACL, ua->argv[1])) { + return 1; + } job = (JOB *)GetResWithName(R_JOB, ua->argv[1]); if (job) { STORE *store; @@ -258,7 +292,69 @@ static int defaultscmd(UAContext *ua, const char *cmd) bsendmsg(ua, "level=%s", level_to_str(job->JobLevel)); bsendmsg(ua, "type=%s", job_type_to_str(job->JobType)); bsendmsg(ua, "fileset=%s", job->fileset->hdr.name); + bsendmsg(ua, "enabled=%d", job->enabled); } + } + /* Client defaults */ + else if (strcmp(ua->argk[1], "client") == 0) { + if (!acl_access_ok(ua, Client_ACL, ua->argv[1])) { + return 1; + } + client = (CLIENT *)GetResWithName(R_CLIENT, ua->argv[1]); + if (client) { + bsendmsg(ua, "client=%s", client->hdr.name); + bsendmsg(ua, "address=%s", client->address); + bsendmsg(ua, "fdport=%d", client->FDport); + bsendmsg(ua, "file_retention=%d", client->FileRetention); + bsendmsg(ua, "job_retention=%d", client->JobRetention); + bsendmsg(ua, "autoprune=%d", client->AutoPrune); + } + } + /* Storage defaults */ + else if (strcmp(ua->argk[1], "storage") == 0) { + if (!acl_access_ok(ua, Storage_ACL, ua->argv[1])) { + return 1; + } + storage = (STORE *)GetResWithName(R_STORAGE, ua->argv[1]); + DEVICE *device; + if (storage) { + bsendmsg(ua, "storage=%s", storage->hdr.name); + bsendmsg(ua, "address=%s", storage->address); + bsendmsg(ua, "enabled=%d", storage->enabled); + bsendmsg(ua, "media_type=%s", storage->media_type); + bsendmsg(ua, "sdport=%d", storage->SDport); + device = (DEVICE *)storage->device->first(); + bsendmsg(ua, "device=%s", device->hdr.name); + if (storage->device->size() > 1) { + while ((device = (DEVICE *)storage->device->next())) + bsendmsg(ua, ",%s", device->hdr.name); + } + } + } + /* Pool defaults */ + else if (strcmp(ua->argk[1], "pool") == 0) { + if (!acl_access_ok(ua, Pool_ACL, ua->argv[1])) { + return 1; + } + pool = (POOL *)GetResWithName(R_POOL, ua->argv[1]); + if (pool) { + bsendmsg(ua, "pool=%s", pool->hdr.name); + bsendmsg(ua, "pool_type=%s", pool->pool_type); + bsendmsg(ua, "label_format=%s", pool->label_format?pool->label_format:""); + bsendmsg(ua, "use_volume_once=%d", pool->use_volume_once); + bsendmsg(ua, "accept_any_volume=%d", pool->accept_any_volume); + bsendmsg(ua, "purge_oldest_volume=%d", pool->purge_oldest_volume); + bsendmsg(ua, "recycle_oldest_volume=%d", pool->recycle_oldest_volume); + bsendmsg(ua, "recycle_current_volume=%d", pool->recycle_current_volume); + bsendmsg(ua, "max_volumes=%d", pool->max_volumes); + bsendmsg(ua, "vol_retention=%d", pool->VolRetention); + bsendmsg(ua, "vol_use_duration=%d", pool->VolUseDuration); + bsendmsg(ua, "max_vol_jobs=%d", pool->MaxVolJobs); + bsendmsg(ua, "max_vol_files=%d", pool->MaxVolFiles); + bsendmsg(ua, "max_vol_bytes=%d", pool->MaxVolBytes); + bsendmsg(ua, "auto_prune=%d", pool->AutoPrune); + bsendmsg(ua, "recycle=%d", pool->Recycle); + } } return 1; }