summaryrefslogtreecommitdiff
path: root/config.pm
diff options
context:
space:
mode:
authorAndreas Scherbaum2010-10-19 21:04:06 +0000
committerAndreas Scherbaum2010-10-19 21:04:06 +0000
commit718dbd973f92c3d3f520448a74b223af78eea342 (patch)
treebd0891f03b724205623f168714183b3b975f307c /config.pm
- initial releaseHEADv1master
Diffstat (limited to 'config.pm')
-rwxr-xr-xconfig.pm258
1 files changed, 258 insertions, 0 deletions
diff --git a/config.pm b/config.pm
new file mode 100755
index 0000000..4aa3b6c
--- /dev/null
+++ b/config.pm
@@ -0,0 +1,258 @@
+#!/usr/bin/perl
+
+
+package docbot::config;
+#
+# config class for docbot
+#
+
+# config file schema:
+#
+# key = value
+# key= value
+# key =value
+# key=value
+# key=
+# key = value
+# ...
+
+# usage:
+#
+# $config = docbot::config->new(<configfile>);
+# $config->set_autosave(<on/off>);
+# $var = $config->get_key(<key name>);
+# $config->set_key(<key name>, <new value>);
+# $config->delete_key(<key name>);
+# %var = $config->get_config_keys();
+# $config->save_config(); # <configfile> from new() will be used
+# $config->save_config(<new filename>);
+
+
+
+use strict;
+use POSIX; # some standards
+use FileHandle; # have variables for the filehandles
+
+# new()
+#
+# constructor
+#
+# parameter:
+# - class name
+# return:
+# - pointer to config class
+sub new {
+ my $class = shift;
+ # get config file
+ my $config_file = shift;
+ # test if config file exists
+ if (!-f $config_file) {
+ die "could not find config file: $config_file\n";
+ }
+ my $self = {};
+ # bless mysqlf
+ bless($self, $class);
+ # define own variables
+ # open config
+ $self->{config} = $self->open_config($config_file);
+ if (!defined($self->{config})) {
+ die "could not open/parse config file: $config_file\n";
+ }
+ # save config file name for later use
+ $self->{config_file} = $config_file;
+ # set config to 'not changed'
+ $self->{changed} = 0;
+ # deactivate auto-save mode
+ $self->{autosave} = 0;
+
+ # return reference
+ return $self;
+}
+
+# open_config()
+#
+# read in a config file
+#
+# parameter:
+# - self
+# - config filename
+# return:
+# - reference to hash with config values
+sub open_config {
+ my $self = shift;
+ if (!ref($self)) {
+ die "do not call me from outside!\n";
+ }
+ # should be already validated for existence in new()
+ my $config_file = shift;
+ my $fh = new FileHandle;
+ # define hash for config
+ my %config = ();
+ open($fh, $config_file) || die "could not open config file ($config_file): $!\n";
+ # read every line
+ while (my $line = <$fh>) {
+ # remove any line ending char
+ $line =~ s/^(.*?)[\s\r\n]*$/$1/g;
+ if ($line =~ /^([a-zA-Z0-9\-_]+)[\s\t]*=[\s\t]*(.*)$/) {
+ $config{$1} = $2;
+ #print "read config line: $1 -> $2\n";
+ }
+ }
+ close($fh);
+ # return config
+ return \%config;
+}
+
+# set_autosave()
+#
+# set autosave mode for config
+#
+# parameter:
+# - self
+# - autosave mode (on/off)
+# return:
+# none
+sub set_autosave {
+ my $self = shift;
+ my $autosave = shift;
+ # validate the given mode
+ if ($autosave eq "1" or lc($autosave) eq "yes" or lc($autosave) eq "on") {
+ # set to 'on'
+ $self->{autosave} = 1;
+ } elsif ($autosave eq "0" or lc($autosave) eq "no" or lc($autosave) eq "off") {
+ # set to 'off'
+ $self->{autosave} = 0;
+ } else {
+ die "could not recognize autosave mode: $autosave (please use on/off)\n";
+ }
+}
+
+# DESTROY()
+#
+# destructor
+#
+# parameter:
+# - self
+# return:
+# none
+sub DESTROY {
+ my $self = shift;
+ # check autosave mode
+ if ($self->{autosave} == 1) {
+ # check if config is saved
+ if ($self->{changed} == 1) {
+ # save the config
+ $self->save_config();
+ }
+ }
+}
+
+# get_key()
+#
+# return a config value
+#
+# parameter:
+# - self
+# - config key name
+# return:
+# - value of config parameter (or undef)
+sub get_key {
+ my $self = shift;
+ my $key = shift;
+ # return value
+ return $self->{config}->{$key};
+}
+
+# set_key()
+#
+# set a new config value
+#
+# parameter:
+# - self
+# - config key name
+# - new value
+# return:
+# none
+sub set_key {
+ my $self = shift;
+ my $key = shift;
+ my $new_value = shift;
+ # set new value
+ $self->{config}->{$key} = $new_value;
+ # mark config changed
+ $self->{changed} = 1;
+}
+
+# delete_key()
+#
+# delete a config key
+#
+# parameter:
+# - self
+# - config key name
+# return:
+# none
+sub delete_key {
+ my $self = shift;
+ my $key = shift;
+ # delete key
+ delete($self->{config}->{$key});
+ # mark config changed
+ $self->{changed} = 1;
+}
+
+# get_config_keys()
+#
+# return hash with all defined config keys
+#
+# parameter:
+# - self
+# return:
+# - hash with config keys
+sub get_config_keys {
+ my $self = shift;
+ # return sorted hash
+ return sort(keys(%{$self->{config}}));
+}
+
+# save_config()
+#
+# write the config to disk
+#
+# parameter:
+# - self
+# - (optional) config filename
+# return:
+# none
+# comment:
+# - if no filename is given, the original config filename will be used
+sub save_config {
+ my $self = shift;
+ # get original config filename
+ my $config_file = $self->{config_file};
+ if (defined($_[0])) {
+ # another config filename is given
+ $config_file = shift;
+ }
+ my $fh = new FileHandle;
+ # open config file for write
+ open($fh, ">$config_file") || die "could not open config file for write ($config_file): $!\n";
+ my ($key, $value);
+ # get all keys
+ foreach $key ($self->get_config_keys()) {
+ # get the value for the key
+ $value = $self->get_key($key);
+ #print "write config line: $key -> $value\n";
+ print $fh "$key = $value\n";
+ }
+ # flush the filehandle to get stuff written to disk
+ $fh->flush;
+ # close filehandle
+ close($fh);
+ #mark config unchanged
+ $self->{changed} = 0;
+}
+
+
+# finish module
+1;