3 * Bacula Director -- User Agent Server
5 * Kern Sibbald, September MM
11 Copyright (C) 2000, 2001, 2002 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,
34 /* Imported subroutines */
35 extern void run_job(JCR *jcr);
37 /* Imported variables */
40 extern struct s_res resources[];
41 extern int console_msg_pending;
42 extern char my_name[];
44 /* Static variables */
46 /* Exported variables */
47 int quit_cmd_thread = 0;
49 /* Imported functions */
51 /* Forward referenced functions */
53 static void *connect_thread(void *arg);
54 static void handle_UA_client_request(void *arg);
57 /* Global variables */
58 static int started = FALSE;
59 static workq_t ua_workq;
66 /* Called here by Director daemon to start UA (user agent)
67 * command thread. This routine creates the thread and then
70 void start_UA_server(char *UA_addr, int UA_port)
74 static struct s_addr_port arg;
78 if ((status=pthread_create(&thid, NULL, connect_thread, (void *)&arg)) != 0) {
79 Emsg1(M_ABORT, 0, _("Cannot create UA thread: %s\n"), strerror(status));
85 static void *connect_thread(void *arg)
87 struct s_addr_port *UA = (struct s_addr_port *)arg;
89 pthread_detach(pthread_self());
91 /* ****FIXME**** put # 5 on config parameter */
92 bnet_thread_server(UA->addr, UA->port, 5, &ua_workq, handle_UA_client_request);
97 * Handle Director User Agent commands
100 static void handle_UA_client_request(void *arg)
104 BSOCK *UA_sock = (BSOCK *) arg;
106 pthread_detach(pthread_self());
108 memset(&ua, 0, sizeof(ua));
111 ua.jcr = new_jcr(sizeof(JCR), dird_free_jcr);
112 ua.jcr->sd_auth_key = bstrdup("dummy"); /* dummy Storage daemon key */
113 ua.UA_sock = UA_sock;
114 ua.cmd = get_pool_memory(PM_FNAME);
115 ua.args = get_pool_memory(PM_FNAME);
117 create_unique_job_name(ua.jcr, "*Console*");
118 ua.jcr->sched_time = ua.jcr->start_time;
119 ua.jcr->JobType = JT_CONSOLE;
121 bnet_recv(ua.UA_sock); /* Get first message */
122 if (!authenticate_user_agent(ua.UA_sock)) {
127 stat = bnet_recv(ua.UA_sock);
129 ua.cmd = check_pool_memory_size(ua.cmd, ua.UA_sock->msglen+1);
130 bstrncpy(ua.cmd, ua.UA_sock->msg, ua.UA_sock->msglen+1);
131 parse_command_args(&ua);
132 if (ua.argc > 0 && ua.argk[0][0] == '.') {
133 do_a_dot_command(&ua, ua.cmd);
135 do_a_command(&ua, ua.cmd);
138 if (ua.auto_display_messages) {
139 strcpy(ua.cmd, "messages");
140 qmessagescmd(&ua, ua.cmd);
141 ua.user_notified_msg_pending = FALSE;
142 } else if (!ua.user_notified_msg_pending && console_msg_pending) {
143 bsendmsg(&ua, _("You have messages.\n"));
144 ua.user_notified_msg_pending = TRUE;
146 bnet_sig(ua.UA_sock, BNET_EOD); /* send end of command */
148 } else if (stat == 0) {
149 if (ua.UA_sock->msglen == BNET_TERMINATE) {
153 bnet_sig(ua.UA_sock, BNET_POLL);
155 break; /* error, exit */
161 bnet_close(ua.UA_sock);
165 close_db(&ua); /* do this before freeing JCR */
175 free_pool_memory(ua.cmd);
178 free_pool_memory(ua.args);
184 * Called from main Bacula thread
186 void term_ua_server()
191 quit_cmd_thread = TRUE;