Модераторы: ginnie, korob2001

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вычисления по методу ipcalc 
:(
    Опции темы
ISQman
Дата 29.7.2008, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



имеем список ip c масками:
Код

83.143.234.0/24
83.143.235.0/24
83.143.236.0/24
83.143.237.0/24
83.143.238.0/24
83.143.239.0/24
85.238.96.0/19
91.90.8.0/24
91.90.9.0/24
91.90.10.0/24
91.90.11.0/24
91.90.12.0/24
91.90.13.0/24
91.90.14.0/24
91.90.15.0/24
91.102.176.0/21
91.192.128.0/22
91.196.92.0/22
91.197.16.0/22
91.202.244.0/22
193.16.247.0/24
193.22.84.0/24
193.200.212.0/24
193.227.97.0/24
194.44.30.0/24
194.54.88.0/22
194.110.219.0/24
195.22.132.0/23
195.66.192.0/19
195.114.128.0/19
195.114.128.0/24
195.114.129.0/24
195.114.130.0/24
195.114.131.0/24
195.114.132.0/24
195.114.133.0/24
195.114.135.0/24

нужно по принципу ipcalc проверить принадлежность данных ip к их подсети, и если да, то удалить данный ип.
Вопрос заключается в реализации, т.к. не разобрался в коде ipcalc
заранее благодарю за ответы.

PM MAIL ICQ   Вверх
ginnie
Дата 29.7.2008, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Уважаемый ISQman, я, наверное, что-то не понимаю: как IP-адрес может не принадлежать подсети в Вашем условии, ведь подсеть определяется на основе этого IP-адреса?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ISQman
Дата 29.7.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



в данном случае приходится сильно  ухищряться, т.к. это взято из анонса, который делали ногами, как видно выше есть ипы такого плана:
195.114.128.0/19
195.114.128.0/24
в данном случае маска присваивается верхнему значению. так же и для всех его подсеток. путём листа и ручки а также для ускорения калькулятора в руках это вычислить не сложно, и будет видно, что:

195.114.128.0/19
195.114.128.0/24
195.114.129.0/24
195.114.130.0/24
195.114.131.0/24
195.114.132.0/24
195.114.133.0/24
195.114.135.0/24
будут  все иметь маску /19 и естественно я их удалю руками (ipcalc вычисляет чётко)про действия могу сказать так: достаточно присвоить всем нижним подсеткам маску /19 и нетворк будет равен верхнему. При выполнении данного условия остаться должень только тот ип, который и является нетворком (195.114.128.0/19), ну и так по всему списку  smile 
(ЗЫ описал тему как сам понял, может чтото упустил)

Это сообщение отредактировал(а) ISQman - 29.7.2008, 11:58
PM MAIL ICQ   Вверх
amg
Дата 29.7.2008, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Удалить все подсетки, целиком входящие в другие подсетки?
Код
use Net::IP;

my @IP = qw(195.114.128.0/19 195.114.128.0/24 195.114.129.0/24 195.114.130.0/24 
195.114.131.0/24 195.114.132.0/24 195.114.133.0/24 195.114.135.0/24 );

my @ip = map {new Net::IP($_)} @IP;

foreach my $ip (@ip) {
    @ip = grep {$ip->overlaps($_)!=$IP_B_IN_A_OVERLAP} @ip;
}

@IP = map {$_->print()} @ip;

print "@IP\n";


PM MAIL   Вверх
ginnie
Дата 29.7.2008, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Уважаемый amg, менять массив внутри цикла по нему разве хороший стиль?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
amg
Дата 29.7.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Цитата(ginnie @  29.7.2008,  14:38 Найти цитируемый пост)
Уважаемый amg, менять массив внутри цикла по нему разве хороший стиль?
Это отвратительно. Но сначала стало любопытно, как перл такую пакость разрулит, а потом, когда оказалось, что работает, просто оставил как есть.

PM MAIL   Вверх
ISQman
Дата 29.7.2008, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



менять массивы и тд тут не выход из положения..
отбор осуществляться должен путём подобного сравнения

Address:   195.114.128.0        11000011.01110010.100 00000.00000000
Netmask:   255.255.224.0 = 19   11111111.11111111.111 00000.00000000
Wildcard:  0.0.31.255           00000000.00000000.000 11111.11111111
=>
Network:   195.114.128.0/19     11000011.01110010.100 00000.00000000

Address:   195.114.129.0        11000011.01110010.1000 0001.00000000
Netmask:   255.255.240.0 = 20   11111111.11111111.1111 0000.00000000
Wildcard:  0.0.15.255           00000000.00000000.0000 1111.11111111
=>
Network:   195.114.128.0/20     11000011.01110010.1000 0000.00000000

Address:   195.114.129.0        11000011.01110010.100 00001.00000000
Netmask:   255.255.224.0 = 19   11111111.11111111.111 00000.00000000
Wildcard:  0.0.31.255           00000000.00000000.000 11111.11111111
=>
Network:   195.114.128.0/19     11000011.01110010.100 00000.00000000

в данном случае нетворком является один и тот же адрес.
отсюда вопрос как данное сравнение организовать на perl? с учетом того, что при совпадении нетворков нижнее значение должно удаляться, также не факт что в списке будут присутствовать маски /20 и /19... 
PM MAIL ICQ   Вверх
ginnie
Дата 29.7.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Уважаемый ISQman, напишите, что неверно делает вариант, предложенный amg?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ISQman
Дата 29.7.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



я так понял что в вышеизложенном  коде фрагмент 
Код

my @IP = qw(195.114.128.0/19 195.114.128.0/24 195.114.129.0/24 195.114.130.0/24 
195.114.131.0/24 195.114.132.0/24 195.114.133.0/24 195.114.135.0/24 );

яавляется не совсем удобным т.к. считывание значений будут из файла или из массива и по истичению какогото времени эти значения будут меняться :( если я чтото пишу не так, будьте так добры поправьте...

Это сообщение отредактировал(а) ISQman - 29.7.2008, 15:54
PM MAIL ICQ   Вверх
ISQman
Дата 29.7.2008, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



попробовал использовать данный 
amg, скрипт, он либо выводи 1 ип, либо не фильрует вообще не пойму по какой причине...
PM MAIL ICQ   Вверх
ginnie
Дата 29.7.2008, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Уважаемый ISQman, скрипт в студию.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 29.7.2008, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



меняться ничего не должно!

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

вот еще скрипт я где-то давно нашел, работает на BSD!

Код

#!/bin/sh

wget -q -O - http://noc.ix.net.ua/ua-list.txt | sed 's/\.0$/.0\/24/g' > /etc/ua-list.txt

for SUBNET in `ipfw table 0 list | cut -f 1 -d " " | diff /etc/ua-list.txt - | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep ">" | cut -f 2 -d " " `; do
ipfw -q table 0 delete $SUBNET
done

for SUBNET in `ipfw table 0 list | cut -f 1 -d " " | diff /etc/ua-list.txt - | grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" | grep "<" | cut -f 2 -d " " `; do
ipfw -q table 0 add $SUBNET
done


Это сообщение отредактировал(а) gcc - 29.7.2008, 18:38
PM WWW ICQ Skype GTalk Jabber   Вверх
ginnie
Дата 29.7.2008, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



Уважаемый gcc, не подскажите, как может быть левой маска, указанная в виде /xx?


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
gcc
Дата 29.7.2008, 18:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Агент алкомафии
****


Профиль
Группа: Участник
Сообщений: 2691
Регистрация: 25.4.2008
Где: %&й

Репутация: нет
Всего: 17



Уважаемый ginnie, ну эти маски беруться наверное с маршрутизаторов...?

и в списке сетей офицальном на моем провейдере админы вывесили подсети с неправильными масками smile или вообще без масок... то есть трафик расчитатьь нельзя, некоторые сети были с бесплтаными трафиком

или я не понял суть вопроса автора топика? smile

Это сообщение отредактировал(а) gcc - 29.7.2008, 18:49
PM WWW ICQ Skype GTalk Jabber   Вверх
amg
Дата 30.7.2008, 07:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Цитата(ISQman @  29.7.2008,  15:51 Найти цитируемый пост)
фрагмент ... является не совсем удобным т.к. считывание значений будут из файла или из массива
@IP = qw(...); и есть массив.
open F, 'file'; @IP = <F>; -- получить его из файла
Цитата(ISQman @  29.7.2008,  15:08 Найти цитируемый пост)
менять массивы и тд тут не выход из положения..
Я в растерянности... Если менять данные (массивы) нельзя (не выход из положения), то и делать ничего не нужно?
Цитата(ISQman @  29.7.2008,  18:09 Найти цитируемый пост)
попробовал использовать данный amg, скрипт, он либо выводи 1 ип, либо не фильрует вообще не пойму по какой причине...
Должно быть по другому? Как именно? Совсем перестал понимать, что нужно...
Покажите, пожалуйста, что должно получиться, например, из данных, приведенных в 1-м посте.

PM MAIL   Вверх
ISQman
Дата 30.7.2008, 09:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



Цитата

админы вывесили подсети с неправильными масками smile или вообще без масок... то есть трафик расчитатьь нельзя, некоторые сети были с бесплтаными трафиком

вот от этой криворукости и мы страдаем, в общем вот код, где небыло маски вообще я добавлял /24
Код

#!/usr/bin/perl

use Net::Telnet; 
use Net::IP;

$pass="1";
$comand="show ip bgp";
$port="2605";
$server="127.0.0.1";
$file="./ip.log";
$err_1="Ошибка открытия файла";
$err_2="Ошибка записи файла";

my $connect = new Net::Telnet (Timeout  => 5,
                         Prompt   => '/[\>\#] $/',
                         Port     => $port);
$connect->open($server);
$connect->cmd("$pass");
@broodlist=$connect->cmd("$comand");

@list=map{(split)[1]}@broodlist;
@list=grep{!/^194\.107\.117/}@list;
@list=grep{!/^0\.0\.0/}@list;
@list=map{"$_\/24"}@list;
@list=map{/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}/g}@list;
@list=map{"$_\n"}@list; 

open (BROOD,">brood.log") ||die "$err_1";
if (!print BROOD @broodlist){
    warn "$err_2";
}
close (BROOD);

open (IP,">$file") || die "$err_1";
if (!print  IP @list){
    warn "$err_2";
}
close (IP);

print @list,"\n";
exit;



чуть не забыл работаю под фряхой 
имхо винда сакс

Это сообщение отредактировал(а) ISQman - 30.7.2008, 09:41
PM MAIL ICQ   Вверх
ISQman
Дата 31.7.2008, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



наверное всётаки никто не сталкивался с таким гемором...
тогда такой вопорс, как ещё проверить вхождения подсеток?
PM MAIL ICQ   Вверх
ginnie
Дата 31.7.2008, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 6
Всего: 49



ISQman, если честно, я из Ваших пояснений так и не понял задачу, которую надо решить. Про вхождение подсеток amg, решение уже привел. Вам, вероятно, надо что другое, но вот что -  не понятно!
Присоединяюсь к просьбе amg
Цитата

Покажите, пожалуйста, что должно получиться, например, из данных, приведенных в 1-м посте.


Это сообщение отредактировал(а) ginnie - 31.7.2008, 17:46


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
ISQman
Дата 31.7.2008, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



глубоко извиняюсь покурил мануальчики, и всё стало на свои места
amg и ginnie, Вы просто чудо а не люди))) СЫПЫСЫ вам от чистого сердца smile  smile 
великие шаманы программирования  smile  ;)
PM MAIL ICQ   Вверх
ISQman
Дата 20.8.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



Цитата(amg @ 29.7.2008,  14:13)
Удалить все подсетки, целиком входящие в другие подсетки?
Код
use Net::IP;

my @IP = qw(195.114.128.0/19 195.114.128.0/24 195.114.129.0/24 195.114.130.0/24 
195.114.131.0/24 195.114.132.0/24 195.114.133.0/24 195.114.135.0/24 );

my @ip = map {new Net::IP($_)} @IP;

foreach my $ip (@ip) {
    @ip = grep {$ip->overlaps($_)!=$IP_B_IN_A_OVERLAP} @ip;
}

@IP = map {$_->print()} @ip;

print "@IP\n";

Всё чудесно, только вот вопрос каким таким чудесным образом вывод получается такого вида?
212.40.60/24
213.155.0/19
213.231.0/18

т.е ип теперь состоит из 3-х "частей" а не из 4-х

Это сообщение отредактировал(а) ISQman - 20.8.2008, 12:07
PM MAIL ICQ   Вверх
ISQman
Дата 27.10.2009, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



а есть ли альтернатива данному способу?
т.к. при переборе фул вью на более чем 2к подсетей роутер уходит в раздумие минут на 10...
PM MAIL ICQ   Вверх
amg
Дата 28.10.2009, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 9
Всего: 50



Если под "данным способом" Вы имеете в виду тот код, который я приводил где-то в начале, то первое, что приходит в голову -- это переписать тот дурацкий цикл, который совершенно справедливо критиковал ginnie. Возможно, будет ускорение, м.б. даже в разы.

Дальнейшее ускорение -- это уже нужно менять алгоритм и/или используемый модуль.

Возможно, сначала отсортировать список и очевидные случаи удалить сразу ...
И кстати, на отсортированном списке при условии "правильного" цикла (который не тупо перебирает все подряд, а делает выход, как только обнаруживает совпадение) даже без удаления "в ручную" очевидных случаев программа будет работать быстрее (возможно, сильно быстрее).

Это сообщение отредактировал(а) amg - 28.10.2009, 09:14
PM MAIL   Вверх
ISQman
Дата 28.10.2009, 12:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 22.7.2008

Репутация: нет
Всего: нет



цикл я переписал сразу, а счас просто ищу вот тот самый алгоритм/модуль, который будет работать быстрее...
идея на данный момент есть, например, ключами для начала использовать глые ипы без маски, а значения будут масками, таким образом я хоть смогу отсеять часть дубликатов (параллельно проверять маски и оставльять наименшую)...
кстати есть ещё идея и вот как раз с ней я никак не могу подружиться в плане кода:
можно подсети сравнить побитово (благодаря маске), но как правильна побитово разложить увы я так и не понял, да и как сравнить. 
допустим есть 172.16.0.0/15
минимальный ип будет 172.16.0.1
бродкаст - 172.17.255.255
в данном случае все подсети аля 172.17.0.0/24 172.16.0.0/24 должны отсеятся (если таковы имеются в списке) и т.д.
пока реализовую первую задумку
вот что наковырял:

Код

$n = 0;
$i = @list_3;
while ($i>$n){
    if (exists($list3{$p1[$n]}) && $list3{$p1[$n]} >= $p2[$n]){
        print $list3{$p1[$n]};
        delete($list3{$p1[$n]});
    }else{
        $list3{$p1[$n]}=$p2[$n];
    }
$n++;
}

ключами являются ипы, значения - маски
втолько остался вопрос стоит ли сливать в подсетки...

Это сообщение отредактировал(а) ISQman - 28.10.2009, 13:18
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: Системное программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к системному программированию на Perl
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0981 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.