src/dird/fd_cmds.c
int send_runscripts_commands(JCR *jcr)
{
   POOLMEM *msg = get_pool_memory(PM_FNAME);
   BSOCK *fd = jcr->file_bsock;
   RUNSCRIPT *cmd;
   bool launch_before_cmd = false;
   POOLMEM *ehost = get_pool_memory(PM_FNAME);
   int result;

   Dmsg0(120, "bdird: sending runscripts to fd\n");
   if (!jcr->job->RunScripts) {
      goto norunscript;
   }
   foreach_alist(cmd, jcr->job->RunScripts) {
      if (cmd->can_run_at_level(jcr->getJobLevel()) && cmd->target) {
         ehost = edit_job_codes(jcr, ehost, cmd->target, "");
         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);

            Dmsg1(120, "bdird: sending runscripts to fd '%s'\n", cmd->command);

            /* 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);

               result = response(jcr, fd, OKRunScript, "RunScript", DISPLAY_ERROR);
               launch_before_cmd = true;
            }

            if (!result) {
               goto bail_out;
            }
         }
         /* TODO : we have to play with other client */
         /*
           else {
           send command to an other client
           }
         */
      }
   }

   /* Tell the FD to execute the ClientRunBeforeJob */
   if (launch_before_cmd) {
      fd->fsend(runbeforenow);
      if (!response(jcr, fd, OKRunBeforeNow, "RunBeforeNow", DISPLAY_ERROR)) {
        goto bail_out;
      }
   }
norunscript:
   free_pool_memory(msg);
   free_pool_memory(ehost);
   return 1;

bail_out:
   Jmsg(jcr, M_FATAL, 0, _("Client \"%s\" RunScript failed.\n"), ehost);
   free_pool_memory(msg);
   free_pool_memory(ehost);
   return 0;
}
/*
 * Send RunScripts to File daemon
 * 1) We send all runscript to FD, they can be executed Before, After, or twice
 * 2) Then, we send a "RunBeforeNow" command to the FD to tell him to do the
 *    first run_script() call. (ie ClientRunBeforeJob)
 */
Send RunScripts to File daemon
1) We send all runscript to FD, they can be executed Before, After, or twice
2) Then, we send a "RunBeforeNow" command to the FD to tell him to do the
first run_script() call.
Send RunScripts to File daemon 1 ) We send all runscript to FD they can be executed Before After or twice 2 ) Then we send a " RunBeforeNow " command to the FD to tell him to do the first run_script () call .
int send_runscripts_commands(JCR *jcr)
{
   POOLMEM *msg = get_pool_memory(PM_FNAME);
   BSOCK *fd = jcr->file_bsock;
   RUNSCRIPT *cmd;
   bool launch_before_cmd = false;
   POOLMEM *ehost = get_pool_memory(PM_FNAME);
   int result;
   Dmsg0(120, "bdird: sending runscripts to fd\n");
   if (!jcr->job->RunScripts) {
      goto norunscript;
   }
   foreach_alist(cmd, jcr->job->RunScripts) {
      if (cmd->can_run_at_level(jcr->getJobLevel()) && cmd->target) {
         ehost = edit_job_codes(jcr, ehost, cmd->target, "");
         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);
            Dmsg1(120, "bdird: sending runscripts to fd '%s'\n", cmd->command);
            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);
               result = response(jcr, fd, OKRunScript, "RunScript", DISPLAY_ERROR);
               launch_before_cmd = true;
            }
            if (!result) {
               goto bail_out;
            }
         }
      }
   }
   if (launch_before_cmd) {
      fd->fsend(runbeforenow);
      if (!response(jcr, fd, OKRunBeforeNow, "RunBeforeNow", DISPLAY_ERROR)) {
        goto bail_out;
      }
   }
norunscript:
   free_pool_memory(msg);
   free_pool_memory(ehost);
   return 1;
bail_out:
   Jmsg(jcr, M_FATAL, 0, _("Client \"%s\" RunScript failed.\n"), ehost);
   free_pool_memory(msg);
   free_pool_memory(ehost);
   return 0;
}
int send_runscripts_commands ( JCR * jcr ) { POOLMEM * msg = get_pool_memory ( PM_FNAME ) ; BSOCK * fd = jcr -> file_bsock ; RUNSCRIPT * cmd ; bool launch_before_cmd = false ; POOLMEM * ehost = get_pool_memory ( PM_FNAME ) ; int result ; Dmsg0 ( 120 , " \n " ) ; if ( ! jcr -> job -> RunScripts ) { goto norunscript ; } foreach_alist ( cmd , jcr -> job -> RunScripts ) { if ( cmd -> can_run_at_level ( jcr -> getJobLevel ( ) ) && cmd -> target ) { ehost = edit_job_codes ( jcr , ehost , cmd -> target , " " ) ; Dmsg2 ( 200 , " \n " , cmd -> target , ehost ) ; if ( strcmp ( ehost , jcr -> client -> name ( ) ) == 0 ) { pm_strcpy ( msg , cmd -> command ) ; bash_spaces ( msg ) ; Dmsg1 ( 120 , " \n " , cmd -> command ) ; 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 ) ; result = response ( jcr , fd , OKRunScript , " " , DISPLAY_ERROR ) ; launch_before_cmd = true ; } if ( ! result ) { goto bail_out ; } } } } if ( launch_before_cmd ) { fd -> fsend ( runbeforenow ) ; if ( ! response ( jcr , fd , OKRunBeforeNow , " " , DISPLAY_ERROR ) ) { goto bail_out ; } } norunscript : free_pool_memory ( msg ) ; free_pool_memory ( ehost ) ; return 1 ; bail_out : Jmsg ( jcr , M_FATAL , 0 , _ ( " \" \" \n " ) , ehost ) ; free_pool_memory ( msg ) ; free_pool_memory ( ehost ) ; return 0 ; }
Send RunScripts to File daemon
 1) We send all runscript to FD, they can be executed Before, After, or twice
 2) Then, we send a "RunBeforeNow" command to the FD to tell him to do the
    first run_script() call.
Send RunScripts to File daemon 1 ) We send all runscript to FD they can be executed Before After or twice 2 ) Then we send a " RunBeforeNow " command to the FD to tell him to do the first run_script () call .
/* TODO: remove this with bacula 1.42 */ /* TODO : we have to play with other client */ /*
           else {
           send command to an other client
           }
         */ /* Tell the FD to execute the ClientRunBeforeJob */