static void cockpit_web_server_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { CockpitWebServer *server = COCKPIT_WEB_SERVER (object); GString *str; const gchar *address = NULL; switch (prop_id) { case PROP_PORT: server->port = g_value_get_int (value); break; case PROP_ADDRESS: address = g_value_get_string (value); if (address) { server->address = g_inet_address_new_from_string (address); if (!server->address) g_warning ("Couldn't parse IP address from: %s", address); } break; case PROP_CERTIFICATE: server->certificate = g_value_dup_object (value); break; case PROP_DOCUMENT_ROOTS: server->document_roots = cockpit_web_server_resolve_roots (g_value_get_boxed (value)); break; case PROP_SSL_EXCEPTION_PREFIX: g_string_assign (server->ssl_exception_prefix, g_value_get_string (value)); break; case PROP_URL_ROOT: str = g_string_new (g_value_get_string (value)); while (str->str[0] == '/') g_string_erase (str, 0, 1); if (str->len) { while (str->str[str->len - 1] == '/') g_string_truncate (str, str->len - 1); } if (str->len) g_string_printf (server->url_root, "/%s", str->str); else g_string_assign (server->url_root, str->str); g_string_free (str, TRUE); break; case PROP_REDIRECT_TLS: server->redirect_tls = g_value_get_boolean (value); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
int main (int argc, char *argv[]) { gint ret = 1; CockpitWebServer *server = NULL; GOptionContext *context; CockpitHandlerData data; GTlsCertificate *certificate = NULL; GError *local_error = NULL; GError **error = &local_error; gchar **roots = NULL; gchar *cert_path = NULL; GMainLoop *loop; signal (SIGPIPE, SIG_IGN); g_setenv ("GSETTINGS_BACKEND", "memory", TRUE); g_setenv ("GIO_USE_PROXY_RESOLVER", "dummy", TRUE); g_setenv ("GIO_USE_VFS", "local", TRUE); /* Any interaction with a krb5 ccache should be explicit */ g_setenv ("KRB5CCNAME", "FILE:/dev/null", TRUE); g_type_init (); ssh_init (); memset (&data, 0, sizeof (data)); context = g_option_context_new (NULL); g_option_context_add_main_entries (context, cmd_entries, NULL); if (!g_option_context_parse (context, &argc, &argv, error)) { goto out; } cockpit_set_journal_logging (!isatty (2)); if (opt_no_tls) { /* no certificate */ } else { cert_path = cockpit_certificate_locate (FALSE, error); if (cert_path != NULL) certificate = cockpit_certificate_load (cert_path, error); if (certificate == NULL) goto out; g_info ("Using certificate: %s", cert_path); } if (opt_uninstalled) { roots = cockpit_web_server_resolve_roots (SRCDIR "/src/static", SRCDIR "/lib", NULL); cockpit_ws_bridge_program = BUILDDIR "/cockpit-bridge"; cockpit_ws_session_program = BUILDDIR "/cockpit-session"; } else { roots = cockpit_web_server_resolve_roots (DATADIR "/cockpit/static", NULL); } data.auth = cockpit_auth_new (); data.static_roots = (const gchar **)roots; server = cockpit_web_server_new (opt_port, certificate, NULL, NULL, error); if (server == NULL) { g_prefix_error (error, "Error starting web server: "); goto out; } /* Ignores stuff it shouldn't handle */ g_signal_connect (server, "handle-stream", G_CALLBACK (cockpit_handler_socket), &data); g_signal_connect (server, "handle-resource::/login", G_CALLBACK (cockpit_handler_login), &data); /* Don't redirect to TLS for /ping */ g_object_set (server, "ssl-exception-prefix", "/ping", NULL); g_signal_connect (server, "handle-resource::/ping", G_CALLBACK (cockpit_handler_ping), &data); g_signal_connect (server, "handle-resource::/", G_CALLBACK (cockpit_handler_index), &data); g_signal_connect (server, "handle-resource::/static/", G_CALLBACK (cockpit_handler_static), &data); g_signal_connect (server, "handle-resource::/cockpit/", G_CALLBACK (cockpit_handler_resource), &data); /* Files that cannot be cache-forever, because of well known names */ g_signal_connect (server, "handle-resource::/favicon.ico", G_CALLBACK (cockpit_handler_root), &data); g_signal_connect (server, "handle-resource::/apple-touch-icon.png", G_CALLBACK (cockpit_handler_root), &data); g_info ("HTTP Server listening on port %d", opt_port); loop = g_main_loop_new (NULL, FALSE); g_main_loop_run (loop); g_main_loop_unref (loop); ret = 0; out: if (local_error) { g_printerr ("cockpit-ws: %s\n", local_error->message); g_error_free (local_error); } g_clear_object (&server); g_clear_object (&data.auth); g_clear_object (&certificate); g_free (cert_path); g_strfreev (roots); return ret; }