365 lines
9.9 KiB
Perl
Executable File
365 lines
9.9 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
package President;
|
|
print $0 ."\n";
|
|
print `pwd` . "\n";
|
|
my $self = $$;
|
|
print "I am $self\n";
|
|
use Mojolicious::Lite;
|
|
use Mojo::IOLoop;
|
|
use Mojo::Server::Daemon;
|
|
use Mojo::Server::Morbo;
|
|
use Mojo::Server::Prefork;
|
|
use Mojo::Server::Hypnotoad;
|
|
use Data::Dumper;
|
|
use File::Slurp;
|
|
|
|
use Time::Local;
|
|
use Time::Piece;
|
|
use Time::Duration;
|
|
use Date::Parse;
|
|
use Mojo::JSON qw(decode_json encode_json);
|
|
use Mojo::Reactor::Poll;
|
|
use threads 'exit' => 'threads_only';
|
|
|
|
|
|
my $working_dir = $0;
|
|
my $present_dir = `pwd`;
|
|
|
|
my $dump_dir = &home('~/.president');
|
|
`rm -R $dump_dir/*`;
|
|
my $duty_file = &home('~/.president/on_duty');
|
|
`touch $duty_file`;
|
|
write_file($duty_file, 0);
|
|
my $config_file = read_file('./config.json');
|
|
my $config = decode_json $config_file;
|
|
our $logfile = &home($config->{'logfile'});
|
|
`touch $logfile` if not -e $logfile;
|
|
our $log = Mojo::Log->new(path => $logfile);
|
|
if ($working_dir ne $present_dir) {
|
|
my @folder = split '/', $working_dir;
|
|
pop @folder;
|
|
my $new_dir = join '/', @folder;
|
|
print 'chdir to ' . $new_dir . "\n";
|
|
chdir $new_dir;
|
|
print `pwd` . "\n";
|
|
|
|
}
|
|
#`espeak "president has begun"`;
|
|
|
|
|
|
my $environment = shift;
|
|
|
|
my $cache_dir = &home('~/') . '.president';
|
|
`mkdir -p $cache_dir` unless -e $cache_dir;
|
|
|
|
require './gb.pl';
|
|
$gb::duty_time = &subs::rightNow();
|
|
my $random_number = 0;
|
|
until ($random_number > 1024 && $random_number < 65532) {
|
|
$random_number = int(rand(65532));
|
|
}
|
|
|
|
my $on_duty = 0;
|
|
my $hour = localtime( &subs::rightNow() / 1000 )->strftime( "%H");
|
|
|
|
my $domain = $config->{'domain'} || '127.0.0.1';
|
|
#my $domain = '127.0.0.1';
|
|
|
|
my $device = &device_setter();
|
|
if ($device eq 'mobile') {
|
|
`termux-wake-lock`;
|
|
`sshd`;
|
|
}
|
|
|
|
if ($config->{'open_browser'} eq 'yes') {
|
|
if ($device eq 'mobile') {
|
|
threads->create(sub() {
|
|
`termux-open https://127.0.0.1:$random_number/manager & `
|
|
});
|
|
}
|
|
elsif ($device eq 'computer') {
|
|
threads->create(sub() {
|
|
`export DISPLAY=:0`;
|
|
my $chrome = `chromium https://$domain:$random_number/manager &`;
|
|
});
|
|
}
|
|
}
|
|
if ($environment) {
|
|
if ($environment =~ /^dev/) {
|
|
$config->{'environment'} = 'development';
|
|
}
|
|
elsif ($environment =~ /^pro/) {
|
|
$config->{'environment'} = 'production';
|
|
}
|
|
}
|
|
my $port = $random_number || $config->{'port'};
|
|
my $alarm_port = $port + 2;
|
|
my $ws_port = $port + 1;
|
|
my $dock_port = 3000;
|
|
my $tty_port = $port + 3;
|
|
if ($config->{'environment'} eq 'development') {
|
|
$ws_port = $port;
|
|
}
|
|
|
|
|
|
my @threads;
|
|
sub manager_starter() {
|
|
my $ws_tty_port = $tty_port + 1;
|
|
$ENV{PORT_AHOY} = $random_number;
|
|
$ENV{PORT_MSG} = $ws_port;
|
|
$ENV{PORT_BELL} = $alarm_port;
|
|
$ENV{PORT_BESTOW} = $tty_port;
|
|
$ENV{PORT_DOCK} = $dock_port;
|
|
$ENV{PORT_COMS} = $ws_tty_port;
|
|
$ENV{PORT_ENV} = $config->{'environment'};
|
|
$ENV{cookie_name} = 'president';
|
|
|
|
my $certs = "";
|
|
|
|
if (-e './server/fullchain.pem' && -e './server/privkey.pem') {
|
|
$certs = "?cert=./server/fullchain.pem&key=./server/privkey.pem";
|
|
}
|
|
my $time_count = 0;
|
|
write_file($duty_file, &subs::rightNow());
|
|
|
|
$ENV{'MOJO_MAX_LINE_SIZE'} = "64000";
|
|
|
|
|
|
if ($config->{'environment'} eq 'development') {
|
|
threads->create(sub() {
|
|
print "Starting Locker Server on port " . $dock_port . "\n";
|
|
$ENV{MOJO_LISTEN} = 'https://*:' . $dock_port . $certs;
|
|
$ENV{PURPOSE} = 'locker';
|
|
my $morbo = Mojo::Server::Morbo->new;
|
|
$morbo->backend->watch(['./', './templates']);
|
|
$morbo = $morbo->daemon(Mojo::Server::Daemon->new);
|
|
$morbo->run('./Manager.pl');
|
|
});
|
|
if ($ENV{PORT_AHOY} != $ENV{PORT_MSG}) {
|
|
threads->create(sub() {
|
|
print "Starting WS Server on port " . $ws_port . "\n";
|
|
$ENV{MOJO_LISTEN} = 'https://*:' . $ws_port . $certs;
|
|
$ENV{PURPOSE} = 'websocket';
|
|
my $morbo = Mojo::Server::Morbo->new;
|
|
$morbo->backend->watch(['./', './templates']);
|
|
$morbo = $morbo->daemon(Mojo::Server::Daemon->new);
|
|
$morbo->run('./Manager.pl');
|
|
});
|
|
}
|
|
threads->create(sub() {
|
|
print "Starting Main Server on port " . $port . "\n";
|
|
$ENV{MOJO_LISTEN} = 'https://*:' . $port . $certs;
|
|
$ENV{PURPOSE} = 'main';
|
|
my $morbo = Mojo::Server::Morbo->new;
|
|
$morbo = $morbo->daemon(Mojo::Server::Daemon->new);
|
|
$morbo->backend->watch(['./', './templates']);
|
|
$morbo->run('./Manager.pl');
|
|
});
|
|
}
|
|
elsif ($config->{'environment'} eq 'production') {
|
|
|
|
push @threads, threads->create(sub() {
|
|
print "Starting Pro Locker Server on port " . $dock_port . "\n";
|
|
$ENV{MOJO_LISTEN} = 'https://*:' . $dock_port . $certs;
|
|
$ENV{PURPOSE} = 'locker';
|
|
my $prefork = Mojo::Server::Prefork->new(listen => [ $ENV{MOJO_LISTEN} ]);
|
|
$prefork->load_app('./Manager.pl');
|
|
$prefork->workers(1);
|
|
$prefork->run;
|
|
$log->info('after locker server');
|
|
});
|
|
push @threads, threads->create(sub() {
|
|
print "Starting Pro WS Server on port " . $ws_port . "\n";
|
|
$ENV{MOJO_LISTEN} = 'https://*:' . $ws_port . $certs;
|
|
$ENV{PURPOSE} = 'websocket';
|
|
my $prefork = Mojo::Server::Prefork->new(listen => [ $ENV{MOJO_LISTEN} ]);
|
|
$prefork->load_app('./Manager.pl');
|
|
$prefork->workers(1);
|
|
$prefork->run;
|
|
$log->info('after ws server');
|
|
});
|
|
push @threads, threads->create(sub() {
|
|
print "Starting Pro Main Server on port " . $port . "\n";
|
|
$ENV{MOJO_LISTEN} = 'https://*:' . $port . $certs;
|
|
$ENV{PURPOSE} = 'main';
|
|
my $prefork = Mojo::Server::Prefork->new(listen => [ $ENV{MOJO_LISTEN} ]);
|
|
$prefork->load_app('./Manager.pl');
|
|
$prefork->workers(7);
|
|
$prefork->run;
|
|
$log->info('after main server');
|
|
});
|
|
|
|
}
|
|
else {
|
|
print "I have no environment!\n";
|
|
}
|
|
|
|
if ($device ne 'server') {
|
|
threads->create(sub() {
|
|
$ENV{PURPOSE} = "watch";
|
|
$ENV{MOJO_LISTEN} = 'https://*:' . $alarm_port . $certs;
|
|
if ($config->{'environment'} eq 'development') {
|
|
print "Starting Development Watch Server on $alarm_port\n";
|
|
my $morbo = Mojo::Server::Morbo->new;
|
|
$morbo = $morbo->daemon(Mojo::Server::Daemon->new);
|
|
$morbo->run('./watch.pl');
|
|
}
|
|
elsif ($config->{'environment'} eq 'production') {
|
|
print "Starting Pro Watch Server on port " . $alarm_port . "\n";
|
|
my $prefork = Mojo::Server::Prefork->new(listen => [ $ENV{MOJO_LISTEN} ]);
|
|
$prefork->load_app('./watch.pl');
|
|
$prefork->workers(3);
|
|
$prefork->run;
|
|
}
|
|
});
|
|
|
|
threads->create(sub() {
|
|
$ENV{PURPOSE} = "teletype";
|
|
$ENV{MOJO_LISTEN} = 'https://*:' . $tty_port . $certs;
|
|
if ($config->{'environment'} eq 'development') {
|
|
print "Starting Development TTY Server on $tty_port\n";
|
|
my $morbo = Mojo::Server::Morbo->new;
|
|
$morbo = $morbo->daemon(Mojo::Server::Daemon->new);
|
|
$morbo->run('./teletype.pl');
|
|
}
|
|
elsif ($config->{'environment'} eq 'production') {
|
|
print "Starting Pro TTY Server on port " . $tty_port . "\n";
|
|
my $prefork = Mojo::Server::Prefork->new(listen => [ $ENV{MOJO_LISTEN} ]);
|
|
$prefork->load_app('./teletype.pl');
|
|
$prefork->workers(3);
|
|
$prefork->run;
|
|
}
|
|
});
|
|
threads->create(sub() {
|
|
$ENV{MOJO_LISTEN} = 'http://*:' . $ws_tty_port ;
|
|
if ($config->{'environment'} eq 'development') {
|
|
print "Starting Development TTYws Server on $ws_tty_port\n";
|
|
my $morbo = Mojo::Server::Morbo->new;
|
|
$morbo = $morbo->daemon(Mojo::Server::Daemon->new);
|
|
$morbo->run('./teletype.pl');
|
|
}
|
|
elsif ($config->{'environment'} eq 'production') {
|
|
print "Starting Pro TTYws Server on port " . $ws_tty_port . "\n";
|
|
my $prefork = Mojo::Server::Prefork->new(listen => [ $ENV{MOJO_LISTEN} ]);
|
|
$prefork->load_app('./teletype.pl');
|
|
$prefork->workers(1);
|
|
$prefork->run;
|
|
}
|
|
});
|
|
}
|
|
|
|
|
|
print "Starting Alarm Clock\n";
|
|
$ENV{PURPOSE} = "alarm";
|
|
require './Alarm.pl';
|
|
$gb::alarm_running = 0;
|
|
$gb::budget_running = 0;
|
|
$gb::housekeeping_running = 0;
|
|
$gb::clothesline_running = 0;
|
|
my $id = Mojo::IOLoop->recurring($gb::timeouts->{'alarm'} => sub () {
|
|
if ($gb::alarm_running != 1) {
|
|
$gb::alarm_running = 1;
|
|
$gb::alarm_running = 0;
|
|
}
|
|
&Alarm::alarm_clock() if $config->{'environment'} eq 'production';
|
|
});
|
|
my $big = Mojo::IOLoop->recurring($gb::timeouts->{'budget'} => sub() {
|
|
if ($gb::budget_running == 0) {
|
|
$gb::budget_running = 1;
|
|
$gb::budget_running = &Alarm::budget_watcher();
|
|
}
|
|
});
|
|
if ($device eq 'mobile') {
|
|
my $sms = Mojo::IOLoop->recurring($gb::timeouts->{'sms'} => sub() {
|
|
my $returner = &subs::sms_list_check();
|
|
});
|
|
}
|
|
my $backups = Mojo::IOLoop->recurring($gb::timeouts->{'backups'} => sub() {
|
|
my ($db,$database,$sql) = &subs::database_grabber();
|
|
if ($db) {
|
|
my $c = app->build_controller;
|
|
my $suds = &subs::suds_grabber();
|
|
$c->session('suds' => $suds);
|
|
$c->param('reason' => 'backup');
|
|
if ($suds ne '') {
|
|
&subs::backup_now($c);
|
|
}
|
|
}
|
|
});
|
|
|
|
my $clothes = Mojo::IOLoop->recurring($gb::timeouts->{'clothesline'} => sub() {
|
|
if ($gb::clothesline_running == 0) {
|
|
$gb::clothesline_running = 1;
|
|
&subs::hang_to_dry();
|
|
$gb::clothesline_running = 0;
|
|
}
|
|
});
|
|
my $tasks = Mojo::IOLoop->recurring($gb::timeouts->{'tasks'} => sub() {
|
|
if ($gb::tasks_running == 0) {
|
|
$gb::tasks_running = 1;
|
|
$gb::tasks_running = &Alarm::task_checker();
|
|
}
|
|
});
|
|
my $sync = Mojo::IOLoop->recurring($gb::timeouts->{'remote_machine_sync'} => sub() {
|
|
if ($gb::syncing == 0) {
|
|
$gb::syncing = 1;
|
|
my $gimme;
|
|
|
|
|
|
my $hour = localtime( &subs::rightNow() / 1000 )->strftime( "%H");
|
|
if ($hour eq 4) {
|
|
$gimme = '1d';
|
|
}
|
|
&subs::remote_machine_negotiator({ gimme => $gimme });
|
|
$gb::syncing = 0;
|
|
}
|
|
});
|
|
my $house = Mojo::IOLoop->recurring($gb::timeouts->{'housekeeping'} => sub() {
|
|
if ($gb::housekeeping_running == 0) {
|
|
$gb::housekeeping_running = 1;
|
|
$gb::housekeeping_running = &Alarm::housekeeping();
|
|
}
|
|
});
|
|
|
|
Mojo::IOLoop->start;
|
|
while (1) {
|
|
sleep 1;
|
|
}
|
|
END {
|
|
print "quitting now!\n";
|
|
print "They dead\n";
|
|
# `./scripts/manager_killer.pl`;
|
|
}
|
|
}
|
|
|
|
&manager_starter();
|
|
|
|
sub home() {
|
|
my ($inhabitant) = @_;
|
|
my $com = 'echo $HOME';
|
|
my $cwd = `$com`;
|
|
chomp $cwd;
|
|
$inhabitant =~ s/~/$cwd/;
|
|
return $inhabitant;
|
|
}
|
|
|
|
sub device_setter() {
|
|
my $device = 'computer';
|
|
if ($config->{'device'}) {
|
|
$device = $config->{'device'};
|
|
}
|
|
else {
|
|
my $uname = `uname -a`;
|
|
if ($uname =~ /Android/gi) {
|
|
$device = 'mobile';
|
|
}
|
|
elsif ($uname =~ /Debian/gi) {
|
|
$device = 'server';
|
|
}
|
|
}
|
|
return $device;
|
|
}
|