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
() автор топика
Ответ на: комментарий от Nohack

а ты думал, что вот так вот можно выходить в интернет, пукать, и тебе ничего не будет?

gagarin0
()
Ответ на: комментарий от FishHook

Мне Perl не нравится, но вот для таких задач, где нужно минимум кода, памяти и тормозов, он идеален.

Nohack
() автор топика
Ответ на: комментарий от anonymous

я тоже удивился, ждал более яркую реакцию, наверно английский тут мало кто понимать

Nohack
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария