Re: [Matahari] POST state in Bugzilla
by Zane Bitter
[Moving this discussion to the Matahari list]
On 18/08/11 14:22, Russell Bryant wrote:
>
> One thing to note from the guidelines that we haven't been doing is
> including the Acked-by and Reported-by tags. I would still like to use
> those, but it's obviously open for discussion.
The traditional way that this works is that the person doing the Ack-ing
adds Acked-by and pushes the patch upstream themselves. I like having it
there, but the tools don't make it as easy as I'd like it to be with our
current workflow.
- ZB
12 years, 8 months
[PATCH] - Return statuses pulled from key file (rev3)
by Adam Stokes
This allows 3 ways to test for configuration
status
1) If file exists then in the least the execution
was issued
2) If file exists and contents of file report an
error, then process failed with at least 1 execution
3) If file exists and contents contain a success
message, then binary was executed and successfully
completed.
Signed-off-by: Adam Stokes <astokes(a)fedoraproject.org>
---
src/include/matahari/sysconfig.h | 15 ++++++++++-----
src/lib/sysconfig.c | 28 ++++++++++------------------
src/lib/sysconfig_linux.c | 20 +++++++++++++++-----
src/sysconfig/sysconfig-qmf.cpp | 27 +++++++++++++--------------
src/tests/mh_api_sysconfig.h | 4 ++--
5 files changed, 50 insertions(+), 44 deletions(-)
diff --git a/src/include/matahari/sysconfig.h b/src/include/matahari/sysconfig.h
index 0390528..0b43cb8 100644
--- a/src/include/matahari/sysconfig.h
+++ b/src/include/matahari/sysconfig.h
@@ -77,21 +77,24 @@ mh_sysconfig_query(const char *query, uint32_t flags, const char *scheme);
* Set system as configured
*
* \param[in] key config item to define
+ * \param[in] contents specifies success/fail with error where applicable
*
- * \return TRUE if applying key to config succeeds
+ * \retval[1] if writing to file suceeds
+ * \retval[0] failed to write to file
*/
extern gboolean
-mh_sysconfig_set_configured(const char *key);
+mh_sysconfig_set_configured(const char *key, const char *contents);
/**
* Test if system has been configured
*
- * \param[in] flags allow a force reconfiguration
* \param[in] key config item to test if used
*
- * \return TRUE if system is configured
+ * \note The return of this routine must be freed with free()
+ *
+ * \return STATUS of key
*/
-extern gboolean
+extern char *
mh_sysconfig_is_configured(const char *key);
/**
@@ -102,6 +105,8 @@ mh_sysconfig_is_configured(const char *key);
*
* \param[in] path directory to store key info
*
+ * \note The return of this routine must be freed with free()
+ *
* \return nothing
*/
extern void
diff --git a/src/lib/sysconfig.c b/src/lib/sysconfig.c
index 1dc5753..de47481 100644
--- a/src/lib/sysconfig.c
+++ b/src/lib/sysconfig.c
@@ -64,10 +64,9 @@ mh_sysconfig_keys_dir_set(const char *path)
}
static gboolean
-set_key(const char *key)
+set_key(const char *key, const char *contents)
{
char key_file[PATH_MAX];
- const char contents[] = "ok";
g_snprintf(key_file, sizeof(key_file), "%s%s", keys_dir_get(), key);
if (!g_file_set_contents(key_file, contents, strlen(contents), NULL)) {
@@ -77,42 +76,35 @@ set_key(const char *key)
return TRUE;
}
-static gboolean
+static char *
get_key(const char *key)
{
char key_file[PATH_MAX];
- char *contents;
+ char *contents = NULL;
size_t length;
g_snprintf(key_file, sizeof(key_file), "%s%s", keys_dir_get(), key);
if (g_file_test(key_file, G_FILE_TEST_EXISTS)) {
if(g_file_get_contents(key_file, &contents, &length, NULL)) {
- if (strcmp(contents, "ok") == 0) {
- free(contents);
- return TRUE;
- }
+ return contents;
}
- free(contents);
}
- return FALSE;
+ return contents;
}
-gboolean
-mh_sysconfig_set_configured(const char *key)
+int
+mh_sysconfig_set_configured(const char *key, const char *contents)
{
- if (!set_key(key)) {
+ if (!set_key(key, contents)) {
return FALSE;
}
return TRUE;
}
-gboolean
+char *
mh_sysconfig_is_configured(const char *key)
{
- if (!get_key(key)) {
- return FALSE;
- }
- return TRUE;
+ return get_key(key);
}
int
diff --git a/src/lib/sysconfig_linux.c b/src/lib/sysconfig_linux.c
index a809267..8e605cc 100644
--- a/src/lib/sysconfig_linux.c
+++ b/src/lib/sysconfig_linux.c
@@ -32,6 +32,7 @@
#include "matahari/utilities.h"
#include "sysconfig_private.h"
+#define BUFSIZE 1024
MH_TRACE_INIT_DATA(mh_sysconfig);
@@ -59,10 +60,11 @@ sysconfig_os_download(const char *uri, FILE *fp)
static int
-sysconfig_os_run_puppet(const char *uri, const char *data)
+sysconfig_os_run_puppet(const char *uri, const char *data, const char *key)
{
gboolean ret;
GError *error = NULL;
+ char fmt_error[BUFSIZE];
gchar *cmd[4];
char filename[PATH_MAX];
int fd;
@@ -99,14 +101,22 @@ sysconfig_os_run_puppet(const char *uri, const char *data)
ret = g_spawn_async(NULL, cmd, NULL, G_SPAWN_SEARCH_PATH,
NULL, NULL, NULL, &error);
if (ret == FALSE) {
+ snprintf(fmt_error, sizeof(fmt_error), "ERROR\n%s", error->message);
+ if (mh_sysconfig_set_configured(key, fmt_error) == FALSE) {
+ mh_err("Unable to write to file.");
+ }
g_error_free(error);
return -1;
}
+ if (mh_sysconfig_set_configured(key, "OK") == FALSE) {
+ mh_err("Unable to write to file.");
+ return -1;
+ }
return 0;
}
static int
-sysconfig_os_run_augeas(const char *query, const char *data)
+sysconfig_os_run_augeas(const char *query, const char *data, const char *key)
{
mh_warn("not implemented\n");
return -1;
@@ -128,9 +138,9 @@ sysconfig_os_run_uri(const char *uri, uint32_t flags, const char *scheme,
if (mh_sysconfig_is_configured(key) == FALSE || (flags & MH_SYSCONFIG_FLAG_FORCE)) {
if (strcasecmp(scheme, "puppet") == 0) {
- rc = sysconfig_os_run_puppet(uri, NULL);
+ rc = sysconfig_os_run_puppet(uri, NULL, key);
} else if (strcasecmp(scheme, "augeas") == 0) {
- rc = sysconfig_os_run_augeas(uri, NULL);
+ rc = sysconfig_os_run_augeas(uri, NULL, key);
} else {
rc = -1;
}
@@ -146,7 +156,7 @@ sysconfig_os_run_string(const char *data, uint32_t flags, const char *scheme,
if (mh_sysconfig_is_configured(key) == FALSE || (flags & MH_SYSCONFIG_FLAG_FORCE)) {
if (strcasecmp(scheme, "puppet") == 0) {
- rc = sysconfig_os_run_puppet(NULL, data);
+ rc = sysconfig_os_run_puppet(NULL, data, key);
} else {
rc = -1;
}
diff --git a/src/sysconfig/sysconfig-qmf.cpp b/src/sysconfig/sysconfig-qmf.cpp
index 962ca3d..ad847a1 100644
--- a/src/sysconfig/sysconfig-qmf.cpp
+++ b/src/sysconfig/sysconfig-qmf.cpp
@@ -74,7 +74,7 @@ ConfigAgent::setup(qmf::AgentSession session)
gboolean
ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer user_data)
{
- int rc = 0;
+ char *status = NULL;
const std::string& methodName(event.getMethodName());
if (event.getType() != qmf::AGENT_METHOD) {
@@ -84,23 +84,19 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u
qpid::types::Variant::Map& args = event.getArguments();
if (methodName == "run_uri") {
- rc = mh_sysconfig_run_uri(args["uri"].asString().c_str(),
+ mh_sysconfig_run_uri(args["uri"].asString().c_str(),
args["flags"].asUint32(),
args["scheme"].asString().c_str(),
args["key"].asString().c_str());
- if (rc == 0) {
- mh_sysconfig_set_configured(args["key"].asString().c_str());
- }
- event.addReturnArgument("status", rc);
+ status = mh_sysconfig_is_configured(args["key"].asString().c_str());
+ event.addReturnArgument("status", status);
} else if (methodName == "run_string") {
- rc = mh_sysconfig_run_string(args["data"].asString().c_str(),
+ mh_sysconfig_run_string(args["data"].asString().c_str(),
args["flags"].asUint32(),
args["scheme"].asString().c_str(),
args["key"].asString().c_str());
- if (rc == 0) {
- mh_sysconfig_set_configured(args["key"].asString().c_str());
- }
- event.addReturnArgument("status", rc);
+ status = mh_sysconfig_is_configured(args["key"].asString().c_str());
+ event.addReturnArgument("status", status);
} else if (methodName == "query") {
const char *data = NULL;
data = mh_sysconfig_query(args["query"].asString().c_str(),
@@ -108,14 +104,17 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u
args["scheme"].asString().c_str());
event.addReturnArgument("query", data);
} else if (methodName == "is_configured") {
- rc = mh_sysconfig_is_configured(args["key"].asString().c_str());
- _instance.setProperty("is_postboot_configured", rc);
- event.addReturnArgument("status", rc ? "ok" : "no");
+ status = mh_sysconfig_is_configured(args["key"].asString().c_str());
+ _instance.setProperty("is_postboot_configured", status);
+ event.addReturnArgument("status", status);
} else {
session.raiseException(event, MH_NOT_IMPLEMENTED);
goto bail;
}
+ if (status != NULL) {
+ free(status);
+ }
session.methodSuccess(event);
bail:
diff --git a/src/tests/mh_api_sysconfig.h b/src/tests/mh_api_sysconfig.h
index 879bb11..73c1d76 100644
--- a/src/tests/mh_api_sysconfig.h
+++ b/src/tests/mh_api_sysconfig.h
@@ -31,8 +31,8 @@ class MhApiSysconfigSuite : public CxxTest::TestSuite
mh_sysconfig_keys_dir_set("/tmp/");
- TS_ASSERT((mh_sysconfig_set_configured(key)) == TRUE);
- TS_ASSERT((mh_sysconfig_is_configured(key)) == TRUE);
+ TS_ASSERT((mh_sysconfig_set_configured(key, "OK")) == TRUE);
+ TS_ASSERT((mh_sysconfig_is_configured(key)) != NULL);
TS_ASSERT((mh_sysconfig_run_uri(uri, flags, "puppet", key)) != -1);
}
};
--
1.7.6
12 years, 8 months
[PATCH] - Return statuses pulled from key file (rev2)
by Adam Stokes
This allows 3 ways to test for configuration
status
1) If file exists then in the least the execution
was issued
2) If file exists and contents of file report an
error, then process failed with at least 1 execution
3) If file exists and contents contain a success
message, then binary was executed and successfully
completed.
Signed-off-by: Adam Stokes <astokes(a)fedoraproject.org>
---
src/include/matahari/sysconfig.h | 16 ++++++++++------
src/lib/sysconfig.c | 32 ++++++++++++--------------------
src/lib/sysconfig_linux.c | 15 ++++++++++-----
src/sysconfig/sysconfig-qmf.cpp | 27 +++++++++++++--------------
src/tests/mh_api_sysconfig.h | 4 ++--
5 files changed, 47 insertions(+), 47 deletions(-)
diff --git a/src/include/matahari/sysconfig.h b/src/include/matahari/sysconfig.h
index 0390528..5767274 100644
--- a/src/include/matahari/sysconfig.h
+++ b/src/include/matahari/sysconfig.h
@@ -77,21 +77,23 @@ mh_sysconfig_query(const char *query, uint32_t flags, const char *scheme);
* Set system as configured
*
* \param[in] key config item to define
+ * \param[in] contents specifies success/fail with error where applicable
*
- * \return TRUE if applying key to config succeeds
+ * \return STATUS of spawned process return code
*/
-extern gboolean
-mh_sysconfig_set_configured(const char *key);
+extern char *
+mh_sysconfig_set_configured(const char *key, const char *contents);
/**
* Test if system has been configured
*
- * \param[in] flags allow a force reconfiguration
* \param[in] key config item to test if used
*
- * \return TRUE if system is configured
+ * \note The return of this routine must be freed with free()
+ *
+ * \return STATUS of key
*/
-extern gboolean
+extern char *
mh_sysconfig_is_configured(const char *key);
/**
@@ -102,6 +104,8 @@ mh_sysconfig_is_configured(const char *key);
*
* \param[in] path directory to store key info
*
+ * \note The return of this routine must be freed with free()
+ *
* \return nothing
*/
extern void
diff --git a/src/lib/sysconfig.c b/src/lib/sysconfig.c
index 1dc5753..6532277 100644
--- a/src/lib/sysconfig.c
+++ b/src/lib/sysconfig.c
@@ -64,10 +64,9 @@ mh_sysconfig_keys_dir_set(const char *path)
}
static gboolean
-set_key(const char *key)
+set_key(const char *key, const char *contents)
{
char key_file[PATH_MAX];
- const char contents[] = "ok";
g_snprintf(key_file, sizeof(key_file), "%s%s", keys_dir_get(), key);
if (!g_file_set_contents(key_file, contents, strlen(contents), NULL)) {
@@ -77,42 +76,35 @@ set_key(const char *key)
return TRUE;
}
-static gboolean
+static char *
get_key(const char *key)
{
char key_file[PATH_MAX];
- char *contents;
+ char *contents = NULL;
size_t length;
g_snprintf(key_file, sizeof(key_file), "%s%s", keys_dir_get(), key);
if (g_file_test(key_file, G_FILE_TEST_EXISTS)) {
if(g_file_get_contents(key_file, &contents, &length, NULL)) {
- if (strcmp(contents, "ok") == 0) {
- free(contents);
- return TRUE;
- }
+ return contents;
}
- free(contents);
}
- return FALSE;
+ return contents;
}
-gboolean
-mh_sysconfig_set_configured(const char *key)
+char *
+mh_sysconfig_set_configured(const char *key, const char *contents)
{
- if (!set_key(key)) {
- return FALSE;
+ if (!set_key(key, contents)) {
+ return NULL;
}
- return TRUE;
+ return get_key(key);
}
-gboolean
+char *
mh_sysconfig_is_configured(const char *key)
{
- if (!get_key(key)) {
- return FALSE;
- }
- return TRUE;
+ return get_key(key);
}
int
diff --git a/src/lib/sysconfig_linux.c b/src/lib/sysconfig_linux.c
index a809267..d31b6b0 100644
--- a/src/lib/sysconfig_linux.c
+++ b/src/lib/sysconfig_linux.c
@@ -59,9 +59,10 @@ sysconfig_os_download(const char *uri, FILE *fp)
static int
-sysconfig_os_run_puppet(const char *uri, const char *data)
+sysconfig_os_run_puppet(const char *uri, const char *data, const char *key)
{
gboolean ret;
+ char *status = NULL;
GError *error = NULL;
gchar *cmd[4];
char filename[PATH_MAX];
@@ -99,14 +100,18 @@ sysconfig_os_run_puppet(const char *uri, const char *data)
ret = g_spawn_async(NULL, cmd, NULL, G_SPAWN_SEARCH_PATH,
NULL, NULL, NULL, &error);
if (ret == FALSE) {
+ status = mh_sysconfig_set_configured(key, error->message);
+ free(status);
g_error_free(error);
return -1;
}
+ status = mh_sysconfig_set_configured(key, "OK");
+ free(status);
return 0;
}
static int
-sysconfig_os_run_augeas(const char *query, const char *data)
+sysconfig_os_run_augeas(const char *query, const char *data, const char *key)
{
mh_warn("not implemented\n");
return -1;
@@ -128,9 +133,9 @@ sysconfig_os_run_uri(const char *uri, uint32_t flags, const char *scheme,
if (mh_sysconfig_is_configured(key) == FALSE || (flags & MH_SYSCONFIG_FLAG_FORCE)) {
if (strcasecmp(scheme, "puppet") == 0) {
- rc = sysconfig_os_run_puppet(uri, NULL);
+ rc = sysconfig_os_run_puppet(uri, NULL, key);
} else if (strcasecmp(scheme, "augeas") == 0) {
- rc = sysconfig_os_run_augeas(uri, NULL);
+ rc = sysconfig_os_run_augeas(uri, NULL, key);
} else {
rc = -1;
}
@@ -146,7 +151,7 @@ sysconfig_os_run_string(const char *data, uint32_t flags, const char *scheme,
if (mh_sysconfig_is_configured(key) == FALSE || (flags & MH_SYSCONFIG_FLAG_FORCE)) {
if (strcasecmp(scheme, "puppet") == 0) {
- rc = sysconfig_os_run_puppet(NULL, data);
+ rc = sysconfig_os_run_puppet(NULL, data, key);
} else {
rc = -1;
}
diff --git a/src/sysconfig/sysconfig-qmf.cpp b/src/sysconfig/sysconfig-qmf.cpp
index 962ca3d..ad847a1 100644
--- a/src/sysconfig/sysconfig-qmf.cpp
+++ b/src/sysconfig/sysconfig-qmf.cpp
@@ -74,7 +74,7 @@ ConfigAgent::setup(qmf::AgentSession session)
gboolean
ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer user_data)
{
- int rc = 0;
+ char *status = NULL;
const std::string& methodName(event.getMethodName());
if (event.getType() != qmf::AGENT_METHOD) {
@@ -84,23 +84,19 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u
qpid::types::Variant::Map& args = event.getArguments();
if (methodName == "run_uri") {
- rc = mh_sysconfig_run_uri(args["uri"].asString().c_str(),
+ mh_sysconfig_run_uri(args["uri"].asString().c_str(),
args["flags"].asUint32(),
args["scheme"].asString().c_str(),
args["key"].asString().c_str());
- if (rc == 0) {
- mh_sysconfig_set_configured(args["key"].asString().c_str());
- }
- event.addReturnArgument("status", rc);
+ status = mh_sysconfig_is_configured(args["key"].asString().c_str());
+ event.addReturnArgument("status", status);
} else if (methodName == "run_string") {
- rc = mh_sysconfig_run_string(args["data"].asString().c_str(),
+ mh_sysconfig_run_string(args["data"].asString().c_str(),
args["flags"].asUint32(),
args["scheme"].asString().c_str(),
args["key"].asString().c_str());
- if (rc == 0) {
- mh_sysconfig_set_configured(args["key"].asString().c_str());
- }
- event.addReturnArgument("status", rc);
+ status = mh_sysconfig_is_configured(args["key"].asString().c_str());
+ event.addReturnArgument("status", status);
} else if (methodName == "query") {
const char *data = NULL;
data = mh_sysconfig_query(args["query"].asString().c_str(),
@@ -108,14 +104,17 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u
args["scheme"].asString().c_str());
event.addReturnArgument("query", data);
} else if (methodName == "is_configured") {
- rc = mh_sysconfig_is_configured(args["key"].asString().c_str());
- _instance.setProperty("is_postboot_configured", rc);
- event.addReturnArgument("status", rc ? "ok" : "no");
+ status = mh_sysconfig_is_configured(args["key"].asString().c_str());
+ _instance.setProperty("is_postboot_configured", status);
+ event.addReturnArgument("status", status);
} else {
session.raiseException(event, MH_NOT_IMPLEMENTED);
goto bail;
}
+ if (status != NULL) {
+ free(status);
+ }
session.methodSuccess(event);
bail:
diff --git a/src/tests/mh_api_sysconfig.h b/src/tests/mh_api_sysconfig.h
index 879bb11..1cc82bc 100644
--- a/src/tests/mh_api_sysconfig.h
+++ b/src/tests/mh_api_sysconfig.h
@@ -31,8 +31,8 @@ class MhApiSysconfigSuite : public CxxTest::TestSuite
mh_sysconfig_keys_dir_set("/tmp/");
- TS_ASSERT((mh_sysconfig_set_configured(key)) == TRUE);
- TS_ASSERT((mh_sysconfig_is_configured(key)) == TRUE);
+ TS_ASSERT((mh_sysconfig_set_configured(key, "OK")) != NULL);
+ TS_ASSERT((mh_sysconfig_is_configured(key)) != NULL);
TS_ASSERT((mh_sysconfig_run_uri(uri, flags, "puppet", key)) != -1);
}
};
--
1.7.6
12 years, 8 months
[PATCH] - Return statuses pulled from key file
by Adam Stokes
This allows 3 ways to test for configuration
status
1) If file exists then in the least the execution
was issued
2) If file exists and contents of file report an
error, then process failed with at least 1 execution
3) If file exists and contents contain a success
message, then binary was executed and successfully
completed.
Signed-off-by: Adam Stokes <astokes(a)fedoraproject.org>
---
src/include/matahari/sysconfig.h | 12 ++++++------
src/lib/sysconfig.c | 32 ++++++++++++--------------------
src/lib/sysconfig_linux.c | 12 +++++++-----
src/sysconfig/sysconfig-qmf.cpp | 24 ++++++++++--------------
src/tests/mh_api_sysconfig.h | 4 ++--
5 files changed, 37 insertions(+), 47 deletions(-)
diff --git a/src/include/matahari/sysconfig.h b/src/include/matahari/sysconfig.h
index 0390528..ede9c7c 100644
--- a/src/include/matahari/sysconfig.h
+++ b/src/include/matahari/sysconfig.h
@@ -77,21 +77,21 @@ mh_sysconfig_query(const char *query, uint32_t flags, const char *scheme);
* Set system as configured
*
* \param[in] key config item to define
+ * \param[in] contents specifies success/fail with error where applicable
*
- * \return TRUE if applying key to config succeeds
+ * \return STATUS of spawned process return code
*/
-extern gboolean
-mh_sysconfig_set_configured(const char *key);
+extern const char *
+mh_sysconfig_set_configured(const char *key, const char *contents);
/**
* Test if system has been configured
*
- * \param[in] flags allow a force reconfiguration
* \param[in] key config item to test if used
*
- * \return TRUE if system is configured
+ * \return STATUS of key
*/
-extern gboolean
+extern const char *
mh_sysconfig_is_configured(const char *key);
/**
diff --git a/src/lib/sysconfig.c b/src/lib/sysconfig.c
index 1dc5753..a8c78cf 100644
--- a/src/lib/sysconfig.c
+++ b/src/lib/sysconfig.c
@@ -64,10 +64,9 @@ mh_sysconfig_keys_dir_set(const char *path)
}
static gboolean
-set_key(const char *key)
+set_key(const char *key, const char *contents)
{
char key_file[PATH_MAX];
- const char contents[] = "ok";
g_snprintf(key_file, sizeof(key_file), "%s%s", keys_dir_get(), key);
if (!g_file_set_contents(key_file, contents, strlen(contents), NULL)) {
@@ -77,42 +76,35 @@ set_key(const char *key)
return TRUE;
}
-static gboolean
+static char *
get_key(const char *key)
{
char key_file[PATH_MAX];
- char *contents;
+ char *contents = NULL;
size_t length;
g_snprintf(key_file, sizeof(key_file), "%s%s", keys_dir_get(), key);
if (g_file_test(key_file, G_FILE_TEST_EXISTS)) {
if(g_file_get_contents(key_file, &contents, &length, NULL)) {
- if (strcmp(contents, "ok") == 0) {
- free(contents);
- return TRUE;
- }
+ return contents;
}
- free(contents);
}
- return FALSE;
+ return contents;
}
-gboolean
-mh_sysconfig_set_configured(const char *key)
+const char *
+mh_sysconfig_set_configured(const char *key, const char *contents)
{
- if (!set_key(key)) {
- return FALSE;
+ if (!set_key(key, contents)) {
+ return NULL;
}
- return TRUE;
+ return get_key(key);
}
-gboolean
+const char *
mh_sysconfig_is_configured(const char *key)
{
- if (!get_key(key)) {
- return FALSE;
- }
- return TRUE;
+ return get_key(key);
}
int
diff --git a/src/lib/sysconfig_linux.c b/src/lib/sysconfig_linux.c
index a809267..4fabdda 100644
--- a/src/lib/sysconfig_linux.c
+++ b/src/lib/sysconfig_linux.c
@@ -59,7 +59,7 @@ sysconfig_os_download(const char *uri, FILE *fp)
static int
-sysconfig_os_run_puppet(const char *uri, const char *data)
+sysconfig_os_run_puppet(const char *uri, const char *data, const char *key)
{
gboolean ret;
GError *error = NULL;
@@ -99,14 +99,16 @@ sysconfig_os_run_puppet(const char *uri, const char *data)
ret = g_spawn_async(NULL, cmd, NULL, G_SPAWN_SEARCH_PATH,
NULL, NULL, NULL, &error);
if (ret == FALSE) {
+ mh_sysconfig_set_configured(key, error->message);
g_error_free(error);
return -1;
}
+ mh_sysconfig_set_configured(key, "OK");
return 0;
}
static int
-sysconfig_os_run_augeas(const char *query, const char *data)
+sysconfig_os_run_augeas(const char *query, const char *data, const char *key)
{
mh_warn("not implemented\n");
return -1;
@@ -128,9 +130,9 @@ sysconfig_os_run_uri(const char *uri, uint32_t flags, const char *scheme,
if (mh_sysconfig_is_configured(key) == FALSE || (flags & MH_SYSCONFIG_FLAG_FORCE)) {
if (strcasecmp(scheme, "puppet") == 0) {
- rc = sysconfig_os_run_puppet(uri, NULL);
+ rc = sysconfig_os_run_puppet(uri, NULL, key);
} else if (strcasecmp(scheme, "augeas") == 0) {
- rc = sysconfig_os_run_augeas(uri, NULL);
+ rc = sysconfig_os_run_augeas(uri, NULL, key);
} else {
rc = -1;
}
@@ -146,7 +148,7 @@ sysconfig_os_run_string(const char *data, uint32_t flags, const char *scheme,
if (mh_sysconfig_is_configured(key) == FALSE || (flags & MH_SYSCONFIG_FLAG_FORCE)) {
if (strcasecmp(scheme, "puppet") == 0) {
- rc = sysconfig_os_run_puppet(NULL, data);
+ rc = sysconfig_os_run_puppet(NULL, data, key);
} else {
rc = -1;
}
diff --git a/src/sysconfig/sysconfig-qmf.cpp b/src/sysconfig/sysconfig-qmf.cpp
index 962ca3d..dfe1e6c 100644
--- a/src/sysconfig/sysconfig-qmf.cpp
+++ b/src/sysconfig/sysconfig-qmf.cpp
@@ -74,7 +74,7 @@ ConfigAgent::setup(qmf::AgentSession session)
gboolean
ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer user_data)
{
- int rc = 0;
+ const char *status;
const std::string& methodName(event.getMethodName());
if (event.getType() != qmf::AGENT_METHOD) {
@@ -84,23 +84,19 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u
qpid::types::Variant::Map& args = event.getArguments();
if (methodName == "run_uri") {
- rc = mh_sysconfig_run_uri(args["uri"].asString().c_str(),
+ mh_sysconfig_run_uri(args["uri"].asString().c_str(),
args["flags"].asUint32(),
args["scheme"].asString().c_str(),
args["key"].asString().c_str());
- if (rc == 0) {
- mh_sysconfig_set_configured(args["key"].asString().c_str());
- }
- event.addReturnArgument("status", rc);
+ status = mh_sysconfig_is_configured(args["key"].asString().c_str());
+ event.addReturnArgument("status", status);
} else if (methodName == "run_string") {
- rc = mh_sysconfig_run_string(args["data"].asString().c_str(),
+ mh_sysconfig_run_string(args["data"].asString().c_str(),
args["flags"].asUint32(),
args["scheme"].asString().c_str(),
args["key"].asString().c_str());
- if (rc == 0) {
- mh_sysconfig_set_configured(args["key"].asString().c_str());
- }
- event.addReturnArgument("status", rc);
+ status = mh_sysconfig_is_configured(args["key"].asString().c_str());
+ event.addReturnArgument("status", status);
} else if (methodName == "query") {
const char *data = NULL;
data = mh_sysconfig_query(args["query"].asString().c_str(),
@@ -108,9 +104,9 @@ ConfigAgent::invoke(qmf::AgentSession session, qmf::AgentEvent event, gpointer u
args["scheme"].asString().c_str());
event.addReturnArgument("query", data);
} else if (methodName == "is_configured") {
- rc = mh_sysconfig_is_configured(args["key"].asString().c_str());
- _instance.setProperty("is_postboot_configured", rc);
- event.addReturnArgument("status", rc ? "ok" : "no");
+ status = mh_sysconfig_is_configured(args["key"].asString().c_str());
+ _instance.setProperty("is_postboot_configured", status);
+ event.addReturnArgument("status", status);
} else {
session.raiseException(event, MH_NOT_IMPLEMENTED);
goto bail;
diff --git a/src/tests/mh_api_sysconfig.h b/src/tests/mh_api_sysconfig.h
index 879bb11..1cc82bc 100644
--- a/src/tests/mh_api_sysconfig.h
+++ b/src/tests/mh_api_sysconfig.h
@@ -31,8 +31,8 @@ class MhApiSysconfigSuite : public CxxTest::TestSuite
mh_sysconfig_keys_dir_set("/tmp/");
- TS_ASSERT((mh_sysconfig_set_configured(key)) == TRUE);
- TS_ASSERT((mh_sysconfig_is_configured(key)) == TRUE);
+ TS_ASSERT((mh_sysconfig_set_configured(key, "OK")) != NULL);
+ TS_ASSERT((mh_sysconfig_is_configured(key)) != NULL);
TS_ASSERT((mh_sysconfig_run_uri(uri, flags, "puppet", key)) != -1);
}
};
--
1.7.6
12 years, 8 months
[PATCH] services: rhbz#731914 - Fix crash in services agent.
by Russell Bryant
This patch resolves a crash in the services agent when a requested
action times out. The problem was that when the action timed out, the
data associated with the action was freed, but the mainloop still had
the stdout and stderr pipes registered for monitoring. This ensures
that those get unregistered when the action data is being cleaned up.
Signed-off-by: Russell Bryant <rbryant(a)redhat.com>
---
src/lib/services.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)
diff --git a/src/lib/services.c b/src/lib/services.c
index f199ed5..5768a5e 100644
--- a/src/lib/services.c
+++ b/src/lib/services.c
@@ -88,6 +88,16 @@ services_action_free(svc_action_t *op)
return;
}
+ if (op->opaque->stderr_gsource) {
+ mainloop_destroy_fd(op->opaque->stderr_gsource);
+ op->opaque->stderr_gsource = NULL;
+ }
+
+ if (op->opaque->stdout_gsource) {
+ mainloop_destroy_fd(op->opaque->stdout_gsource);
+ op->opaque->stdout_gsource = NULL;
+ }
+
free(op->id);
free(op->opaque->exec);
--
1.7.6
12 years, 8 months
[PATCH] core: rhbz#731858 Fix connection to broker via dns srv.
by Russell Bryant
This bug report pointed out that the agent's log output would show
successfully doing a DNS SRV lookup, but then wouldn't use it. It would
always first try to connect to localhost. This patch resolves that.
The fix for the immediate problem is just one line. The rest is a bit
of an improvement to the DNS SRV functionality.
The only way to use DNS SRV was if you were connecting to the same
domain as what Matahari determines the local machine is a part of (the
result of mh_domainname()). A new option has been added so that the
domain to connect to can be specified. For example:
$ matahari-qmf-hostd -vvv -d russellbryant.net
mh_connect: SRV record resolved to: justtesting.russellbryant.net
mh_connect: Trying: amqp:tcp:justtesting.russellbryant.net:49000
Signed-off-by: Russell Bryant <rbryant(a)redhat.com>
---
src/lib/mh_agent.cpp | 24 ++++++++++++++++++++++--
1 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/src/lib/mh_agent.cpp b/src/lib/mh_agent.cpp
index 2166b36..27d7aa1 100644
--- a/src/lib/mh_agent.cpp
+++ b/src/lib/mh_agent.cpp
@@ -174,6 +174,9 @@ int print_help(int code, const char *name, const char *arg, void *userdata)
printf("\t-h | --help print this help message.\n");
printf("\t-b | --broker value specify broker host name..\n");
printf("\t-p | --port value specify broker port.\n");
+ printf("\t-d | --domain value Specify domain to connect to (Use DNS SRV to determine host).\n"
+ "\t For this option to take effect, the broker option must not\n"
+ "\t be provided.\n");
printf("\t-u | --username value username to use for authentication purposes.\n");
printf("\t-P | --password value password to use for authentication purposes.\n");
printf("\t-s | --service value service name to use for authentication purposes.\n");
@@ -205,7 +208,13 @@ mh_connect(qpid::types::Variant::Map mh_options, qpid::types::Variant::Map amqp_
if(mh_options.count("servername") == 0) {
/* Is _ssl valid here as a protocol? _udp? */
std::stringstream fqdn;
- fqdn << "_matahari._tcp." << mh_domainname();
+
+ if (mh_options.count("domain")) {
+ fqdn << "_matahari._tcp." << mh_options["domain"];
+ } else {
+ fqdn << "_matahari._tcp." << mh_domainname();
+ }
+
target = mh_dnssrv_lookup(fqdn.str().c_str());
if(target) {
@@ -219,7 +228,7 @@ mh_connect(qpid::types::Variant::Map mh_options, qpid::types::Variant::Map amqp_
std::stringstream url;
if(mh_options.count("servername") > 0) {
url << "amqp:" << mh_options["protocol"] << ":" << mh_options["servername"] << ":" << mh_options["serverport"] ;
- } else if(target != NULL && (retries % 2) == 1) {
+ } else if (target) {
/* Try DNS */
url << "amqp:" << mh_options["protocol"] << ":" << target << ":" << mh_options["serverport"] ;
} else {
@@ -272,6 +281,7 @@ mh_parse_options(const char *proc_name, int argc, char **argv, qpid::types::Vari
/* Force local-only handling */
mh_add_option('b', required_argument, "broker", NULL, NULL, NULL);
+ mh_add_option('d', required_argument, "domain", NULL, NULL, NULL);
mh_add_option('p', required_argument, "port", NULL, NULL, NULL);
#ifdef MH_SSL
mh_add_option('N', required_argument, "ssl-cert-name", NULL, NULL, NULL);
@@ -296,6 +306,13 @@ mh_parse_options(const char *proc_name, int argc, char **argv, qpid::types::Vari
if (RegistryRead(HKEY_LOCAL_MACHINE,
L"SYSTEM\\CurrentControlSet\\services\\Matahari",
+ L"domain", &value) == 0) {
+ options["domain"] = value;
+ value = NULL;
+ }
+
+ if (RegistryRead(HKEY_LOCAL_MACHINE,
+ L"SYSTEM\\CurrentControlSet\\services\\Matahari",
L"port", &value) == 0) {
options["serverport"] = atoi(value);
free(value);
@@ -378,6 +395,9 @@ mh_parse_options(const char *proc_name, int argc, char **argv, qpid::types::Vari
mh_err("Broker '%s' is not resolvable - ignoring", optarg);
}
break;
+ case 'd':
+ options["domain"] = optarg;
+ break;
#ifdef MH_SSL
case 'N':
ssl_cert_name = optarg;
--
1.7.6
12 years, 8 months
QMF Schema Handling
by russell@russellbryant.net
Greetings,
I've been doing some looking at versioning issues related to QMF
schemas and wanted to share some notes to make sure that I understand
correctly and that we're all on the same page. I will be creating a
wiki page to capture this information, including related sample code.
On the agent side of things:
1) We can add new properties without affecting backwards compatibility.
2) We can add new methods without affecting backwards compatibility.
3) We can add new arguments to methods without affecting backwards
compatibility, as long as the agent code is written in such a way that
it does not _expect_ the new arguments to always be present.
4) Removing things should be avoided as much as possible once they hit
a supported release.
On the console side:
1) Consoles must always be written against the same or older version
of the schema as the agent. A console may not include arguments to a
method that the agent does not know about.
2) If a console would like to operate against multiple versions of an
agent that have different schemas, it can inspect the schema presented
by the agent. To make this a bit easier, I have written some helper
functions which you can find here:
https://github.com/russellb/matahari/blob/qmfutils/src/include/matahari/q...
These functions make it easy to do some schema checks against a new
agent. For example, let's say you get a CONSOLE_AGENT_ADD event
notifying you that a new agent has shown up, you could then do checks
against it like this:
qmf::Agent agent(event.getAgent());
// Does this agent have the hostname property?
std::cout << "Has hostname: " <<
matahari::qmf::schema_has_property(agent, "org.matahariproject",
"Host", "hostname") << std::endl;
// Does this agent have the get_uuid method?
std::cout << "Has get_uuid method: " <<
matahari::qmf::schema_has_method(agent, "org.matahariproject", "Host",
"get_uuid") << std::endl;
// Does this agent take the lifetime argument to the get_uuid method?
std::cout << "Has lifetime argument to get_uuid_method: " <<
matahari::qmf::schema_has_property(agent, "org.matahariproject",
"Host", "get_uuid", "lifetime") << std::endl;
I implemented this in the matahari code base just to flesh out the
ideas. This functionality probably belongs as a part of the
qmf::Agent class upstream.
Comments welcome. Thanks.
--
Russell Bryant
12 years, 8 months
[PATCH] Spec: rhbz#731233 - Fix RPM warnings about qpidd user
by Zane Bitter
If the QMF broker is not installed, there may be no qpidd user on the system
(unless qpid is also installed). However, we need to ensure that the qpidd
user can access /var/lib/matahari and /var/run/matahari without changing
the permissions if it is installed at a later time.
The solution is to create the group qpidd if it does not exist and set the
ownership of /var/lib/matahari to root:qpidd with mode 770. This avoids the
need to create the qpidd user's home directory, which should be
/var/lib/qpidd. We leave that to the qpid-cpp-server package.
Note that /var/lib/matahari is no longer world-readable (/var/run/matahari
remains world-readable).
Signed-off-by: Zane Bitter <zbitter(a)redhat.com>
---
matahari-broker.init.in | 3 ++-
matahari.spec.in | 19 +++++++++++++------
2 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/matahari-broker.init.in b/matahari-broker.init.in
index 13a535d..aee1d6d 100755
--- a/matahari-broker.init.in
+++ b/matahari-broker.init.in
@@ -53,7 +53,8 @@ RETVAL=0
start() {
echo -n $"Starting Matahari broker daemon: "
- install -o qpidd -g qpidd -d @localstatedir@/{run,lib}/matahari
+ install -o root -g qpidd -m 770 -d @localstatedir@/lib/matahari
+ install -o root -g qpidd -m 775 -d @localstatedir@/run/matahari
daemon --pidfile $pidfile --check $prog --user qpidd /usr/sbin/$prog --daemon --pid-dir @localstatedir@/run/matahari --data-dir @localstatedir@/lib/matahari $QPIDD_OPTIONS
RETVAL=$?
echo
diff --git a/matahari.spec.in b/matahari.spec.in
index 374730a..3d60bad 100644
--- a/matahari.spec.in
+++ b/matahari.spec.in
@@ -99,6 +99,7 @@ Summary: C++ library used by Matahari agents
Group: Applications/System
Requires: %{name}-lib = %{version}-%{release}
Requires: qpid-cpp-client-ssl > 0.7
+Requires(pre): shadow-utils
%description agent-lib
C++ library containing the base class for Matahari agents
@@ -202,8 +203,8 @@ make DESTDIR=%{buildroot} install
%{__install} matahari-broker.sysconf $RPM_BUILD_ROOT/%{_sysconfdir}/sysconfig/matahari-broker
%{__ln_s} qpidd $RPM_BUILD_ROOT/%{_sbindir}/matahari-brokerd
-%{__install} -d -m0755 $RPM_BUILD_ROOT/%{_localstatedir}/lib/%{name}
-%{__install} -d -m0755 $RPM_BUILD_ROOT/%{_localstatedir}/run/%{name}
+%{__install} -d -m0770 $RPM_BUILD_ROOT/%{_localstatedir}/lib/%{name}
+%{__install} -d -m0775 $RPM_BUILD_ROOT/%{_localstatedir}/run/%{name}
%endif
%post -n matahari-lib -p /sbin/ldconfig
@@ -304,6 +305,12 @@ if [ "$1" -ge "1" ]; then
/sbin/service matahari-broker condrestart >/dev/null 2>&1 || :
fi
+#== Agent Lib
+
+%pre agent-lib
+getent group qpidd >/dev/null || groupadd -r qpidd
+exit 0
+
%endif
%clean
@@ -314,15 +321,15 @@ test "x%{buildroot}" != "x" && rm -rf %{buildroot}
%doc AUTHORS COPYING
%files agent-lib
-%defattr(644, root, root, 755)
-%dir %{_datadir}/matahari/
+%defattr(644, root, root)
+%attr(755, -, -) %dir %{_datadir}/matahari/
%config(noreplace) %{_sysconfdir}/sysconfig/matahari
%doc AUTHORS COPYING
%if %{with qmf}
%{_libdir}/libmcommon_qmf.so.*
-%attr(755, qpidd, qpidd) %{_localstatedir}/lib/%{name}
-%ghost %attr(755, qpidd, qpidd) %{_localstatedir}/run/%{name}
+%dir %attr(0770, root, qpidd) %{_localstatedir}/lib/%{name}
+%ghost %dir %attr(0775, root, qpidd) %{_localstatedir}/run/%{name}
%endif
%if %{with dbus}
12 years, 8 months
[PATCH] - Fix cmd line parsing within initiscript for consoles
by Adam Stokes
- Our naming scheme for consoles 'sysconfig-console' is causing
errors in the initscript. The '-' is making bash think it is some
sort of command line options rather than a variable to be
read. Resolves rhbz#727194
Signed-off-by: Adam Stokes <astokes(a)fedoraproject.org>
---
matahari.init.in | 4 ++--
src/sysconfig/CMakeLists.txt | 8 +++-----
2 files changed, 5 insertions(+), 7 deletions(-)
diff --git a/matahari.init.in b/matahari.init.in
index c873cd4..ea51d2d 100644
--- a/matahari.init.in
+++ b/matahari.init.in
@@ -24,8 +24,8 @@
# Source function library.
. @sysconfdir(a)/rc.d/init.d/functions
-SERVICE=matahari-@BASE@
-PROCESS=matahari-qmf-@BASE@d
+SERVICE=matahari-@BASE@@BASE_SUB@
+PROCESS=matahari-qmf-@BASE@@BASE_SUB@d
RETVAL=0
diff --git a/src/sysconfig/CMakeLists.txt b/src/sysconfig/CMakeLists.txt
index 1d9fba8..89acc04 100644
--- a/src/sysconfig/CMakeLists.txt
+++ b/src/sysconfig/CMakeLists.txt
@@ -18,11 +18,9 @@ if(WITH-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})
+ set(BASE_SUB "-console")
+ configure_file(${CMAKE_SOURCE_DIR}/matahari.init.in ${CMAKE_CURRENT_BINARY_DIR}/matahari-${BASE}${BASE_SUB})
+ install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/matahari-${BASE}${BASE_SUB} DESTINATION ${initdir})
endif(NOT WIN32)
install(TARGETS ${QMF_AGENT} DESTINATION sbin)
--
1.7.6
12 years, 8 months
[PATCH] Set initial values to uninitialized structs
by Roman Rakus
Coverity is complaining about using some uninitialized values.
Signed-off-by: Roman Rakus <rrakus(a)redhat.com>
---
src/lib/dnssrv_linux.c | 2 ++
src/lib/mainloop.c | 2 ++
2 files changed, 4 insertions(+), 0 deletions(-)
diff --git a/src/lib/dnssrv_linux.c b/src/lib/dnssrv_linux.c
index e6863af..4877963 100644
--- a/src/lib/dnssrv_linux.c
+++ b/src/lib/dnssrv_linux.c
@@ -39,6 +39,8 @@ mh_os_dnssrv_lookup(const char *query)
ns_rr rr;
int size, rrnum;
+ memset(&nsh, 0, sizeof(nsh));
+
size = res_query(query,
C_IN,
T_SRV,
diff --git a/src/lib/mainloop.c b/src/lib/mainloop.c
index f68a555..f398fbb 100644
--- a/src/lib/mainloop.c
+++ b/src/lib/mainloop.c
@@ -170,6 +170,8 @@ mainloop_signal(int sig, void (*dispatch)(int sig))
struct sigaction sa;
struct sigaction old;
+ memset(&sa, 0, sizeof(sa));
+
if (sigemptyset(&mask) < 0) {
mh_perror(LOG_ERR, "Call to sigemptyset failed");
return FALSE;
--
1.7.6
12 years, 8 months