1c090e5dfSBryan Cantrill#!/usr/perl5/bin/perl -w 210e6dadfSbrendan# 310e6dadfSbrendan# CDDL HEADER START 410e6dadfSbrendan# 510e6dadfSbrendan# The contents of this file are subject to the terms of the 610e6dadfSbrendan# Common Development and Distribution License (the "License"). 710e6dadfSbrendan# You may not use this file except in compliance with the License. 810e6dadfSbrendan# 910e6dadfSbrendan# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 1010e6dadfSbrendan# or http://www.opensolaris.org/os/licensing. 1110e6dadfSbrendan# See the License for the specific language governing permissions 1210e6dadfSbrendan# and limitations under the License. 1310e6dadfSbrendan# 1410e6dadfSbrendan# When distributing Covered Code, include this CDDL HEADER in each 1510e6dadfSbrendan# file and include the License file at usr/src/OPENSOLARIS.LICENSE. 1610e6dadfSbrendan# If applicable, add the following below this CDDL HEADER, with the 1710e6dadfSbrendan# fields enclosed by brackets "[]" replaced with your own identifying 1810e6dadfSbrendan# information: Portions Copyright [yyyy] [name of copyright owner] 1910e6dadfSbrendan# 2010e6dadfSbrendan# CDDL HEADER END 2110e6dadfSbrendan# 2210e6dadfSbrendan 2310e6dadfSbrendan# 2410e6dadfSbrendan# Copyright 2008 Sun Microsystems, Inc. All rights reserved. 2510e6dadfSbrendan# Use is subject to license terms. 2610e6dadfSbrendan# 2710e6dadfSbrendan 2810e6dadfSbrendan# 2910e6dadfSbrendan# get.ipv6remote.pl 3010e6dadfSbrendan# 31*bbf21555SRichard Lowe# Find an IPv6 reachable remote host using both ifconfig(8) and ping(8). 3210e6dadfSbrendan# Print the local address and the remote address, or print nothing if either 3310e6dadfSbrendan# no IPv6 interfaces or remote hosts were found. (Remote IPv6 testing is 3410e6dadfSbrendan# considered optional, and so not finding another IPv6 host is not an error 3510e6dadfSbrendan# state we need to log.) Exit status is 0 if a host was found. 3610e6dadfSbrendan# 3710e6dadfSbrendan 3810e6dadfSbrendanuse strict; 3910e6dadfSbrendanuse IO::Socket; 4010e6dadfSbrendan 4110e6dadfSbrendanmy $MAXHOSTS = 32; # max hosts to scan 4210e6dadfSbrendanmy $TIMEOUT = 3; # connection timeout 4310e6dadfSbrendanmy $MULTICAST = "FF02::1"; # IPv6 multicast address 4410e6dadfSbrendan 4510e6dadfSbrendan# 4610e6dadfSbrendan# Determine local IP address 4710e6dadfSbrendan# 4810e6dadfSbrendanmy $local = ""; 4910e6dadfSbrendanmy $remote = ""; 5010e6dadfSbrendanmy %Local; 5110e6dadfSbrendanmy $up; 5210e6dadfSbrendanopen IFCONFIG, '/usr/sbin/ifconfig -a inet6 |' 5310e6dadfSbrendan or die "Couldn't run ifconfig: $!\n"; 5410e6dadfSbrendanwhile (<IFCONFIG>) { 5510e6dadfSbrendan next if /^lo/; 5610e6dadfSbrendan 5710e6dadfSbrendan # "UP" is always printed first (see print_flags() in ifconfig.c): 5810e6dadfSbrendan $up = 1 if /^[a-z].*<UP,/; 5910e6dadfSbrendan $up = 0 if /^[a-z].*<,/; 6010e6dadfSbrendan 6110e6dadfSbrendan # assume output is "inet6 ...": 6210e6dadfSbrendan if (m:inet6 (\S+)/:) { 6310e6dadfSbrendan my $addr = $1; 6410e6dadfSbrendan $Local{$addr} = 1; 6510e6dadfSbrendan $local = $addr if $up and $local eq ""; 6610e6dadfSbrendan $up = 0; 6710e6dadfSbrendan } 6810e6dadfSbrendan} 6910e6dadfSbrendanclose IFCONFIG; 7010e6dadfSbrendanexit 1 if $local eq ""; 7110e6dadfSbrendan 7210e6dadfSbrendan# 7310e6dadfSbrendan# Find the first remote host that responds to an icmp echo, 7410e6dadfSbrendan# which isn't a local address. 7510e6dadfSbrendan# 7610e6dadfSbrendanopen PING, "/usr/sbin/ping -ns -A inet6 $MULTICAST 56 $MAXHOSTS |" or 7710e6dadfSbrendan die "Couldn't run ping: $!\n"; 7810e6dadfSbrendanwhile (<PING>) { 7910e6dadfSbrendan if (/bytes from (.*): / and not defined $Local{$1}) { 8010e6dadfSbrendan $remote = $1; 8110e6dadfSbrendan last; 8210e6dadfSbrendan } 8310e6dadfSbrendan} 8410e6dadfSbrendanclose PING; 8510e6dadfSbrendanexit 2 if $remote eq ""; 8610e6dadfSbrendan 8710e6dadfSbrendanprint "$local $remote\n"; 88