#!/usr/bin/perl

use 5.42.0;
use utf8;

die "uptime cmd not found" unless (length (`which uptime`) > 6);

# use 5.043.6;    # dev version
                  # Sencillamente, llega un momento que no lo entiendo
                  # y me mareo viendo en el regex que no da error

# use utf8;       # esto se necesita para todo, incluído comentarios
                # posible uso de crontab,
		# pero, mejor no considerar la cpu
		# al arranque

my $DEBUG = 1;

# Main purpose

# Aquí trato de hacer un wrapper de 'uptime'
# que tome atividad de cpu media al minuto
# (eso lo da el comando)
# A continuación, grabo cada 5*60 minutos su
# media en fichero

# En uptime es la cifra de en medio, hay comas a barullo

# Cada vez que se arranque el fichero, se lee
# el valor anterior
# De esta manera se tiene una media móvil,
# «de amplitud variable»
# No pasa nada, porque lo que se va a tener
# es una media degradable con el tiempo,
# como las de la bolsa

my $pastcpu;
open my $fhi, '<', "/home/jesus/src/sensor/5mincpuload.log" or warn $!;
$pastcpu = <$fhi>;      # esto lee una línea
close $fhi;

chomp $pastcpu;

$pastcpu //= 1.00;

my $meancpu = $pastcpu;
my $count = 0;
my $flag = 0;
my $cmd;
my @tmp;
my $flagant = 0;
my ($s, $s2);
say "Listado de media de actividad 5min con memoria alisada 10min:";
while (1){
    sleep 5*60;          # 5min
    $count++;
    
    # añadir más tarde que existe el cmd
    $cmd = `uptime`;
    @tmp = split /:\s/, $cmd; 
    $s = $tmp[-1];  
    $s =~ m/\, (\d+[\.|\,]\d+)\, /;   # fase 1: tomar la cifra de en medio 5min
    
    $s2 = $1;
    $flag++ if ($DEBUG && $s2);
    if ($flag > $flagant && $DEBUG && defined $s2 && $flag > 0) { 
	print " OK";
	$flagant = $flag;
    }else{
	die "Error: can't get the capture";
    }
    
    if ( $s2 =~ s/(\d)\,(\d)/$1.$2/ ) { 
	;                                     # fase 2: convertir a número
	print " and is a number" if ($DEBUG && (0+$s2 eq $s2));
    }else{
	die "Error: can't numerize";
    }
    
    $meancpu = ($s2 > 0) ? ($s2 /2 + $meancpu /2) : $meancpu/2 ;     # si es 1/10, ya se probó, y el factor de reducción ES BAJO
   
    print "\r$count)    mean $meancpu";    
    
    if ($count % 12 == 1){           # una hora son 12 veces 5min
	open my $fho, '>', "/home/jesus/src/sensor/5mincpuload.log" or die $!;
	print $fho $meancpu;
	close $fho;
	say "   saved";
    }else{ say ""; }
}

exit 3;

