Files
scripts/sshcron.1.pl
2025-06-03 23:03:08 +02:00

159 lines
4.5 KiB
Perl

# Automatically enables "strict", "warnings", "utf8" and Perl 5.10 features
use Mojolicious::Lite;
use Net::SSH::Perl;
# use Data::Printer;
use Try::Tiny;
use File::Slurp qw(:std);
use JSON;
my $config = plugin 'Config';
# Datei einlesen
my $fi = read_file( 'sshcron.json', err_mode => "quiet");
my $daten;
if ( $fi ) {
$daten = decode_json($fi);
}
# Route with placeholder
get '/:new/:server' => {new => '', server => ''} => sub {
my $c = shift;
my $new = $c->stash('new');
my $server = $c->stash('server');
my @servers = [];
my @neline;
my %se;
if ( $new =~ /upd|del/ && $server ne "" ) {
for my $old ( @{$daten} ) {
if ( $server eq 'alle' ) {
if ( !$se{$old->{server}} ) {
$se{$old->{server}} = 1;
push @servers, $old->{server};
@neline = [];
}
} elsif ( $old->{server} ne $server ) {
push @neline, $old;
}
}
if ( $new eq "upd" ) {
if ( $server ne "alle" ) {
@servers = [];
push @servers, $server;
}
for my $ser ( @servers ) {
try {
my $ssh = Net::SSH::Perl->new($ser);
$ssh->login('root', '8-Tung');
my($stdout, $stderr, $exit) = $ssh->cmd("grep --exclude-dir={.placeholder} -rnw -v '#' '/etc/cron.d'");
next if ( defined $stderr );
for my $text ( split '\n', $stdout ) {
my @s = split ':', $text;
if ( scalar(@s) == 2 || $s[2] =~ /$config->{ignore}/ ) {
} else {
my @file = split( '/', $s[0]);
my @j = split( ' ', $s[2]);
my $pro = "";
if (scalar(@j) > 6) {
for my $p ( 6 .. scalar(@j)-1 ) {
if ($p == scalar(@j)-1 ) {
$pro .= "$j[$p]";
} else {
$pro .= "$j[$p] ";
}
}
if (scalar(@s) > 3 ) {
for my $p ( 3 .. scalar(@s)-1 ) {
$pro .= ":$s[$p]";
}
}
}
push @neline, { datei => $file[scalar(@file)-1], user => $j[5], min => $j[0], std => $j[1], day => $j[2], month => $j[3], monthday => $j[4], programm => $pro, server => $ser };
}
}
} catch {
push @neline, { datei => '', user =>'', min => '', std => '', day => '', month => '', monthday => '', programm => 'error', server => $ser };
};
}
}
write_file('sshcron.json', encode_json(\@neline) );
$daten = \@neline;
}
# p $daten;
$c->render(template => 'foo/bar', da => $daten );
};
# Start the Mojolicious command system
app->start;
__DATA__
@@ foo/bar.html.ep
% layout 'mylayout';
<div class="container-fluid">
<table id="tbl" class="table table-striped table-bordered table-sm nowrap" style="width:100%">
<thead>
<tr>
<th>server</th><th>user</th><th>day</th><th>min</th><th>month</th><th>monthday</th><th>std</th><th>datei</th><th>programm</th>
</tr>
</thead>
<tbody>
% use Data::Dumper;
% for my $d ( @{$da} ) {
% print Dumper( $d);
<tr>
<td><%= $d->{server} %></td>
<td><%= $d->{user} %></td>
<td><%= $d->{day} %></td>
<td><%= $d->{min} %></td>
<td><%= $d->{month} %></td>
<td><%= $d->{monthday} %></td>
<td><%= $d->{std} %></td>
<td><%= $d->{datei} %></td>
<td><%= $d->{programm} %></td>
</tr>
%}
</tbody>
</table>
</div>
@@ layouts/mylayout.html.ep
<!DOCTYPE html>
<html>
<head>
<title>MyApp</title>
%= stylesheet 'http://htlib/htlib/bootstrap/4.3.1/css/bootstrap.min.css'
%= stylesheet 'http://htlib/htlib/jquery-datatables/1.10.19/css/dataTables.bootstrap4.min.css'
%= stylesheet 'http://htlib/htlib/jquery-datatables/extensions/Scroller/1.5.0/css/scroller.bootstrap4.min.css'
<!-- Jquery / Datatables -->
%= javascript 'http://htlib/htlib/jquery/jquery-3.3.1.js'
%= javascript 'http://htlib/htlib/bootstrap/4.3.1/js/bootstrap.bundle.min.js'
%= javascript 'http://htlib/htlib/jquery-datatables/1.10.19/js/jquery.dataTables.min.js'
%= javascript 'http://htlib/htlib/jquery-datatables/extensions/Scroller/1.5.0/js/dataTables.scroller.min.js'
</head>
<body>
<%= content %>
<script>
$(document).ready(function() {
$('#tbl').DataTable({
scrollY: '87vh',
deferRender: true,
scroller: true,
});
});
</script>
</body>
</html>