- Sysconfig-console is basing its connection parameters off a
possible new way of handling URLS. Keeping all parameters
in a map.
- Key getting/setting implemented
Signed-off-by: Adam Stokes <astokes(a)fedoraproject.org>
---
src/CMakeLists.txt | 2 +-
src/include/matahari/mh_agent.h | 1 -
src/include/matahari/sysconfig.h | 92 +++++++++++++++++++++
src/lib/CMakeLists.txt | 13 ++--
src/lib/sysconfig.c | 118 +++++++++++++++++++++++++++
src/lib/sysconfig_linux.c | 154 +++++++++++++++++++++++++++++++++++
src/postboot/CMakeLists.txt | 30 -------
src/postboot/postboot-console.cpp | 79 ------------------
src/postboot/postboot-qmf.cpp | 101 -----------------------
src/postboot/schema.xml | 16 ----
src/sysconfig/CMakeLists.txt | 30 +++++++
src/sysconfig/schema.xml | 35 ++++++++
src/sysconfig/sysconfig-console.cpp | 97 ++++++++++++++++++++++
src/sysconfig/sysconfig-qmf.cpp | 142 ++++++++++++++++++++++++++++++++
src/tests/CMakeLists.txt | 6 +-
src/tests/mh_api_postboot.h | 34 --------
src/tests/mh_api_sysconfig.h | 37 +++++++++
17 files changed, 716 insertions(+), 271 deletions(-)
create mode 100644 src/include/matahari/sysconfig.h
create mode 100644 src/lib/sysconfig.c
create mode 100644 src/lib/sysconfig_linux.c
delete mode 100644 src/postboot/CMakeLists.txt
delete mode 100644 src/postboot/postboot-console.cpp
delete mode 100644 src/postboot/postboot-qmf.cpp
delete mode 100644 src/postboot/schema.xml
create mode 100644 src/sysconfig/CMakeLists.txt
create mode 100644 src/sysconfig/schema.xml
create mode 100644 src/sysconfig/sysconfig-console.cpp
create mode 100644 src/sysconfig/sysconfig-qmf.cpp
delete mode 100644 src/tests/mh_api_postboot.h
create mode 100644 src/tests/mh_api_sysconfig.h
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 227e89c..50b3ea7 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -138,7 +138,7 @@ add_subdirectory(lib)
add_subdirectory(host)
add_subdirectory(network)
add_subdirectory(service)
-add_subdirectory(postboot)
+add_subdirectory(sysconfig)
add_subdirectory(tests)
### Installation
diff --git a/src/include/matahari/mh_agent.h b/src/include/matahari/mh_agent.h
index 5b6c8a3..567e2f1 100644
--- a/src/include/matahari/mh_agent.h
+++ b/src/include/matahari/mh_agent.h
@@ -1,7 +1,6 @@
/* mh_agent.cpp - Copyright (C) 2010 Red Hat, Inc.
* Written by Andrew Beekhof <andrew(a)beekhof.net>
*
- *
* 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
diff --git a/src/include/matahari/sysconfig.h b/src/include/matahari/sysconfig.h
new file mode 100644
index 0000000..72e2fa0
--- /dev/null
+++ b/src/include/matahari/sysconfig.h
@@ -0,0 +1,92 @@
+/* sysconfig.h - Copyright (C) 2011 Red Hat, Inc.
+ * Written by Adam Stokes <astokes(a)fedoraproject.org>
+ *
+ * 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 2.1 of the License, or (at your option) any later version.
+ *
+ * This software 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 library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/**
+ * \file
+ * \brief Config API
+ * \ingroup coreapi
+ */
+
+#ifndef __MH_SYSCONFIG_H__
+#define __MH_SYSCONFIG_H__
+
+#include <stdint.h>
+#include <glib.h>
+/*! Supported FLAGS */
+#define MH_SYSCONFIG_FLAG_FORCE (1 << 0)
+
+/**
+ * Download and process URI for configuration
+ *
+ * \param[in] uri the url of configuration item
+ * \param[in] flags flags used
+ * \param[in] scheme the type of configuration i.e. puppet
+ * \param[in] key configuration key for keeping track of existing
+ * configuration runs
+ *
+ * \return 0 for success -1 for fail
+ */
+extern int mh_sysconfig_run_uri(const char *uri, uint32_t flags, const char *scheme,
+ const char *key);
+
+/**
+ * Process a text blob
+ *
+ * \param[in] string the text blob to process, accepts a range of data from XML to Puppet
classes
+ * \param[in] flags flags used
+ * \param[in] scheme the type of configuration i.e. puppet
+ * \param[in] key configuration key for keeping track of existing
+ * configuration runs
+ *
+ * \return 0 for success -1 for fail
+ */
+extern int mh_sysconfig_run_string(const char *string, uint32_t flags, const char
*scheme,
+ const char *key);
+
+/**
+ * Query against a configuration object on the system
+ *
+ * \param[in] query the query command used
+ * \param[in] flags flags used
+ * \param[in] scheme the type of configuration i.e. puppet
+ *
+ * \return data the result found from query
+ */
+extern const char *
+mh_sysconfig_query(const char *query, uint32_t flags, const char *scheme);
+
+/**
+ * Set system as configured
+ *
+ * \param[in] key config item to define
+ *
+ * \return TRUE if applying key to config succeeds
+ */
+extern gboolean
+mh_set_configured(const char *key);
+
+/**
+ * Test if system has been configured
+ *
+ * \param[in] flags allow a force reconfiguration
+ * \param[in] key config item to test if used
+ */
+extern gboolean
+mh_is_configured(uint32_t flags, const char *key);
+
+#endif // __MH_SYSCONFIG_H__
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index cf37cf3..d12b577 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -1,10 +1,10 @@
# Library
-set(LIBS mcommon mhost mnetwork mservice mpostboot)
+set(LIBS mcommon mhost mnetwork mservice msysconfig)
include_directories(${pcre_INCLUDE_DIRS})
# See
http://sourceware.org/autobook/autobook/autobook_91.html for
-# how to set the library version appropriately
+# how to set the library version appropriately
add_library (mcommon SHARED utilities.c mainloop.c dnssrv_${VARIANT}.c)
set_target_properties(mcommon PROPERTIES SOVERSION 1.0.0)
@@ -22,9 +22,9 @@ add_library (mservice SHARED services.c services_${VARIANT}.c)
set_target_properties(mservice PROPERTIES SOVERSION 1.0.0)
target_link_libraries(mservice ${pcre_LIBRARIES} mcommon ${SIGAR} ${glib_LIBRARIES})
-add_library (mpostboot SHARED postboot.c)
-set_target_properties(mpostboot PROPERTIES SOVERSION 1.0.0)
-target_link_libraries(mpostboot ${pcre_LIBRARIES} mcommon ${glib_LIBRARIES})
+add_library (msysconfig SHARED sysconfig.c sysconfig_${VARIANT}.c)
+set_target_properties(msysconfig PROPERTIES SOVERSION 1.0.0)
+target_link_libraries(msysconfig ${pcre_LIBRARIES} mcommon ${glib_LIBRARIES})
if(WIN32)
foreach (lib ${LIBS})
@@ -33,7 +33,8 @@ if(WIN32)
endforeach (lib ${LIBS})
else(WIN32)
foreach (lib ${LIBS})
- install(TARGETS ${lib} DESTINATION lib${LIB_SUFFIX})
+ target_link_libraries(${lib} resolv curl)
+ install(TARGETS ${lib} DESTINATION lib${LIB_SUFFIX})
endforeach (lib ${LIBS})
endif(WIN32)
diff --git a/src/lib/sysconfig.c b/src/lib/sysconfig.c
new file mode 100644
index 0000000..cdc1599
--- /dev/null
+++ b/src/lib/sysconfig.c
@@ -0,0 +1,118 @@
+/* sysconfig.c - Copyright (C) 2011 Red Hat, Inc.
+ * Written by Adam Stokes <astokes(a)fedoraproject.org>
+ *
+ * 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 2.1 of the License, or (at your option) any later version.
+ *
+ * This software 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 library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <stdint.h>
+#include <string.h>
+#include <fcntl.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+#include <glib/gprintf.h>
+
+#include "matahari/logging.h"
+#include "matahari/sysconfig.h"
+#include "matahari/utilities.h"
+
+MH_TRACE_INIT_DATA(mh_sysconfig);
+
+static const char configured_fn[] = "/var/lib/matahari/.is_configured";
+
+static char **
+string_to_array(const char *contents)
+{
+ char **keys = NULL;
+ keys = g_strsplit(contents, "\n", 0);
+ return keys;
+}
+
+static gboolean
+set_key(const char *key)
+{
+ char *contents = NULL;
+ char *contents_appended = NULL;
+ char **keys_array = NULL;
+ size_t length;
+
+ if (!g_file_test(configured_fn, G_FILE_TEST_EXISTS)) {
+ if (!g_file_set_contents(configured_fn, key, -1, NULL)) {
+ mh_err("Could not read file %s", configured_fn);
+ return FALSE;
+ }
+ } else {
+ if (g_file_get_contents(configured_fn, &contents, &length, NULL)) {
+ int i = 0;
+ keys_array = string_to_array(contents);
+ while (keys_array[i] != NULL) {
+ if ((strcasecmp(key, keys_array[i])) == 0) {
+ return TRUE;
+ }
+ i++;
+ }
+ contents_appended = g_strconcat(contents, "\n", key, NULL);
+ g_file_set_contents(configured_fn, contents_appended, -1, NULL);
+ } else {
+ mh_err("Unable to write to keys file");
+ return FALSE;
+ }
+ }
+ return TRUE;
+}
+
+static gboolean
+get_key(const char *key)
+{
+ size_t length;
+ int i = 0;
+ char *contents = NULL;
+ char **keys_array = NULL;
+ if (g_file_test(configured_fn, G_FILE_TEST_EXISTS)) {
+ g_file_get_contents(configured_fn, &contents, &length, NULL);
+ keys_array = string_to_array(contents);
+ while (keys_array[i] != NULL) {
+ if ((strcasecmp(key, keys_array[i])) == 0) {
+ g_strfreev(keys_array);
+ return TRUE;
+ }
+ i++;
+ }
+ }
+ g_strfreev(keys_array);
+ return FALSE;
+}
+
+gboolean
+mh_set_configured(const char *key)
+{
+ if (!set_key(key)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+gboolean
+mh_is_configured(uint32_t flags, const char *key)
+{
+ if (flags & MH_SYSCONFIG_FLAG_FORCE) {
+ return FALSE;
+ }
+
+ if (!get_key(key)) {
+ return FALSE;
+ }
+ return TRUE;
+}
+
diff --git a/src/lib/sysconfig_linux.c b/src/lib/sysconfig_linux.c
new file mode 100644
index 0000000..c159c5f
--- /dev/null
+++ b/src/lib/sysconfig_linux.c
@@ -0,0 +1,154 @@
+/* sysconfig_linux.c - Copyright (C) 2011 Red Hat, Inc.
+ * Written by Adam Stokes <astokes(a)fedoraproject.org>
+ *
+ * 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 2.1 of the License, or (at your option) any later version.
+ *
+ * This software 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 library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef WIN32
+#include "config.h"
+#include <stddef.h>
+#endif
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <glib.h>
+#include <curl/curl.h>
+#include "matahari/logging.h"
+#include "matahari/sysconfig.h"
+#include "matahari/utilities.h"
+
+
+MH_TRACE_INIT_DATA(mh_sysconfig);
+
+static int
+download(const char *uri, FILE *fp)
+{
+ CURL *curl;
+ CURLcode res;
+
+ curl_global_init(CURL_GLOBAL_DEFAULT);
+ curl = curl_easy_init();
+ if (curl) {
+ curl_easy_setopt(curl, CURLOPT_URL, uri);
+ curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
+ res = curl_easy_perform(curl);
+
+ if (CURLE_OK != res) {
+ return -1;
+ }
+ }
+ curl_global_cleanup();
+ return 0;
+}
+
+
+static int
+mh_sysconfig_run_puppet(const char *uri, const char *data)
+{
+ gboolean ret;
+ GError *error;
+ char filename[PATH_MAX + 1];
+ gchar cmd[PATH_MAX];
+ int fd;
+ FILE *fp;
+
+ if (uri != NULL) {
+ strncpy(filename, "puppet_conf_XXXXXX", sizeof(filename) -1);
+ fd = mkstemp(filename);
+ if (fd < 0) {
+ return -1;
+ }
+ fp = fdopen(fd, "w+b");
+ if (fp == NULL) {
+ return -1;
+ }
+ if ((download(uri, fp)) != 0) {
+ fclose(fp);
+ return -1;
+ }
+ fclose(fp);
+ } else if (data != NULL) {
+ strncpy(filename,"puppet_conf_blob", sizeof(filename) -1);
+ g_file_set_contents(filename, data, strlen(data), NULL);
+ } else {
+ return -1;
+ }
+
+ g_snprintf(cmd, sizeof(cmd), "puppet %s", filename);
+ ret = g_spawn_async(NULL, (gchar **)cmd, NULL, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, NULL, &error);
+ fprintf(stderr, "bool: %d", ret);
+ if (ret == FALSE) {
+ g_error_free(error);
+ return -1;
+ }
+ return 0;
+}
+
+static int
+mh_sysconfig_run_augeas(const char *query, const char *data)
+{
+ mh_warn("not implemented\n");
+ return 0;
+}
+
+static const char *
+mh_sysconfig_query_augeas(const char *query)
+{
+ const char *data = NULL;
+ mh_warn("not implemented\n");
+ return data;
+}
+
+int
+mh_sysconfig_run_uri(const char *uri, uint32_t flags, const char *scheme,
+ const char *key)
+{
+ int rc = 0;
+
+ if (strcasecmp(scheme, "puppet") == 0) {
+ rc = mh_sysconfig_run_puppet(uri, NULL);
+ } else {
+ rc = -1;
+ }
+ return rc;
+}
+
+int
+mh_sysconfig_run_string(const char *data, uint32_t flags, const char *scheme,
+ const char *key)
+{
+ int rc = 0;
+
+ if (strcasecmp(scheme, "puppet") == 0) {
+ rc = mh_sysconfig_run_puppet(NULL, data);
+ } else {
+ rc = -1;
+ }
+ return rc;
+}
+
+const char *
+mh_sysconfig_query(const char *query, uint32_t flags, const char *scheme)
+{
+ const char *data = NULL;
+
+ if (strcasecmp(scheme, "augeas") == 0) {
+ data = mh_sysconfig_query_augeas(query);
+ }
+
+ return data;
+}
diff --git a/src/postboot/CMakeLists.txt b/src/postboot/CMakeLists.txt
deleted file mode 100644
index 36d59a1..0000000
--- a/src/postboot/CMakeLists.txt
+++ /dev/null
@@ -1,30 +0,0 @@
-set(BASE "postboot")
-set(BASE_LIB "m${BASE}")
-set(QMF_AGENT "matahari-qmf-${BASE}d")
-set(QMF_CONSOLE "matahari-qmf-${BASE}-consoled")
-
-# QMF daemon
-if(WITH-QMF)
- set(SCHEMA_SOURCES
${CMAKE_CURRENT_BINARY_DIR}/qmf/org/matahariproject/QmfPackage.cpp)
- generate_qmf_schemas(${CMAKE_CURRENT_SOURCE_DIR}/schema.xml ${SCHEMA_SOURCES})
- include_directories(${CMAKE_CURRENT_BINARY_DIR})
-
- add_executable(${QMF_AGENT} ${BASE}-qmf.cpp ${SCHEMA_SOURCES})
- add_executable(${QMF_CONSOLE} ${BASE}-console.cpp)
-
- target_link_libraries(${QMF_AGENT} ${BASE_LIB} mcommon_qmf)
- target_link_libraries(${QMF_CONSOLE} mcommon_qmf)
-
- if(NOT WIN32)
- configure_file(${CMAKE_SOURCE_DIR}/matahari.init.in
${CMAKE_CURRENT_BINARY_DIR}/matahari-${BASE})
- install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/matahari-${BASE} DESTINATION
${initdir})
- # Override BASE for matahari-postboot-console
- unset(BASE)
- set(BASE "postboot-console")
- configure_file(${CMAKE_SOURCE_DIR}/matahari.init.in
${CMAKE_CURRENT_BINARY_DIR}/matahari-${BASE})
- install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/matahari-${BASE} DESTINATION
${initdir})
- endif(NOT WIN32)
-
- install(TARGETS ${QMF_AGENT} DESTINATION sbin)
- install(TARGETS ${QMF_CONSOLE} DESTINATION sbin)
-endif(WITH-QMF)
diff --git a/src/postboot/postboot-console.cpp b/src/postboot/postboot-console.cpp
deleted file mode 100644
index 188c443..0000000
--- a/src/postboot/postboot-console.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/* config-console.cpp - Copyright (c) 2011 Red Hat, Inc.
- * Written by Adam Stokes <astokes(a)fedoraproject.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library 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
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
- */
-
-#ifndef WIN32
-#include "config.h"
-#endif
-
-#include <qpid/messaging/Connection.h>
-#include <qpid/messaging/Duration.h>
-#include <qmf/ConsoleSession.h>
-#include <qmf/ConsoleEvent.h>
-#include <qmf/Agent.h>
-#include <qmf/Data.h>
-#include <qmf/DataAddr.h>
-#include <qmf/Query.h>
-#include <qpid/types/Variant.h>
-
-#include <string>
-#include <iostream>
-
-using namespace std;
-using namespace qmf;
-using qpid::types::Variant;
-using qpid::messaging::Duration;
-
-int main(int argc, char** argv)
-{
- string brokerUrl("amqp:tcp:127.0.0.1:49000");
- qpid::types::Variant::Map connectionOptions;
- qpid::types::Variant::Map dataProperties;
- string sessionOptions;
-
- connectionOptions["reconnect"] = true;
-
- dataProperties["uri"] = argv[1] ? argv[1] :
"http://localhost/config/uuid";
-
- qpid::messaging::Connection connection(brokerUrl, connectionOptions);
- connection.open();
-
- ConsoleSession session(connection, sessionOptions);
- // Only filter connecting agents under
matahariproject.org vendor and Config product
- session.setAgentFilter("[and, [eq, _vendor, [quote,
'matahariproject.org']], [eq, _product, [quote, 'Config']]]");
- session.open();
-
- Agent agent;
- while (true) {
- ConsoleEvent event;
- if(session.nextEvent(event)) {
- switch(event.getType()) {
- case CONSOLE_AGENT_ADD:
- {
- agent = event.getAgent();
- DataAddr agent_event_addr("config", agent.getName(),
0);
- ConsoleEvent result(agent.callMethod("configure",
- dataProperties,
- agent_event_addr));
- }
- break;
- default: {}
- }
- }
- }
- return 0;
-}
diff --git a/src/postboot/postboot-qmf.cpp b/src/postboot/postboot-qmf.cpp
deleted file mode 100644
index 7058276..0000000
--- a/src/postboot/postboot-qmf.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/* config-qmf.cpp - Copyright (C) 2011 Red Hat, Inc.
- * Written by Adam Stokes <astokes(a)fedoraproject.org>
- *
- * 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 2.1 of the License, or (at your option) any later version.
- *
- * This software 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 library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- */
-
-#ifndef WIN32
-#include "config.h"
-#endif
-
-#include "matahari/mh_agent.h"
-
-#include "qmf/org/matahariproject/QmfPackage.h"
-
-#include <qpid/agent/ManagementAgent.h>
-
-extern "C" {
-#include <stdlib.h>
-#include <string.h>
-#include <glib.h>
-#include <glib/gprintf.h>
-#include "matahari/postboot.h"
-#include "matahari/logging.h"
-#include "matahari/network.h"
-#include "matahari/host.h"
-#include <sigar.h>
-#include <sigar_format.h>
-};
-
-class ConfigAgent : public MatahariAgent
-{
-private:
- qmf::org::matahariproject::PackageDefinition _package;
-public:
- virtual int setup(qmf::AgentSession session);
- virtual gboolean invoke(qmf::AgentSession session, qmf::AgentEvent event,
- gpointer user_data);
-};
-
-int
-main(int argc, char **argv)
-{
- ConfigAgent agent;
- int rc = agent.init(argc, argv, "Config");
- if (rc == 0) {
- agent.run();
- }
- return rc;
-}
-
-int
-ConfigAgent::setup(qmf::AgentSession session)
-{
- _package.configure(session);
- _instance = qmf::Data(_package.data_Postboot);
-
- _instance.setProperty("hostname", mh_hostname());
- _instance.setProperty("uuid", mh_uuid());
- _instance.setProperty("is_configured", mh_is_configured());
-
- _agent_session.addData(_instance, "postboot");
- return 0;
-}
-
-gboolean
-ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer
user_data)
-{
- if (event.getType() != qmf::AGENT_METHOD) {
- return TRUE;
- }
-
- const std::string& methodName(event.getMethodName());
-
- if (methodName == "configure") {
- int rc = mh_is_configured();
- if(rc == 0) {
- mh_configure(event.getArguments()["uri"].asString().c_str());
- }
- event.addReturnArgument("configured", rc);
- } else {
- session.raiseException(event, MH_NOT_IMPLEMENTED);
- goto bail;
- }
-
- session.methodSuccess(event);
-
-bail:
- return TRUE;
-}
diff --git a/src/postboot/schema.xml b/src/postboot/schema.xml
deleted file mode 100644
index 2d930ce..0000000
--- a/src/postboot/schema.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<schema package="org.matahariproject">
-
- <!-- Config API -->
- <class name="Postboot">
- <property name="uuid" type="sstr"
access="RO" desc="Host UUID" />
- <property name="hostname" type="sstr"
access="RO" desc="Hostname" index="y"/>
- <property name="is_configured" type="uint32"
access="RO" desc="Check if agent is configured." />
-
- <statistic name="qmf-gen-no-crash" type="absTime"
desc="Dummy stat to stop qmf-gen from crashing." />
-
- <method name="configure" desc="Send configure
method">
- <arg name="uri" dir="I"
type="sstr" />
- <arg name="configured" dir="O"
type="uint32" />
- </method>
- </class>
-</schema>
diff --git a/src/sysconfig/CMakeLists.txt b/src/sysconfig/CMakeLists.txt
new file mode 100644
index 0000000..1d9fba8
--- /dev/null
+++ b/src/sysconfig/CMakeLists.txt
@@ -0,0 +1,30 @@
+set(BASE "sysconfig")
+set(BASE_LIB "m${BASE}")
+set(QMF_AGENT "matahari-qmf-${BASE}d")
+set(QMF_CONSOLE "matahari-qmf-${BASE}-consoled")
+
+# QMF daemon
+if(WITH-QMF)
+ set(SCHEMA_SOURCES
${CMAKE_CURRENT_BINARY_DIR}/qmf/org/matahariproject/QmfPackage.cpp)
+ generate_qmf_schemas(${CMAKE_CURRENT_SOURCE_DIR}/schema.xml ${SCHEMA_SOURCES})
+ include_directories(${CMAKE_CURRENT_BINARY_DIR})
+
+ add_executable(${QMF_AGENT} ${BASE}-qmf.cpp ${SCHEMA_SOURCES})
+ add_executable(${QMF_CONSOLE} ${BASE}-console.cpp)
+
+ target_link_libraries(${QMF_AGENT} ${BASE_LIB} mcommon_qmf)
+ target_link_libraries(${QMF_CONSOLE} mcommon_qmf)
+
+ if(NOT WIN32)
+ configure_file(${CMAKE_SOURCE_DIR}/matahari.init.in
${CMAKE_CURRENT_BINARY_DIR}/matahari-${BASE})
+ install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/matahari-${BASE} DESTINATION
${initdir})
+ # Override BASE for matahari-sysconfig-console
+ unset(BASE)
+ set(BASE "sysconfig-console")
+ configure_file(${CMAKE_SOURCE_DIR}/matahari.init.in
${CMAKE_CURRENT_BINARY_DIR}/matahari-${BASE})
+ install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/matahari-${BASE} DESTINATION
${initdir})
+ endif(NOT WIN32)
+
+ install(TARGETS ${QMF_AGENT} DESTINATION sbin)
+ install(TARGETS ${QMF_CONSOLE} DESTINATION sbin)
+endif(WITH-QMF)
diff --git a/src/sysconfig/schema.xml b/src/sysconfig/schema.xml
new file mode 100644
index 0000000..d5c52aa
--- /dev/null
+++ b/src/sysconfig/schema.xml
@@ -0,0 +1,35 @@
+<schema package="org.matahariproject">
+
+ <!-- Config API -->
+ <class name="Sysconfig">
+ <property name="uuid" type="sstr"
access="RO" desc="Host UUID" />
+ <property name="hostname" type="sstr"
access="RO" desc="Hostname" index="y"/>
+ <property name="is_postboot_configured" type="uint32"
access="RO" desc="Check if agent is configured." />
+
+ <statistic name="qmf-gen-no-crash" type="absTime"
desc="Dummy stat to stop qmf-gen from crashing." />
+
+ <method name="run_uri" desc="Send configure uri
method">
+ <arg name="uri" dir="I"
type="sstr" />
+ <arg name="scheme" dir="I"
type="sstr" />
+ <arg name="key" dir="I"
type="sstr" />
+ <arg name="flags" dir="I"
type="uint32" />
+ </method>
+
+ <method name="run_string" desc="Send configure text
method">
+ <arg name="text" dir="I"
type="sstr" />
+ <arg name="scheme" dir="I"
type="sstr" />
+ <arg name="key" dir="I"
type="sstr" />
+ <arg name="flags" dir="I"
type="uint32" />
+ </method>
+
+ <method name="query" desc="Perform query
lookup">
+ <arg name="text" dir="I"
type="sstr" />
+ <arg name="scheme" dir="I"
type="sstr" />
+ <arg name="flags" dir="I"
type="uint32" />
+ </method>
+
+ <method name="is_configured" desc="Check if system is
configured">
+ <arg name="key" dir="I"
type="sstr" />
+ </method>
+ </class>
+</schema>
diff --git a/src/sysconfig/sysconfig-console.cpp b/src/sysconfig/sysconfig-console.cpp
new file mode 100644
index 0000000..4a629b1
--- /dev/null
+++ b/src/sysconfig/sysconfig-console.cpp
@@ -0,0 +1,97 @@
+/* config-console.cpp - Copyright (c) 2011 Red Hat, Inc.
+ * Written by Adam Stokes <astokes(a)fedoraproject.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef WIN32
+#include "config.h"
+#endif
+
+#include <qpid/messaging/Connection.h>
+#include <qpid/messaging/Duration.h>
+#include <qmf/ConsoleSession.h>
+#include <qmf/ConsoleEvent.h>
+#include <qmf/Agent.h>
+#include <qmf/Data.h>
+#include <qmf/DataAddr.h>
+#include <qmf/Query.h>
+#include <qpid/types/Variant.h>
+
+#include "matahari/mh_agent.h"
+
+#include <string>
+#include <iostream>
+#include <sstream>
+
+extern "C" {
+#include "matahari/logging.h"
+#include "matahari/sysconfig.h"
+}
+
+using namespace std;
+using namespace qmf;
+using qpid::types::Variant;
+using qpid::messaging::Duration;
+
+int main(int argc, char **argv)
+{
+ qpid::types::Variant::Map options;
+ qpid::types::Variant::Map callOptions;
+ string sessionOptions;
+ ConsoleEvent event;
+ Agent agent;
+
+ mh_log_init("sysconfig-console", LOG_TRACE, TRUE);
+
+ mh_add_option('U', required_argument, "uri", "URI of
configuration", &options, NULL);
+
+ qpid::types::Variant::Map urlMap = mh_parse_options("sysconfig-console",
argc, argv, options);
+
+ callOptions["uri"] = options["uri"];
+
+ mh_log_init("sysconfig-console", mh_log_level, mh_log_level >
LOG_INFO);
+
+ qpid::messaging::Connection connection(urlMap["uri"], options);
+ connection.open();
+
+ ConsoleSession session(connection, sessionOptions);
+ // Only filter connecting agents under
matahariproject.org vendor and Config product
+ session.setAgentFilter("[and, [eq, _vendor, [quote,
'matahariproject.org']], [eq, _product, [quote, 'Sysconfig']]]");
+ session.open();
+
+ while(session.getAgentCount() == 0) {
+ g_usleep(1000);
+ }
+
+ while (true) {
+ if(session.nextEvent(event)) {
+ switch(event.getType()) {
+ case CONSOLE_AGENT_ADD:
+ {
+ agent = event.getAgent();
+ DataAddr agent_event_addr("config", agent.getName(),
0);
+ ConsoleEvent result(agent.callMethod("run_uri",
+ callOptions,
+ agent_event_addr));
+ }
+ break;
+ default:
+ break;
+ }
+ }
+ }
+ return 0;
+}
diff --git a/src/sysconfig/sysconfig-qmf.cpp b/src/sysconfig/sysconfig-qmf.cpp
new file mode 100644
index 0000000..5b3e49a
--- /dev/null
+++ b/src/sysconfig/sysconfig-qmf.cpp
@@ -0,0 +1,142 @@
+/* sysconfig-qmf.cpp - Copyright (C) 2011 Red Hat, Inc.
+ * Written by Adam Stokes <astokes(a)fedoraproject.org>
+ *
+ * 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 2.1 of the License, or (at your option) any later version.
+ *
+ * This software 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 library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+/**
+ * \file
+ * \brief Sysconfig QMF Agent
+ */
+
+#ifndef WIN32
+#include "config.h"
+#endif
+
+#include "matahari/mh_agent.h"
+
+#include "qmf/org/matahariproject/QmfPackage.h"
+
+#include <qpid/agent/ManagementAgent.h>
+
+extern "C" {
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <glib.h>
+#include <glib/gstdio.h>
+#include <glib/gprintf.h>
+#include "matahari/sysconfig.h"
+#include "matahari/logging.h"
+#include "matahari/network.h"
+#include "matahari/host.h"
+#include <sigar.h>
+#include <sigar_format.h>
+};
+
+class ConfigAgent : public MatahariAgent
+{
+private:
+ qmf::org::matahariproject::PackageDefinition _package;
+public:
+ virtual int setup(qmf::AgentSession session);
+ virtual gboolean invoke(qmf::AgentSession session, qmf::AgentEvent event,
+ gpointer user_data);
+};
+
+int
+main(int argc, char **argv)
+{
+ ConfigAgent agent;
+ int rc = agent.init(argc, argv, "Sysconfig");
+ if (rc == 0) {
+ agent.run();
+ }
+ return rc;
+}
+
+int
+ConfigAgent::setup(qmf::AgentSession session)
+{
+ _package.configure(session);
+ _instance = qmf::Data(_package.data_Sysconfig);
+
+ _instance.setProperty("hostname", mh_hostname());
+ _instance.setProperty("uuid", mh_uuid());
+ _instance.setProperty("is_postboot_configured", 0);
+
+ _agent_session.addData(_instance, "sysconfig");
+ return 0;
+}
+
+gboolean
+ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer
user_data)
+{
+ int rc = 0;
+ uint32_t flags;
+
+ const std::string& methodName(event.getMethodName());
+ if (event.getType() != qmf::AGENT_METHOD) {
+ return TRUE;
+ }
+
+ qpid::types::Variant::Map& args = event.getArguments();
+
+ if (methodName == "run_uri") {
+ flags = args["flags"].asUint32();
+ if((mh_is_configured(flags,args["key"].asString().c_str())) == 0) {
+ rc = mh_sysconfig_run_uri(args["uri"].asString().c_str(),
+ flags,
+ args["scheme"].asString().c_str(),
+ args["key"].asString().c_str());
+ if (rc == 0) {
+ mh_set_configured(args["key"].asString().c_str());
+ }
+ }
+ event.addReturnArgument("configured", rc);
+ } else if (methodName == "run_string") {
+ flags = args["flags"].asUint32();
+ if((mh_is_configured(flags, args["key"].asString().c_str())) == 0) {
+ rc = mh_sysconfig_run_string(args["data"].asString().c_str(),
+ flags,
+ args["scheme"].asString().c_str(),
+ args["key"].asString().c_str());
+ if (rc == 0) {
+ mh_set_configured(args["key"].asString().c_str());
+ }
+ }
+ event.addReturnArgument("configured", rc);
+ } else if (methodName == "query") {
+ flags = args["flags"].asUint32();
+ const char *data = NULL;
+ data = mh_sysconfig_query(args["query"].asString().c_str(),
+ flags,
+ args["scheme"].asString().c_str());
+ event.addReturnArgument("query", data);
+ } else if (methodName == "is_configured") {
+ flags = args["flags"].asUint32();
+ rc = mh_is_configured(flags, args["key"].asString().c_str());
+ _instance.setProperty("is_postboot_configured", rc);
+ event.addReturnArgument("configured", rc);
+ } else {
+ session.raiseException(event, MH_NOT_IMPLEMENTED);
+ goto bail;
+ }
+
+ session.methodSuccess(event);
+
+bail:
+ return TRUE;
+}
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index 6db157c..8fe81f2 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -5,13 +5,13 @@ if(CXXTEST_FOUND)
ENABLE_TESTING()
CXXTEST_ADD_TEST(mh_api_network_unittest network_unittest.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mh_api_network.h)
CXXTEST_ADD_TEST(mh_api_host_unittest host_unittest.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mh_api_host.h)
- CXXTEST_ADD_TEST(mh_api_postboot_unittest postboot_unittest.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mh_api_postboot.h)
+ CXXTEST_ADD_TEST(mh_api_sysconfig_unittest sysconfig_unittest.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mh_api_sysconfig.h)
CXXTEST_ADD_TEST(mh_hsa_unittest hsa_unittest.cpp
${CMAKE_CURRENT_SOURCE_DIR}/mh_hsa_${VARIANT}.h)
add_library(mh_tester SHARED test_utilities.c)
- target_link_libraries(mh_tester ${pcre_LIBRARIES} mcommon mnetwork mhost mpostboot)
+ target_link_libraries(mh_tester ${pcre_LIBRARIES} mcommon mnetwork mhost msysconfig)
target_link_libraries(mh_api_network_unittest mh_tester)
target_link_libraries(mh_api_host_unittest mh_tester)
- target_link_libraries(mh_api_postboot_unittest mh_tester)
+ target_link_libraries(mh_api_sysconfig_unittest mh_tester)
target_link_libraries(mh_hsa_unittest mh_tester)
endif(CXXTEST_FOUND)
diff --git a/src/tests/mh_api_postboot.h b/src/tests/mh_api_postboot.h
deleted file mode 100644
index 5e59a9b..0000000
--- a/src/tests/mh_api_postboot.h
+++ /dev/null
@@ -1,34 +0,0 @@
-#ifndef __MH_API_NETWORK_UNITTEST_H
-#define __MH_API_NETWORK_UNITTEST_H
-#include <iostream>
-#include <string>
-#include <sstream>
-#include <utility>
-#include <vector>
-#include <cstdlib>
-#include <cstdio>
-#include <sys/stat.h>
-#include <dirent.h>
-#include <cxxtest/TestSuite.h>
-
-extern "C" {
-#include "matahari/postboot.h"
-#include <glib.h>
-#include "mh_test_utilities.h"
-};
-
-using namespace std;
-
-class MhApiPostbootSuite : public CxxTest::TestSuite
-{
- public:
-
- void testIsConfigured(void)
- {
- const char *uri = "http://matahariproject.org/testing.xml";
- mh_configure(uri);
- TS_ASSERT((mh_is_configured()) == 1);
- }
-};
-
-#endif
diff --git a/src/tests/mh_api_sysconfig.h b/src/tests/mh_api_sysconfig.h
new file mode 100644
index 0000000..9393643
--- /dev/null
+++ b/src/tests/mh_api_sysconfig.h
@@ -0,0 +1,37 @@
+#ifndef __MH_API_NETWORK_UNITTEST_H
+#define __MH_API_NETWORK_UNITTEST_H
+#include <iostream>
+#include <string>
+#include <sstream>
+#include <utility>
+#include <vector>
+#include <cstdlib>
+#include <cstdio>
+#include <sys/stat.h>
+#include <dirent.h>
+#include <cxxtest/TestSuite.h>
+
+extern "C" {
+#include "matahari/sysconfig.h"
+#include <glib.h>
+#include "mh_test_utilities.h"
+};
+
+using namespace std;
+
+class MhApiSysconfigSuite : public CxxTest::TestSuite
+{
+ public:
+
+ void testIsConfigured(void)
+ {
+ const char *uri = "http://matahariproject.org/atom.xml"; // Test if
download succeeds
+ uint32_t flags = 0;
+ const char key[] = "org.matahariproject.firstboot"; // Unimportant key
defined
+ TS_ASSERT((mh_is_configured(flags,key)) == TRUE);
+ TS_ASSERT((mh_set_configured(key)) == TRUE);
+ TS_ASSERT((mh_sysconfig_run_uri(uri, flags, "puppet", key)) != -1);
+ }
+};
+
+#endif
--
1.7.6