Add check of configuration (-t).
authorAdam Dickmeiss <adam@indexdata.dk>
Thu, 10 Sep 2009 10:30:44 +0000 (12:30 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Thu, 10 Sep 2009 10:30:44 +0000 (12:30 +0200)
Option -t tests the Pazpar2 configuration and returns exit code
(0=success, non-zero=failure). The configuration is dumped to the yaz
log file if -d is given. Previously the configuration was dumped always
to stdout.

NEWS
doc/pazpar2.xml
src/pazpar2.c
src/pazpar2_config.c
src/pazpar2_config.h

diff --git a/NEWS b/NEWS
index ea4a6b8..7e42df1 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,11 @@
+Option -t tests the Pazpar2 configuration and returns exit code
+(0=success, non-zero=failure). In previous version of Pazpar2, -t
+specified local settings.
+
+In version 1.2.0 the configuration file - after include processing -
+was dumped to stdout. Now, the configuration is only dumped to the
+yaz log file if option -d is given.
+
 --- 1.2.0 2009/09/10
 
 Configuration may now have multiple server areas. This means that a
index 072c677..c9b2614 100644 (file)
@@ -32,6 +32,7 @@
    <arg choice="opt"><option>-h <replaceable>ip:port</replaceable></option></arg>
    <arg choice="opt"><option>-l <replaceable>logfile</replaceable></option></arg>
    <arg choice="opt"><option>-p <replaceable>pidfile</replaceable></option></arg>
+   <arg choice="opt"><option>-t</option></arg>
    <arg choice="opt"><option>-T <replaceable>session_timeout</replaceable></option></arg>
    <arg choice="opt"><option>-u <replaceable>uid</replaceable></option></arg>
    <arg choice="opt"><option>-V</option></arg>
    </varlistentry>
 
    <varlistentry>
+    <term><option>-t</option></term>
+    <listitem>
+     <para>
+      Checks parameters and configuration. No service or daemon is
+      started. Useful for checking a new configuration before a
+      Pazpar2 is restarted.
+     </para>
+     <note>
+      <para>
+       In Pazpar2 1.2 and earlier releasese, option -t specified a
+       local target settings file.
+      </para>
+     </note>
+    </listitem>
+   </varlistentry>
+
+   <varlistentry>
     <term><option>-T <replaceable>session_timeout</replaceable></option></term>
     <listitem>
      <para>
index d7e8c98..60ec1db 100644 (file)
@@ -92,7 +92,9 @@ static int sc_main(
     int session_timeout = 60;
     const char *listener_override = 0;
     const char *proxy_override = 0;
+    const char *config_fname = 0;
     struct conf_config *config = 0;
+    int test_mode = 0;
 
 #ifndef WIN32
     if (signal(SIGPIPE, SIG_IGN) == SIG_ERR)
@@ -104,7 +106,7 @@ static int sc_main(
     yaz_log_init_prefix("pazpar2");
     yaz_log_xml_errors(0, YLOG_WARN);
 
-    while ((ret = options("dDf:h:l:p:T:u:VX", argv, argc, &arg)) != -2)
+    while ((ret = options("dDf:h:l:p:tT:u:VX", argv, argc, &arg)) != -2)
     {
        switch (ret)
         {
@@ -115,10 +117,7 @@ static int sc_main(
             daemon = 1;
             break;
         case 'f':
-            config = config_create(arg);
-            if (!config)
-                return 1;
-            sc_stop_config = config;
+            config_fname = arg;
             break;
         case 'h':
             listener_override = arg;
@@ -130,6 +129,9 @@ static int sc_main(
         case 'p':
             pidfile = arg;
             break;
+        case 't':
+            test_mode = 1;
+            break;
         case 'T':
            session_timeout = atoi(arg);
            if (session_timeout < 9 || session_timeout > 86400)
@@ -150,48 +152,60 @@ static int sc_main(
             break;
         default:
             fprintf(stderr, "Usage: pazpar2\n"
-                    "    -d                      (show internal records)\n"
+                    "    -d                      Show internal records\n"
                     "    -D                      Daemon mode (background)\n"
-                    "    -f configfile\n"
-                    "    -h [host:]port          (REST protocol listener)\n"
-                    "    -l file                 log to file\n"
+                    "    -f configfile           Configuration\n"
+                    "    -h [host:]port          Listener port\n"
+                    "    -l file                 Log to file\n"
                     "    -p pidfile              PID file\n"
-                    "    -T session_timeout\n"
-                    "    -u uid\n"
-                    "    -V                      show version\n"
-                    "    -X                      debug mode\n"
+                    "    -t                      Test configuration\n"
+                    "    -T session_timeout      Session timeout\n"
+                    "    -u uid                  Change user to uid\n"
+                    "    -V                      Show version\n"
+                    "    -X                      Debug mode\n"
 #ifdef WIN32
-                    "    -install                install windows service\n"
-                    "    -remove                 remove windows service\n"
+                    "    -install                Install windows service\n"
+                    "    -remove                 Remove windows service\n"
 #endif
                 );
             return 1;
        }
     }
-
-    yaz_log(YLOG_LOG, "Pazpar2 %s started", VERSION);
-    if (daemon && !log_file_in_use)
+    if (!config_fname)
     {
-        yaz_log(YLOG_FATAL, "Logfile must be given (option -l) for daemon "
-                "mode");
+        yaz_log(YLOG_FATAL, "Configuration must be given with option -f");
         return 1;
     }
+    config = config_create(config_fname, global_parameters.dump_records);
     if (!config)
-    {
-        yaz_log(YLOG_FATAL, "Load config with -f");
         return 1;
+    sc_stop_config = config;
+    if (test_mode)
+    {
+        yaz_log(YLOG_LOG, "Configuration OK");
+        config_destroy(config);
+    }
+    else
+    {
+        yaz_log(YLOG_LOG, "Pazpar2 %s started", VERSION);
+        if (daemon && !log_file_in_use)
+        {
+            yaz_log(YLOG_FATAL, "Logfile must be given (option -l) for daemon "
+                    "mode");
+            return 1;
+        }
+        ret = config_start_listeners(config, listener_override, proxy_override);
+        if (ret)
+            return ret; /* error starting http listener */
+        
+        yaz_sc_running(s);
+        
+        yaz_daemon("pazpar2",
+                   (global_parameters.debug_mode ? YAZ_DAEMON_DEBUG : 0) +
+                   (daemon ? YAZ_DAEMON_FORK : 0) + YAZ_DAEMON_KEEPALIVE,
+                   child_handler, config /* child_data */,
+                   pidfile, uid);
     }
-    ret = config_start_listeners(config, listener_override, proxy_override);
-    if (ret)
-        return ret; /* error starting http listener */
-
-    yaz_sc_running(s);
-
-    yaz_daemon("pazpar2",
-               (global_parameters.debug_mode ? YAZ_DAEMON_DEBUG : 0) +
-               (daemon ? YAZ_DAEMON_FORK : 0) + YAZ_DAEMON_KEEPALIVE,
-               child_handler, config /* child_data */,
-               pidfile, uid);
     return 0;
 }
 
index 4745458..7340512 100644 (file)
@@ -849,7 +849,7 @@ static int process_config_includes(struct conf_config *config, xmlNode *n)
     return 0;
 }
 
-struct conf_config *config_create(const char *fname)
+struct conf_config *config_create(const char *fname, int verbose)
 {
     xmlDoc *doc = xmlParseFile(fname);
     xmlNode *n;
@@ -887,7 +887,12 @@ struct conf_config *config_create(const char *fname)
     r = process_config_includes(config, n);
     if (r == 0) /* OK */
     {
-        xmlDocFormatDump(stdout, doc, 0);
+        if (verbose)
+        {
+            yaz_log(YLOG_LOG, "Configuration %s after include processing",
+                    fname);
+            xmlDocFormatDump(yaz_log_file(), doc, 0);
+        }
         r = parse_config(config, n);
     }
     xmlFreeDoc(doc);
index 2298cff..3faa145 100644 (file)
@@ -169,7 +169,7 @@ struct conf_targetprofiles
     char *src;
 };
 
-struct conf_config *config_create(const char *fname);
+struct conf_config *config_create(const char *fname, int verbose);
 void config_destroy(struct conf_config *config);
 xsltStylesheet *conf_load_stylesheet(struct conf_config *config,
                                      const char *fname);