物好き者

物好き者が行ったことを載せています。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop

smtp認証機能が無い機器からのメール送信に挑戦17

smtp認証機能が無い機器からのメール送信に挑戦16 でperlデバッガを使ってsmtpproxのデバッグを行いました。
しかし、ssh上でデバッグした場合子プロセスが起動した時に、子プロセス用のデバッガが起動できずにデバッグが続けられませんでした。

perlではforkで子プロセスを起動するということが判り、smtpproxのプログラムを確認したところ、forkを実行しているところがありました。
PARENT: while (1) {
while (scalar(keys %children) >= $children) {
my $child = wait;
delete $children{$child} if exists $children{$child};
if ($please_die) { kill 15, keys %children; exit 0; }
}
my $pid = fork;
die "$0: fork failed: $!\n" unless defined $pid;
last PARENT if $pid == 0;
$children{$pid} = 1;
select(undef, undef, undef, 0.1);
if ($please_die) { kill 15, keys %children; exit 0; }
}

この部分を削除することで、子プロセスが立ち上がらずデバッグが続けれれました。

LafoneraにインストールしたOpenwrt上でsmtpproxをデバッグしたところ、次のような動作となっていました。

main::(/smtpprox-1.2/smtpprox:141): while (1) {
DB<1>
main::(/smtpprox-1.2/smtpprox:142): $server->accept(%opts);
DB<1>
ここで停止しますが、クライアントからの通信を待っている状態なので、クライアントからの通信があると、次に進みます。
main::(/smtpprox-1.2/smtpprox:143): my $client = MSDW::SMTP::Client->new(interface => $dstaddr, port => $dstport);
DB<1>
しかし、ここで止まったままとなり、クライアントへの応答がありません。
ここでCtrl+Cを実行すると、下記が表示されます。
IO::Socket::connect(/usr/lib/perl5/5.10//IO/Socket.pm:116):
116: $err = $! || (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1);
エラー処理が継続しますが、その後停止してしまいます。

ただこの状態のデバッガでは、下のプログラムの動作しかわからなく、モジュールの実行状態がわかりません。
デバッガのヘルプを見ると、tコマンドでトレースというのがありましたので、トレースをonでデバッグをすると、モジュールの実行状態もわかりました。

クライアントからの通信後、いろいろと実行されますが、下記の部分で停止します。
IO::Socket::connect(/usr/lib/perl5/5.10//IO/Socket.pm:114):
114: undef $!;
IO::Socket::connect(/usr/lib/perl5/5.10//IO/Socket.pm:115):
115: if (!$sel->can_write($timeout)) {
IO::Select::can_write(/usr/lib/perl5/5.10//IO/Select.pm:107):
107: my $vec = shift;
IO::Select::can_write(/usr/lib/perl5/5.10//IO/Select.pm:108):
108: my $timeout = shift;
IO::Select::can_write(/usr/lib/perl5/5.10//IO/Select.pm:109):
109: my $w = $vec->[VEC_BITS];
IO::Select::can_write(/usr/lib/perl5/5.10//IO/Select.pm:111):
111: defined($w) && (select(undef,$w,undef,$timeout) > 0)
112: ? handles($vec, $w)
113: : ();

この状態でCtrl+Cを押すと、エラー処理が実行されますが、最終的に停止してしまいます。
O::Socket::connect(/usr/lib/perl5/5.10//IO/Socket.pm:116):
116: $err = $! || (exists &Errno::ETIMEDOUT ? &Errno::ETIMEDOUT : 1);
DB<1>
IO::Socket::connect(/usr/lib/perl5/5.10//IO/Socket.pm:117):
117: $@ = "connect: timeout";
DB<1>
IO::Socket::connect(/usr/lib/perl5/5.10//IO/Socket.pm:135):
135: $sock->blocking(1) if $blocking;
DB<1>
IO::Socket::blocking(/usr/lib/perl5/5.10//IO/Socket.pm:144):
144: my $sock = shift;
IO::Socket::blocking(/usr/lib/perl5/5.10//IO/Socket.pm:146):
146: return $sock->SUPER::blocking(@_)
147: if $^O ne 'MSWin32';
IO::Socket::connect(/usr/lib/perl5/5.10//IO/Socket.pm:137):
137: $! = $err if $err;
DB<1>
IO::Socket::connect(/usr/lib/perl5/5.10//IO/Socket.pm:139):
139: $err ? undef : $sock;
DB<1>
IO::Socket::INET::configure(/usr/lib/perl5/5.10//IO/Socket/INET.pm:229):
229: return _error($sock, $!, $@ || "Timeout")
230: unless @raddr;
DB<1>
IO::Socket::INET::_error(/usr/lib/perl5/5.10//IO/Socket/INET.pm:107):
107: my $sock = shift;
IO::Socket::INET::_error(/usr/lib/perl5/5.10//IO/Socket/INET.pm:108):
108: my $err = shift;
109: {
IO::Socket::INET::_error(/usr/lib/perl5/5.10//IO/Socket/INET.pm:110):
110: local($!);
IO::Socket::INET::_error(/usr/lib/perl5/5.10//IO/Socket/INET.pm:110):
110: local($!);
IO::Socket::INET::_error(/usr/lib/perl5/5.10//IO/Socket/INET.pm:111):
111: my $title = ref($sock).": ";
IO::Socket::INET::_error(/usr/lib/perl5/5.10//IO/Socket/INET.pm:112):
112: $@ = join("", $_[0] =~ /^$title/ ? "" : $title, @_);
IO::Socket::INET::_error(/usr/lib/perl5/5.10//IO/Socket/INET.pm:113):
113: $sock->close()
114: if(defined fileno($sock));
IO::Socket::close(/usr/lib/perl5/5.10//IO/Socket.pm:181):
181: @_ == 1 or croak 'usage: $sock->close()';
IO::Socket::close(/usr/lib/perl5/5.10//IO/Socket.pm:182):
182: my $sock = shift;
IO::Socket::close(/usr/lib/perl5/5.10//IO/Socket.pm:183):
183: ${*$sock}{'io_socket_peername'} = undef;
IO::Socket::close(/usr/lib/perl5/5.10//IO/Socket.pm:183):
183: ${*$sock}{'io_socket_peername'} = undef;
IO::Socket::close(/usr/lib/perl5/5.10//IO/Socket.pm:184):
184: $sock->SUPER::close();
IO::Handle::close(/usr/lib/perl5/5.10//IO/Handle.pm:102):
102: @_ == 1 or croak 'usage: $io->close()';
IO::Handle::close(/usr/lib/perl5/5.10//IO/Handle.pm:103):
103: my($io) = @_;
IO::Handle::close(/usr/lib/perl5/5.10//IO/Handle.pm:105):
105: close($io);
IO::Socket::INET::_error(/usr/lib/perl5/5.10//IO/Socket/INET.pm:116):
116: $! = $err;
IO::Socket::INET::_error(/usr/lib/perl5/5.10//IO/Socket/INET.pm:117):
117: return undef;
IO::Handle::DESTROY(/usr/lib/perl5/5.10//IO/Handle.pm:68):
68: sub DESTROY {}
IO::Handle::DESTROY(/usr/lib/perl5/5.10//IO/Handle.pm:68):
68: sub DESTROY {}
MSDW::SMTP::Client::new(MSDW/SMTP/Client.pm:105):
105: die "$0: socket connect failure: $!\n" unless defined $self->{sock};
DB<1>
/smtpprox-1.2/smtpprox: socket connect failure: Interrupted system call
at MSDW/SMTP/Client.pm line 105
MSDW::SMTP::Client::new('MSDW::SMTP::Client', 'interface', 203.216.247.162, 'port', 587) called at /smtpprox-1.2/smtpprox line 143
IO::Handle::DESTROY(/usr/lib/perl5/5.10//IO/Handle.pm:68):
68: sub DESTROY {}
IO::Handle::DESTROY(/usr/lib/perl5/5.10//IO/Handle.pm:68):
68: sub DESTROY {}
IO::Handle::DESTROY(/usr/lib/perl5/5.10//IO/Handle.pm:68):
68: sub DESTROY {}
IO::Handle::DESTROY(/usr/lib/perl5/5.10//IO/Handle.pm:68):
68: sub DESTROY {}
Debugged program terminated. Use q to quit or R to restart,
use o inhibit_exit to avoid stopping after program termination,
h q, h R or h o to get additional info.
DB<1>
Use `q' to quit or `R' to restart. `h q' for details.

クライアントから接続した状態でネットワークの状態を確認すると、下記のようにメールサーバーnアクセスしに行っています。
oot@OpenWrt:~# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 39 0 192.168.0.10:56774 smtp01.mail.vip.tnz:587 ESTABLISHED
tcp 0 0 192.168.0.10:25 192.168.0.10:60293 ESTABLISHED
tcp 0 0 192.168.0.10:60293 192.168.0.10:25 ESTABLISHED
tcp 0 0 192.168.0.10:22 192.168.0.1:1457 ESTABLISHED
tcp 0 52 192.168.0.10:22 192.168.0.1:1483 ESTABLISHED
netstat: no support for 'AF INET6 (tcp)' on this system
netstat: no support for 'AF INET6 (udp)' on this system
netstat: no support for 'AF INET6 (raw)' on this system
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 7 [ ] DGRAM 322 /dev/log
unix 2 [ ] DGRAM 5598
unix 2 [ ] DGRAM 580
unix 2 [ ] DGRAM 577
unix 2 [ ] DGRAM 361
unix 2 [ ] DGRAM 325


perlについてさらに調べないと、解決できそうにありません。

スポンサーサイト

PageTop

コメント


管理者にだけ表示を許可する
 

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。