]> andersk Git - moira.git/blame - update/client.c
posixify source
[moira.git] / update / client.c
CommitLineData
de56407f 1/*
2 * $Source$
3 * $Header$
4 */
5
6#ifndef lint
7static char *rcsid_client2_c = "$Header$";
8#endif lint
9
10/*
11 * MODULE IDENTIFICATION:
12 * $Header$
546bc43b 13 * Copyright 1987, 1988 by the Massachusetts Institute of Technology.
14 * For copying and distribution information, please see the file
15 * <mit-copyright.h>.
de56407f 16 * DESCRIPTION:
17 * This code handles the actual distribution of data files
2ad0a777 18 * to servers in the MOIRA server-update program.
de56407f 19 * AUTHOR:
20 * Ken Raeburn (spook@athena.MIT.EDU),
21 * MIT Project Athena/MIT Information Systems.
22 * DEFINED VALUES:
23 * conn
2ad0a777 24 * mr_update_server
de56407f 25 */
26
546bc43b 27#include <mit-copyright.h>
de56407f 28#include <stdio.h>
29#include <strings.h>
7bd50861 30#include <gdb.h>
de56407f 31#include <sys/param.h>
7bd50861 32#include <sys/wait.h>
f5b9994a 33#include <sys/socket.h>
7bd50861 34#include <update.h>
de56407f 35#include <errno.h>
7bd50861 36#include <dcm.h>
2ad0a777 37#include <moira.h>
38#include <moira_site.h>
de56407f 39#include <krb.h>
40
7bd50861 41extern char *malloc();
bc6cbc65 42extern int errno, dbg;
de56407f 43
de56407f 44static char buf[BUFSIZ];
7bd50861 45static int code;
de56407f 46
47CONNECTION conn;
de56407f 48
de56407f 49
50/*
51 * FUNCTION:
52 * initialize()
53 * DESCRIPTION:
54 * Insures that various libraries have a chance to get
55 * initialized.
56 * INPUT:
57 * OUTPUT:
58 * RETURN VALUE:
59 * void
60 * SIDE EFFECTS:
756e2c48 61 * Initializes GDB library.
de56407f 62 * PROBLEMS:
63 *
64 */
7bd50861 65static void
de56407f 66initialize()
67{
68 static int initialized = 0;
7bd50861 69
de56407f 70 if (!initialized) {
71 gdb_init();
de56407f 72 initialized++;
73 }
74}
75
7bd50861 76
de56407f 77/*
78 * FUNCTION:
2ad0a777 79 * mr_update_server(service, machine, target_path)
de56407f 80 * DESCRIPTION:
7bd50861 81 * Attempts to perform an update to the named machine
a6be2cf4 82 * of the named service. The file DCM_DIR/service.out
7bd50861 83 * will be sent, then the file SMS_DIR/bin/service.sh,
84 * the the shell script will be executed.
de56407f 85 * INPUT:
7bd50861 86 * service
de56407f 87 * Name of service to be updated; used to find
2ad0a777 88 * the source data file in the MR data directory.
7bd50861 89 * machine
90 * target_path
de56407f 91 * Location to install the file.
de56407f 92 * RETURN VALUE:
93 * int:
94 * Error code, or zero if no error was detected
95 * in the data supplied to this routine.
96 * SIDE EFFECTS:
97 * May write information to logs.
98 * PROBLEMS:
99 *
100 */
101
102int
2ad0a777 103mr_update_server(service, machine, target_path, instructions)
7bd50861 104char *service;
105char *machine;
106char *target_path;
107char *instructions;
de56407f 108{
7bd50861 109#define ASSERT(condition,stat,amsg) \
110 if (!(condition)) { com_err(whoami, stat, amsg); return(stat); }
111#define ASSERT2(condition,stat,amsg,arg1) \
112 if (!(condition)) { com_err(whoami, stat, amsg, arg1); return(stat); }
de56407f 113#define NONNULL(str) \
7bd50861 114 (((str) != (char *)NULL) && (strlen(str) != 0))
de56407f 115
7bd50861 116 char *service_address, *service_updated, *pathname;
f5b9994a 117 int on;
de56407f 118
de56407f 119 /* some sanity checking of arguments while we build data */
2ad0a777 120 ASSERT(NONNULL(machine), MR_INTERNAL, " null host name");
121 ASSERT(NONNULL(service), MR_INTERNAL, " null service name");
122 ASSERT((strlen(machine) + strlen(service) + 2 < BUFSIZ), MR_ARG_TOO_LONG,
7bd50861 123 " machine and service names");
124 sprintf(buf, "%s:%s", machine, service);
125 service_updated = strsave(buf);
2ad0a777 126 ASSERT(NONNULL(service_updated), MR_NO_MEM, " for service name");
127 ASSERT((strlen(machine)+strlen(SERVICE_NAME)+2 < BUFSIZ), MR_ARG_TOO_LONG,
7bd50861 128 " machine and update service name");
129 sprintf(buf, "%s:%s", machine, SERVICE_NAME);
130 service_address = strsave(buf);
2ad0a777 131 ASSERT(NONNULL(service_address), MR_NO_MEM, " for service address");
132 ASSERT(NONNULL(target_path), MR_INTERNAL, " null target pathname");
133 ASSERT((strlen(target_path) < MAXPATHLEN), MR_ARG_TOO_LONG,
7bd50861 134 " target pathname");
2ad0a777 135 ASSERT2(target_path[0] == '/', MR_NOT_UNIQUE,
7bd50861 136 " non-absolute pathname supplied \"%s\"", target_path);
a6be2cf4 137 sprintf(buf, "%s/%s.out", DCM_DIR, service);
7bd50861 138 pathname = strsave(buf);
2ad0a777 139 ASSERT(NONNULL(pathname), MR_NO_MEM, " for pathname");
140 ASSERT(NONNULL(instructions), MR_NO_MEM, " for instructions");
141 ASSERT((strlen(instructions) < MAXPATHLEN), MR_ARG_TOO_LONG,
7bd50861 142 " instruction pathname");
de56407f 143
144 initialize();
7bd50861 145 com_err(whoami, 0, "starting update for %s", service_updated);
de56407f 146
147 /* open connection */
333d2c82 148 gdb_Options |= GDB_OPT_KEEPALIVE;
5dabdff4 149 conn = start_server_connection(service_address, "");
7bd50861 150 if (!conn || (connection_status(conn) == CON_STOPPED)) {
151 com_err(whoami, connection_errno(conn),
152 " can't connect to update %s", service_address);
2ad0a777 153 return(MR_CANT_CONNECT);
de56407f 154 }
de56407f 155
156 /* send authenticators */
7bd50861 157 code = send_auth(machine);
de56407f 158 if (code) {
7bd50861 159 com_err(whoami, code, " authorization attempt to %s failed",
160 service_updated);
de56407f 161 goto update_failed;
162 }
163
de940d6f 164 code = send_file(pathname, target_path, 0);
de56407f 165 if (code)
7bd50861 166 goto update_failed;
167
de56407f 168 /* send instructions for installation */
2ad0a777 169 strcpy(buf, "/tmp/moira-update.XXXXXX");
de56407f 170 mktemp(buf);
de940d6f 171 code = send_file(instructions, buf, 0);
de56407f 172 if (code)
7bd50861 173 goto update_failed;
174
de56407f 175 /* perform installation */
176 code = execute(buf);
177 if (code) {
7bd50861 178 com_err(whoami, code, " installation of %s failed, code = %d",
179 service_updated, code);
180 goto update_failed;
de56407f 181 }
182
de56407f 183 /* finished updates */
2ad0a777 184 code = MR_SUCCESS;
7bd50861 185
186 update_failed:
de56407f 187 send_quit();
de56407f 188 conn = sever_connection(conn);
189 return(code);
7bd50861 190
de56407f 191#undef NONNULL
192#undef ASSERT
193}
194
7bd50861 195
de56407f 196static
7bd50861 197send_auth(host_name)
198char *host_name;
de56407f 199{
200 KTEXT_ST ticket_st;
201 KTEXT ticket = &ticket_st;
202 STRING data;
203 register int code;
204 int response;
205
2ad0a777 206 code = get_mr_update_ticket(host_name, ticket);
de56407f 207 if (code) {
208 return(code);
209 }
210 STRING_DATA(data) = "AUTH_001";
211 MAX_STRING_SIZE(data) = 9;
212 code = send_object(conn, (char *)&data, STRING_T);
213 if (code) {
214 return(connection_errno(conn));
215 }
216 code = receive_object(conn, (char *)&response, INTEGER_T);
217 if (code) {
218 return(connection_errno(conn));
219 }
220 if (response) {
221 return(response);
222 }
223 STRING_DATA(data) = (char *)ticket->dat;
224 MAX_STRING_SIZE(data) = ticket->length;
225 code = send_object(conn, (char *)&data, STRING_T);
226 if (code) {
227 return(connection_errno(conn));
228 }
229 code = receive_object(conn, (char *)&response, INTEGER_T);
230 if (code) {
231 return(connection_errno(conn));
232 }
233 if (response) {
234 return(response);
235 }
2ad0a777 236 return(MR_SUCCESS);
de56407f 237}
238
239static
240execute(path)
241 char *path;
242{
1e447eb1 243 int response;
de56407f 244 STRING data;
245 register int code;
246
247 string_alloc(&data, BUFSIZ);
248 sprintf(STRING_DATA(data), "EXEC_002 %s", path);
249 code = send_object(conn, (char *)&data, STRING_T);
250 if (code)
251 return(connection_errno(conn));
252 code = receive_object(conn, (char *)&response, INTEGER_T);
253 if (code)
254 return(connection_errno(conn));
bc6cbc65 255 if (dbg & DBG_TRACE)
1e447eb1 256 com_err(whoami, response, "execute returned %d", response);
257 if (response)
258 return(response);
2ad0a777 259 return(MR_SUCCESS);
de56407f 260}
261
262send_quit()
263{
264 STRING str;
265 if (!conn)
266 return;
267 string_alloc(&str, 5);
268 (void) strcpy(STRING_DATA(str), "quit");
269 (void) send_object(conn, (char *)&str, STRING_T);
270 string_free(&str);
271}
This page took 0.113073 seconds and 5 git commands to generate.