]> git.ipfire.org Git - thirdparty/squid.git/blame - scripts/icp-test.pl
SourceFormat Enforcement
[thirdparty/squid.git] / scripts / icp-test.pl
CommitLineData
4f254368 1#!/usr/local/bin/perl
a151895d 2#
f6e9a3ee 3## Copyright (C) 1996-2019 The Squid Software Foundation and contributors
a151895d
AJ
4##
5## Squid software is distributed under GPLv2+ license and includes
6## contributions from numerous individuals and organizations.
7## Please see the COPYING and CONTRIBUTORS files for details.
8##
4f254368 9
4cc6d51c 10# icp-test.pl
4f254368 11#
4cc6d51c 12# Duane Wessels, Nov 1996
4f254368 13#
4cc6d51c 14# Usage: icp-test.pl host:port ... < url-list
4f254368 15#
4cc6d51c 16# Sends a continuous stream of ICP queries to a set of caches. Stdin is
17# a list of URLs to request.
4f254368 18
19require 'getopts.pl';
20
21$|=1;
22
23&Getopts('n');
24
4f254368 25# just copy this from src/proto.c
26@CODES=(
27 "ICP_INVALID",
28 "ICP_QUERY",
29 "UDP_HIT",
30 "UDP_MISS",
31 "ICP_ERR",
32 "ICP_SEND",
33 "ICP_SENDA",
34 "ICP_DATABEG",
35 "ICP_DATA",
36 "ICP_DATAEND",
37 "ICP_SECHO",
38 "ICP_DECHO",
39 "ICP_OP_UNUSED0",
40 "ICP_OP_UNUSED1",
41 "ICP_OP_UNUSED2",
42 "ICP_OP_UNUSED3",
43 "ICP_OP_UNUSED4",
44 "ICP_OP_UNUSED5",
45 "ICP_OP_UNUSED6",
46 "ICP_OP_UNUSED7",
47 "ICP_OP_UNUSED8",
48 "UDP_RELOADING",
49 "UDP_DENIED",
50 "UDP_HIT_OBJ",
51 "ICP_END"
52);
53
54require 'sys/socket.ph';
55
56$sockaddr = 'S n a4 x8';
57($name, $aliases, $proto) = getprotobyname("udp");
4f254368 58$thissock = pack($sockaddr, &AF_INET, 0, "\0\0\0\0");
4f254368 59
60chop($me=`uname -a|cut -f2 -d' '`);
61$myip=(gethostbyname($me))[4];
62
63die "socket: $!\n" unless
64 socket (SOCK, &AF_INET, &SOCK_DGRAM, $proto);
65
66$flags = 0;
67$flags |= 0x80000000;
68$flags |= 0x40000000 if ($opt_n);
69$flags = ~0;
70
4cc6d51c 71while ($ARGV[0] =~ /([^:]+):(\d+)/) {
72 $host = $1;
73 $port = $2;
74 ($fqdn, $aliases, $type, $len, $themaddr) = gethostbyname($host);
75 $ADDR{$host} = pack('Sna4x8', &AF_INET, $port, $themaddr);
76 $ip = join('.', unpack('C4', $themaddr));
77 $FQDN{$ip} = $fqdn;
78 shift;
79}
80
36f42e09 81$rn = 0;
4f254368 82while (<>) {
4cc6d51c 83 print;
4f254368 84 chop;
36f42e09 85 $len = length($_) + 1;
86 $request_template = sprintf 'CCnNNa4a4x4a%d', $len;
87 $request = pack($request_template,
88 1, # C opcode
89 2, # C version
90 24 + $len, # n length
91 ++$rn, # N reqnum
92 $flags, # N flags
93 '', # a4 pad
94 $myip, # a4 shostid
95 $_); # a%d payload
4cc6d51c 96 $n = 0;
97 foreach $host (keys %ADDR) {
98 $port = $PORT{$host};
99 @ip = split('\.', $IP{$host});
100 $them = pack('SnC4x8', &AF_INET, $port, @ip);
101 ($sport,@IP) = unpack('x2nC4x8', $ADDR{$host});
102 die "send: $!\n" unless send(SOCK, $request, 0, $ADDR{$host});
103 $n++;
104 }
105 while ($n > 0) {
106 $rin = '';
107 vec($rin,fileno(SOCK),1) = 1;
108 ($nfound,$timeleft) = select($rout=$rin, undef, undef, 2.0);
109 last if ($nfound == 0);
110 die "recv: $!\n" unless
111 $theiraddr = recv(SOCK, $reply, 1024, 0);
112 ($junk, $junk, $sourceaddr, $junk) = unpack($sockaddr, $theiraddr);
113 $ip = join('.', unpack('C4', $sourceaddr));
114 ($type,$ver,$len,$flag,$p1,$p2,$payload) = unpack('CCnx4Nnnx4A', $reply);
115 printf "\t%-20.20s %-10.10s",
116 $FQDN{$ip},
117 $CODES[$type];
118 print " hop=$p1" if ($opt_n);
119 print " rtt=$p2" if ($opt_n);
120 print "\n";
121 $n--;
122 }
4f254368 123}
124