| /* |
| * Copyright (C) Tildeslash Ltd. All rights reserved. |
| * |
| * This program is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU Affero General Public License version 3. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| * You should have received a copy of the GNU Affero General Public License |
| * along with this program. If not, see <http://www.gnu.org/licenses/>. |
| * |
| * In addition, as a special exception, the copyright holders give |
| * permission to link the code of portions of this program with the |
| * OpenSSL library under certain conditions as described in each |
| * individual source file, and distribute linked combinations |
| * including the two. |
| * |
| * You must obey the GNU Affero General Public License in all respects |
| * for all of the code used other than OpenSSL. |
| */ |
| |
| #include "config.h" |
| |
| #ifdef HAVE_STDIO_H |
| #include <stdio.h> |
| #endif |
| |
| #ifdef HAVE_STDLIB_H |
| #include <stdlib.h> |
| #endif |
| |
| #ifdef HAVE_SYS_TYPES_H |
| #include <sys/types.h> |
| #endif |
| |
| #ifdef HAVE_SYS_SOCKET_H |
| #include <sys/socket.h> |
| #endif |
| |
| #ifdef HAVE_STRING_H |
| #include <string.h> |
| #endif |
| |
| #ifdef HAVE_STRINGS_H |
| #include <strings.h> |
| #endif |
| |
| #ifdef HAVE_UNISTD_H |
| #include <unistd.h> |
| #endif |
| |
| #include "ssl.h" |
| #include "net.h" |
| #include "socket.h" |
| #include "monit.h" |
| #include "process.h" |
| #include "device.h" |
| |
| |
| /** |
| * Obtain status from the monit daemon |
| * |
| * @file |
| */ |
| |
| |
| /* ------------------------------------------------------------------ Public */ |
| |
| |
| /** |
| * Show all services in the service list. |
| */ |
| int status(char *level) { |
| |
| #define LINE 1024 |
| |
| int status = FALSE; |
| Socket_T S = NULL; |
| char buf[LINE]; |
| char *auth = NULL; |
| |
| if(!exist_daemon()) { |
| LogError("%s: Status not available -- the monit daemon is not running\n", prog); |
| return status; |
| } |
| S = socket_create_t(Run.bind_addr ? Run.bind_addr : "localhost", Run.httpdport, SOCKET_TCP, |
| (Ssl_T){.use_ssl = Run.httpdssl, .clientpemfile = Run.httpsslclientpem}, NET_TIMEOUT); |
| if (! S) { |
| LogError("%s: error connecting to the monit daemon\n", prog); |
| return status; |
| } |
| |
| auth = Util_getBasicAuthHeaderMonit(); |
| socket_print(S, |
| "GET /_status?format=text&level=%s HTTP/1.0\r\n%s\r\n", |
| level, auth?auth:""); |
| FREE(auth); |
| |
| /* Read past HTTP headers and check status */ |
| while(socket_readln(S, buf, LINE)) { |
| if(*buf == '\n' || *buf == '\r') |
| break; |
| if(Str_startsWith(buf, "HTTP/1.0 200")) |
| status= TRUE; |
| } |
| |
| if(!status) { |
| LogError("%s: cannot read status from the monit daemon\n", prog); |
| } else { |
| while(socket_readln(S, buf, LINE)) { |
| printf("%s", buf); |
| } |
| } |
| socket_free(&S); |
| |
| return status; |
| } |