Имитация хоста недоступна - как этого добиться / реализовать - PullRequest
10 голосов
/ 15 марта 2011

Вот мой сценарий:

A - сервер обеспечения, а B - клиент.Всякий раз, когда есть какие-либо изменения в настройке B, он загружает соответствующий файл конфигурации в A.

Я работаю инженером по автоматизации, чтобы автоматизировать его.Один из сценариев говорит отключить A от сети или остановить сервер A. выполнить некоторые изменения в B и убедиться, что B не удалось загрузить файлы на сервер обеспечения A. A. 1005 *

Чтобы автоматизировать это, простой способостановите сервер A и выполните соответствующие действия.

Так как A и B также используются другими сторонами для других целей, я не могу ни отключить A или B от сети, ни остановить сервер на A.

Итак, я с нетерпением жду любого решения, чтобы смоделировать сценарий недоступности хоста (сервера предоставления доступа).Поэтому, когда B отправит обновление A, оно не будет работать, но в действительности A работает как обычно.

Пожалуйста, предложите мне какой-нибудь способ достичь этого.

Я использую Perl в качестве языка программирования, но я в порядке, если решение доступно на другом языке.

Ответы [ 3 ]

19 голосов
/ 15 марта 2011

Я делал это до использования нулевого маршрута.Это то, что лучше всего сделать из оболочки с помощью команды ip.

# blackhole all packets destined for 192.168.2.1
ip route add blackhole 192.168.2.1
# to delete the same route, replace add with del
ip route del blackhole 192.168.2.1

В зависимости от вашего варианта использования недостижимый маршрут может работать лучше, так как он возвращает ICMP-недостижимый вместо отбрасывания пакетов, хотя оникак правило, имеют тот же эффект.

ip route add unreachable 192.168.2.1

А для тщательности, если вы действительно хотите смоделировать ситуацию недоступности хоста (против недоступности сети), вам придется сделать это на уровне брандмауэра.

# resond with icmp-host-unreachable for *any* outbound packet to 192.168.2.1
iptables -I OUTPUT -d 192.168.2.1 -j REJECT --reject-with=icmp-host-unreachable
# delete the same rule (without looking up the rule #)
iptables -D OUTPUT -d 192.168.2.1 -j REJECT --reject-with=icmp-host-unreachable
1 голос
/ 15 марта 2011

Другой, возможно, более простой вариант - изменить конфигурацию на B, чтобы при выполнении теста иметь поддельный IP-адрес для A (например, 192.0.2.0).

0 голосов
/ 17 марта 2011

Test :: MockObject :: Extends - отлично подходит для модификации небольших частей модулей для создания конкретных сценариев тестирования.Прекрасно подходит для вещей, которые вы не можете хорошо протестировать, потому что они влияют на вещи в производстве или в местах, которые вы не контролируете.

#!/usr/bin/perl

use strict;
use warnings;
use Test::MockObject::Extends;

#Fake module that has your remote connect subroutine
use Fake::Module;

my $object = Fake::Module->new();

#replace your obj with a copy that Test::MO:E will let us mess with
$object = Test::MockObject::Extends->new( $object )

#replace your connect function with a temp fake version
$object->mock(
    'your_remote_connect_sub' => sub {
        #Whatever data that should returned by your connect function if the server is unavailable
        return undef;
    },
);

#test your sub now
if ( !defined( $object->your_remove_connect_sub() ) ) {
    print "Remote server unavailable\n";
}
...