Browse Source

klish: Utility can send command to daemon

Serj Kalichev 2 years ago
parent
commit
9ba0f7428b

+ 9 - 2
bin/klish/klish.c

@@ -54,11 +54,18 @@ int main(int argc, char **argv)
 	net = faux_net_new();
 	faux_net_set_fd(net, ktp_session_fd(session));
 	msg = faux_msg_new(KTP_MAGIC, KTP_MAJOR, KTP_MINOR);
-	faux_msg_set_cmd(msg, KTP_AUTH);
+	faux_msg_set_cmd(msg, KTP_CMD);
+	if (opts->line)
+		faux_msg_add_param(msg, KTP_PARAM_LINE,
+			opts->line, strlen(opts->line));
+	faux_msg_debug(msg);
 	faux_msg_send(msg, net);
-//	write(ktp_session_fd(session), "hello", 5);
+	faux_msg_free(msg);
 
+	msg = faux_msg_recv(net);
+	faux_msg_debug(msg);
 	faux_msg_free(msg);
+
 	faux_net_free(net);
 
 	retval = 0;

+ 11 - 2
bin/klish/opts.c

@@ -30,6 +30,7 @@ struct options *opts_init(void)
 	// Initialize
 	opts->verbose = BOOL_FALSE;
 	opts->unix_socket_path = faux_str_dup(KLISH_DEFAULT_UNIX_SOCKET_PATH);
+	opts->line = NULL;
 
 	return opts;
 }
@@ -42,6 +43,8 @@ void opts_free(struct options *opts)
 	if (!opts)
 		return;
 	faux_str_free(opts->unix_socket_path);
+	faux_str_free(opts->line);
+
 	faux_free(opts);
 }
 
@@ -50,11 +53,12 @@ void opts_free(struct options *opts)
  */
 int opts_parse(int argc, char *argv[], struct options *opts)
 {
-	static const char *shortopts = "hvS:";
+	static const char *shortopts = "hvS:c:";
 	static const struct option longopts[] = {
 		{"socket",		1, NULL, 'S'},
 		{"help",		0, NULL, 'h'},
 		{"verbose",		0, NULL, 'v'},
+		{"command",		1, NULL, 'c'},
 		{NULL,			0, NULL, 0}
 	};
 
@@ -77,6 +81,10 @@ int opts_parse(int argc, char *argv[], struct options *opts)
 			help(0, argv[0]);
 			_exit(0);
 			break;
+		case 'c':
+			faux_str_free(opts->line);
+			opts->line = faux_str_dup(optarg);
+			break;
 		default:
 			help(-1, argv[0]);
 			_exit(-1);
@@ -111,8 +119,9 @@ void help(int status, const char *argv0)
 		printf("Usage   : %s [options]\n", name);
 		printf("Klish client\n");
 		printf("Options :\n");
-		printf("\t-S, --socket UNIX socket path.\n");
+		printf("\t-S <path>, --socket=<path> UNIX socket path.\n");
 		printf("\t-h, --help Print this help.\n");
 		printf("\t-v, --verbose Be verbose.\n");
+		printf("\t-c <line>, --command=<line> Command to execute.\n");
 	}
 }

+ 1 - 0
bin/klish/private.h

@@ -9,6 +9,7 @@
 struct options {
 	bool_t verbose;
 	char *unix_socket_path;
+	char *line;
 };
 
 // Options

+ 1 - 1
bin/klishd/klishd.c

@@ -681,7 +681,7 @@ static bool_t client_ev(faux_eloop_t *eloop, faux_eloop_type_e type,
 		if (!ktpd_session_async_out(ktpd_session)) {
 			// Someting went wrong
 			faux_eloop_del_fd(eloop, info->fd);
-			syslog(LOG_ERR, "Problem with async input");
+			syslog(LOG_ERR, "Problem with async output");
 		}
 	}
 

+ 4 - 4
klish/ksession/ksession_parse.c

@@ -130,9 +130,9 @@ static kpargv_status_e ksession_parse_arg(kentry_t *current_entry,
 		kentry_t *nested = NULL;
 
 		while ((nested = kentry_entrys_each(&iter))) {
-printf("SWITCH arg: %s, entry %s\n", *argv_iter ? faux_argv_current(*argv_iter) : "<empty>", kentry_name(nested));
+//printf("SWITCH arg: %s, entry %s\n", *argv_iter ? faux_argv_current(*argv_iter) : "<empty>", kentry_name(nested));
 			rc = ksession_parse_arg(nested, argv_iter, pargv);
-printf("%s\n", kpargv_status_decode(rc));
+//printf("%s\n", kpargv_status_decode(rc));
 			// If some arguments was consumed then we will not check
 			// next SWITCH's entries in any case.
 			if (saved_argv_iter != *argv_iter)
@@ -161,9 +161,9 @@ printf("%s\n", kpargv_status_decode(rc));
 			// Try to match argument and current entry
 			// (from 'min' to 'max' times)
 			for (num = 0; num < kentry_max(nested); num++) {
-printf("SEQ arg: %s, entry %s\n", *argv_iter ? faux_argv_current(*argv_iter) : "<empty>", kentry_name(nested));
+//printf("SEQ arg: %s, entry %s\n", *argv_iter ? faux_argv_current(*argv_iter) : "<empty>", kentry_name(nested));
 				nrc = ksession_parse_arg(nested, argv_iter, pargv);
-printf("%s\n", kpargv_status_decode(nrc));
+//printf("%s\n", kpargv_status_decode(nrc));
 				if (nrc != KPARSE_INPROGRESS)
 					break;
 			}

+ 7 - 0
klish/ktp.h

@@ -31,6 +31,13 @@ typedef enum {
 } ktp_cmd_e;
 
 
+typedef enum {
+	KTP_PARAM_NULL = '\0',
+	KTP_PARAM_LINE = 'L',
+	KTP_PARAM_ERROR = 'E',
+} ktp_param_e;
+
+
 C_DECL_BEGIN
 
 int ktp_connect_unix(const char *sun_path);

+ 56 - 1
klish/ktp/ktpd_session.c

@@ -39,6 +39,49 @@ static bool_t check_ktp_header(faux_hdr_t *hdr)
 }
 
 
+static bool_t ktpd_session_process_cmd(ktpd_session_t *session, faux_msg_t *msg)
+{
+	bool_t rc = BOOL_FALSE;
+
+	assert(session);
+	if (!session)
+		goto err;
+	assert(msg);
+	if (!msg)
+		goto err;
+
+	goto err;
+
+	rc = BOOL_TRUE;
+err:
+	if (!rc) {
+		char *buf = NULL;
+		size_t buf_len = 0;
+		faux_msg_t *emsg = faux_msg_new(KTP_MAGIC, KTP_MAJOR, KTP_MINOR);
+		const char *error = "Can't process line";
+		faux_msg_set_cmd(emsg, KTP_CMD_ACK);
+		faux_msg_add_param(emsg, KTP_PARAM_ERROR, error, strlen(error));
+	
+//	faux_net_t *net = faux_net_new();
+//	faux_net_set_fd(net, ktpd_session_fd(session));
+faux_msg_debug(emsg);
+//	printf("Send len: %ld\n", faux_msg_send(emsg, net));
+//	faux_net_free(net);
+
+	
+	
+//	buf = buf;
+//	buf_len = buf_len;
+		faux_msg_serialize(emsg, &buf, &buf_len);
+		faux_async_write(session->async, buf, buf_len);
+		faux_free(buf);
+		faux_msg_free(emsg);
+	}
+
+	return rc;
+}
+
+
 static bool_t ktpd_session_dispatch(ktpd_session_t *session, faux_msg_t *msg)
 {
 	assert(session);
@@ -48,7 +91,19 @@ static bool_t ktpd_session_dispatch(ktpd_session_t *session, faux_msg_t *msg)
 	if (!msg)
 		return BOOL_FALSE;
 
-	printf("Dispatch %d\n", faux_msg_get_len(msg));
+	printf("Dispatch cmd %c\n", (char)faux_msg_get_cmd(msg));
+	switch (faux_msg_get_cmd(msg)) {
+	case KTP_CMD:
+		ktpd_session_process_cmd(session, msg);
+		break;
+/*	case KTP_COMPLETION:
+		break;
+	case KTP_HELP:
+		break;
+*/	default:
+		printf("Unsupported command\n");
+		break;
+	}
 
 	return BOOL_TRUE;
 }

+ 0 - 4
klish/xml-helper/load.c

@@ -21,10 +21,6 @@
 
 #define TAG "XML"
 
-#ifdef DEBUG
-#define KXML_DEBUG DEBUG
-#endif
-
 
 typedef bool_t (kxml_process_fn)(const kxml_node_t *element,
 	void *parent, faux_error_t *error);