Beefy Boxes and Bandwidth Generously Provided by pair Networks
"be consistent"

Re: Single file oriented for different usage

by snoopy (Deacon)
on Feb 27, 2008 at 00:20 UTC ( #670442=note: print w/replies, xml ) Need Help??

in reply to Single file oriented for different usage

Hey arbingersys, tell me about it. I'm maintaining a number of loosely coupled, but interelated web site instances. In addition there are multiple development and test sites. A lot of the information is shared, but to give each it's own copy, that's a cut and paste nightmare.

Since you ask, here's how I've approached it:

  • I maintain a meta config file. This has knowledge about all the websites in the cluster.
  • At run time, when I load the meta-config, it conditionally extract just the config information required by this application, running on this host, in this working directory:

    A snippet from a typical (YAML) config file and Perl extraction code follow. The "about" clauses represent the conditional parts:

    --- timezone: Australia/Melbourne demo_url: support_url: /?_action=support::support some_root_id: 1272 # someapp_db: adaptor: mysql database: some_database host: localhost username: some_username password: some_password # otherapp_db: adaptor: mysql database: some_database host: localhost username: some_username password: some_password # about: host: about: server_root: /home/snoopy/merge/www_someapp: &1 prod_level: devl client_root: /var/www/devl/someapp someapp_url: demo_url: otherapp_url: /home/david/doitall: *1 about: server_root: # /home/wwwbaz/public_html: prod_level: prod otherapp_url: someapp_url: demo_url: client_root: /home/wwwbaz/public_html # /home/wwwbazuk/public_html: prod_level: prod otherapp_url: someapp_url: client_root: /home/wwwfoobar/public_html someapp_db: adaptor: mysql database: yet_another_database host: localhost username: yet_another_username password: yet_aother_password
    I'm using the host name and the working directory to build the actual run-time settings for this instance of the application.
    package SomeApp::Config; use warnings; use strict; use YAML; use Cwd; use Config::Auto; use Class::Autouse qw/Sys::Hostname/; our $Config; our $Host; our $Cwd; use Class::Struct ('Database' => { adaptor => '$', database => '$', host => '$', username => '$', password => '$', }); use Class::Struct ( client_root => '$', demo_url => '$', host => '$', someapp_db => 'Database', someapp_url => '$', prod_level => '$', server_root => '$', root_id => '$', support_url => '$', timezone => '$', otherapp_db => 'Database', otherapp_url => '$', ); { my $config = Config::Auto::parse('someapp.ini', format => 'yaml'); my @config = _load_config($config); $Config = __PACKAGE__->new( @config ); } sub _load_config { my $ config = shift; my @config = (); my $about = delete $config->{about}; push(@config, map{$_ => $config->{$_}} (keys %$config)); $Host ||= Sys::Hostname::hostname(); $Cwd ||= cwd(); if ($about) { die "malformed 'about' clause in config file" unless (ref $about eq 'HASH'); foreach (keys %$about) { if ($_ eq 'host') { my $about_hosts = $about->{'host'}; if (my $about_this_host = $about_hosts->{$Host}) { push (@config, _load_config ($about_this_host)); } } elsif ($_ eq 'server_root') { my $about_cwds = $about->{'server_root'}; foreach (sort keys %$about_cwds) { if (substr($Cwd, 0, length($_)) eq $_) { my $about_this_cwd = $about_cwds->{$_}; push (@config, _load_config ($about_this_cwd)) +; } } } else { die "don't know anything 'about' $_"; } } } push (@config, 'host', $Host); push (@config, 'server_root', $Cwd); return (@config); } sub config { return $Config; }; 1;
  • Log In?

    What's my password?
    Create A New User
    Node Status?
    node history
    Node Type: note [id://670442]
    and all is quiet...

    How do I use this? | Other CB clients
    Other Users?
    Others avoiding work at the Monastery: (4)
    As of 2017-07-28 06:16 GMT
    Find Nodes?
      Voting Booth?
      I came, I saw, I ...

      Results (424 votes). Check out past polls.