summaryrefslogtreecommitdiff
path: root/usr/src/libpiny/lib/Piny/Config.pm
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/libpiny/lib/Piny/Config.pm')
-rw-r--r--usr/src/libpiny/lib/Piny/Config.pm175
1 files changed, 105 insertions, 70 deletions
diff --git a/usr/src/libpiny/lib/Piny/Config.pm b/usr/src/libpiny/lib/Piny/Config.pm
index ecc6d89..6cca2f6 100644
--- a/usr/src/libpiny/lib/Piny/Config.pm
+++ b/usr/src/libpiny/lib/Piny/Config.pm
@@ -1,119 +1,154 @@
# Copyright © 2010 Julian Blake Kongslie <jblake@omgwallhack.org>
# Licensed under the BSD 3-clause license.
+use strict;
+use warnings;
+
package Piny::Config;
-use MooseX::Singleton;
+use Moose;
+use MooseX::StrictConstructor;
-use YAML::Tiny qw( );
+use Carp;
+use Config::Simple qw( );
# Attributes
-has '_conf' =>
- ( is => 'ro'
- , isa => 'HashRef[Str]'
- , lazy_build => 1
- , init_arg => undef
- );
-
-has 'ikiwiki_destdir' =>
+has 'confpath' =>
( is => 'ro'
, isa => 'Str'
- , lazy_build => 1
- , init_arg => undef
+ , predicate => 'has_confpath'
);
-has 'ikiwiki_srcdir' =>
- ( is => 'ro'
- , isa => 'Str'
- , lazy_build => 1
- , init_arg => undef
- );
-
-has 'ikiwiki_url' =>
- ( is => 'ro'
- , isa => 'Str'
- , lazy_build => 1
- , init_arg => undef
- );
-
-has 'ikiwiki_secure_url' =>
- ( is => 'ro'
- , isa => 'Str'
- , lazy_build => 1
- , init_arg => undef
- );
-
-has 'ikiwiki_secure_path' =>
+has '_conf' =>
( is => 'ro'
- , isa => 'Str'
+ , isa => 'HashRef[Str]'
, lazy_build => 1
, init_arg => undef
);
# Builder methods
-sub _build__conf {
- my ( $s ) = @_;
+# If constructed with just one argument, then treat it as a config path.
+around BUILDARGS => sub {
+ my ( $orig, $class ) = ( shift, shift );
- if ( -e "/etc/piny.conf" ) {
- my $yaml = YAML::Tiny->new;
- return $yaml->read( "/etc/piny.conf" )->[0];
+ if ( @_ == 1 && ! ref $_[0] ) {
+ return $class->$orig( confpath => $_[0] );
} else {
- return { };
+ return $class->$orig( @_ );
};
};
-sub _build_ikiwiki_destdir {
+sub _build__conf {
my ( $s ) = @_;
- if ( exists $s->_conf->{"ikiwiki_destdir"} ) {
- return $s->_conf->{"ikiwiki_destdir"};
+ my $conf;
+
+ if ( $s->has_confpath and -e $s->confpath ) {
+ $conf = Config::Simple->new( $s->confpath )->vars;
} else {
- return "/srv/www/piny.be/";
+ $conf = { };
};
-};
-sub _build_ikiwiki_srcdir {
- my ( $s ) = @_;
+ if ( -e "/etc/piny-default.conf" ) {
+
+ my $default = Config::Simple->new( "/etc/piny-default.conf" )->vars;
+
+ foreach my $key ( keys %$default ) {
+ if ( not exists $conf->{$key} ) {
+ $conf->{$key} = $default->{$key};
+ };
+ };
- if ( exists $s->_conf->{"ikiwiki_srcdir"} ) {
- return $s->_conf->{"ikiwiki_srcdir"};
- } else {
- return "/srv/ikiwiki/";
};
-};
-sub _build_ikiwiki_url {
- my ( $s ) = @_;
+ if ( -e "/etc/piny-override.conf" ) {
+
+ my $override = Config::Simple->new( "/etc/piny-override.conf" )->vars;
+
+ foreach my $key ( keys %$override ) {
+ $conf->{$key} = $override->{$key};
+ };
- if ( exists $s->_conf->{"ikiwiki_url"} ) {
- return $s->_conf->{"ikiwiki_url"};
- } else {
- return "http://piny.be/";
};
+
+ return $conf;
};
-sub _build_ikiwiki_secure_url {
+# Save the config
+
+sub save {
my ( $s ) = @_;
- if ( exists $s->_conf->{"ikiwiki_secure_url"} ) {
- return $s->_conf->{"ikiwiki_secure_url"};
- } else {
- return "https://secure.piny.be/";
+ if ( not $s->has_confpath ) {
+ croak "Can't save a Piny::Config if the confpath is not set!";
+ };
+
+ my $cs = Config::Simple->new( syntax => "ini" );
+
+ foreach my $key ( keys %{$s->_conf} ) {
+ $cs->param( $key, $s->_conf->{$key} );
};
+
+ $cs->write( $s->confpath );
};
-sub _build_ikiwiki_secure_path {
- my ( $s ) = @_;
+# Tweakable helper
+
+sub tweakable {
+ my ( $attr, $default ) = @_;
+
+ my $attrname = $attr;
+ $attrname =~ s/_/./g;
+
+ has $attr =>
+ ( is => 'rw'
+ , isa => 'Str'
+ , lazy_build => 1
+ , trigger => sub {
+ my ( $s, $old, $new ) = @_;
+
+ $s->_conf->{$attrname} = $new;
+
+ if ( $s->has_confpath ) {
+ $s->save;
+ $s->clear__conf;
+ } else {
+ carp "Attribute $attrname modification ignored!";
+ $s->clear__conf;
+ my $clearer = "clear_$attr";
+ $s->$clearer;
+ };
+ }
+ );
+
+ my $builder = sub {
+ my ( $s ) = @_;
+
+ if ( exists $s->_conf->{$attrname} ) {
+ return $s->_conf->{$attrname};
+ } else {
+ return $default;
+ };
+ };
- if ( exists $s->_conf->{"ikiwiki_secure_path"} ) {
- return $s->_conf->{"ikiwiki_secure_path"};
- } else {
- return "/srv/www/secure.piny.be/";
+ {
+ no strict "refs";
+
+ *{"_build_" . $attr} = $builder;
};
};
+# The tweakables
+
+tweakable "piny_ikiwiki_destdir" => "/srv/www/piny.be/";
+tweakable "piny_ikiwiki_srcdir" => "/srv/ikiwiki/";
+tweakable "piny_ikiwiki_url" => "http://piny.be/";
+tweakable "piny_ikiwiki_secure_url" => "https://secure.piny.be/";
+tweakable "piny_ikiwiki_secure_path" => "/srv/www/secure.piny.be/";
+tweakable "receive_denyNonFastforwards" => "true";
+
# Moose boilerplate
__PACKAGE__->meta->make_immutable;