Add config file handling v0.4
authorSteve McIntyre <steve@einval.com>
Sat, 16 Apr 2011 18:36:59 +0000 (19:36 +0100)
committerSteve McIntyre <steve@einval.com>
Sat, 16 Apr 2011 18:36:59 +0000 (19:36 +0100)
Version 0.4

Move config variables into the %conf hash.

Set default config values in set_default_config()

In read_config(), look for a config file called find_file.cfg in the
same dir as the script is run from. If it exists, use the
ConfigReader::Simple library to load and parse the config file,
looking for directives that match the keys already in the %conf hash.

Makes it much easier to run the script on multiple hosts directly from
git - now we can store config in a separate file and we don't have to
modify the script itself.

find_file.cgi

index fb33b30..abfdf9c 100755 (executable)
@@ -24,9 +24,9 @@
 use strict;
 use DB_File;
 use CGI;
+use ConfigReader::Simple;
 
-my $dbdir = "/home/steve/debian/debian-cd/search/search-db";
-my $htmldir = "/home/steve/debian/debian-cd/html";
+my %conf;
 my $cdimage_url = "http://cdimage.debian.org/cdimage/";
 my @AREAS;
 my %num_files;
@@ -43,7 +43,7 @@ my $header2 = "";
 my $footer1 = "";
 my $footer2 = "";
 
-my $version = "0.3";
+my $version = "0.4";
 my $title_base = "Debian CD search engine";
 
 my $q = new CGI;
@@ -54,16 +54,16 @@ my $authormail = '93sam@debian.org';
 sub read_files ($) {
     my $lang = shift;
     
-    open IN, "<", "$htmldir/header1.$lang.html";
+    open IN, "<", "$conf{'htmldir'}/header1.$lang.html";
     while(<IN>) { $header1 .= $_; }
     close(IN);
-    open IN, "<", "$htmldir/header2.$lang.html";
+    open IN, "<", "$conf{'htmldir'}/header2.$lang.html";
     while(<IN>) { $header2 .= $_; }
     close(IN);
-    open IN, "<", "$htmldir/footer1.$lang.html";
+    open IN, "<", "$conf{'htmldir'}/footer1.$lang.html";
     while(<IN>) { $footer1 .= $_; }
     close(IN);
-    open IN, "<", "$htmldir/footer2.$lang.html";
+    open IN, "<", "$conf{'htmldir'}/footer2.$lang.html";
     while(<IN>) { $footer2 .= $_; }
     close(IN);
 }
@@ -195,9 +195,33 @@ sub pretty_name ($) {
     return $name;
 }    
 
+sub set_default_config () {
+    $conf{'dbdir'} = "/home/steve/debian/debian-cd/search/search-db";
+    $conf{'htmldir'} = "/home/steve/debian/debian-cd/html";
+}
+
+# If we can find an appropriately-name config file, read it and
+# over-write the default config for $conf{'dbdir'} and $conf{'htmldir'}
+sub read_config () {
+    my $config_file;
+
+    $config_file = $0;
+    $config_file =~ s/find_file.cgi/find_file.cfg/;
+    if (-r $config_file) {
+        my $config = ConfigReader::Simple->new($config_file);
+        foreach my $key (keys %conf) {
+            if ($config->exists($key)) {
+                $conf{$key} = $config->get($key);
+            }
+        }
+    }
+}
+
+set_default_config();
+read_config();
 read_files("en");
-chdir($dbdir) || log_error(500, "Failed to cd to $dbdir: $!\n");
-opendir(my $dh, ".") || log_error(500, "Failed to open $dbdir: $!\n");
+chdir($conf{'dbdir'}) || log_error(500, "Failed to cd to $conf{'dbdir'}: $!\n");
+opendir(my $dh, ".") || log_error(500, "Failed to open $conf{'dbdir'}: $!\n");
 while (defined($_ = readdir($dh))) {
     m/(.*)\.db$/ and push(@AREAS, "$1");
 }
@@ -230,7 +254,7 @@ my $re_search = glob2re($query_term);
 
 # If we get here, we have stuff to work with. Yay!
 foreach my $area (@chosen_areas) {
-    my $db_file_name = "$dbdir/$area.db";
+    my $db_file_name = "$conf{'dbdir'}/$area.db";
     $l .= "Looking in area $area, file $db_file_name<br>\n";
     dbmopen(%fileinfo, "$db_file_name", 0000) ||
         log_error(500, "Failed to open db file: $!\n");