Я обернул Perl Net :: SSH :: Expect небольшим модулем, чтобы уменьшить стандартный код, необходимый для написания нового скрипта конфигурации для использования с нашими картами HP iLO, Хотя, с одной стороны, я хочу, чтобы эта обертка была как можно более компактной, чтобы ее могли использовать коллеги, не являющиеся программистами, я также хочу, чтобы она была написана как можно лучше.
Используется так:
my $ilo = iLO->new(host => $host, password => $password);
$ilo->login;
$ilo->command("cd /system1");
$ilo->command("set oemhp_server_name=$system_name", 'status=0');
и это iLO::command()
:
sub command {
my ($self, $cmd, $response) = @_;
$response = 'hpiLO-> ' unless defined($response);
# $self->{ssh} is a Net::SSH::Expect object
croak "Not logged in!\n" unless ($self->{ssh});
$self->{ssh}->send($cmd);
if ($self->{ssh}->waitfor($response, $self->{CMD_TIMEOUT}, '-re')) {
return {
before => $self->{ssh}->before(),
match => $self->{ssh}->match(),
after => $self->{ssh}->after(),
};
} else {
carp "ERROR: '$cmd' response did not match /$response/:\n\n",
$self->{ssh}->before()),
"\n";
return undef;
}
}
У меня есть два связанных запроса. Во-первых, как мне поступить с ответами, которые не соответствуют ожидаемому ответу? Я думаю, что то, что я делаю сейчас, удовлетворительно - возвращая undef
, я сообщаю, что что-то сломалось, и мой croak()
выдаст ошибку (хотя вряд ли изящно). Но это похоже на запах кода. Если бы в Perl были исключения, я бы поднял их и позволил вызывающему коду решить, игнорировать ли их / выйти / напечатать предупреждение, но это не так (ну, в 5.8). Возможно, мне следует вернуть какой-то другой объект (iLO::response
или что-то в этом роде), который содержит сообщение об ошибке и содержимое $ilo->before()
(что является просто Net :: SSH :: Expect's before()
)? Но если я сделаю это - и мне придется обернуть каждый $ilo->command
в тесте, чтобы поймать его - мои сценарии снова будут заполнены образцом.
Во-вторых, что я должен вернуть для успеха? Опять же, мой хеш, более или менее содержащий ответ от Net :: SSH :: Expect, выполняет свою работу, но он как-то не выглядит «правильным». Хотя этот пример на Perl, мой код на других языках выдает тот же знакомый запах: я никогда не уверен, что и как вернуть из метода. Что ты можешь мне сказать?