/* * * 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