diff --git a/plugins/nagios/nagios.c b/plugins/nagios/nagios.c index 5ab70acf..b459eb50 100644 --- a/plugins/nagios/nagios.c +++ b/plugins/nagios/nagios.c @@ -16,7 +16,7 @@ struct option nagios_options[] = { int nagios() { char *tcp_port; - struct pollfd nagios_poll; + struct wsgi_request nagios_req; // connect and send if (!use_nagios) { @@ -34,27 +34,30 @@ int nagios() { tcp_port[0] = 0; - nagios_poll.fd = connect_to_tcp(uwsgi.sockets->name, atoi(tcp_port + 1), uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], 0); - if (nagios_poll.fd < 0) { + int fd = connect_to_tcp(uwsgi.sockets->name, atoi(tcp_port + 1), uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], 0); + if (fd < 0) { fprintf(stdout, "UWSGI CRITICAL: could not connect() to workers\n"); exit(2); } - uwsgi.wsgi_req->uh.modifier1 = UWSGI_MODIFIER_PING; - uwsgi.wsgi_req->uh.pktsize = 0; - uwsgi.wsgi_req->uh.modifier2 = 0; - if (write(nagios_poll.fd, uwsgi.wsgi_req, 4) != 4) { + nagios_req.uh.modifier1 = UWSGI_MODIFIER_PING; + nagios_req.uh.pktsize = 0; + nagios_req.uh.modifier2 = 0; + if (write(fd, &nagios_req.uh, 4) != 4) { uwsgi_error("write()"); fprintf(stdout, "UWSGI CRITICAL: could not send ping packet to workers\n"); exit(2); } - nagios_poll.events = POLLIN; - if (!uwsgi_parse_response(&nagios_poll, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], (struct uwsgi_header *) uwsgi.wsgi_req, uwsgi.wsgi_req->buffer, uwsgi_proto_uwsgi_parser)) { + + nagios_req.poll.fd = fd; + nagios_req.poll.events = POLLIN; + + if (!uwsgi_parse_packet(&nagios_req, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT])) { fprintf(stdout, "UWSGI CRITICAL: timed out waiting for response\n"); exit(2); } else { - if (uwsgi.wsgi_req->uh.pktsize > 0) { - fprintf(stdout, "UWSGI WARNING: %.*s\n", uwsgi.wsgi_req->uh.pktsize, uwsgi.wsgi_req->buffer); + if (nagios_req.uh.pktsize > 0) { + fprintf(stdout, "UWSGI WARNING: %.*s\n", nagios_req.uh.pktsize, nagios_req.buffer); exit(1); } else { diff --git a/plugins/ping/ping_plugin.c b/plugins/ping/ping_plugin.c index d82c30aa..e6f3af81 100644 --- a/plugins/ping/ping_plugin.c +++ b/plugins/ping/ping_plugin.c @@ -15,32 +15,38 @@ struct option uwsgi_ping_options[] = { static void ping() { - struct uwsgi_header uh; - struct pollfd uwsgi_poll; + struct wsgi_request ping_req; + char *buf = uwsgi_malloc(uwsgi.buffer_size); // use a 3 secs timeout by default if (!uping.ping_timeout) uping.ping_timeout = 3; uwsgi_log("PING uwsgi host %s (timeout: %d)\n", uping.ping, uping.ping_timeout); - uwsgi_poll.fd = uwsgi_connect(uping.ping, uping.ping_timeout, 0); - if (uwsgi_poll.fd < 0) { + int fd = uwsgi_connect(uping.ping, uping.ping_timeout, 0); + if (fd < 0) { exit(1); } - uh.modifier1 = UWSGI_MODIFIER_PING; - uh.pktsize = 0; - uh.modifier2 = 0; - if (write(uwsgi_poll.fd, &uh, 4) != 4) { + memset(&ping_req, 0, sizeof(struct wsgi_request)); + ping_req.uh.modifier1 = UWSGI_MODIFIER_PING; + ping_req.uh.pktsize = 0; + ping_req.uh.modifier2 = 0; + if (write(fd, &ping_req.uh, 4) != 4) { uwsgi_error("write()"); exit(2); } - uwsgi_poll.events = POLLIN; - if (!uwsgi_parse_response(&uwsgi_poll, uping.ping_timeout, &uh, NULL, uwsgi_proto_uwsgi_parser)) { + ping_req.poll.fd = fd; + ping_req.poll.events = POLLIN; + + ping_req.buffer = buf; + + if (!uwsgi_parse_packet(&ping_req, uping.ping_timeout)) { exit(1); } else { - if (uh.pktsize > 0) { + if (ping_req.uh.pktsize > 0) { + uwsgi_log("[WARNING] node %s message: %.*s\n", uping.ping, ping_req.uh.pktsize, buf); exit(2); } else { @@ -92,6 +98,7 @@ int uwsgi_ping_manage_options(int i, char *optarg) { switch(i) { case LONG_ARGS_PING: + uwsgi.no_server = 1; uping.ping = optarg; return 1; case LONG_ARGS_PING_TIMEOUT: diff --git a/plugins/python/uwsgi_pymodule.c b/plugins/python/uwsgi_pymodule.c index b486b6c6..19950648 100644 --- a/plugins/python/uwsgi_pymodule.c +++ b/plugins/python/uwsgi_pymodule.c @@ -319,7 +319,6 @@ PyObject *py_uwsgi_rpc(PyObject * self, PyObject * args) { int rlen; int rpc_args = 0; - struct pollfd upoll; // TODO better error reporting if (argc < 2) @@ -405,11 +404,10 @@ PyObject *py_uwsgi_rpc(PyObject * self, PyObject * args) { rlen = uwsgi_waitfd(fd, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT]); if (rlen > 0) { - upoll.fd = fd; - upoll.events = POLLIN; rpc_req.poll.fd = fd; + rpc_req.poll.events = POLLIN; rpc_req.buffer = buffer; - if (uwsgi_parse_response(&upoll, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], (struct uwsgi_header *)&rpc_req, buffer, uwsgi_proto_uwsgi_parser)) { + if (uwsgi_parse_packet(&rpc_req, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT])) { size = rpc_req.uh.pktsize; } } @@ -1246,7 +1244,7 @@ PyObject *py_uwsgi_send_multi_message(PyObject * self, PyObject * args) { int managed; struct pollfd *multipoll; char *buffer; - struct uwsgi_header uh; + PyObject *arg_cluster; PyObject *cluster_node; @@ -1360,9 +1358,11 @@ PyObject *py_uwsgi_send_multi_message(PyObject * self, PyObject * args) { goto megamulticlear; } else { + // TODO fix +/* for (i = 0; i < clen; i++) { if (multipoll[i].revents & POLLIN) { - if (!uwsgi_parse_response(&multipoll[i], PyInt_AsLong(arg_timeout), &uh, &buffer[i], uwsgi_proto_uwsgi_parser)) { + if (!uwsgi_parse_packet(&multipoll[i], PyInt_AsLong(arg_timeout), &uh, &buffer[i], uwsgi_proto_uwsgi_parser)) { goto megamulticlear; } else { @@ -1375,6 +1375,7 @@ PyObject *py_uwsgi_send_multi_message(PyObject * self, PyObject * args) { } } } +*/ } } diff --git a/plugins/rpc/rpc_plugin.c b/plugins/rpc/rpc_plugin.c index f1f49bf6..3c8c1d35 100644 --- a/plugins/rpc/rpc_plugin.c +++ b/plugins/rpc/rpc_plugin.c @@ -5,8 +5,8 @@ extern struct uwsgi_server uwsgi; int uwsgi_rpc_request(struct wsgi_request *wsgi_req) { - char *argv[0xff]; - uint8_t argc; + char *argv[256]; + uint8_t argc = 0xff; /* Standard RPC request */ if (!wsgi_req->uh.pktsize) { @@ -14,10 +14,24 @@ int uwsgi_rpc_request(struct wsgi_request *wsgi_req) { return -1; } + /* + for(argc=0;argcuh.pktsize;argc++) { + uwsgi_log("rpc: %c\n", wsgi_req->buffer[argc]); + } + */ + +#ifdef UWSGI_DEBUG + uwsgi_log("RPC pktsize %d\n", wsgi_req->uh.pktsize); +#endif + if (uwsgi_parse_array(wsgi_req->buffer, wsgi_req->uh.pktsize, argv, &argc)) { uwsgi_log("Invalid RPC request. skip.\n"); return -1; } + +#ifdef UWSGI_DEBUG + uwsgi_log("RPC args %d\n", argc-1); +#endif wsgi_req->uh.pktsize = uwsgi_rpc(argv[0], argc-1, argv+1, wsgi_req->buffer); diff --git a/protocol.c b/protocol.c index 1b3634df..78145a1e 100644 --- a/protocol.c +++ b/protocol.c @@ -339,7 +339,7 @@ ssize_t uwsgi_send_message(int fd, uint8_t modifier1, uint8_t modifier2, char *m } -int uwsgi_parse_response(struct pollfd *upoll, int timeout, struct uwsgi_header *uh, char *buffer, int (*socket_proto)(struct wsgi_request *)) { +int uwsgi_parse_packet(struct wsgi_request *wsgi_req, int timeout) { int rlen; int status = UWSGI_AGAIN; @@ -347,7 +347,7 @@ int uwsgi_parse_response(struct pollfd *upoll, int timeout, struct uwsgi_header timeout = 1; while(status == UWSGI_AGAIN) { - rlen = poll(upoll, 1, timeout * 1000); + rlen = poll(&wsgi_req->poll, 1, timeout * 1000); if (rlen < 0) { uwsgi_error("poll()"); exit(1); @@ -357,7 +357,12 @@ int uwsgi_parse_response(struct pollfd *upoll, int timeout, struct uwsgi_header //close(upoll->fd); return 0; } - status = socket_proto((struct wsgi_request *) uh); + if (wsgi_req->socket) { + status = wsgi_req->socket->proto(wsgi_req); + } + else { + status = uwsgi_proto_uwsgi_parser(wsgi_req); + } if (status < 0) { uwsgi_log("error parsing request\n"); //close(upoll->fd); @@ -393,6 +398,7 @@ int uwsgi_parse_array(char *buffer, uint16_t size, char **argv, uint8_t *argc) { if (ptrbuf + strsize <= bufferend) { // item argv[*argc] = uwsgi_cheap_string(ptrbuf, strsize); + uwsgi_log("arg %s\n", argv[*argc]); ptrbuf += strsize; *argc = *argc + 1; } @@ -754,7 +760,7 @@ int uwsgi_ping_node(int node, struct wsgi_request *wsgi_req) { } uwsgi_poll.events = POLLIN; - if (!uwsgi_parse_response(&uwsgi_poll, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], (struct uwsgi_header *) wsgi_req, wsgi_req->buffer, uwsgi_proto_uwsgi_parser)) { + if (!uwsgi_parse_packet(wsgi_req, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT])) { return -1; } @@ -1096,8 +1102,7 @@ uint16_t fcgi_get_record(int fd, char *buf) { char *uwsgi_simple_message_string(char *socket_name, uint8_t modifier1, uint8_t modifier2, char *what, uint16_t what_len, char *buffer, uint16_t *response_len, int timeout) { - struct uwsgi_header uh; - struct pollfd upoll; + struct wsgi_request msg_req; int fd = uwsgi_connect(socket_name, timeout, 0); @@ -1112,17 +1117,19 @@ char *uwsgi_simple_message_string(char *socket_name, uint8_t modifier1, uint8_t return NULL; } - upoll.fd = fd; - upoll.events = POLLIN; + memset(&msg_req, 0, sizeof(struct wsgi_request)); + msg_req.poll.fd = fd; + msg_req.poll.events = POLLIN; + msg_req.buffer = buffer; if (buffer) { - if (!uwsgi_parse_response(&upoll, timeout, &uh, buffer, uwsgi_proto_uwsgi_parser)) { + if (!uwsgi_parse_packet(&msg_req, timeout)) { close(fd); if (response_len) *response_len = 0; return NULL; } - if (response_len) *response_len = uh.pktsize; + if (response_len) *response_len = msg_req.uh.pktsize; } close(fd); diff --git a/utils.c b/utils.c index ddc55d01..f8ec4be6 100644 --- a/utils.c +++ b/utils.c @@ -716,7 +716,7 @@ int wsgi_req_recv(struct wsgi_request *wsgi_req) { gettimeofday(&wsgi_req->start_of_request, NULL); if (!wsgi_req->socket->edge_trigger) { - if (!uwsgi_parse_response(&wsgi_req->poll, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT], (struct uwsgi_header *) wsgi_req, wsgi_req->buffer, wsgi_req->socket->proto)) { + if (!uwsgi_parse_packet(wsgi_req, uwsgi.shared->options[UWSGI_OPTION_SOCKET_TIMEOUT])) { return -1; } } diff --git a/uwsgi.c b/uwsgi.c index 6432d418..ad9f3fb2 100644 --- a/uwsgi.c +++ b/uwsgi.c @@ -746,8 +746,6 @@ int main(int argc, char *argv[], char *envp[]) { char *magic_table[0xff]; char *optname; - uwsgi_log("size = %d\n", sizeof(struct cmsghdr) + CMSG_SPACE(sizeof(int))); - signal(SIGHUP, SIG_IGN); signal(SIGTERM, SIG_IGN); diff --git a/uwsgi.h b/uwsgi.h index afb5796c..a91fcbed 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -1508,7 +1508,7 @@ uint64_t uwsgi_swap64(uint64_t); ssize_t send_udp_message(uint8_t, char *, char *, uint16_t); #endif -int uwsgi_parse_response(struct pollfd *, int, struct uwsgi_header *, char *, int (*)(struct wsgi_request *)); +int uwsgi_parse_packet(struct wsgi_request *, int); int uwsgi_parse_vars(struct wsgi_request *); int uwsgi_enqueue_message(char *, int, uint8_t, uint8_t, char *, int, int); diff --git a/uwsgicc/__init__.py b/uwsgicc/__init__.py index 6b49893f..9ea610e9 100644 --- a/uwsgicc/__init__.py +++ b/uwsgicc/__init__.py @@ -7,4 +7,6 @@ def hello_world(name): uwsgi.register_rpc("hello", hello_world) +uwsgi.set_warning_message("uWSGI is running the Control Center") + application = app