Author: timopollmeier
Date: 2017-08-09 15:23:23 +0200 (Wed, 09 Aug 2017)
New Revision: 29329

Modified:
   branches/openvas-manager-7.0/ChangeLog
   branches/openvas-manager-7.0/src/manage.c
   branches/openvas-manager-7.0/src/manage.h
   branches/openvas-manager-7.0/src/manage_sql.c
   branches/openvas-manager-7.0/src/ompd.c
   branches/openvas-manager-7.0/src/openvasmd.c
   branches/openvas-manager-7.0/src/sql.h
   branches/openvas-manager-7.0/src/sql_pg.c
   branches/openvas-manager-7.0/src/sql_sqlite3.c
Log:
        Backport r28922 and r28923.

        Handle termination signals outside the main serve_and_schedule loop by
        canceling SQL statements and closing scanner connections.

        * src/manage_sql.c (sql_cancel): New function.

        * src/manage.c (handle_slave_task): Stop current task if a termination
        signal was received.
        (get_termination_signal): New function.

        * src/manage.h (get_termination_signal, sql_cancel): New prototypes.

        * src/ompd.c (serve_omp): Close scanner connection and exit loop if a
        termination signal was received.

        * src/openvasmd.c (handle_termination_signal): Call sql_cancel.

        * src/sql_pg.c (sql_cancel_internal): New function.

        * src/sql_sqlite3.c (sql_cancel_internal): New function.

        * src/sql.h (sql_cancel_internal): New function prototype.

Modified: branches/openvas-manager-7.0/ChangeLog
===================================================================
--- branches/openvas-manager-7.0/ChangeLog      2017-08-09 11:43:15 UTC (rev 
29328)
+++ branches/openvas-manager-7.0/ChangeLog      2017-08-09 13:23:23 UTC (rev 
29329)
@@ -1,3 +1,29 @@
+2017-08-09  Timo Pollmeier <timo.pollme...@greenbone.net>
+
+       Backport r28922 and r28923.
+
+       Handle termination signals outside the main serve_and_schedule loop by
+       canceling SQL statements and closing scanner connections.
+
+       * src/manage_sql.c (sql_cancel): New function.
+
+       * src/manage.c (handle_slave_task): Stop current task if a termination
+       signal was received.
+       (get_termination_signal): New function.
+
+       * src/manage.h (get_termination_signal, sql_cancel): New prototypes.
+
+       * src/ompd.c (serve_omp): Close scanner connection and exit loop if a
+       termination signal was received.
+
+       * src/openvasmd.c (handle_termination_signal): Call sql_cancel.
+
+       * src/sql_pg.c (sql_cancel_internal): New function.
+
+       * src/sql_sqlite3.c (sql_cancel_internal): New function.
+
+       * src/sql.h (sql_cancel_internal): New function prototype.
+
 2017-08-07  Matthew Mundell <matthew.mund...@greenbone.net>
 
        Backport r29325.

Modified: branches/openvas-manager-7.0/src/manage.c
===================================================================
--- branches/openvas-manager-7.0/src/manage.c   2017-08-09 11:43:15 UTC (rev 
29328)
+++ branches/openvas-manager-7.0/src/manage.c   2017-08-09 13:23:23 UTC (rev 
29329)
@@ -156,6 +156,9 @@
  */
 #define MAX_HOSTS_DEFAULT "20"
 
+extern volatile int termination_signal;
+
+
 
 /* Certificate and key management. */
 
@@ -3473,9 +3476,22 @@
       }
     else
       {
+        int termination_signal = get_termination_signal ();
         if ((task_run_status (task) == TASK_STATUS_STOP_REQUESTED_GIVEUP)
-            || (task_run_status (task) == TASK_STATUS_STOP_REQUESTED))
+            || (task_run_status (task) == TASK_STATUS_STOP_REQUESTED)
+            || termination_signal)
           {
+            if (termination_signal)
+              {
+                g_debug ("%s: Received %s signal.",
+                         __FUNCTION__,
+                         sys_siglist[get_termination_signal()]);
+              }
+            if (current_report)
+              {
+                set_report_scan_run_status (current_report,
+                                            TASK_STATUS_STOPPED);
+              }
             set_task_run_status (task, TASK_STATUS_STOPPED);
             g_free (slave_task_name);
             return 0;
@@ -3485,6 +3501,22 @@
 
   while (1)
     {
+      int termination_signal = get_termination_signal ();
+      if (termination_signal)
+        {
+          g_debug ("%s: Received %s signal.",
+                   __FUNCTION__,
+                   sys_siglist[get_termination_signal()]);
+          if (current_report)
+            {
+              set_report_scan_run_status (current_report,
+                                          TASK_STATUS_STOPPED);
+            }
+          set_task_run_status (task, TASK_STATUS_STOPPED);
+          g_free (slave_task_name);
+          return 0;
+        }
+
       ret = slave_setup (connection, slave_task_name,
                          task, target, target_ssh_credential,
                          target_smb_credential, target_esxi_credential,
@@ -9429,3 +9461,14 @@
     return 3;
   return 0;
 }
+
+/**
+ * @brief Gets the last termination signal or 0.
+ *
+ * @return The last termination signal or 0 if there was none.
+ */
+int
+get_termination_signal ()
+{
+  return termination_signal;
+}

Modified: branches/openvas-manager-7.0/src/manage.h
===================================================================
--- branches/openvas-manager-7.0/src/manage.h   2017-08-09 11:43:15 UTC (rev 
29328)
+++ branches/openvas-manager-7.0/src/manage.h   2017-08-09 13:23:23 UTC (rev 
29329)
@@ -4178,4 +4178,12 @@
 int
 manage_optimize (GSList *, const gchar *, const gchar *);
 
+/* Signal management */
+
+int
+get_termination_signal ();
+
+int
+sql_cancel ();
+
 #endif /* not OPENVAS_MANAGER_MANAGE_H */

Modified: branches/openvas-manager-7.0/src/manage_sql.c
===================================================================
--- branches/openvas-manager-7.0/src/manage_sql.c       2017-08-09 11:43:15 UTC 
(rev 29328)
+++ branches/openvas-manager-7.0/src/manage_sql.c       2017-08-09 13:23:23 UTC 
(rev 29329)
@@ -66510,3 +66510,15 @@
 
   return ret;
 }
+
+/**
+ * @brief Cancels the current SQL statement.
+ *
+ * @return 0 on success, -1 on error.
+ */
+int
+sql_cancel ()
+{
+  g_debug ("%s: cancelling current SQL statement", __FUNCTION__);
+  return sql_cancel_internal ();
+}

Modified: branches/openvas-manager-7.0/src/ompd.c
===================================================================
--- branches/openvas-manager-7.0/src/ompd.c     2017-08-09 11:43:15 UTC (rev 
29328)
+++ branches/openvas-manager-7.0/src/ompd.c     2017-08-09 13:23:23 UTC (rev 
29329)
@@ -556,7 +556,22 @@
     {
       int ret;
       fd_set readfds, writefds;
+      int termination_signal = get_termination_signal ();
 
+      if (termination_signal)
+        {
+          g_debug ("%s: Received %s signal.",
+                   __FUNCTION__,
+                   sys_siglist[get_termination_signal()]);
+
+          if (openvas_scanner_connected ())
+            {
+              openvas_scanner_close ();
+            }
+
+          goto client_free;
+        }
+
       /* Setup for select. */
 
       /** @todo nfds must only include a socket if it's in >= one set. */

Modified: branches/openvas-manager-7.0/src/openvasmd.c
===================================================================
--- branches/openvas-manager-7.0/src/openvasmd.c        2017-08-09 11:43:15 UTC 
(rev 29328)
+++ branches/openvas-manager-7.0/src/openvasmd.c        2017-08-09 13:23:23 UTC 
(rev 29329)
@@ -868,6 +868,8 @@
 handle_termination_signal (int signal)
 {
   termination_signal = signal;
+
+  sql_cancel ();
 }
 
 /**

Modified: branches/openvas-manager-7.0/src/sql.h
===================================================================
--- branches/openvas-manager-7.0/src/sql.h      2017-08-09 11:43:15 UTC (rev 
29328)
+++ branches/openvas-manager-7.0/src/sql.h      2017-08-09 13:23:23 UTC (rev 
29329)
@@ -207,4 +207,7 @@
 long long int
 sql_column_int64 (sql_stmt_t *, int);
 
+int
+sql_cancel_internal ();
+
 #endif /* not OPENVAS_MANAGER_SQL_H */

Modified: branches/openvas-manager-7.0/src/sql_pg.c
===================================================================
--- branches/openvas-manager-7.0/src/sql_pg.c   2017-08-09 11:43:15 UTC (rev 
29328)
+++ branches/openvas-manager-7.0/src/sql_pg.c   2017-08-09 13:23:23 UTC (rev 
29329)
@@ -245,10 +245,11 @@
   PostgresPollingStatusType poll_status;
   int socket;
 
-  conn_info = g_strdup_printf ("dbname = %s",
+  conn_info = g_strdup_printf ("dbname='%s' application_name='%s'",
                                database
                                 ? database
-                                : sql_default_database ());
+                                : sql_default_database (),
+                               "gvmd");
   conn = PQconnectStart (conn_info);
   g_free (conn_info);
   if (conn == NULL)
@@ -928,3 +929,35 @@
         return atol (cell);
     }
 }
+
+/**
+ * @brief Cancels the current SQL statement.
+ *
+ * @return 0 on success, -1 on error.
+ */
+int
+sql_cancel_internal ()
+{
+  PGcancel *cancel;
+  char errbuf[256] = "";
+
+  cancel = PQgetCancel (conn);
+  if (cancel)
+    {
+      if (PQcancel (cancel, errbuf, 256))
+        {
+          PQfreeCancel (cancel);
+        }
+      else
+        {
+          PQfreeCancel (cancel);
+          return -1;
+        }
+    }
+  else
+    {
+      return -1;
+    }
+
+  return 0;
+}

Modified: branches/openvas-manager-7.0/src/sql_sqlite3.c
===================================================================
--- branches/openvas-manager-7.0/src/sql_sqlite3.c      2017-08-09 11:43:15 UTC 
(rev 29328)
+++ branches/openvas-manager-7.0/src/sql_sqlite3.c      2017-08-09 13:23:23 UTC 
(rev 29329)
@@ -886,3 +886,22 @@
 {
   return sqlite3_column_int64 (stmt->stmt, position);
 }
+
+/**
+ * @brief Cancels the current SQL statement.
+ *
+ * @return 0 on success, -1 on error.
+ */
+int
+sql_cancel_internal ()
+{
+  if (task_db)
+    {
+      sqlite3_interrupt (task_db);
+      return 0;
+    }
+  else
+    {
+      return -1;
+    }
+}

_______________________________________________
Openvas-commits mailing list
Openvas-commits@wald.intevation.org
https://lists.wald.intevation.org/cgi-bin/mailman/listinfo/openvas-commits

Reply via email to