summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2023-02-03 02:14:02 +0200
committerPaul Buetow <paul@buetow.org>2023-02-03 02:14:02 +0200
commit5015c0abf19de316b9691968ff76c7e3eb78660f (patch)
tree447f835ecfdc42370c866dc6414dd441d47df4c9
parente2bf875c6ea615aaaabedb772c443b93e97746c7 (diff)
initial raku port
-rw-r--r--src/guprecords.raku61
1 files changed, 61 insertions, 0 deletions
diff --git a/src/guprecords.raku b/src/guprecords.raku
new file mode 100644
index 0000000..f0fade2
--- /dev/null
+++ b/src/guprecords.raku
@@ -0,0 +1,61 @@
+#!/usr/bin/env raku
+
+use v6.d;
+
+class Aggregate {
+ has Int $.total-uptime = 0;
+ has Int $.first-boot;
+ has Int $.last-seen;
+
+ method aggregate(Str :$uptime is readonly, Str :$boot-time is readonly) {
+ $!total-uptime += $uptime;
+ $!first-boot = +$boot-time if not defined $!first-boot
+ or $!first-boot > +$boot-time;
+ my Int $last-seen = $uptime + $boot-time;
+ $!last-seen = $last-seen if not defined $!last-seen
+ or $!last-seen < $last-seen;
+ }
+
+ method total-downtime { $.last-seen - $.first-boot - $.total-uptime }
+ method total-time { self.total-downtime + $.total-uptime }
+}
+
+class Aggregator {
+ has %.aggregates = { hostname => {}, os => {}, os-kernel => {} }
+
+ method aggregate(IO::Path :$file is readonly) {
+ my Str $hostname = $file.IO.basename.split('.').first;
+ %!aggregates<hostname>{$hostname} //= Aggregate.new;
+
+ for $file.IO.lines {
+ my Str ($uptime, $boot-time, $os) = .trim.split(':');
+ my Str $os-kernel = $os.split(' ').first;
+
+ %!aggregates<os>{$os} //= Aggregate.new;
+ %!aggregates<os-kernel>{$os-kernel} //= Aggregate.new;
+
+ for %!aggregates.values.flatmap( { .values } ) {
+ .aggregate(:$uptime, :$boot-time);
+ }
+ }
+ }
+}
+
+
+
+sub MAIN(
+ Str $in-dir = './stats',
+) {
+ my Aggregator $aggregator .= new;
+
+ for dir($in-dir, test => { /\.records$/ }) -> $file {
+ $aggregator.aggregate(:$file)
+ }
+
+ for $aggregator.aggregates.kv -> $category, $aggregates {
+ say "Categoty $category";
+ for $aggregates.kv -> $name, $aggregate {
+ say "\t$name $aggregate";
+ }
+ }
+}