Use a local cf structure in each function that needs to pass one, rather than a global. Then: ACK
- ZB
On 20/07/11 17:36, Adam Stokes wrote:
- Updates made based off previous ML post
https://fedorahosted.org/pipermail/matahari/2011-July/001400.html
Signed-off-by: Adam Stokesastokes@fedoraproject.org
src/include/matahari/mh_agent.h | 3 + src/include/matahari/sysconfig.h | 29 +++++------ src/lib/sysconfig_linux.c | 100 +++++++++++++++++------------------ src/sysconfig/schema.xml | 3 +- src/sysconfig/sysconfig-console.cpp | 42 ++++++++++----- src/sysconfig/sysconfig-qmf.cpp | 16 ++---- src/tests/mh_api_sysconfig.h | 11 ++-- 7 files changed, 106 insertions(+), 98 deletions(-)
diff --git a/src/include/matahari/mh_agent.h b/src/include/matahari/mh_agent.h index 5b6c8a3..275e090 100644 --- a/src/include/matahari/mh_agent.h +++ b/src/include/matahari/mh_agent.h @@ -47,6 +47,9 @@ int required_argument = 1;
#define MH_NOT_IMPLEMENTED "Not implemented"
+#ifndef NS_MAXDNAME +# define NS_MAXDNAME 1025 +#endif using namespace qpid::management; using namespace std;
diff --git a/src/include/matahari/sysconfig.h b/src/include/matahari/sysconfig.h index 17ce0b0..cdd1e8d 100644 --- a/src/include/matahari/sysconfig.h +++ b/src/include/matahari/sysconfig.h @@ -25,30 +25,27 @@ #ifndef __MH_SYSCONFIG_H__ #define __MH_SYSCONFIG_H__
-struct conf {
- int scheme;
+typedef struct conf_s { int flags;
- char *uri;
- char *data;
- char *query;
- const char *uri;
- const char *data;
- const char *query; const char *key;
-};
- const char *scheme;
+} conf_t;
-// Supported SCHEME types -#define PUPPET 1 -#define AUGEAS 2
// Supported FLAGS -#define FORCE 1 +#define SYSCONFIG_FLAG_FORCE (1<< 0)
-extern int mh_sysconfig_run(const char *uri, int flags, int scheme, struct conf *cf); -extern int mh_sysconfig_run_string(const char *string, int flags, int scheme, struct conf *cf); +extern int mh_sysconfig_run_uri(const char *uri, int flags, const char *scheme); +extern int mh_sysconfig_run_string(const char *string, int flags, const char *scheme); extern int mh_sysconfig_query(const char *query, const char *data,
int flags, int scheme, struct conf *cf);
int flags, const char *scheme);
// scheme specific
-extern int mh_sysconfig_run_puppet(struct conf *cf); -extern int mh_sysconfig_run_augeas(struct conf *cf); -extern int mh_sysconfig_query_augeas(struct conf *cf); +extern int mh_sysconfig_run_puppet(conf_t *cf); +extern int mh_sysconfig_run_augeas(conf_t *cf); +extern int mh_sysconfig_query_augeas(conf_t *cf);
#endif // __MH_SYSCONFIG_H__ diff --git a/src/lib/sysconfig_linux.c b/src/lib/sysconfig_linux.c index 4f239c7..a1f438a 100644 --- a/src/lib/sysconfig_linux.c +++ b/src/lib/sysconfig_linux.c @@ -1,4 +1,4 @@ -/* sysconfig.c - Copyright (C) 2011 Red Hat, Inc. +/* sysconfig_linux.c - Copyright (C) 2011 Red Hat, Inc.
- Written by Adam Stokesastokes@fedoraproject.org
- This program is free software; you can redistribute it and/or
@@ -33,6 +33,7 @@
MH_TRACE_INIT_DATA(mh_sysconfig);
+static conf_t cf = {}; static int download(const char *uri, FILE *fp) { @@ -41,12 +42,12 @@ download(const char *uri, FILE *fp)
curl_global_init(CURL_GLOBAL_DEFAULT); curl = curl_easy_init();
- if(curl) {
- 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) {
if (CURLE_OK != res) { return -1; } }
@@ -55,99 +56,96 @@ download(const char *uri, FILE *fp) }
int -mh_sysconfig_run(const char *uri, int flags, int scheme, struct conf *cf) { +mh_sysconfig_run_uri(const char *uri, int flags, const char *scheme) { int rc = 0;
- switch(scheme) {
case PUPPET:
cf->uri = strdup(uri);
cf->scheme = scheme;
rc = mh_sysconfig_run_puppet(cf);
free(cf->uri);
break;
default:
rc = -1;
break;
if (g_strcmp0(scheme, "puppet") == 0) {
cf.uri = uri;
cf.scheme = scheme;
rc = mh_sysconfig_run_puppet(&cf);
} else {
rc = -1;
} return rc; }
int
-mh_sysconfig_run_string(const char *data, int flags, int scheme, struct conf *cf) { +mh_sysconfig_run_string(const char *data, int flags, const char *scheme) { int rc = 0;
- switch(scheme) {
case PUPPET:
cf->data = strdup(data);
cf->scheme = scheme;
rc = mh_sysconfig_run_puppet(cf);
free(cf->data);
break;
default:
rc = -1;
break;
if (g_strcmp0(scheme, "puppet") == 0) {
cf.data = data;
cf.scheme = scheme;
rc = mh_sysconfig_run_puppet(&cf);
} else {
rc = -1;
} return rc; }
int
-mh_sysconfig_query(const char *query, const char *data, int flags, int scheme, struct conf *cf) { +mh_sysconfig_query(const char *query, const char *data, int flags, const char *scheme) { int rc = 0;
- switch(scheme) {
- case AUGEAS:
cf->query = strdup(query);
cf->data = strdup(data);
cf->scheme = scheme;
rc = mh_sysconfig_run_augeas(cf);
free(cf->query);
free(cf->data);
break;
- default:
- if (g_strcmp0(scheme, "augeas") == 0) {
cf.query = query;
cf.data = data;
cf.scheme = scheme;
rc = mh_sysconfig_run_augeas(&cf);
- } else { rc = -1;
break;
} return rc; }
int
-mh_sysconfig_run_puppet(struct conf *cf) +mh_sysconfig_run_puppet(conf_t *cf) {
- int rc = 0;
- char *filename = NULL, *cmd = NULL;
- gboolean ret;
- GError *error;
- char *filename = NULL;
- gchar cmd[PATH_MAX]; int fd; FILE *fp;
- if(cf->uri != NULL) {
- if (cf->uri != NULL) { filename = strdup("puppet_conf_XXXXXX"); fd = mkstemp(filename); fp = fdopen(fd, "w+b");
rc = download(cf->uri, fp);
if ((download(cf->uri, fp)) != 0) {
fclose(fp);
return -1;
fclose(fp);}
- } else if(cf->data != NULL) {
- } else if (cf->data != NULL) { filename = strdup("puppet_conf_blob"); g_file_set_contents(filename, cf->data, strlen(cf->data), NULL); } else { return -1; }
- asprintf(cmd, "puppet %s", filename);
- rc = system(cmd);
- g_snprintf(cmd, sizeof(cmd), "puppet %s", filename);
- fprintf(stderr, "%s", cmd);
- 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);
free(filename);
return -1;
- } free(filename);
- free(cmd);
- return rc;
return 0; }
int
-mh_sysconfig_run_augeas(struct conf *cf) +mh_sysconfig_run_augeas(conf_t *cf) { fprintf(stderr, "not implemented\n"); return 0; }
int -mh_sysconfig_query_augeas(struct conf *cf) +mh_sysconfig_query_augeas(conf_t *cf) { fprintf(stderr, "not implemented\n"); return 0; diff --git a/src/sysconfig/schema.xml b/src/sysconfig/schema.xml index d729000..065fb7a 100644 --- a/src/sysconfig/schema.xml +++ b/src/sysconfig/schema.xml @@ -7,8 +7,7 @@ <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" desc="Send configure uri method">
<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" />
diff --git a/src/sysconfig/sysconfig-console.cpp b/src/sysconfig/sysconfig-console.cpp index 920cbd7..d8ed5de 100644 --- a/src/sysconfig/sysconfig-console.cpp +++ b/src/sysconfig/sysconfig-console.cpp @@ -30,8 +30,14 @@ #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" +}
using namespace std; using namespace qmf; @@ -40,38 +46,46 @@ 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;
- qpid::types::Variant::Map options;
- qpid::types::Variant::Map callOptions; string sessionOptions;
- connectionOptions["reconnect"] = true;
- dataProperties["uri"] = argv[1] ? argv[1] : "http://localhost/config/uuid";
- ConsoleEvent event;
- Agent agent;
- mh_log_init("sysconfig-console", LOG_TRACE, TRUE);
- mh_add_option('U', required_argument, "uri", "URI of configuration",&options, NULL);
- string url = mh_parse_options("sysconfig-console", argc, argv, options);
- qpid::messaging::Connection connection(brokerUrl, connectionOptions);
callOptions["uri"] = options["uri"];
mh_log_init("sysconfig-console", mh_log_level, mh_log_level> LOG_INFO);
qpid::messaging::Connection connection(url, 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();
- Agent agent;
- while(session.getAgentCount() == 0) {
g_usleep(1000);
- } 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,
ConsoleEvent result(agent.callMethod("configure",
callOptions, agent_event_addr)); } break;
default: {}
default:
break; } } }
diff --git a/src/sysconfig/sysconfig-qmf.cpp b/src/sysconfig/sysconfig-qmf.cpp index 4cbdd0d..16fdf19 100644 --- a/src/sysconfig/sysconfig-qmf.cpp +++ b/src/sysconfig/sysconfig-qmf.cpp @@ -83,7 +83,7 @@ static int is_configured(const char *key, int flags) { int rc = 0;
- if(flags == FORCE) {
- if(flags& SYSCONFIG_FLAG_FORCE) { return rc; }
@@ -95,7 +95,6 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u { int rc = 0; int flags;
struct conf *cf = NULL;
if (event.getType() != qmf::AGENT_METHOD) {
@@ -104,13 +103,12 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u
const std::string& methodName(event.getMethodName());
- if (methodName == "run") {
- if (methodName == "run_uri") { flags = event.getArguments()["flags"].asInt32(); if((is_configured(_instance.getProperty("uuid").asString().c_str(), flags)) == 0) {
rc = mh_sysconfig_run(event.getArguments()["uri"].asString().c_str(),
rc = mh_sysconfig_run_uri(event.getArguments()["uri"].asString().c_str(), flags,
event.getArguments()["scheme"].asInt32(),
cf);
event.getArguments()["scheme"].asString().c_str()); } event.addReturnArgument("configured", rc); } else if (methodName == "run_string") {
@@ -118,8 +116,7 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u if((is_configured(_instance.getProperty("uuid").asString().c_str(), flags)) == 0) { rc = mh_sysconfig_run_string(event.getArguments()["data"].asString().c_str(), flags,
event.getArguments()["scheme"].asInt32(),
cf);
event.getArguments()["scheme"].asString().c_str()); } event.addReturnArgument("configured", rc); } else if (methodName == "query") {
@@ -127,9 +124,8 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u if((is_configured(_instance.getProperty("uuid").asString().c_str(), flags)) == 0) { rc = mh_sysconfig_query(event.getArguments()["query"].asString().c_str(), event.getArguments()["data"].asString().c_str(),
event.getArguments()["scheme"].asInt32(), flags,
cf);
event.getArguments()["scheme"].asString().c_str()); } event.addReturnArgument("configured", rc); } else if (methodName == "is_configured") {
diff --git a/src/tests/mh_api_sysconfig.h b/src/tests/mh_api_sysconfig.h index 48cadfa..7e1b2b4 100644 --- a/src/tests/mh_api_sysconfig.h +++ b/src/tests/mh_api_sysconfig.h @@ -19,16 +19,17 @@ extern "C" {
using namespace std;
-class MhApisysconfigSuite : public CxxTest::TestSuite +class MhApiSysconfigSuite : public CxxTest::TestSuite { public:
void testIsConfigured(void) {
const char *uri = "http://matahariproject.org/atom.xml";
struct conf *cf = NULL;
TS_ASSERT((mh_sysconfig_run(uri, PUPPET, 0, cf)) != -1);
conf_t cf = {};
cf.uri = "http://matahariproject.org/atom.xml";
cf.flags = 0;
cf.scheme = "puppet";
};TS_ASSERT((mh_sysconfig_run_uri(cf.uri, cf.flags, cf.scheme)) != -1); }