Blame lib/Net/DNS/Resolver/os390.pm

Packit e6c8bb
package Net::DNS::Resolver::os390;
Packit e6c8bb
Packit e6c8bb
#
Packit e6c8bb
# $Id: os390.pm 1579 2017-06-26 11:36:57Z willem $
Packit e6c8bb
#
Packit e6c8bb
our $VERSION = (qw$LastChangedRevision: 1579 $)[1];
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
=head1 NAME
Packit e6c8bb
Packit e6c8bb
Net::DNS::Resolver::os390 - IBM OS/390 resolver class
Packit e6c8bb
Packit e6c8bb
=cut
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
use strict;
Packit e6c8bb
use warnings;
Packit e6c8bb
use base qw(Net::DNS::Resolver::Base);
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
local $ENV{PATH} = '/bin:/usr/bin';
Packit e6c8bb
my $sysname = eval {`sysvar SYSNAME 2>/dev/null`} || '';
Packit e6c8bb
chomp $sysname;
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
my %RESOLVER_SETUP;			## placeholders for unimplemented search list elements
Packit e6c8bb
Packit e6c8bb
my @dataset = (				## plausible places to seek resolver configuration
Packit e6c8bb
	$RESOLVER_SETUP{GLOBALTCPIPDATA},
Packit e6c8bb
	$ENV{RESOLVER_CONFIG},					# MVS dataset or Unix file name
Packit e6c8bb
	"/etc/resolv.conf",
Packit e6c8bb
	$RESOLVER_SETUP{SYSTCPD},
Packit e6c8bb
	"//TCPIP.DATA",						# <username>.TCPIP.DATA
Packit e6c8bb
	"//'${sysname}.TCPPARMS(TCPDATA)'",
Packit e6c8bb
	"//'SYS1.TCPPARMS(TCPDATA)'",
Packit e6c8bb
	$RESOLVER_SETUP{DEFAULTTCPIPDATA},
Packit e6c8bb
	"//'TCPIP.TCPIP.DATA'"
Packit e6c8bb
	);
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
my $dotfile = '.resolv.conf';
Packit e6c8bb
my @dotpath = grep defined, $ENV{HOME}, '.';
Packit e6c8bb
my @dotfile = grep -f $_ && -o _, map "$_/$dotfile", @dotpath;
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
my %option = (				## map MVS config option names
Packit e6c8bb
	NSPORTADDR	   => 'port',
Packit e6c8bb
	RESOLVERTIMEOUT	   => 'retrans',
Packit e6c8bb
	RESOLVERUDPRETRIES => 'retry',
Packit e6c8bb
	SORTLIST	   => 'sortlist',
Packit e6c8bb
	);
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
sub _init {
Packit e6c8bb
	my $defaults = shift->_defaults;
Packit e6c8bb
	my %stop;
Packit e6c8bb
	local $ENV{PATH} = '/bin:/usr/bin';
Packit e6c8bb
Packit e6c8bb
	foreach my $dataset ( Net::DNS::Resolver::Base::_untaint( grep defined, @dataset ) ) {
Packit e6c8bb
		eval {
Packit e6c8bb
			local *FILE;				# "cat" able to read MVS dataset
Packit e6c8bb
			open( FILE, qq[cat "$dataset" 2>/dev/null |] ) or die "$dataset: $!";
Packit e6c8bb
Packit e6c8bb
			my @nameserver;
Packit e6c8bb
			my @searchlist;
Packit e6c8bb
			local $_;
Packit e6c8bb
Packit e6c8bb
			while (<FILE>) {
Packit e6c8bb
				s/[;#].*$//;			# strip comment
Packit e6c8bb
				s/^\s+//;			# strip leading white space
Packit e6c8bb
				next unless $_;			# skip empty line
Packit e6c8bb
Packit e6c8bb
				next if m/^\w+:/ && !m/^$sysname:/oi;
Packit e6c8bb
				s/^\w+:\s*//;			# discard qualifier
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
				m/^(NSINTERADDR|nameserver)/i && do {
Packit e6c8bb
					my ( $keyword, @ip ) = grep defined, split;
Packit e6c8bb
					push @nameserver, @ip;
Packit e6c8bb
					next;
Packit e6c8bb
				};
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
				m/^(DOMAINORIGIN|domain)/i && do {
Packit e6c8bb
					my ( $keyword, @domain ) = grep defined, split;
Packit e6c8bb
					$defaults->domain(@domain) unless $stop{domain}++;
Packit e6c8bb
					next;
Packit e6c8bb
				};
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
				m/^search/i && do {
Packit e6c8bb
					my ( $keyword, @domain ) = grep defined, split;
Packit e6c8bb
					push @searchlist, @domain;
Packit e6c8bb
					next;
Packit e6c8bb
				};
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
				m/^option/i && do {
Packit e6c8bb
					my ( $keyword, @option ) = grep defined, split;
Packit e6c8bb
					foreach (@option) {
Packit e6c8bb
						my ( $attribute, @value ) = split m/:/;
Packit e6c8bb
						$defaults->_option( $attribute, @value )
Packit e6c8bb
								unless $stop{$attribute}++;
Packit e6c8bb
					}
Packit e6c8bb
					next;
Packit e6c8bb
				};
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
				m/^RESOLVEVIA/i && do {
Packit e6c8bb
					my ( $keyword, $value ) = grep defined, split;
Packit e6c8bb
					$defaults->_option( 'usevc', $value eq 'TCP' )
Packit e6c8bb
							unless $stop{usevc}++;
Packit e6c8bb
					next;
Packit e6c8bb
				};
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
				m/^\w+\s*/ && do {
Packit e6c8bb
					my ( $keyword, @value ) = grep defined, split;
Packit e6c8bb
					my $attribute = $option{uc $keyword} || next;
Packit e6c8bb
					$defaults->_option( $attribute, @value )
Packit e6c8bb
							unless $stop{$attribute}++;
Packit e6c8bb
				};
Packit e6c8bb
			}
Packit e6c8bb
Packit e6c8bb
			close(FILE);
Packit e6c8bb
Packit e6c8bb
			$defaults->nameserver(@nameserver) if @nameserver && !$stop{nameserver}++;
Packit e6c8bb
			$defaults->searchlist(@searchlist) if @searchlist && !$stop{search}++;
Packit e6c8bb
		};
Packit e6c8bb
		warn $@ if $@;
Packit e6c8bb
	}
Packit e6c8bb
Packit e6c8bb
	%$defaults = Net::DNS::Resolver::Base::_untaint(%$defaults);
Packit e6c8bb
Packit e6c8bb
	map $defaults->_read_config_file($_), @dotfile;
Packit e6c8bb
Packit e6c8bb
	$defaults->_read_env;
Packit e6c8bb
}
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
1;
Packit e6c8bb
__END__
Packit e6c8bb
Packit e6c8bb
Packit e6c8bb
=head1 SYNOPSIS
Packit e6c8bb
Packit e6c8bb
    use Net::DNS::Resolver;
Packit e6c8bb
Packit e6c8bb
=head1 DESCRIPTION
Packit e6c8bb
Packit e6c8bb
This class implements the OS specific portions of C<Net::DNS::Resolver>.
Packit e6c8bb
Packit e6c8bb
No user serviceable parts inside, see L<Net::DNS::Resolver>
Packit e6c8bb
for all your resolving needs.
Packit e6c8bb
Packit e6c8bb
=head1 COPYRIGHT
Packit e6c8bb
Packit e6c8bb
Copyright (c)2017 Dick Franks.
Packit e6c8bb
Packit e6c8bb
All rights reserved.
Packit e6c8bb
Packit e6c8bb
=head1 LICENSE
Packit e6c8bb
Packit e6c8bb
Permission to use, copy, modify, and distribute this software and its
Packit e6c8bb
documentation for any purpose and without fee is hereby granted, provided
Packit e6c8bb
that the above copyright notice appear in all copies and that both that
Packit e6c8bb
copyright notice and this permission notice appear in supporting
Packit e6c8bb
documentation, and that the name of the author not be used in advertising
Packit e6c8bb
or publicity pertaining to distribution of the software without specific
Packit e6c8bb
prior written permission.
Packit e6c8bb
Packit e6c8bb
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit e6c8bb
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit e6c8bb
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
Packit e6c8bb
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Packit e6c8bb
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
Packit e6c8bb
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
Packit e6c8bb
DEALINGS IN THE SOFTWARE.
Packit e6c8bb
Packit e6c8bb
=head1 SEE ALSO
Packit e6c8bb
Packit e6c8bb
L<perl>, L<Net::DNS>, L<Net::DNS::Resolver>
Packit e6c8bb
Packit e6c8bb
=cut
Packit e6c8bb