123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- #!/usr/bin/perl
- use local::lib;
- use v5.10;
- use strict;
- use warnings;
- use List::Util qw( any );
- use Mojo::Server::Morbo ();
- use Time::HiRes qw( sleep );
- $| = 1;
- my @switches = grep {/^-/} @ARGV;
- $ENV{DEBUG} = 1;
- $ENV{LOGBOT_CONFIG} = join(',', grep { !/^-/ } @ARGV) || '_development';
- $ENV{LOGBOT_STATUS_PASSWORD} = '';
- # asset watch
- {
- my $pid = fork();
- if (defined($pid) && $pid == 0) {
- my $make = Make->new();
- while (1) {
- $make->execute() if $make->updated();
- sleep(0.25);
- }
- }
- }
- # memcached
- if (!any { $_ eq '--no-cache' } @switches) {
- my $pid = fork();
- if (defined($pid) && $pid == 0) {
- my $verbose = any { $_ eq '-v' || $_ eq '--verbose' } @switches;
- ## no critic (InputOutput::RequireBriefOpen)
- open(my $mc, '-|', 'memcached -vv 2>&1') || die "failed to start memcached: $!\n";
- say 'memcached listening on :11211' unless $verbose;
- while (<$mc>) {
- next unless $verbose;
- next
- if /^slab class/
- || /^<\d+ new auto-negotiating/
- || /^<\d+ connection closed/
- || /^\d+: Client using/;
- print 'memcached: ', $_;
- }
- close($mc) || die $!;
- ## use critic
- exit;
- }
- }
- # web server
- my $morbo = Mojo::Server::Morbo->new();
- $morbo->backend->watch(['web/templates/', 'web/templates/layouts/', 'lib/LogBot', 'lib/Logbot/Web']);
- $morbo->run('logbot-web');
- package Make;
- use strict;
- use v5.10;
- use warnings;
- use FindBin qw( $RealBin );
- use lib "$RealBin/lib";
- use LogBot::Util qw( file_time run );
- sub new {
- my ($class) = @_;
- return bless({ make => "$RealBin/dev-make", ts => 0, first => 1 }, $class);
- }
- sub execute {
- my ($self) = @_;
- run($self->{make}, delete $self->{first} ? '-q' : '', delete $self->{all} ? '-B' : '');
- }
- sub updated {
- my ($self) = @_;
- if (file_time($self->{make}) != $self->{ts}) {
- $self->{all} = $self->{ts} != 0;
- $self->{ts} = file_time($self->{make});
- $self->{files} = $self->_prerequisites();
- $self->{files_ts} = {};
- }
- my $updated = 0;
- foreach my $file (@{ $self->{files} }) {
- if (!-e $file) {
- $self->{ts} = 0;
- $updated = 1;
- } else {
- my $ts = file_time($file);
- if ($ts != ($self->{files_ts}->{$file} // 0)) {
- $updated = 1;
- }
- $self->{files_ts}->{$file} = $ts;
- }
- }
- return $updated;
- }
- sub _prerequisites {
- my ($self) = @_;
- open(my $dm, '-|', $self->{make}, 'deps') or die $!;
- chomp(my @files = <$dm>);
- close($dm) or die $!;
- return \@files;
- }
- 1;
|