388 lines
12 KiB
Perl
Executable File
388 lines
12 KiB
Perl
Executable File
#!/usr/bin/perl
|
|
|
|
use strict;
|
|
use warnings;
|
|
package watch;
|
|
use Mojolicious::Lite -signatures;
|
|
use File::Slurp;
|
|
use Mojo::JSON qw(decode_json encode_json);
|
|
use SQL::Abstract;
|
|
use Mojo::SQLite;
|
|
use Time::Local;
|
|
use Data::Dumper;
|
|
use URI::Encode qw(uri_encode uri_decode);
|
|
use Mojo::Util qw(secure_compare);
|
|
plugin 'RenderFile';
|
|
require './subroutines.pl';
|
|
require './teletype.pl';
|
|
require './Websocket.pl';
|
|
require './Manager.pl';
|
|
print('Watch pwd: ' . `pwd` . "\n\n");
|
|
my $config_file = read_file('./config.json');
|
|
my $config = decode_json $config_file;
|
|
my $device = &subs::device_setter();
|
|
our $logfile = &subs::home($config->{'logfile'});
|
|
`touch $logfile` if not -e $logfile;
|
|
our $log = Mojo::Log->new(path => $logfile);
|
|
|
|
|
|
sub embeddedAuthorizer($c) {
|
|
my $edt = $c->param('edt');
|
|
my $chip_id = $c->param('chip_id');
|
|
my $wat_set = &subs::setting_grabber({ app => $edt, setting => 'operator_door', device => $device, subsetting => $chip_id });;
|
|
my $watch_settings = eval { return decode_json $wat_set } || {};
|
|
my $auth = $watch_settings->{'__specs'}->{'authorization'};
|
|
my $author = `echo $auth | base64 --decode`;
|
|
my $authorization = &subs::note_decrypter($watch_settings->{'__shutup'}->{'patience'}, $author);
|
|
my $rauth = $c->param('authorization');
|
|
my $rauthorization = `echo $rauth | base64 --decode`;
|
|
my $remote_auth = &subs::note_decrypter($watch_settings->{'__shutup'}->{'patience'}, $rauthorization);
|
|
|
|
if ($remote_auth && $edt && secure_compare $remote_auth, $authorization) {
|
|
$watch_settings->{'__shutup'} = undef;
|
|
return $watch_settings;
|
|
}
|
|
else {
|
|
return undef;
|
|
}
|
|
}
|
|
|
|
get '/watch/time' => sub($c) {
|
|
if (my $watch_settings = &embeddedAuthorizer($c)) {
|
|
my $edt = $c->param('edt');
|
|
my $server_time = time();
|
|
my @t = localtime(time);
|
|
my $is_dst = $t[8];
|
|
my $offset = timegm(@t) - timelocal(@t);
|
|
if ($is_dst == 0 && $edt eq 'watch') {
|
|
$server_time = $server_time + (1000 * 3600);
|
|
}
|
|
my $returner = encode_json { timestamp => $server_time, offset => $offset };
|
|
$c->render(text => $returner);
|
|
}
|
|
else {
|
|
$c->render(template => 'guest_layouts/denial');
|
|
}
|
|
};
|
|
|
|
|
|
get '/watch/asset' => sub($c) {
|
|
if (my $watch_settings = &embeddedAuthorizer($c)) {
|
|
my $filename = $c->param('filename');
|
|
my $paths = Mojo::File->new('public/' . $filename);
|
|
$c->render_file('filepath' => $paths->to_string);
|
|
}
|
|
else {
|
|
$c->render(template => 'guest_layouts/denial');
|
|
}
|
|
};
|
|
|
|
get '/teletype/wifi_update' => sub($c) {
|
|
my $edt = $c->param('edt');
|
|
my $timestamp = $c->param('timestamp');
|
|
my $json_wifi = &subs::setting_grabber({ app => $edt, setting => 'wifi'}) || '{}';
|
|
|
|
my $wifi = decode_json $json_wifi;
|
|
$c->render(text => $json_wifi);
|
|
};
|
|
|
|
get '/embedded/teletype/backup' => sub($c) {
|
|
if (my $watch_settings = &embeddedAuthorizer($c)) {
|
|
|
|
my $b = $c->param('archive');
|
|
|
|
my $paths = Mojo::File->new($b);
|
|
$c->render_file('filepath' => $paths->to_string);
|
|
}
|
|
else {
|
|
$c->render(template => 'guest_layouts/denial');
|
|
}
|
|
};
|
|
|
|
|
|
get '/watch' => sub($c) {
|
|
my $edt = $c->param('edt');
|
|
my $timestamp = $c->param('timestamp');
|
|
my $room = $c->param('room');
|
|
my $chip_id = $c->param('chip_id');
|
|
if (my $watch_settings = &embeddedAuthorizer($c)) {
|
|
my $room_count = $watch_settings->{'__specs'}->{'room_count'};
|
|
my $room_max = $watch_settings->{'__specs'}->{'room_max'};
|
|
foreach my $k ( keys %{$watch_settings} ) {
|
|
$watch_settings->{$k}->{'toggle'} = &subs::setting_grabber({ app => $watch_settings->{$k}->{'app'}, setting => 'toggle' }) eq 'on' ? 1 : 0;
|
|
}
|
|
$watch_settings = &subs::embedded_internal_jobs($watch_settings);
|
|
|
|
$c->render('json' => $watch_settings);
|
|
&Websocket::send('tab', { console => 'nowMeSuccess(\'' . $edt . '\',\'' . $chip_id . '\')', browser_tab_id => $c->param('browser_tab_id') });
|
|
}
|
|
else {
|
|
$c->render('text' => "No!");
|
|
}
|
|
};
|
|
|
|
get '/watch/telephone_msg' => sub($c) {
|
|
my $timestamp = &subs::rightNow() || $c->param('timestamp');
|
|
my $server_time = &subs::rightNow();
|
|
my $message = $c->param('msg');
|
|
my $app = $c->param('app');
|
|
my $app = &subs::unformat_name($c->param('app'));
|
|
my ($db,$database) = &subs::database_grabber();
|
|
my $insert = &subs::db_insert('appointments', {
|
|
app => $app,
|
|
server_time => $server_time,
|
|
timestamp => $timestamp,
|
|
type => 'msg',
|
|
data => &subs::format_name($message),
|
|
uuid => &subs::random_string_creator(40),
|
|
});
|
|
my $msg = { app => $app, uuid => &subs::random_string_creator(6), console => 'appointmentGrabber("' . $app . '",' . $timestamp . ')' };
|
|
&Websocket::send('server', $msg );
|
|
|
|
$c->render('json' => { 'msg' => $message });
|
|
};
|
|
|
|
get '/watch/button' => sub($c) {
|
|
my $edt = $c->param('edt');
|
|
my $chip_id = $c->param('chip_id');
|
|
my $remote_address = $c->tx->remote_address;
|
|
if (my $watch_settings = &embeddedAuthorizer($c)) {
|
|
my $button = $c->param('button');
|
|
|
|
my $timestamp = $c->param('timestamp') * 1000 || &subs::rightNow();
|
|
my $room = $c->param('room');
|
|
my $toggle = $c->param('toggle');
|
|
if ($toggle == 1) {
|
|
$toggle = 'off'
|
|
}
|
|
else {
|
|
$toggle = 'on';
|
|
}
|
|
|
|
|
|
|
|
&subs::setting_setter({ app => $b->{'app'}, setting => 'toggle', value => $toggle });
|
|
|
|
my $returner = &subs::edt_button_presser({
|
|
timestamp => $timestamp,
|
|
room => $room,
|
|
watch_settings => $watch_settings,
|
|
button => $button,
|
|
edt => $edt,
|
|
chip_id => $chip_id,
|
|
remote_address => $remote_address,
|
|
toggle => $toggle
|
|
});
|
|
$c->render('json' => $returner);
|
|
}
|
|
else { $c->render("text" => "No!" ); }
|
|
};
|
|
|
|
get '/watch/switch' => sub($c) {
|
|
my $edt = $c->param('edt');
|
|
my $chip_id = $c->param('chip_id');
|
|
my $remote_address = $c->tx->remote_address;
|
|
if (my $watch_settings = &embeddedAuthorizer($c)) {
|
|
my $button = $c->param('switch');
|
|
my $state = $c->param('state');
|
|
my $toggle = $c->param('toggle');
|
|
my $timestamp = $c->param('timestamp') * 1000 || &subs::rightNow();
|
|
my $room = $c->param('room');
|
|
if ($state eq 'on') {
|
|
$state = 'off'
|
|
}
|
|
else {
|
|
$state = 'on';
|
|
}
|
|
my $syl_count = 10;
|
|
$syl_count = 1 unless $edt eq 'microcontroller';
|
|
my $b = $watch_settings->{&subs::shorthand_name('switch', $syl_count) . $button} || {};
|
|
&subs::setting_setter({ app => $b->{'app'}, setting => 'toggle', value => $state });
|
|
my $data = {
|
|
timestamp => $timestamp,
|
|
room => $room,
|
|
watch_settings => $watch_settings,
|
|
button => $button,
|
|
component => 'switch',
|
|
edt => $edt,
|
|
chip_id => $chip_id,
|
|
remote_address => $remote_address
|
|
};
|
|
$data->{'switch'} = $button;
|
|
if ($data->{'toggle'} == 1) {
|
|
$data->{'state'} = 'on';
|
|
}
|
|
else {
|
|
$data->{'state'} = 'off';
|
|
}
|
|
my $returner = &subs::edt_button_presser($data);
|
|
$c->render(json => $returner);
|
|
}
|
|
else {
|
|
$c->render('text' => 'No!');
|
|
}
|
|
};
|
|
|
|
get '/watch/measure' => sub($c) {
|
|
my $remote_address = $c->tx->remote_address;
|
|
if (my $watch_settings = &embeddedAuthorizer($c)) {
|
|
$c->render('text' => 'ok');
|
|
|
|
my $component = $c->param('component');
|
|
my $chip_id = $c->param('chip_id');
|
|
my $measure = $c->param('measure');
|
|
my $button = $c->param('button');
|
|
my $edt = $c->param('edt');
|
|
my $room = $c->param('room');
|
|
my $timestamp = &subs::rightNow();
|
|
|
|
|
|
my $emin = $c->param('min');
|
|
my $emax = $c->param('max');
|
|
my $syl_count = 10;
|
|
$syl_count = 1 unless $edt eq 'microcontroller';
|
|
my $b = $watch_settings->{&subs::shorthand_name($component, $syl_count) . $button} || {};
|
|
|
|
my $app = $b->{'app'};
|
|
my $settings = &subs::settings_grabber({ app => $app, settings => ['app_measures'] });
|
|
my $app_measures = eval { return decode_json $settings->{'app_measures'} } || [];
|
|
if (exists $app_measures->{$b->{'measure'}}->{'max'} && exists $app_measures->{$b->{'measure'}}->{'min'}) {
|
|
my $etotal = $emax - $emin;
|
|
|
|
my $estate = $measure - $emin;
|
|
my $eratio = $estate / $etotal;
|
|
my $total = $app_measures->{$b->{'measure'}}->{'max'} - $app_measures->{$b->{'measure'}}->{'min'};
|
|
my $state_total = $eratio * $total;
|
|
|
|
$measure = sprintf("%.3f", $state_total + $app_measures->{$b->{'measure'}}->{'min'});
|
|
my $state = $state_total / $total * 100;
|
|
}
|
|
|
|
my $returner = &subs::edt_button_presser({
|
|
timestamp => $timestamp,
|
|
room => $room,
|
|
watch_settings => $watch_settings,
|
|
button => $button,
|
|
edt => $edt,
|
|
chip_id => $chip_id,
|
|
measure => $measure,
|
|
component => $component,
|
|
remote_address => $remote_address
|
|
});
|
|
}
|
|
|
|
else { $c->render("text" => "No!" ); }
|
|
};
|
|
|
|
any '/watch/chat_received' => sub ($c) {
|
|
my $message = $c->param('message');
|
|
|
|
my $username = $c->param('username');
|
|
my $timestamp = $c->param('timestamp');
|
|
my $contact = $c->param('contact');
|
|
my $community = $c->param('community');
|
|
my $club = $c->param('club');
|
|
my $team = $c->param('team');
|
|
my $project = $c->param('project');
|
|
my $account = $c->param('account');
|
|
my $person = $c->param('person');
|
|
my $authorization = $c->param('authorization');
|
|
if (my $watch_settings = &embeddedAuthorizer($c)) {
|
|
my ($db,$database,$sql) = &subs::database_grabber();
|
|
my $ticket = &subs::db_query('select uuid from tickets where name = ?', $contact);
|
|
my $contact_uuid = $ticket->hashes->[0]->{'uuid'};
|
|
&subs::db_insert('mailbox', {
|
|
uuid => &subs::random_string_creator(25),
|
|
timestamp => &subs::rightNow(),
|
|
server_time => &subs::rightNow(),
|
|
body => $message,
|
|
manager_file => $username,
|
|
status => 'public',
|
|
project => $project || $gb::social_constructs->{'projects'}->{'def'},
|
|
account => $account || $gb::social_constructs->{'accounts'}->{'def'},
|
|
community => $community || $gb::social_constructs->{'communities'}->{'def'},
|
|
club => $club || $gb::social_constructs->{'clubs'}->{'def'},
|
|
team => $team || $gb::social_constructs->{'teams'}->{'def'},
|
|
person => $person || $gb::social_constructs->{'people'}->{'def'},
|
|
contact => $contact_uuid || $watch_settings->{'__specs'}->{'computer'}
|
|
});
|
|
$c->render(json => { returner => $username . ": " . $message });
|
|
}
|
|
else {
|
|
$c->render(json => { returner => "P: NO!!!!" });
|
|
}
|
|
};
|
|
|
|
|
|
get '/teletype/pen' => sub($c) {
|
|
my $returner = {};
|
|
if (my $watch_settings = &embeddedAuthorizer($c)) {
|
|
|
|
&subs::db_insert('mailbox', {
|
|
uuid => &subs::random_string_creator(25),
|
|
timestamp => &subs::rightNow(),
|
|
server_time => &subs::rightNow(),
|
|
body => $c->param('message'),
|
|
manager_file => $c->param('username'),
|
|
status => 'public',
|
|
contact => 'pen'
|
|
});
|
|
my $return_msg = &subs::pen_message({ 'msg' => $c->param('message') });
|
|
$returner = { message => $return_msg };
|
|
}
|
|
else {
|
|
$returner->{'message'} = "i don't know you";
|
|
}
|
|
$c->render(json => $returner);
|
|
};
|
|
|
|
get '/watch/chat_grabber' => sub($c) {
|
|
my $secret = $c->param('s');
|
|
my $timestamp = $c->param('ts');
|
|
my $uuid = $c->param('uuid');
|
|
my $chip_id = $c->param('chip_id');
|
|
my $wat_set = &subs::setting_grabber({ app => 'watch', setting => 'operator_door', subsetting => $chip_id });;
|
|
my $op_d = eval { return decode_json $wat_set } || {};
|
|
my $s = `(echo $secret) | base64 --decode`;
|
|
if (my $watch_settings = &embeddedAuthorizer($c)) {
|
|
my $pass = &subs::note_decrypter($op_d->{'__shutup'}->{'patience'},$s);
|
|
my ($db,$database,$sql) = &subs::database_grabber();
|
|
my $q = &subs::db_query('select * from mailbox where uuid = ?', $uuid);
|
|
my $mail = $q->hashes->[0];
|
|
my $mb = &subs::note_decrypter($pass, $mail->{'body'}, $mail->{'timestamp'});
|
|
chomp $mb;
|
|
$mail->{'body'} = $mb;
|
|
$c->render(json => $mail);
|
|
}
|
|
else {
|
|
$c->render('text' => 'fuck you');
|
|
}
|
|
};
|
|
|
|
get '/watch/alive' => sub($c) {
|
|
$c->render(text => "alive");
|
|
};
|
|
|
|
get '/watch/ota_status' => sub($c) {
|
|
if (my $watch_settings = &embeddedAuthorizer($c)) {
|
|
my $file = './jp/alarmclock/build/rp2040.rp2040.rpipico2w/alarmclock.ino.bin';
|
|
my $total_size = -s $file;
|
|
|
|
my $percentage = sprintf("%.2f", $c->param('current_size') / $total_size * 100 ) . '%';
|
|
$c->render(text => $total_size);
|
|
&Websocket::send('tab', { console => '$(\'#embedded_ota_uploader_percentage\').text(\'' . &subs::format_name($c->param('status')) . ' ' . $percentage . '\').show()', browser_tab_id => $c->param('browser_tab_id') });
|
|
}
|
|
else {
|
|
$c->render(text => 'no');
|
|
}
|
|
};
|
|
|
|
if ($ENV{PURPOSE} eq "watch") {
|
|
app->secrets($gb::secret_maker);
|
|
app->sessions->cookie_name($ENV{'cookie_name'});
|
|
app->start;
|
|
}
|
|
else {
|
|
1;
|
|
}
|