3 * Bacula Director -- User Agent Server
5 * Kern Sibbald, September MM
11 Copyright (C) 2000-2003 Kern Sibbald and John Walker
13 This program is free software; you can redistribute it and/or
14 modify it under the terms of the GNU General Public License as
15 published by the Free Software Foundation; either version 2 of
16 the License, or (at your option) any later version.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
21 General Public License for more details.
23 You should have received a copy of the GNU General Public
24 License along with this program; if not, write to the Free
25 Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
33 /* Imported subroutines */
35 /* Imported variables */
38 extern struct s_res resources[];
39 extern int console_msg_pending;
40 extern char my_name[];
42 /* Static variables */
44 /* Exported variables */
45 int quit_cmd_thread = 0;
47 /* Imported functions */
49 /* Forward referenced functions */
51 static void *connect_thread(void *arg);
52 static void *handle_UA_client_request(void *arg);
55 /* Global variables */
56 static int started = FALSE;
57 static workq_t ua_workq;
64 /* Called here by Director daemon to start UA (user agent)
65 * command thread. This routine creates the thread and then
68 void start_UA_server(char *UA_addr, int UA_port)
72 static struct s_addr_port arg;
76 if ((status=pthread_create(&thid, NULL, connect_thread, (void *)&arg)) != 0) {
77 Emsg1(M_ABORT, 0, _("Cannot create UA thread: %s\n"), strerror(status));
83 static void *connect_thread(void *arg)
85 struct s_addr_port *UA = (struct s_addr_port *)arg;
87 pthread_detach(pthread_self());
89 /* ****FIXME**** put # 5 on config parameter */
90 bnet_thread_server(UA->addr, UA->port, 5, &ua_workq, handle_UA_client_request);
95 * Create a Job Control Record for a console "job"
96 * filling in all the appropriate fields.
98 static JCR *create_console_jcr()
101 jcr = new_jcr(sizeof(JCR), dird_free_jcr);
102 jcr->sd_auth_key = bstrdup("dummy"); /* dummy Storage daemon key */
103 create_unique_job_name(jcr, "*Console*");
104 jcr->sched_time = jcr->start_time;
105 jcr->JobType = JT_CONSOLE;
106 jcr->JobLevel = L_FULL;
107 jcr->JobStatus = JS_Running;
108 /* None of these are really defined for the Console, so we
109 * simply take the first of each one. This ensures that there
110 * will be no null pointer references.
113 jcr->job = (JOB *)GetNextRes(R_JOB, NULL);
114 jcr->messages = (MSGS *)GetNextRes(R_MSGS, NULL);
115 jcr->client = (CLIENT *)GetNextRes(R_CLIENT, NULL);
116 jcr->pool = (POOL *)GetNextRes(R_POOL, NULL);
117 jcr->catalog = (CAT *)GetNextRes(R_CATALOG, NULL);
118 jcr->store = (STORE *)GetNextRes(R_STORAGE, NULL);
119 jcr->fileset = (FILESET *)GetNextRes(R_FILESET, NULL);
125 * Handle Director User Agent commands
128 static void *handle_UA_client_request(void *arg)
133 BSOCK *UA_sock = (BSOCK *)arg;
135 pthread_detach(pthread_self());
137 jcr = create_console_jcr();
139 ua = new_ua_context(jcr);
140 ua->UA_sock = UA_sock;
142 bnet_recv(ua->UA_sock); /* Get first message */
143 if (!authenticate_user_agent(ua->UA_sock)) {
148 stat = bnet_recv(ua->UA_sock);
150 ua->cmd = check_pool_memory_size(ua->cmd, ua->UA_sock->msglen+1);
151 bstrncpy(ua->cmd, ua->UA_sock->msg, ua->UA_sock->msglen+1);
153 if (ua->argc > 0 && ua->argk[0][0] == '.') {
154 do_a_dot_command(ua, ua->cmd);
156 do_a_command(ua, ua->cmd);
159 if (ua->auto_display_messages) {
160 strcpy(ua->cmd, "messages");
161 qmessagescmd(ua, ua->cmd);
162 ua->user_notified_msg_pending = FALSE;
163 } else if (!ua->user_notified_msg_pending && console_msg_pending) {
164 bsendmsg(ua, _("You have messages.\n"));
165 ua->user_notified_msg_pending = TRUE;
167 bnet_sig(ua->UA_sock, BNET_EOD); /* send end of command */
169 } else if (is_bnet_stop(ua->UA_sock)) {
172 } else { /* signal */
173 bnet_sig(ua->UA_sock, BNET_POLL);
187 * Create a UAContext for a Job that is running so that
188 * it can the User Agent routines and
189 * to ensure that the Job gets the proper output.
190 * This is a sort of mini-kludge, and should be
191 * unified at some point.
193 UAContext *new_ua_context(JCR *jcr)
197 ua = (UAContext *)malloc(sizeof(UAContext));
198 memset(ua, 0, sizeof(UAContext));
201 ua->cmd = get_pool_memory(PM_FNAME);
202 ua->args = get_pool_memory(PM_FNAME);
204 ua->automount = TRUE;
208 void free_ua_context(UAContext *ua)
211 free_pool_memory(ua->cmd);
214 free_pool_memory(ua->args);
221 bnet_close(ua->UA_sock);
229 * Called from main Bacula thread
231 void term_ua_server()
236 quit_cmd_thread = TRUE;