# ABSTRACT: Watch over your infrastructure
our $VERSION = '0.1'; # VERSION
use strict;
sub new {
my $class = shift;
my $rh_options = shift || {};
my $self = bless( {}, $class );
return $self;
}
sub servicelock {
my $self = shift;
if (!defined($self->{ServiceLock})) {
$self->{ServiceLock} = App::OverWatch::ServiceLock->new({
db => $self->_db()
});
}
return $self->{ServiceLock};
}
sub notify {
my $self = shift;
if (!defined($self->{Notify})) {
$self->{Notify} = App::OverWatch::Notify->new({
db => $self->_db()
});
}
return $self->{Notify};
}
sub eventlog {
my $self = shift;
if (!defined($self->{Eventlog})) {
$self->{Eventlog} = App::OverWatch::Eventlog->new({
db => $self->_db()
});
}
return $self->{Eventlog};
}
sub check_options {
my $self = shift;
my $rh_args = shift || {};
my $ra_commands = $rh_args->{valid_commands};
my $rh_options = $rh_args->{options};
my $rh_required = $rh_args->{required_options};
## Check that only one actual command was provided
my $commands = join(', ', sort @$ra_commands);
my @commands = map { $rh_options->{$_} ? $_ : () } @$ra_commands;
die "Error: Please specify one and only one command ($commands)\n"
if (scalar @commands != 1);
my $command = $commands[0];
## Check all required options are defined
for my $opt (@{ $rh_required->{$command} }) {
die "Error: --$opt is a required option\n"
if (!defined($rh_options->{$opt}));
}
return $command;
}
sub load_config {
my $self = shift;
my $path = shift;
my $rh_conf;
my @paths;
if (defined($path)) {
@paths = ( $path );
} else {
@paths = ( $ENV{HOME} . "/.overwatch.conf",
"/etc/overwatch.conf" );
}
FILE:
for my $file (@paths) {
next FILE
if (!defined($file) || ! -f $file);
my $Config = Config::Tiny->read($file);
$rh_conf = $Config->{_}
if ($Config && defined($Config->{_}));
}
die "Error: Couldn't load configuration from "
. join(', ', @paths) . "\n"
if (!defined($rh_conf));
die "Error: Require 'db_type' to be set in config\n"
if (!$rh_conf->{db_type});
$self->{Config} = App::OverWatch::Config->new($rh_conf);
}
sub load_config_string {
my $self = shift;
my $string = shift;
my $Config = Config::Tiny->read_string($string);
my $rh_conf = $Config->{_}
if ($Config && defined($Config->{_}));
die "Error: Couldn't load configuration from string\n"
if (!defined($rh_conf));
die "Error: Require 'db_type' to be set in config\n"
if (!$rh_conf->{db_type});
$self->{Config} = App::OverWatch::Config->new($rh_conf);
}
sub _db {
my $self = shift;
if (!defined($self->{DB})) {
$self->{DB} = App::OverWatch::DB->new( $self->{Config} );
}
return $self->{DB};
}
1;
__END__
=pod
=encoding UTF-8
=head1 NAME
App::OverWatch - Watch over your infrastructure
=head1 VERSION
version 0.1
=head1 SYNOPSIS
use App::OverWatch;
my $OverWatch = App::OverWatch->new();
$OverWatch->load_config();
my $ServiceLock = $OverWatch->ServiceLock();
=head1 DESCRIPTION
Designed to provide a simple framework to give some oversight to applications
running in a distributed environment. Applications can quickly
register/release simple locks, register and send notifications, and log events
to a database using a very simple interface.
=head1 CONFIGURATION
Database configuration is loaded from a config file by load_config() and
looks as follows:
db_type = postgres
user = test
password = test
dsn = DBI:Pg:database=test
Valid db_types are mysql, postgres, sqlite.
=head1 METHODS
=head2 new
Create an App::OverWatch object.
my $OverWatch = App::OverWatch->new();
=head2 servicelock
Return a App::OverWatch::ServiceLock object.
=head2 notify
Return a App::OverWatch::Notify object.
=head2 eventlog
Return a App::OverWatch::EventLog object.
=head2 check_options
Checks Getopt::Long options for command line scripts. Checks that only
one of a list of commands 'valid_commands' is provided, and that all
required options 'required_options' have been passed.
Dies on any missing requirements. Returns the command.
=head2 load_config
$OverWatch->load_config();
$OverWatch->load_config($filename);
Loads OverWatch DB connection configuration from a text file, by
default it will try ~/.overwatch.conf and then /etc/overwatch.conf.
If a filename is provided, it will only try to load that file.
=head2 load_config_string
$OverWatch->load_config_string('
# A comment
db_type = sqlite
user =
password =
dsn = DBI::SQLite:dbname=:memory:
');
Loads a configuration from a string.
=head1 AUTHOR
Chris Hughes <chrisjh@cpan.org>
=head1 COPYRIGHT AND LICENSE
This software is copyright (c) 2015 by Chris Hughes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
=cut