summaryrefslogtreecommitdiffstats
path: root/lib/OpenSLX/Basics.pm
diff options
context:
space:
mode:
authorOliver Tappe2007-01-14 19:51:01 +0100
committerOliver Tappe2007-01-14 19:51:01 +0100
commit2d6ff3aadb5d4f7ea1d478fcd6df2494f4c2df64 (patch)
treea3da66b4b2645f0452f0e73d28f3c101e48c5239 /lib/OpenSLX/Basics.pm
parent* moved basic perl modules into new 'lib' folder in order to make them available (diff)
downloadcore-2d6ff3aadb5d4f7ea1d478fcd6df2494f4c2df64.tar.gz
core-2d6ff3aadb5d4f7ea1d478fcd6df2494f4c2df64.tar.xz
core-2d6ff3aadb5d4f7ea1d478fcd6df2494f4c2df64.zip
* first try at restoring mysteriously missing files... oops!
git-svn-id: http://svn.openslx.org/svn/openslx/trunk@626 95ad53e4-c205-0410-b2fa-d234c58c8868
Diffstat (limited to 'lib/OpenSLX/Basics.pm')
-rw-r--r--lib/OpenSLX/Basics.pm266
1 files changed, 266 insertions, 0 deletions
diff --git a/lib/OpenSLX/Basics.pm b/lib/OpenSLX/Basics.pm
new file mode 100644
index 00000000..e8874b8a
--- /dev/null
+++ b/lib/OpenSLX/Basics.pm
@@ -0,0 +1,266 @@
+# Basics.pm - provides basic functionality of the OpenSLX config-db.
+#
+# (c) 2006 - OpenSLX.com
+#
+# Oliver Tappe <ot@openslx.com>
+#
+package OpenSLX::Basics;
+
+use strict;
+use vars qw(@ISA @EXPORT $VERSION);
+
+use Exporter;
+$VERSION = 0.02;
+@ISA = qw(Exporter);
+
+@EXPORT = qw(
+ &openslxInit %openslxConfig %cmdlineConfig
+ &_tr &trInit
+ &vlog
+);
+
+use vars qw(%openslxConfig %cmdlineConfig);
+
+################################################################################
+### Module implementation
+################################################################################
+use Carp;
+use FindBin;
+use Getopt::Long;
+use POSIX qw(locale_h);
+
+my %translations;
+
+# this hash will hold the active openslx configuration,
+# the initial content is based on environment variables or default values.
+# Each value may be overrided from config files and/or cmdline arguments.
+%openslxConfig = (
+ 'db-datadir' => $ENV{SLX_DB_DATADIR},
+ 'db-name' => $ENV{SLX_DB_NAME} || 'openslx',
+ 'db-spec' => $ENV{SLX_DB_SPEC},
+ 'db-type' => $ENV{SLX_DB_TYPE} || 'CSV',
+ 'locale' => setlocale(LC_MESSAGES),
+ 'locale-charmap' => `locale charmap`,
+ 'base-path' => $ENV{SLX_BASE_PATH} || '/opt/openslx',
+ 'config-path' => $ENV{SLX_CONFIG_PATH} || '/etc/opt/openslx',
+ 'private-path' => $ENV{SLX_PRIVATE_PATH} || '/var/opt/openslx',
+ 'public-path' => $ENV{SLX_PUBLIC_PATH} || '/srv/openslx',
+ 'temp-path' => $ENV{SLX_TEMP_PATH} || '/tmp',
+ 'verbose-level' => $ENV{SLX_VERBOSE_LEVEL} || '0',
+);
+chomp($openslxConfig{'locale-charmap'});
+$openslxConfig{'bin-path'}
+ = $ENV{SLX_BIN_PATH} || "$openslxConfig{'base-path'}/bin",
+$openslxConfig{'db-basepath'}
+ = $ENV{SLX_DB_PATH} || "$openslxConfig{'private-path'}/db",
+$openslxConfig{'export-path'}
+ = $ENV{SLX_EXPORT_PATH} || "$openslxConfig{'public-path'}/export",
+$openslxConfig{'share-path'}
+ = $ENV{SLX_SHARE_PATH} || "$openslxConfig{'base-path'}/share",
+$openslxConfig{'tftpboot-path'}
+ = $ENV{SLX_TFTPBOOT_PATH} || "$openslxConfig{'public-path'}/tftpboot",
+
+# specification of cmdline arguments that are shared by all openslx-scripts:
+%cmdlineConfig;
+my %openslxCmdlineArgs = (
+ 'base-path=s' => \$cmdlineConfig{'base-path'},
+ # basic path to project files (binaries, functionality templates and
+ # distro-specs)
+ 'bin-path=s' => \$cmdlineConfig{'bin-path'},
+ # path to binaries and scripts
+ 'config-path=s' => \$cmdlineConfig{'config-path'},
+ # path to configuration files
+ 'db-basepath=s' => \$cmdlineConfig{'db-basepath'},
+ # basic path to openslx database, defaults to "${private-path}/db"
+ 'db-datadir=s' => \$cmdlineConfig{'db-datadir'},
+ # data folder created under db-basepath, default depends on db-type
+ 'db-name=s' => \$cmdlineConfig{'db-name'},
+ # name of database, defaults to 'openslx'
+ 'db-spec=s' => \$cmdlineConfig{'db-spec'},
+ # full specification of database, a special string defining the
+ # precise database to connect to (the contents of this string
+ # depend on db-type)
+ 'db-type=s' => \$cmdlineConfig{'db-type'},
+ # type of database to connect to (CSV, SQLite, ...), defaults to 'CSV'
+ 'export-path=s' => \$cmdlineConfig{'export-path'},
+ # path to root of all exports, each different export-type (e.g. nfs, nbd)
+ # has a separate subfolder in here.
+ 'locale=s' => \$cmdlineConfig{'locale'},
+ # locale to use for translations
+ 'locale-charmap=s' => \$cmdlineConfig{'locale-charmap'},
+ # locale-charmap to use for I/O (iso-8859-1, utf-8, etc.)
+ 'logfile=s' => \$cmdlineConfig{'locale'},
+ # file to write logging output to, defaults to STDERR
+ 'private-path=s' => \$cmdlineConfig{'private-path'},
+ # path to private data (which is *not* accesible by clients and contains
+ # database, vendorOSes and all local extensions [system specific scripts])
+ 'public-path=s' => \$cmdlineConfig{'public-path'},
+ # path to public data (which is accesible by clients and contains
+ # PXE-configurations, kernels, initramfs and client configurations)
+ 'share-path=s' => \$cmdlineConfig{'share-path'},
+ # path to sharable data (functionality templates and distro-specs)
+ 'temp-path=s' => \$cmdlineConfig{'temp-path'},
+ # path to temporary data (used during demuxing)
+ 'tftpboot-path=s' => \$cmdlineConfig{'tftpboot-path'},
+ # path to root of tftp-server, tftpable data will be stored there
+ 'verbose-level=i' => \$cmdlineConfig{'verbose-level'},
+ # level of logging verbosity (0-3)
+);
+
+# filehandle used for logging:
+my $openslxLog = *STDERR;
+
+# ------------------------------------------------------------------------------
+sub vlog
+{
+ my $minLevel = shift;
+ return if $minLevel > $openslxConfig{'verbose-level'};
+ print $openslxLog '-'x$minLevel, @_, "\n";
+}
+
+# ------------------------------------------------------------------------------
+sub openslxInit
+{
+ # evaluate cmdline arguments:
+ Getopt::Long::Configure('no_pass_through');
+ GetOptions(%openslxCmdlineArgs) or return 0;
+
+ # try to read and evaluate config files:
+ my $configPath = $cmdlineConfig{'config-path'}
+ || $openslxConfig{'config-path'};
+ foreach my $f ("$configPath/settings.default",
+ "$configPath/settings.local",
+ "$ENV{HOME}/.openslx/settings") {
+ next unless open(CONFIG, "<$f");
+ if ($cmdlineConfig{'verbose-level'} >= 2) {
+ vlog 0, "reading config-file $f...";
+ }
+ while(<CONFIG>) {
+ chomp;
+ s/#.*//;
+ s/^\s+//;
+ s/\s+$//;
+ next unless length;
+ if (! /^(\w+)=(.*)$/) {
+ die _tr("config-file <%s> has incorrect syntax here:\n\t%s\n",
+ $f, $_);
+ }
+ my ($key, $value) = ($1, $2);
+ # N.B.: the config files are used by shell-scripts, too, so in
+ # order to comply with shell-style, the config files use shell
+ # syntax and an uppercase, underline-as-separator format.
+ # Internally, we use lowercase, minus-as-separator format, so we
+ # need to convert the environment variable names to our own
+ # internal style here (e.g. 'SLX_BASE_PATH' to 'base-path'):
+ $key =~ s[^SLX_][];
+ $key =~ tr/[A-Z]_/[a-z]-/;
+ $openslxConfig{$key} = $value;
+ }
+ close CONFIG;
+ }
+
+ # push any cmdline argument into our config hash, possibly overriding any
+ # setting from the config files:
+ while(my ($key, $val) = each(%cmdlineConfig)) {
+ next unless defined $val;
+ $openslxConfig{$key} = $val;
+ }
+
+ if (defined $openslxConfig{'logfile'}
+ && open(LOG, ">>$openslxConfig{'logfile'}")) {
+ $openslxLog
+ }
+ if ($openslxConfig{'verbose-level'} >= 2) {
+ foreach my $k (sort keys %openslxConfig) {
+ vlog 2, "config-dump: $k = $openslxConfig{$k}";
+ }
+ }
+
+ # setup translation "engine":
+ trInit();
+
+ return 1;
+}
+
+# ------------------------------------------------------------------------------
+sub trInit
+{
+ # set the specified locale...
+ setlocale('LC_ALL', $openslxConfig{'locale'});
+
+ # ...and activate automatic charset conversion on all I/O streams:
+ binmode(STDIN, ":encoding($openslxConfig{'locale-charmap'})");
+ binmode(STDOUT, ":encoding($openslxConfig{'locale-charmap'})");
+ binmode(STDERR, ":encoding($openslxConfig{'locale-charmap'})");
+ use open ':locale';
+
+ my $locale = $openslxConfig{'locale'};
+ if (lc($locale) eq 'c') {
+ # treat locale 'c' as equivalent for 'posix':
+ $locale = 'posix';
+ }
+
+ # load Posix-Translations first in order to fall back to English strings
+ # if a specific translation isn't available:
+ if (eval "require OpenSLX::Translations::posix") {
+ %translations = %OpenSLX::Translations::posix::translations;
+ } else {
+ vlog 1, "unable to load translations module 'posix' ($!).";
+ }
+
+ if (lc($locale) ne 'posix') {
+ # parse locale and canonicalize it (e.g. to 'de_DE') and generate
+ # two filenames from it (language+country and language only):
+ if ($locale !~ m{^\s*([^_]+)(?:_(\w+))?}) {
+ die "locale $locale has unknown format!?!";
+ }
+ my @locales;
+ if (defined $2) {
+ push @locales, lc($1).'_'.uc($2);
+ }
+ push @locales, lc($1);
+
+ # try to load any of the Translation modules (starting with the more
+ # specific one [language+country]):
+ my $loadedTranslationModule;
+ foreach my $trName (@locales) {
+ my $trModule = "OpenSLX::Translations::$trName";
+ if (eval "require $trModule") {
+ # Access OpenSLX::Translations::<locale>::translations
+ # via a symbolic reference...
+ no strict 'refs';
+ my $translationsRef = \%{ "${trModule}::translations" };
+ # ...and copy the available translations into our hash:
+ foreach my $k (keys %{$translationsRef}) {
+ $translations{$k} = $translationsRef->{$k};
+ }
+ $loadedTranslationModule = $trModule;
+ vlog 1, _tr("translations module %s loaded successfully",
+ $trModule);
+ last;
+ }
+ }
+ if (!defined $loadedTranslationModule) {
+ vlog 1, "unable to load any translations module for locale '$locale' ($!).";
+ }
+ }
+}
+
+# ------------------------------------------------------------------------------
+sub _tr
+{
+ my $trOrig = shift;
+
+ my $trKey = $trOrig;
+ $trKey =~ s[\n][\\n]g;
+ $trKey =~ s[\t][\\t]g;
+
+ my $formatStr = $translations{$trKey};
+ if (!defined $formatStr) {
+ vlog 1, "Translation key '$trKey' not found.";
+ $formatStr = $trOrig;
+ }
+ return sprintf($formatStr, @_);
+}
+
+1; \ No newline at end of file