[Openvas-commits] r2847 - in trunk/openvas-manager: . src
scm-commit@wald.intevation.org
scm-commit at wald.intevation.org
Thu Mar 19 17:57:25 CET 2009
Author: mattm
Date: 2009-03-19 17:57:22 +0100 (Thu, 19 Mar 2009)
New Revision: 2847
Modified:
trunk/openvas-manager/ChangeLog
trunk/openvas-manager/src/manage.c
trunk/openvas-manager/src/manage.h
trunk/openvas-manager/src/omp.c
trunk/openvas-manager/src/otp.c
Log:
Add per-report directories. Add initial OMP MODIFY_REPORT.
Modified: trunk/openvas-manager/ChangeLog
===================================================================
--- trunk/openvas-manager/ChangeLog 2009-03-19 15:56:28 UTC (rev 2846)
+++ trunk/openvas-manager/ChangeLog 2009-03-19 16:57:22 UTC (rev 2847)
@@ -1,6 +1,23 @@
2009-03-19 Matthew Mundell <matt at mundell.ukfsn.org>
- Update OTP BYE handling for reconnecting to the server during an OMP
+ Add per-report directories. Add initial OMP MODIFY_REPORT.
+
+ * src/omp.c (client_state_t): Add MODIFY_REPORT states.
+ (omp_xml_handle_start_element, omp_xml_handle_text): Add MODIFY_REPORT
+ handling.
+ (omp_xml_handle_end_element): In CLIENT_GET_REPORT get the report from the
+ report's directory. Add MODIFY_REPORT handling.
+
+ * src/otp.c (save_report): Save report to a dedicated directory.
+
+ * src/manage.h (set_report_parameter): New header.
+
+ * src/manage.c (set_report_parameter): New function.
+ (delete_report): Account for per-report directory.
+
+2009-03-19 Matthew Mundell <matt at mundell.ukfsn.org>
+
+ Update OTP BYE handling for reconnecting to the server during an OMP
session.
* src/openvasmd.c (serve_client): Move session creation and freeing to
Modified: trunk/openvas-manager/src/manage.c
===================================================================
--- trunk/openvas-manager/src/manage.c 2009-03-19 15:56:28 UTC (rev 2846)
+++ trunk/openvas-manager/src/manage.c 2009-03-19 16:57:22 UTC (rev 2847)
@@ -147,45 +147,51 @@
unsigned int id;
if (sscanf (report_id, "%u", &id) == 1)
{
- gchar* base_name;
static char buffer[11]; /* (expt 2 32) => 4294967296 */
sprintf (buffer, "%010u", id);
- base_name = g_strdup_printf ("%s.nbe", buffer);
gchar* link_name;
link_name = g_build_filename (PREFIX
"/var/lib/openvas/mgr/users/",
current_credentials.username,
"reports",
- base_name,
+ buffer,
NULL);
- g_free (base_name);
// FIX glib access setuid note
- if (g_file_test (link_name,
- G_FILE_TEST_EXISTS && G_FILE_TEST_IS_SYMLINK))
+ if (g_file_test (link_name, G_FILE_TEST_IS_SYMLINK)
+ && g_file_test (link_name, G_FILE_TEST_IS_DIR))
{
- GError* link_error = NULL;
- gchar* name = g_file_read_link (link_name, &link_error);
- if (link_error || unlink (name))
+ GError* error = NULL;
+ gchar* name = g_file_read_link (link_name, &error);
+ if (error)
{
- if (link_error)
- {
- fprintf (stderr,
- "Failed to read report symlink: %s.\n",
- link_error->message);
- g_error_free (link_error);
- }
+ fprintf (stderr,
+ "Failed to read report symlink: %s.\n",
+ error->message);
+ g_error_free (error);
g_free (name);
g_free (link_name);
- return link_error ? -3 : -4;
+ return -3;
}
+ else if (rmdir_recursively (name, &error) == FALSE)
+ {
+ fprintf (stderr,
+ "Failed to remove %s: %s.\n",
+ name,
+ error->message);
+ g_error_free (error);
+ g_free (name);
+ g_free (link_name);
+ return -4;
+ }
else
{
if (unlink (link_name))
/* Just log the error. */
fprintf (stderr,
- "Failed to remove report symlink %s.\n",
- link_name);
+ "Failed to remove report symlink %s: %s.\n",
+ link_name,
+ strerror (errno));
g_free (name);
g_free (link_name);
return 0;
@@ -198,6 +204,57 @@
return -1;
}
+/**
+ * @brief Set a report parameter.
+ *
+ * @param[in] report The ID of the report.
+ * @param[in] parameter The name of the parameter (in any case): COMMENT.
+ * @param[in] value The value of the parameter.
+ *
+ * @return 0 success, -1 failed to scan ID, -2 parameter name error,
+ * -3 failed to write parameter to disk.
+ */
+int
+set_report_parameter (char* report_id, const char* parameter, char* value)
+{
+ tracef (" set_report_parameter %s %s\n", report_id, parameter);
+ if (strncasecmp ("COMMENT", parameter, 7) == 0)
+ {
+ unsigned int id;
+ if (sscanf (report_id, "%u", &id) == 1)
+ {
+ static char buffer[11]; /* (expt 2 32) => 4294967296 */
+
+ sprintf (buffer, "%010u", id);
+ gchar* name;
+ name = g_build_filename (PREFIX
+ "/var/lib/openvas/mgr/users/",
+ current_credentials.username,
+ "reports",
+ buffer,
+ "comment",
+ NULL);
+ GError* error = NULL;
+ g_file_set_contents (name, value, -1, &error);
+ if (error)
+ {
+ fprintf (stderr,
+ "Failed to save comment to %s: %s.\n",
+ name,
+ error->message);
+ g_free (name);
+ return -3;
+ }
+ g_free (name);
+ }
+ else
+ return -1;
+ }
+ else
+ return -2;
+ return 0;
+}
+
/* Tasks. */
Modified: trunk/openvas-manager/src/manage.h
===================================================================
--- trunk/openvas-manager/src/manage.h 2009-03-19 15:56:28 UTC (rev 2846)
+++ trunk/openvas-manager/src/manage.h 2009-03-19 16:57:22 UTC (rev 2847)
@@ -60,6 +60,9 @@
int
delete_report (const char*);
+int
+set_report_parameter (char*, const char*, char*);
+
/* Tasks. */
Modified: trunk/openvas-manager/src/omp.c
===================================================================
--- trunk/openvas-manager/src/omp.c 2009-03-19 15:56:28 UTC (rev 2846)
+++ trunk/openvas-manager/src/omp.c 2009-03-19 16:57:22 UTC (rev 2847)
@@ -124,6 +124,10 @@
CLIENT_GET_REPORT,
CLIENT_GET_REPORT_ID,
CLIENT_GET_RULES,
+ CLIENT_MODIFY_REPORT,
+ CLIENT_MODIFY_REPORT_REPORT_ID,
+ CLIENT_MODIFY_REPORT_PARAMETER,
+ CLIENT_MODIFY_REPORT_VALUE,
CLIENT_MODIFY_TASK,
CLIENT_MODIFY_TASK_TASK_ID,
CLIENT_MODIFY_TASK_PARAMETER,
@@ -258,6 +262,8 @@
set_client_state (CLIENT_GET_REPORT);
else if (strncasecmp ("GET_RULES", element_name, 9) == 0)
set_client_state (CLIENT_GET_RULES);
+ else if (strncasecmp ("MODIFY_REPORT", element_name, 13) == 0)
+ set_client_state (CLIENT_MODIFY_REPORT);
else if (strncasecmp ("MODIFY_TASK", element_name, 11) == 0)
set_client_state (CLIENT_MODIFY_TASK);
else if (strncasecmp ("NEW_TASK", element_name, 8) == 0)
@@ -447,6 +453,26 @@
}
break;
+ case CLIENT_MODIFY_REPORT:
+ if (strncasecmp ("REPORT_ID", element_name, 9) == 0)
+ set_client_state (CLIENT_MODIFY_REPORT_REPORT_ID);
+ else if (strncasecmp ("PARAMETER", element_name, 9) == 0)
+ set_client_state (CLIENT_MODIFY_REPORT_PARAMETER);
+ else if (strncasecmp ("VALUE", element_name, 5) == 0)
+ set_client_state (CLIENT_MODIFY_REPORT_VALUE);
+ else
+ {
+ SEND_TO_CLIENT ("<modify_report_response>"
+ "<status>402</status>"
+ "</modify_report_response>");
+ set_client_state (CLIENT_AUTHENTIC);
+ g_set_error (error,
+ G_MARKUP_ERROR,
+ G_MARKUP_ERROR_UNKNOWN_ELEMENT,
+ "Error");
+ }
+ break;
+
case CLIENT_MODIFY_TASK:
if (strncasecmp ("TASK_ID", element_name, 7) == 0)
set_client_state (CLIENT_MODIFY_TASK_TASK_ID);
@@ -1011,20 +1037,18 @@
if (current_task_task_id
&& sscanf (current_task_task_id, "%u", &id) == 1)
{
- gchar* base_name;
static char buffer[11]; /* (expt 2 32) => 4294967296 */
free_string_var (¤t_task_task_id);
sprintf (buffer, "%010u", id);
- base_name = g_strdup_printf ("%s.nbe", buffer);
gchar* name = g_build_filename (PREFIX
"/var/lib/openvas/mgr/users/",
current_credentials.username,
"reports",
- base_name,
+ buffer,
+ "report.nbe",
NULL);
- g_free (base_name);
// FIX glib access setuid note
if (g_file_test (name, G_FILE_TEST_EXISTS))
{
@@ -1137,6 +1161,59 @@
set_client_state (CLIENT_DELETE_TASK);
break;
+ case CLIENT_MODIFY_REPORT:
+ if (current_task_task_id
+ && modify_task_parameter
+ && modify_task_value)
+ {
+ int ret = set_report_parameter (current_task_task_id,
+ modify_task_parameter,
+ modify_task_value);
+ free_string_var (&modify_task_parameter);
+ free_string_var (&modify_task_value);
+ free_string_var (¤t_task_task_id);
+ switch (ret)
+ {
+ case 0:
+ SEND_TO_CLIENT ("<modify_report_response>"
+ "<status>200</status>");
+ break;
+ case -1: /* Failed to scan ID. */
+ case -2: /* Parameter name error. */
+ SEND_TO_CLIENT ("<modify_report_response>"
+ "<status>40x</status>");
+ break;
+ case -3: /* Failed to write to disk. */
+ default:
+ SEND_TO_CLIENT ("<modify_report_response>"
+ "<status>50x</status>");
+ break;
+ }
+ }
+ else
+ {
+ free_string_var (&modify_task_parameter);
+ free_string_var (&modify_task_value);
+ free_string_var (¤t_task_task_id);
+ SEND_TO_CLIENT ("<modify_report_response>"
+ "<status>500</status>");
+ }
+ SEND_TO_CLIENT ("</modify_report_response>");
+ set_client_state (CLIENT_AUTHENTIC);
+ break;
+ case CLIENT_MODIFY_REPORT_PARAMETER:
+ assert (strncasecmp ("PARAMETER", element_name, 9) == 0);
+ set_client_state (CLIENT_MODIFY_REPORT);
+ break;
+ case CLIENT_MODIFY_REPORT_REPORT_ID:
+ assert (strncasecmp ("REPORT_ID", element_name, 9) == 0);
+ set_client_state (CLIENT_MODIFY_REPORT);
+ break;
+ case CLIENT_MODIFY_REPORT_VALUE:
+ assert (strncasecmp ("VALUE", element_name, 5) == 0);
+ set_client_state (CLIENT_MODIFY_REPORT);
+ break;
+
case CLIENT_MODIFY_TASK:
{
assert (current_client_task == NULL);
@@ -1391,12 +1468,16 @@
tracef (" XML text: %s\n", text);
switch (client_state)
{
+ case CLIENT_MODIFY_REPORT_PARAMETER:
+ append_string (&modify_task_parameter, text);
+ break;
+ case CLIENT_MODIFY_REPORT_VALUE:
+ append_string (&modify_task_value, text);
+ break;
+
case CLIENT_MODIFY_TASK_PARAMETER:
append_string (&modify_task_parameter, text);
break;
- case CLIENT_MODIFY_TASK_TASK_ID:
- append_string (¤t_task_task_id, text);
- break;
case CLIENT_MODIFY_TASK_VALUE:
append_string (&modify_task_value, text);
break;
@@ -1424,8 +1505,10 @@
case CLIENT_ABORT_TASK_TASK_ID:
case CLIENT_DELETE_REPORT_ID:
+ case CLIENT_DELETE_TASK_TASK_ID:
case CLIENT_GET_REPORT_ID:
- case CLIENT_DELETE_TASK_TASK_ID:
+ case CLIENT_MODIFY_REPORT_REPORT_ID:
+ case CLIENT_MODIFY_TASK_TASK_ID:
case CLIENT_START_TASK_TASK_ID:
case CLIENT_STATUS_TASK_ID:
append_string (¤t_task_task_id, text);
Modified: trunk/openvas-manager/src/otp.c
===================================================================
--- trunk/openvas-manager/src/otp.c 2009-03-19 15:56:28 UTC (rev 2846)
+++ trunk/openvas-manager/src/otp.c 2009-03-19 16:57:22 UTC (rev 2847)
@@ -273,7 +273,8 @@
* @param[in] task The task.
*
* @return 0 success, -1 failed to open file, -2 failed to close file,
- * -3 failed to symlink file to task dir.
+ * -3 failed to symlink file to task dir, -4 failed to create dir,
+ * -5 failed to generate ID.
*/
int
save_report (task_t* task)
@@ -286,32 +287,12 @@
if (task_id_string (task, &id)) return -1;
- gchar* dir_name = g_build_filename (PREFIX
- "/var/lib/openvas/mgr/users/",
- current_credentials.username,
- "tasks",
- id,
- "reports",
- NULL);
-
gchar* user_dir_name = g_build_filename (PREFIX
"/var/lib/openvas/mgr/users/",
current_credentials.username,
"reports",
NULL);
- /* Ensure task reports directory exists. */
-
- if (g_mkdir_with_parents (dir_name, 33216 /* -rwx------ */) == -1)
- {
- fprintf (stderr, "Failed to create report dir %s: %s\n",
- dir_name,
- strerror (errno));
- g_free (user_dir_name);
- g_free (dir_name);
- return -1;
- }
-
/* Ensure user reports directory exists. */
if (g_mkdir_with_parents (user_dir_name, 33216 /* -rwx------ */) == -1)
@@ -320,38 +301,71 @@
user_dir_name,
strerror (errno));
g_free (user_dir_name);
- g_free (dir_name);
- return -1;
+ return -4;
}
- /* Generate report name. */
+ /* Generate report directory name. */
// FIX OID
- static char buffer[15]; /* (expt 2 32) => 4294967296 + .nbe */
- int length = sprintf (buffer, "%010u.nbe", task->report_count);
+ static char buffer[11]; /* (expt 2 32) => 4294967296 */
+ int length = sprintf (buffer, "%010u", task->report_count);
assert (length < 15);
if (length < 4)
{
fprintf (stderr, "Failed to generate report id.\n");
g_free (user_dir_name);
- g_free (dir_name);
- return -1;
+ return -5;
}
- gchar* name = g_build_filename (dir_name, buffer, NULL);
- g_free (dir_name);
+ gchar* dir_name = g_build_filename (PREFIX
+ "/var/lib/openvas/mgr/users/",
+ current_credentials.username,
+ "tasks",
+ id,
+ "reports",
+ buffer,
+ NULL);
gchar* symlink_name = g_build_filename (user_dir_name, buffer, NULL);
g_free (user_dir_name);
+ /* Ensure task report directory exists. */
+
+ if (g_mkdir_with_parents (dir_name, 33216 /* -rwx------ */) == -1)
+ {
+ fprintf (stderr, "Failed to create report dir %s: %s\n",
+ dir_name,
+ strerror (errno));
+ g_free (dir_name);
+ g_free (symlink_name);
+ return -4;
+ }
+
+ /* Link report directory into task directory. */
+
+ if (symlink (dir_name, symlink_name))
+ {
+ rmdir (dir_name);
+ fprintf (stderr, "Failed to symlink %s to %s\n",
+ dir_name,
+ symlink_name);
+ g_free (dir_name);
+ g_free (symlink_name);
+ return -3;
+ }
+
/* Write report. */
+ gchar* name = g_build_filename (dir_name, "report.nbe", NULL);
+
FILE* file = fopen (name, "w");
if (file == NULL)
{
+ rmdir (dir_name);
fprintf (stderr, "Failed to open report file %s: %s\n",
name,
strerror (errno));
+ g_free (dir_name);
g_free (name);
g_free (symlink_name);
return -1;
@@ -373,29 +387,19 @@
if (fclose (file))
{
unlink (name);
+ rmdir (dir_name);
fprintf (stderr, "Failed to close report file %s: %s\n",
name,
strerror (errno));
+ g_free (dir_name);
g_free (name);
g_free (symlink_name);
return -2;
}
- /* Link report into task directory. */
-
- if (symlink (name, symlink_name))
- {
- unlink (name);
- fprintf (stderr, "Failed to symlink %s to %s\n",
- name,
- symlink_name);
- g_free (name);
- g_free (symlink_name);
- return -3;
- }
-
task->report_count++;
+ g_free (dir_name);
g_free (name);
g_free (symlink_name);
return 0;
More information about the Openvas-commits
mailing list