/*
*
* Conky, a system monitor, based on torsmo
*
* Please see COPYING for details
*
* Copyright (C) 2018 François Revol et al.
* Copyright (c) 2004, Hannu Saransaari and Lauri Hakkarainen
* Copyright (c) 2005-2024 Brenden Matthews, Philip Kovacs, et. al.
* (see AUTHORS)
* All rights reserved.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* 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 General Public License
* along with this program. If not, see .
*
*/
#include
#include "conky.h"
#include "display-http.hh"
#include
#include
#include
#ifdef BUILD_HTTP
#include
#endif /* BUILD_HTTP */
namespace conky {
namespace {
#ifdef BUILD_HTTP
conky::display_output_http http_output;
#else
conky::disabled_display_output http_output_disabled("http", "BUILD_HTTP");
#endif
} // namespace
extern void init_http_output() {}
// TODO: cleanup namespace
// namespace priv {
#ifdef BUILD_HTTP
#ifdef MHD_YES
/* older API */
#define MHD_Result int
#endif /* MHD_YES */
std::string webpage;
struct MHD_Daemon *httpd;
static conky::simple_config_setting http_refresh("http_refresh", false,
true);
static conky::simple_config_setting http_port("http_port",
HTTPPORT, true);
MHD_Result sendanswer(void *cls, struct MHD_Connection *connection,
const char *url, const char *method, const char *version,
const char *upload_data, size_t *upload_data_size,
void **con_cls) {
struct MHD_Response *response = MHD_create_response_from_buffer(
webpage.length(), (void *)webpage.c_str(), MHD_RESPMEM_PERSISTENT);
MHD_Result ret = MHD_queue_response(connection, MHD_HTTP_OK, response);
MHD_destroy_response(response);
if (cls || url || method || version || upload_data || upload_data_size ||
con_cls) {} // make compiler happy
return ret;
}
class out_to_http_setting : public conky::simple_config_setting {
typedef conky::simple_config_setting Base;
protected:
virtual void lua_setter(lua::state &l, bool init) {
lua::stack_sentry s(l, -2);
Base::lua_setter(l, init);
if (init && do_convert(l, -1).first) {
/* warn about old default port */
if (http_port.get(*state) == 10080) {
NORM_ERR(
"warning: port 10080 is blocked by browsers "
"like Firefox and Chromium, you may want to change http_port.");
}
httpd =
MHD_start_daemon(MHD_USE_SELECT_INTERNALLY, http_port.get(*state),
nullptr, NULL, &sendanswer, nullptr, MHD_OPTION_END);
}
++s;
}
virtual void cleanup(lua::state &l) {
lua::stack_sentry s(l, -1);
if (do_convert(l, -1).first) {
MHD_stop_daemon(httpd);
httpd = nullptr;
}
l.pop();
}
public:
out_to_http_setting() : Base("out_to_http", false, false) {}
};
static out_to_http_setting out_to_http;
std::string string_replace_all(std::string original, const std::string &oldpart,
const std::string &newpart,
std::string::size_type start) {
std::string::size_type i = start;
int oldpartlen = oldpart.length();
while (1) {
i = original.find(oldpart, i);
if (i == std::string::npos) { break; }
original.replace(i, oldpartlen, newpart);
}
return original;
}
#endif /* BUILD_HTTP */
//} // namespace priv
#ifdef BUILD_HTTP
display_output_http::display_output_http() : display_output_base("http") {
priority = 0;
httpd = NULL;
}
bool display_output_http::detect() {
if (/*priv::*/ out_to_http.get(*state)) {
DBGP2("Display output '%s' enabled in config.", name.c_str());
return true;
}
return false;
}
bool display_output_http::initialize() {
if (/*priv::*/ out_to_http.get(*state)) {
is_active = true;
return true;
}
return false;
}
bool display_output_http::shutdown() { return true; }
void display_output_http::begin_draw_text() {
#define WEBPAGE_START1 \
"\n"
#define WEBPAGE_START2 \
"Conky"
#define WEBPAGE_END "
"
if (out_to_http.get(*state)) {
webpage = WEBPAGE_START1;
if (http_refresh.get(*state)) {
webpage.append("");
}
webpage.append(WEBPAGE_START2);
}
}
void display_output_http::end_draw_text() { webpage.append(WEBPAGE_END); }
void display_output_http::draw_string(const char *s, int) {
std::string::size_type origlen = webpage.length();
webpage.append(s);
webpage = string_replace_all(webpage, "\n", "
", origlen);
webpage = string_replace_all(webpage, " ", " ", origlen);
webpage = string_replace_all(webpage, " ", " ", origlen);
webpage.append("
");
}
#endif /* BUILD_HTTP */
} // namespace conky