]> git.sur5r.net Git - bacula/bacula/commitdiff
ebl Permit to mix console and command when runsonclient=yes
authorEric Bollengier <eric@eb.homelinux.org>
Tue, 1 Jan 2008 13:54:08 +0000 (13:54 +0000)
committerEric Bollengier <eric@eb.homelinux.org>
Tue, 1 Jan 2008 13:54:08 +0000 (13:54 +0000)
git-svn-id: https://bacula.svn.sourceforge.net/svnroot/bacula/trunk@6172 91ce42f0-d328-0410-95d8-f526ca767f89

bacula/patches/testing/runscript_with_multiple_command.patch

index edee67f05201d195a24d07264eb4bcc9dfd7b729..1d9251afc52ece965dd6c6eb7c2fc441e60a3d38 100644 (file)
 Index: patches/testing/runscript_with_multiple_command.patch
 ===================================================================
---- patches/testing/runscript_with_multiple_command.patch      (révision 6170)
+--- patches/testing/runscript_with_multiple_command.patch      (révision 6171)
 +++ patches/testing/runscript_with_multiple_command.patch      (copie de travail)
-@@ -1,483 +0,0 @@
+@@ -1,982 +0,0 @@
+-Index: patches/testing/runscript_with_multiple_command.patch
+-===================================================================
+---- patches/testing/runscript_with_multiple_command.patch     (révision 6170)
+-+++ patches/testing/runscript_with_multiple_command.patch     (copie de travail)
+-@@ -1,483 +0,0 @@
+--Index: src/dird/fd_cmds.c
+--===================================================================
+----- src/dird/fd_cmds.c       (révision 6169)
+--+++ src/dird/fd_cmds.c       (copie de travail)
+--@@ -537,29 +537,35 @@
+--          Dmsg2(200, "bdird: runscript %s -> %s\n", cmd->target, ehost);
+-- 
+--          if (strcmp(ehost, jcr->client->name()) == 0) {
+---            pm_strcpy(msg, cmd->command);
+---            bash_spaces(msg);
+--+            char *c;
+--+            char *command, cmd_type;
+--+            foreach_alist(c, cmd->commands) {
+--+               cmd->get_command(c, &cmd_type, &command);
+--+               if (cmd_type == SHELL_CMD) {
+--+                  pm_strcpy(msg, command);
+--+                  bash_spaces(msg);
+-- 
+---            Dmsg1(120, "bdird: sending runscripts to fd '%s'\n", cmd->command);
+--+                  Dmsg1(120, "bdird: sending runscripts to fd '%s'\n", command);
+--             
+---            /* TODO: remove this with bacula 1.42 */
+---            if (cmd->old_proto) {
+---               result = send_runscript_with_old_proto(jcr, cmd->when, msg);
+--+                  /* TODO: remove this with bacula 1.42 */
+--+                  if (cmd->old_proto) {
+--+                     result = send_runscript_with_old_proto(jcr, cmd->when, msg);
+--+                     
+--+                  } else {
+--+                     fd->fsend(runscript, cmd->on_success, 
+--+                                          cmd->on_failure,
+--+                                          cmd->fail_on_error,
+--+                                          cmd->when,
+--+                                          msg);
+-- 
+---            } else {
+---               fd->fsend(runscript, cmd->on_success, 
+---                                    cmd->on_failure,
+---                                    cmd->fail_on_error,
+---                                    cmd->when,
+---                                    msg);
+---
+---               result = response(jcr, fd, OKRunScript, "RunScript", DISPLAY_ERROR);
+---               launch_before_cmd = true;
+--+                     result = response(jcr, fd, OKRunScript, "RunScript", DISPLAY_ERROR);
+--+                     launch_before_cmd = true;
+--+                  }
+--+                  if (!result) {
+--+                     goto bail_out;
+--+                  }
+--+               }
+--             }
+---            
+---            if (!result) {
+---               goto bail_out;
+---            }
+--          }
+--          /* TODO : we have to play with other client */
+--          /*
+--@@ -567,7 +573,7 @@
+--            send command to an other client
+--            }
+--          */
+---      }        
+--+      }
+--    } 
+-- 
+--    /* Tell the FD to execute the ClientRunBeforeJob */
+--Index: src/dird/dird_conf.c
+--===================================================================
+----- src/dird/dird_conf.c     (révision 6169)
+--+++ src/dird/dird_conf.c     (copie de travail)
+--@@ -651,16 +651,19 @@
+--          }
+--       }
+--       if (res->res_job.RunScripts) {
+---        RUNSCRIPT *script;
+---        foreach_alist(script, res->res_job.RunScripts) {
+---           sendit(sock, _(" --> RunScript\n"));
+---           sendit(sock, _("  --> Command=%s\n"), NPRT(script->command));
+---           sendit(sock, _("  --> Target=%s\n"),  NPRT(script->target));
+---           sendit(sock, _("  --> RunOnSuccess=%u\n"),  script->on_success);
+---           sendit(sock, _("  --> RunOnFailure=%u\n"),  script->on_failure);
+---           sendit(sock, _("  --> FailJobOnError=%u\n"),  script->fail_on_error);
+---           sendit(sock, _("  --> RunWhen=%u\n"),  script->when);
+---        }
+--+         char *c;
+--+         RUNSCRIPT *script;
+--+         foreach_alist(script, res->res_job.RunScripts) {
+--+            sendit(sock, _(" --> RunScript\n"));
+--+            foreach_alist(c, script->commands) {
+--+               sendit(sock, _("  --> Command=%s\n"), NPRT(c));
+--+            }
+--+            sendit(sock, _("  --> Target=%s\n"),  NPRT(script->target));
+--+            sendit(sock, _("  --> RunOnSuccess=%u\n"),  script->on_success);
+--+            sendit(sock, _("  --> RunOnFailure=%u\n"),  script->on_failure);
+--+            sendit(sock, _("  --> FailJobOnError=%u\n"),  script->fail_on_error);
+--+            sendit(sock, _("  --> RunWhen=%u\n"),  script->when);
+--+         }
+--       }
+--       if (res->res_job.pool) {
+--          sendit(sock, _("  --> "));
+--@@ -1724,14 +1727,14 @@
+-- }
+-- 
+-- /*
+--- * Store a runscript->command as a string
+--+ * Store a runscript->commands as a alist(char + string)
+--  */
+-- static void store_runscript_cmd(LEX *lc, RES_ITEM *item, int index, int pass)
+-- {
+--    lex_get_token(lc, T_STRING);
+-- 
+--    if (pass == 2) {
+---      ((RUNSCRIPT*)item->value)->set_command(lc->str, item->code);
+--+      ((RUNSCRIPT*)item->value)->add_command(lc->str, item->code);
+--    }
+--    scan_to_eol(lc);
+-- }
+--@@ -1745,7 +1748,7 @@
+--       RUNSCRIPT *script = new_runscript();
+--       script->set_job_code_callback(job_code_callback_filesetname);
+-- 
+---      script->set_command(lc->str);
+--+      script->add_command(lc->str);
+-- 
+--       /* TODO: remove all script->old_proto with bacula 1.42 */
+-- 
+--@@ -1873,7 +1876,7 @@
+--    }
+-- 
+--    if (pass == 2) {
+---      if (res_runscript.command == NULL) {
+--+      if (res_runscript.commands == NULL) {
+--          scan_err2(lc, _("%s item is required in %s resource, but not found.\n"),
+--                    "command", "runscript");
+--       }
+--@@ -1883,10 +1886,11 @@
+--          res_runscript.set_target("%c");
+--       }
+-- 
+---      RUNSCRIPT *script = new_runscript();
+---      memcpy(script, &res_runscript, sizeof(RUNSCRIPT));
+--+      RUNSCRIPT *script = copy_runscript(&res_runscript);
+--+      res_runscript.reset_default(true);
+--+
+--       script->set_job_code_callback(job_code_callback_filesetname);
+---      
+--+
+--       if (*runscripts == NULL) {
+--         *runscripts = New(alist(10, not_owned_by_alist));
+--       }
+--Index: src/filed/job.c
+--===================================================================
+----- src/filed/job.c  (révision 6169)
+--+++ src/filed/job.c  (copie de travail)
+--@@ -481,7 +481,7 @@
+-- 
+--    /* Run the command now */
+--    script = new_runscript();
+---   script->set_command(cmd);
+--+   script->add_command(cmd);
+--    script->when = SCRIPT_Before;
+--    ok = script->run(jcr, "ClientRunBeforeJob");
+--    free_runscript(script);
+--@@ -529,7 +529,7 @@
+--    unbash_spaces(msg);
+-- 
+--    cmd = new_runscript();
+---   cmd->set_command(msg);
+--+   cmd->add_command(msg);
+--    cmd->on_success = true;
+--    cmd->on_failure = false;
+--    cmd->when = SCRIPT_After;
+--@@ -567,7 +567,7 @@
+--    cmd->fail_on_error = fail_on_error;
+--    unbash_spaces(msg);
+-- 
+---   cmd->set_command(msg);
+--+   cmd->add_command(msg);
+--    cmd->debug();
+--    jcr->RunScripts->append(cmd);
+-- 
+--Index: src/lib/runscript.h
+--===================================================================
+----- src/lib/runscript.h      (révision 6169)
+--+++ src/lib/runscript.h      (copie de travail)
+--@@ -62,8 +62,8 @@
+-- };
+-- 
+-- enum {
+---   SHELL_CMD   = 1,
+---   CONSOLE_CMD = 2 
+--+   SHELL_CMD   = '|',
+--+   CONSOLE_CMD = '@' 
+-- };
+-- 
+-- /*
+--@@ -71,10 +71,9 @@
+--  */
+-- class RUNSCRIPT {
+-- public:
+---   POOLMEM *command;            /* command string */
+--+   alist *commands;             /* list of command/console string */
+--    POOLMEM *target;             /* host target */
+--    int  when;                   /* SCRIPT_Before|Script_After BEFORE/AFTER JOB*/
+---   int  cmd_type;               /* Command type -- Shell, Console */
+--    char level;                  /* Base|Full|Incr...|All (NYI) */
+--    bool on_success;             /* execute command on job success (After) */
+--    bool on_failure;             /* execute command on job failure (After) */
+--@@ -85,8 +84,10 @@
+--                                 /* Optional callback function passed to edit_job_code */
+-- 
+--    bool run(JCR *job, const char *name=""); /* name must contain "Before" or "After" keyword */
+--+   bool run_command(const char *cmd, JCR *job, const char *name="");
+--    bool can_run_at_level(int JobLevel) { return true;};        /* TODO */
+---   void set_command(const POOLMEM *cmd, int cmd_type = SHELL_CMD);
+--+   void add_command(const POOLMEM *cmd, char cmd_type = SHELL_CMD);
+--+   void get_command(const char *cmd, char *cmd_type, char **cmd);
+--    void set_target(const POOLMEM *client_name);
+--    void reset_default(bool free_string = false);
+--    bool is_local();             /* true if running on local host */
+--Index: src/lib/runscript.c
+--===================================================================
+----- src/lib/runscript.c      (révision 6169)
+--+++ src/lib/runscript.c      (copie de travail)
+--@@ -59,15 +59,20 @@
+-- 
+-- void RUNSCRIPT::reset_default(bool free_strings)
+-- {
+---   if (free_strings && command) {
+---     free_pool_memory(command);
+--+   char *c;
+--+   if (free_strings && commands) {
+--+      foreach_alist(c, commands) {
+--+         free_pool_memory(c);
+--+      }
+--    }
+--    if (free_strings && target) {
+--      free_pool_memory(target);
+--    }
+---   
+--    target = NULL;
+---   command = NULL;
+--+   if (commands) {
+--+      delete commands;
+--+      commands = NULL;
+--+   }
+--    on_success = true;
+--    on_failure = false;
+--    fail_on_error = true;
+--@@ -76,17 +81,23 @@
+--    job_code_callback = NULL;
+-- }
+-- 
+---RUNSCRIPT *copy_runscript(RUNSCRIPT *src)
+--+Runscript *copy_runscript(RUNSCRIPT *src)
+-- {
+--    Dmsg0(500, "runscript: creating new RUNSCRIPT object from other\n");
+-- 
+--    RUNSCRIPT *dst = (RUNSCRIPT *)malloc(sizeof(RUNSCRIPT));
+--    memcpy(dst, src, sizeof(RUNSCRIPT));
+-- 
+---   dst->command = NULL;
+--+   dst->commands =  New(alist(5, not_owned_by_alist));
+--+   char *c;
+--+   POOLMEM *m;
+--+   foreach_alist(c, src->commands) {
+--+      m = get_pool_memory(PM_FNAME);
+--+      pm_strcpy(m, c);
+--+      dst->commands->append(m);
+--+   }
+--+
+--    dst->target = NULL;
+---
+---   dst->set_command(src->command, src->cmd_type);
+--    dst->set_target(src->target);
+-- 
+--    return dst;   
+--@@ -95,9 +106,12 @@
+-- void free_runscript(RUNSCRIPT *script)
+-- {
+--    Dmsg0(500, "runscript: freeing RUNSCRIPT object\n");
+---
+---   if (script->command) {
+---      free_pool_memory(script->command);
+--+   POOLMEM *c;
+--+   if (script->commands) {
+--+      foreach_alist(c, script->commands) {
+--+         free_pool_memory(c);
+--+      }
+--+      delete script->commands;
+--    }
+--    if (script->target) {
+--       free_pool_memory(script->target);
+--@@ -108,60 +122,15 @@
+-- int run_scripts(JCR *jcr, alist *runscripts, const char *label)
+-- {
+--    Dmsg2(200, "runscript: running all RUNSCRIPT object (%s) JobStatus=%c\n", label, jcr->JobStatus);
+---   
+---   RUNSCRIPT *script;
+---   bool runit;
+-- 
+---   int when;
+---
+---   if (strstr(label, NT_("Before"))) {
+---      when = SCRIPT_Before;
+---   } else {
+---      when = SCRIPT_After;
+---   }
+---
+--    if (runscripts == NULL) {
+--       Dmsg0(100, "runscript: WARNING RUNSCRIPTS list is NULL\n");
+--       return 0;
+--    }
+---
+--+   
+--+   RUNSCRIPT *script;
+--    foreach_alist(script, runscripts) {
+---      Dmsg2(200, "runscript: try to run %s:%s\n", NPRT(script->target), NPRT(script->command));
+---      runit = false;
+---
+---      if ((script->when & SCRIPT_Before) && (when & SCRIPT_Before)) {
+---         if ((script->on_success 
+---            && (jcr->JobStatus == JS_Running || jcr->JobStatus == JS_Created))
+---            || (script->on_failure && job_canceled(jcr))
+---            )
+---         {
+---            Dmsg4(200, "runscript: Run it because SCRIPT_Before (%s,%i,%i,%c)\n", 
+---                  script->command, script->on_success, script->on_failure,
+---                  jcr->JobStatus );
+---            runit = true;
+---         }
+---      }
+---
+---      if ((script->when & SCRIPT_After) && (when & SCRIPT_After)) {
+---         if ((script->on_success && (jcr->JobStatus == JS_Terminated))
+---             || (script->on_failure && job_canceled(jcr))
+---            )
+---         {
+---            Dmsg4(200, "runscript: Run it because SCRIPT_After (%s,%i,%i,%c)\n", 
+---                  script->command, script->on_success, script->on_failure,
+---                  jcr->JobStatus );
+---            runit = true;
+---         }
+---      }
+---
+---      if (!script->is_local()) {
+---         runit = false;
+---      }
+---
+---      /* we execute it */
+---      if (runit) {
+---         script->run(jcr, label);
+---      }
+--+      script->run(jcr, label);
+--    }
+--    return 1;
+-- }
+--@@ -176,7 +145,7 @@
+-- }
+-- 
+-- /* set this->command to cmd */
+---void RUNSCRIPT::set_command(const POOLMEM *cmd, int acmd_type)
+--+void RUNSCRIPT::add_command(const POOLMEM *cmd, char acmd_type)
+-- {
+--    Dmsg1(500, "runscript: setting command = %s\n", NPRT(cmd));
+-- 
+--@@ -184,14 +153,21 @@
+--       return;
+--    }
+-- 
+---   if (!command) {
+---      command = get_pool_memory(PM_FNAME);
+--+   if (!commands) {
+--+      commands = New(alist(5, not_owned_by_alist)); 
+--    }
+-- 
+---   pm_strcpy(command, cmd);
+---   cmd_type = acmd_type;
+--+   POOLMEM *c = get_pool_memory(PM_FNAME);
+--+   Mmsg(c, "%c%s", acmd_type, cmd);
+--+   commands->append(c);
+-- }
+-- 
+--+void RUNSCRIPT::get_command(const char* command, char *acmd_type, char **cmd)
+--+{
+--+   *acmd_type = command[0];
+--+   *cmd = (char *)command + 1;
+--+}
+--+
+-- /* set this->target to client_name */
+-- void RUNSCRIPT::set_target(const POOLMEM *client_name)
+-- {
+--@@ -210,14 +186,71 @@
+-- 
+-- bool RUNSCRIPT::run(JCR *jcr, const char *name)
+-- {
+---   Dmsg1(100, "runscript: running a RUNSCRIPT object type=%d\n", cmd_type);
+--+   char *c;
+--+   bool runit;
+--+
+--+   int when;
+--+
+--+   if (strstr(name, NT_("Before"))) {
+--+      when = SCRIPT_Before;
+--+   } else {
+--+      when = SCRIPT_After;
+--+   }
+--+
+--+   foreach_alist(c, this->commands) {
+--+      Dmsg2(200, "runscript: try to run %s:%s\n", NPRT(this->target), NPRT(c));
+--+      runit = false;
+--+
+--+      if ((this->when & SCRIPT_Before) && (when & SCRIPT_Before)) {
+--+         if ((this->on_success 
+--+            && (jcr->JobStatus == JS_Running || jcr->JobStatus == JS_Created))
+--+            || (this->on_failure && job_canceled(jcr))
+--+            )
+--+         {
+--+            Dmsg4(200, "runscript: Run it because SCRIPT_Before (%s,%i,%i,%c)\n", 
+--+                  c, this->on_success, this->on_failure,
+--+                  jcr->JobStatus );
+--+            runit = true;
+--+         }
+--+      }
+--+
+--+      if ((this->when & SCRIPT_After) && (when & SCRIPT_After)) {
+--+         if ((this->on_success && (jcr->JobStatus == JS_Terminated))
+--+             || (this->on_failure && job_canceled(jcr))
+--+            )
+--+         {
+--+            Dmsg4(200, "runscript: Run it because SCRIPT_After (%s,%i,%i,%c)\n", 
+--+                  c, this->on_success, this->on_failure,
+--+                  jcr->JobStatus );
+--+            runit = true;
+--+         }
+--+      }
+--+
+--+      if (!this->is_local()) {
+--+         runit = false;
+--+      }
+--+
+--+      /* we execute it */
+--+      if (runit) {
+--+         this->run_command(c, jcr, name);
+--+      }
+--+   }
+--+   return 1;
+--+}
+--+
+--+bool RUNSCRIPT::run_command(const char *command, JCR *jcr, const char *name)
+--+{
+--    POOLMEM *ecmd = get_pool_memory(PM_FNAME);
+--    int status;
+--    BPIPE *bpipe;
+--    char line[MAXSTRING];
+--+   char cmd_type;
+--+   char *cmd;
+-- 
+---   ecmd = edit_job_codes(jcr, ecmd, this->command, "", this->job_code_callback);
+---   Dmsg1(100, "runscript: running '%s'...\n", ecmd);
+--+   this->get_command(command, &cmd_type, &cmd);
+--+   ecmd = edit_job_codes(jcr, ecmd, cmd, "", this->job_code_callback);
+--+
+--+   Dmsg2(100, "runscript: running '%s' object type=%c...\n", ecmd, cmd_type);
+--    Jmsg(jcr, M_INFO, 0, _("%s: run %s \"%s\"\n"), 
+--         cmd_type==SHELL_CMD?"shell command":"console command", name, ecmd);
+-- 
+--@@ -278,9 +311,12 @@
+-- 
+-- void RUNSCRIPT::debug()
+-- {
+--+   char *c;
+--    Dmsg0(200, "runscript: debug\n");
+--    Dmsg0(200,  _(" --> RunScript\n"));
+---   Dmsg1(200,  _("  --> Command=%s\n"), NPRT(command));
+--+   foreach_alist(c, commands) {
+--+      Dmsg1(200,  _("  --> Command=%s\n"), NPRT(c));
+--+   }
+--    Dmsg1(200,  _("  --> Target=%s\n"),  NPRT(target));
+--    Dmsg1(200,  _("  --> RunOnSuccess=%u\n"),  on_success);
+--    Dmsg1(200,  _("  --> RunOnFailure=%u\n"),  on_failure);
 -Index: src/dird/fd_cmds.c
 -===================================================================
 ---- src/dird/fd_cmds.c        (révision 6169)
 -+++ src/dird/fd_cmds.c        (copie de travail)
--@@ -537,29 +537,35 @@
+-@@ -527,7 +527,8 @@
+-    RUNSCRIPT *cmd;
+-    bool launch_before_cmd = false;
+-    POOLMEM *ehost = get_pool_memory(PM_FNAME);
+--   int result;
+-+   int result, cmd_type;
+-+   char *c, *command;
+- 
+-    Dmsg0(120, "bdird: sending runscripts to fd\n");
+-    
+-@@ -537,29 +538,33 @@
 -          Dmsg2(200, "bdird: runscript %s -> %s\n", cmd->target, ehost);
 - 
 -          if (strcmp(ehost, jcr->client->name()) == 0) {
 --            pm_strcpy(msg, cmd->command);
 --            bash_spaces(msg);
--+            char *c;
--+            char *command, cmd_type;
 -+            foreach_alist(c, cmd->commands) {
 -+               cmd->get_command(c, &cmd_type, &command);
 -+               if (cmd_type == SHELL_CMD) {
@@ -62,7 +558,7 @@ Index: patches/testing/runscript_with_multiple_command.patch
 -          }
 -          /* TODO : we have to play with other client */
 -          /*
--@@ -567,7 +573,7 @@
+-@@ -567,7 +572,7 @@
 -            send command to an other client
 -            }
 -          */
@@ -140,15 +636,9 @@ Index: patches/testing/runscript_with_multiple_command.patch
 -          scan_err2(lc, _("%s item is required in %s resource, but not found.\n"),
 -                    "command", "runscript");
 -       }
--@@ -1883,10 +1886,11 @@
--          res_runscript.set_target("%c");
--       }
-- 
---      RUNSCRIPT *script = new_runscript();
---      memcpy(script, &res_runscript, sizeof(RUNSCRIPT));
--+      RUNSCRIPT *script = copy_runscript(&res_runscript);
--+      res_runscript.reset_default(true);
--+
+-@@ -1886,7 +1889,7 @@
+-       RUNSCRIPT *script = new_runscript();
+-       memcpy(script, &res_runscript, sizeof(RUNSCRIPT));
 -       script->set_job_code_callback(job_code_callback_filesetname);
 --      
 -+
@@ -213,23 +703,37 @@ Index: patches/testing/runscript_with_multiple_command.patch
 -    char level;                  /* Base|Full|Incr...|All (NYI) */
 -    bool on_success;             /* execute command on job success (After) */
 -    bool on_failure;             /* execute command on job failure (After) */
--@@ -85,8 +84,10 @@
--                                 /* Optional callback function passed to edit_job_code */
+-@@ -86,19 +85,22 @@
 - 
 -    bool run(JCR *job, const char *name=""); /* name must contain "Before" or "After" keyword */
--+   bool run_command(const char *cmd, JCR *job, const char *name="");
 -    bool can_run_at_level(int JobLevel) { return true;};        /* TODO */
 --   void set_command(const POOLMEM *cmd, int cmd_type = SHELL_CMD);
 -+   void add_command(const POOLMEM *cmd, char cmd_type = SHELL_CMD);
--+   void get_command(const char *cmd, char *cmd_type, char **cmd);
+-+   void get_command(const char *cmd, int *cmd_type, char **cmd);
 -    void set_target(const POOLMEM *client_name);
 -    void reset_default(bool free_string = false);
 -    bool is_local();             /* true if running on local host */
+-    void debug();
+-+   void set_job_code_callback(job_code_callback_t job_code_callback);
+- 
+--   void set_job_code_callback(job_code_callback_t job_code_callback);
+-+private:
+-+   bool run_command(const char *cmd, JCR *job, const char *name="");
+- };
+- 
+- /* create new RUNSCRIPT (set all value to 0) */
+- RUNSCRIPT *new_runscript();           
+- 
+--/* create new RUNSCRIPT from an other */
+-+/* create new RUNSCRIPT from an other (deep copy) */
+- RUNSCRIPT *copy_runscript(RUNSCRIPT *src);
+- 
+- /* launch each script from runscripts*/
 -Index: src/lib/runscript.c
 -===================================================================
 ---- src/lib/runscript.c       (révision 6169)
 -+++ src/lib/runscript.c       (copie de travail)
--@@ -59,15 +59,20 @@
+-@@ -59,15 +59,18 @@
 - 
 - void RUNSCRIPT::reset_default(bool free_strings)
 - {
@@ -240,6 +744,7 @@ Index: patches/testing/runscript_with_multiple_command.patch
 -+      foreach_alist(c, commands) {
 -+         free_pool_memory(c);
 -+      }
+-+      delete commands;
 -    }
 -    if (free_strings && target) {
 -      free_pool_memory(target);
@@ -247,22 +752,11 @@ Index: patches/testing/runscript_with_multiple_command.patch
 --   
 -    target = NULL;
 --   command = NULL;
--+   if (commands) {
--+      delete commands;
--+      commands = NULL;
--+   }
+-+   commands = NULL;
 -    on_success = true;
 -    on_failure = false;
 -    fail_on_error = true;
--@@ -76,17 +81,23 @@
--    job_code_callback = NULL;
-- }
-- 
---RUNSCRIPT *copy_runscript(RUNSCRIPT *src)
--+Runscript *copy_runscript(RUNSCRIPT *src)
-- {
--    Dmsg0(500, "runscript: creating new RUNSCRIPT object from other\n");
-- 
+-@@ -83,10 +86,16 @@
 -    RUNSCRIPT *dst = (RUNSCRIPT *)malloc(sizeof(RUNSCRIPT));
 -    memcpy(dst, src, sizeof(RUNSCRIPT));
 - 
@@ -282,7 +776,7 @@ Index: patches/testing/runscript_with_multiple_command.patch
 -    dst->set_target(src->target);
 - 
 -    return dst;   
--@@ -95,9 +106,12 @@
+-@@ -95,9 +104,12 @@
 - void free_runscript(RUNSCRIPT *script)
 - {
 -    Dmsg0(500, "runscript: freeing RUNSCRIPT object\n");
@@ -298,7 +792,7 @@ Index: patches/testing/runscript_with_multiple_command.patch
 -    }
 -    if (script->target) {
 -       free_pool_memory(script->target);
--@@ -108,60 +122,15 @@
+-@@ -108,60 +120,15 @@
 - int run_scripts(JCR *jcr, alist *runscripts, const char *label)
 - {
 -    Dmsg2(200, "runscript: running all RUNSCRIPT object (%s) JobStatus=%c\n", label, jcr->JobStatus);
@@ -362,16 +856,19 @@ Index: patches/testing/runscript_with_multiple_command.patch
 -    }
 -    return 1;
 - }
--@@ -176,7 +145,7 @@
+-@@ -175,23 +142,31 @@
+-    }
 - }
 - 
-- /* set this->command to cmd */
+--/* set this->command to cmd */
 --void RUNSCRIPT::set_command(const POOLMEM *cmd, int acmd_type)
+-+/* set add cmd to this->commands alist */
 -+void RUNSCRIPT::add_command(const POOLMEM *cmd, char acmd_type)
 - {
--    Dmsg1(500, "runscript: setting command = %s\n", NPRT(cmd));
+--   Dmsg1(500, "runscript: setting command = %s\n", NPRT(cmd));
+-+   Dmsg2(500, "runscript: setting command = %s type=%i\n", NPRT(cmd), acmd_type);
 - 
--@@ -184,14 +153,21 @@
+-    if (!cmd) {
 -       return;
 -    }
 - 
@@ -388,16 +885,17 @@ Index: patches/testing/runscript_with_multiple_command.patch
 -+   commands->append(c);
 - }
 - 
--+void RUNSCRIPT::get_command(const char* command, char *acmd_type, char **cmd)
+-+/* command = ( SHELL_CMD | CONSOLE_CMD ) command */
+-+void RUNSCRIPT::get_command(const char* command, int *acmd_type, char **cmd)
 -+{
--+   *acmd_type = command[0];
+-+   *acmd_type = (int) command[0];
 -+   *cmd = (char *)command + 1;
 -+}
 -+
 - /* set this->target to client_name */
 - void RUNSCRIPT::set_target(const POOLMEM *client_name)
 - {
--@@ -210,14 +186,71 @@
+-@@ -210,14 +185,70 @@
 - 
 - bool RUNSCRIPT::run(JCR *jcr, const char *name)
 - {
@@ -454,14 +952,15 @@ Index: patches/testing/runscript_with_multiple_command.patch
 -+   return 1;
 -+}
 -+
+-+/* run a command from the list */
 -+bool RUNSCRIPT::run_command(const char *command, JCR *jcr, const char *name)
 -+{
 -    POOLMEM *ecmd = get_pool_memory(PM_FNAME);
--    int status;
+--   int status;
+-+   int status, cmd_type;
 -    BPIPE *bpipe;
--    char line[MAXSTRING];
--+   char cmd_type;
--+   char *cmd;
+--   char line[MAXSTRING];
+-+   char line[MAXSTRING], *cmd;
 - 
 --   ecmd = edit_job_codes(jcr, ecmd, this->command, "", this->job_code_callback);
 --   Dmsg1(100, "runscript: running '%s'...\n", ecmd);
@@ -472,7 +971,7 @@ Index: patches/testing/runscript_with_multiple_command.patch
 -    Jmsg(jcr, M_INFO, 0, _("%s: run %s \"%s\"\n"), 
 -         cmd_type==SHELL_CMD?"shell command":"console command", name, ecmd);
 - 
--@@ -278,9 +311,12 @@
+-@@ -278,9 +309,12 @@
 - 
 - void RUNSCRIPT::debug()
 - {
@@ -707,7 +1206,8 @@ Index: src/lib/runscript.h
 +   void get_command(const char *cmd, int *cmd_type, char **cmd);
     void set_target(const POOLMEM *client_name);
     void reset_default(bool free_string = false);
-    bool is_local();             /* true if running on local host */
+-   bool is_local();             /* true if running on local host */
++   bool is_local(const char *cmd); /* true if running on local host */
     void debug();
 +   void set_job_code_callback(job_code_callback_t job_code_callback);
  
@@ -787,7 +1287,7 @@ Index: src/lib/runscript.c
     }
     if (script->target) {
        free_pool_memory(script->target);
-@@ -108,60 +120,15 @@
+@@ -108,66 +120,25 @@
  int run_scripts(JCR *jcr, alist *runscripts, const char *label)
  {
     Dmsg2(200, "runscript: running all RUNSCRIPT object (%s) JobStatus=%c\n", label, jcr->JobStatus);
@@ -851,7 +1351,18 @@ Index: src/lib/runscript.c
     }
     return 1;
  }
-@@ -175,23 +142,31 @@
+-bool RUNSCRIPT::is_local()
++bool RUNSCRIPT::is_local(const char *c)
+ {
++   if (c[0] == CONSOLE_CMD) {
++      return true;
++   }
++
+    if (!target || (strcmp(target, "") == 0)) {
+       return true;
+    } else {
+@@ -175,23 +146,31 @@
     }
  }
  
@@ -890,7 +1401,7 @@ Index: src/lib/runscript.c
  /* set this->target to client_name */
  void RUNSCRIPT::set_target(const POOLMEM *client_name)
  {
-@@ -210,14 +185,70 @@
+@@ -210,14 +189,70 @@
  
  bool RUNSCRIPT::run(JCR *jcr, const char *name)
  {
@@ -935,7 +1446,7 @@ Index: src/lib/runscript.c
 +         }
 +      }
 +
-+      if (!this->is_local()) {
++      if (!this->is_local(c)) {
 +         runit = false;
 +      }
 +
@@ -966,7 +1477,7 @@ Index: src/lib/runscript.c
     Jmsg(jcr, M_INFO, 0, _("%s: run %s \"%s\"\n"), 
          cmd_type==SHELL_CMD?"shell command":"console command", name, ecmd);
  
-@@ -278,9 +309,12 @@
+@@ -278,9 +313,12 @@
  
  void RUNSCRIPT::debug()
  {