LINUX.ORG.RU

Оцените код написанный ИИ

 


0

1

Решил я проверить куда ходят машины из моей LAN и сколько скачивают. Попробовал сначала ntopng, но это монстр которого я быстро удалил. Так как готовых скриптов я не нашёл, а самому писать лень, то попросил ИИ написать скрипт на баше. Потом попросил его переписать на Perl, так как на баше оно тормозит. Получилось не сразу, он допускает грубые ошибки, однако все строки в итоге написаны ИИ.

#!/usr/bin/perl
use strict;
use warnings;
use POSIX 'strftime';
use constant {
    IN_BYTES => 0, IN_PKTS => 1,
    OUT_BYTES => 2, OUT_PKTS => 3
};

die "Usage: $0 <interface>\n" unless @ARGV;
my $if = shift;
my $dir = "/var/log/network_stats";
my $interval = 3600;  # Flush interval in seconds
my $subnet = qx(ip -o -4 addr show $if) =~ m{inet\s+(\d+\.\d+\.\d+)[^/]+} ? "$1." : die "Can't get subnet\n";
$subnet =~ s/\./\\./g;

my %local_ips;
my $last_date = strftime("%Y-%m-%d", localtime);

$SIG{ALRM} = sub { update_stats(); alarm($interval - (time % $interval)) };
$SIG{INT} = $SIG{TERM} = sub { close TCPDUMP; exit 0 };

sub fmt_bytes {
    my $b = shift // 0;
    return $b < 1024 ? sprintf("%-7dB", $b) :
           $b < 1048576 ? sprintf("%-7dKB", $b/1024) :
           sprintf("%-7dMB", $b/1048576);
}

sub update_stats {
    my $date = strftime("%Y-%m-%d", localtime);
    mkdir "$dir/$last_date";
    
    for my $ip (keys %local_ips) {
        open my $fh, '>', "$dir/$last_date/$ip.txt" or next;
        printf $fh "%-16s  %-9s  %-8s  %-9s  %-8s\n%-16s  %s\n", 
            "Remote IP", "In Bytes", "In Pkts", "Out Bytes", "Out Pkts",
            "-" x 16, "-" x 40;
        for my $remote (sort keys %{$local_ips{$ip}}) {
            my $stats = $local_ips{$ip}{$remote};
            printf $fh "%-16s  %9s  %8d  %9s  %8d\n",
                $remote, fmt_bytes($stats->[IN_BYTES] // 0), $stats->[IN_PKTS] // 0,
                fmt_bytes($stats->[OUT_BYTES] // 0), $stats->[OUT_PKTS] // 0;
        }
        close $fh;
    }
    
    %local_ips = (), $last_date = $date if $date ne $last_date;
}

open(TCPDUMP, "exec tcpdump -i $if -nn -l -e tcp or udp 2>/dev/null |") or die $!;
alarm($interval - (time % $interval));

while (<TCPDUMP>) {
    next unless /(\d+\.\d+\.\d+\.\d+)\.?\d*\s*>\s*(\d+\.\d+\.\d+\.\d+)\.?\d*.*?length\s+(\d+)/;
    my ($src, $dst, $len) = ($1, $2, $3);
    
    if ($src =~ /^$subnet/) {
        $local_ips{$src}{$dst}[OUT_BYTES] = ($local_ips{$src}{$dst}[OUT_BYTES] // 0) + $len;
        $local_ips{$src}{$dst}[OUT_PKTS] = ($local_ips{$src}{$dst}[OUT_PKTS] // 0) + 1;
    }
    if ($dst =~ /^$subnet/) {
        $local_ips{$dst}{$src}[IN_BYTES] = ($local_ips{$dst}{$src}[IN_BYTES] // 0) + $len;
        $local_ips{$dst}{$src}[IN_PKTS] = ($local_ips{$dst}{$src}[IN_PKTS] // 0) + 1;
    }
} 

Из-за ошибок быстрее самому написать и чем больше код тем сложнее будет найти ошибку. Хуже всего то, что он в рабочий код периодически добавляет новые ошибки там, где их не было.


Ответ на: комментарий от anonymous

А ничего, что IPv4 адрес - это 32-битное число и нормальный программист использует арифметические операторы для проверки на диапазон? А маска сети вообще, чтобы одним логическим оператором результат получать.

какой ещё нормальный программист, ты название темы читал ?

Nohack
() автор топика