Net-Whois-Raw-2.99042000755001750001750 015037672667 14521 5ustar00nalobinnalobin000000000000README100644001750001750 1466615037672667 15517 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042NAME Net::Whois::Raw - Get Whois information for domains SYNOPSIS use Net::Whois::Raw; $dominfo = whois('perl.com'); ($dominfo, $whois_server) = whois('funet.fi'); $reginfo = whois('REGRU-REG-RIPN', 'whois.ripn.net'); $arrayref = get_whois('yahoo.co.uk', undef, 'QRY_ALL'); $text = get_whois('yahoo.co.uk', undef, 'QRY_LAST'); ($text, $srv) = get_whois('yahoo.co.uk', undef, 'QRY_FIRST'); $Net::Whois::Raw::OMIT_MSG = 1; # This will attempt to strip several known copyright # messages and disclaimers sorted by servers. # Default is to give the whole response. $Net::Whois::Raw::CHECK_FAIL = 1; # This will return undef if the response matches # one of the known patterns for a failed search, # sorted by servers. # Default is to give the textual response. $Net::Whois::Raw::CHECK_EXCEED = 1; # When this option is set, "die" will be called # if connection rate to specific whois server have been # exceeded $Net::Whois::Raw::CACHE_DIR = "/var/spool/pwhois/"; # Whois information will be # cached in this directory. Default is no cache. $Net::Whois::Raw::CACHE_TIME = 60; # Cache files will be cleared after not accessed # for a specific number of minutes. Documents will not be # cleared if they keep get requested for, independent # of disk space. $Net::Whois::Raw::TIMEOUT = 10; # Cancel the request if connection is not made within # a specific number of seconds. @Net::Whois::Raw::SRC_IPS = (11.22.33.44); # List of local IP addresses to # use for WHOIS queries. Addresses will be used used # successively in the successive queries $Net::Whois::Raw::POSTPROCESS{whois.crsnic.net} = \&my_func; # Call to a user-defined subroutine on whois result, # depending on whois-server. # Above is equil to: # ($text, $srv) = whois('example.com'); # $text = my_func($text) if $srv eq 'whois.crsnic.net'; DESCRIPTION Net::Whois::Raw queries WHOIS servers about domains. The module supports recursive WHOIS queries. Also queries via HTTP is supported for some TLDs. Setting the variables $OMIT_MSG and $CHECK_FAIL will match the results against a set of known patterns. The first flag will try to omit the copyright message/disclaimer, the second will attempt to determine if the search failed and return undef in such a case. IMPORTANT: these checks merely use pattern matching; they will work on several servers but certainly not on all of them. FUNCTIONS whois( DOMAIN [, SRV [, WHICH_WHOIS]] ) Returns Whois information for "DOMAIN". Without "SRV" argument default Whois server for specified domain name zone will be used. Use 'www_whois' as server name to force WHOIS querying via HTTP (only few TLDs are supported in HTTP queries). Caching is supported: if $CACHE_DIR variable is set and there is cached entry for that domain - information from the cache will be used. "WHICH_WHOIS" argument - look get_whois docs below. get_whois( DOMAIN [, SRV [, WHICH_WHOIS]] ) Lower-level function to query Whois information for "DOMAIN". Caching IS NOT supported (caching is implemented only in higher-level "whois" function). Without "SRV" argument default Whois server for specified domain name zone will be used. "WHICH_WHOIS" argument is used to access a results if recursive queries; possible values: 'QRY_FIRST' - returns results of the first query. Non't make recursive queries. In scalar context returns just whois text. In list context returns two values: whois text and whois server which was used to make query). 'QRY_LAST' - returns results of the last query. In scalar context returns just whois text. In list context returns two values: whois text and whois server which was used to make query). This is the default option. 'QRY_ALL' - returns results of the all queries of the recursive chain. Reference to array of references to hashes is returned. Hash keys: "text" - result of whois query, "srv" - whois server which was used to make query. USER DEFINED FUNCTIONS whois_query_sockparams( DOMAIN, SRV ) You can set your own IO::Socket::INET params like this: *Net::Whois::Raw::whois_query_sockparams = sub { my $class = shift; my $domain = shift; my $name = shift; return ( PeerAddr => $name, PeerPort => 43, # LocalHost => , # LocalPort => ); }; whois_query_socket( DOMAIN, SRV ) You can set your own IO::Socket::INET like this: *Net::Whois::Raw::whois_query_socket = sub { my $class = shift; my $domain = shift; my $name = shift; $name .= ':43'; return IO::Socket::INET->new(); }; whois_query_ua( DOMAIN, SRV ) You can set your own LWP::UserAgent like this: *Net::Whois::Raw::whois_query_ua = sub { my $class = shift; my $domain = shift; return LWP::UserAgent->new(); }; AUTHOR Original author Ariel Brosh schop@cpan.org, Inspired by jwhois.pl available on the net. Since Ariel has passed away in September 2002: Past maintainers Gabor Szabo gabor@perl.org.il, Corris Randall corris@cpan.org, Walery Studennikov . Current Maintainer (since 2014): Alexander Nalobin NOTE Some users complained that the die statements in the module make their CGI scripts crash. Please consult the entries on eval and die on perlfunc about exception handling in Perl. COPYRIGHT Copyright 2000--2002 Ariel Brosh. Copyright 2003--2003 Gabor Szabo. Copyright 2003--2003 Corris Randall. Copyright 2003--2014 Walery Studennikov. This package is free software. You may redistribute it or modify it under the same terms as Perl itself. I apologize for any misunderstandings caused by the lack of a clear licence in previous versions. SEE ALSO pwhois, whois. LICENSE100644001750001750 4646515037672667 15646 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042This software is copyright (c) 2002-2025 by Alexander Nalobin. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. Terms of the Perl programming language system itself a) the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version, or b) the "Artistic License" --- The GNU General Public License, Version 1, February 1989 --- This software is Copyright (c) 2002-2025 by Alexander Nalobin. This is free software, licensed under: The GNU General Public License, Version 1, February 1989 GNU GENERAL PUBLIC LICENSE Version 1, February 1989 Copyright (C) 1989 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The license agreements of most software companies try to keep users at the mercy of those companies. By contrast, our General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. The General Public License applies to the Free Software Foundation's software and to any other program whose authors commit to using it. You can use it for your programs, too. When we speak of free software, we are referring to freedom, not price. Specifically, the General Public License is designed to make sure that you have the freedom to give away or sell copies of free software, that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of a such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any work containing the Program or a portion of it, either verbatim or with modifications. Each licensee is addressed as "you". 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this General Public License and to the absence of any warranty; and give any other recipients of the Program a copy of this General Public License along with the Program. You may charge a fee for the physical act of transferring a copy. 2. You may modify your copy or copies of the Program or any portion of it, and copy and distribute such modifications under the terms of Paragraph 1 above, provided that you also do the following: a) cause the modified files to carry prominent notices stating that you changed the files and the date of any change; and b) cause the whole of any work that you distribute or publish, that in whole or in part contains the Program or any part thereof, either with or without modifications, to be licensed at no charge to all third parties under the terms of this General Public License (except that you may choose to grant warranty protection to some or all third parties, at your option). c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the simplest and most usual way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this General Public License. d) You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. Mere aggregation of another independent work with the Program (or its derivative) on a volume of a storage or distribution medium does not bring the other work under the scope of these terms. 3. You may copy and distribute the Program (or a portion or derivative of it, under Paragraph 2) in object code or executable form under the terms of Paragraphs 1 and 2 above provided that you also do one of the following: a) accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Paragraphs 1 and 2 above; or, b) accompany it with a written offer, valid for at least three years, to give any third party free (except for a nominal charge for the cost of distribution) a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Paragraphs 1 and 2 above; or, c) accompany it with the information you received as to where the corresponding source code may be obtained. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form alone.) Source code for a work means the preferred form of the work for making modifications to it. For an executable file, complete source code means all the source code for all modules it contains; but, as a special exception, it need not include source code for modules which are standard libraries that accompany the operating system on which the executable file runs, or for standard header files or definitions files that accompany that operating system. 4. You may not copy, modify, sublicense, distribute or transfer the Program except as expressly provided under this General Public License. Any attempt otherwise to copy, modify, sublicense, distribute or transfer the Program is void, and will automatically terminate your rights to use the Program under this License. However, parties who have received copies, or rights to use copies, from you under this General Public License will not have their licenses terminated so long as such parties remain in full compliance. 5. By copying, distributing or modifying the Program (or any work based on the Program) you indicate your acceptance of this license to do so, and all its terms and conditions. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. 7. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of the license which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the license, you may choose any version ever published by the Free Software Foundation. 8. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 9. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 10. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS Appendix: How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to humanity, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 19yy This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 1, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301 USA Also add information on how to contact you by electronic and paper mail. If the program is interactive, make it output a short notice like this when it starts in an interactive mode: Gnomovision version 69, Copyright (C) 19xx name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program. You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (a program to direct compilers to make passes at assemblers) written by James Hacker. , 1 April 1989 Ty Coon, President of Vice That's all there is to it! --- The Perl Artistic License 1.0 --- This software is Copyright (c) 2002-2025 by Alexander Nalobin. This is free software, licensed under: The Perl Artistic License 1.0 The "Artistic License" Preamble The intent of this document is to state the conditions under which a Package may be copied, such that the Copyright Holder maintains some semblance of artistic control over the development of the package, while giving the users of the package the right to use and distribute the Package in a more-or-less customary fashion, plus the right to make reasonable modifications. Definitions: "Package" refers to the collection of files distributed by the Copyright Holder, and derivatives of that collection of files created through textual modification. "Standard Version" refers to such a Package if it has not been modified, or has been modified in accordance with the wishes of the Copyright Holder as specified below. "Copyright Holder" is whoever is named in the copyright or copyrights for the package. "You" is you, if you're thinking about copying or distributing this Package. "Reasonable copying fee" is whatever you can justify on the basis of media cost, duplication charges, time of people involved, and so on. (You will not be required to justify it to the Copyright Holder, but only to the computing community at large as a market that must bear the fee.) "Freely Available" means that no fee is charged for the item itself, though there may be fees involved in handling the item. It also means that recipients of the item may redistribute it under the same conditions they received it. 1. You may make and give away verbatim copies of the source form of the Standard Version of this Package without restriction, provided that you duplicate all of the original copyright notices and associated disclaimers. 2. You may apply bug fixes, portability fixes and other modifications derived from the Public Domain or from the Copyright Holder. A Package modified in such a way shall still be considered the Standard Version. 3. You may otherwise modify your copy of this Package in any way, provided that you insert a prominent notice in each changed file stating how and when you changed that file, and provided that you do at least ONE of the following: a) place your modifications in the Public Domain or otherwise make them Freely Available, such as by posting said modifications to Usenet or an equivalent medium, or placing the modifications on a major archive site such as uunet.uu.net, or by allowing the Copyright Holder to include your modifications in the Standard Version of the Package. b) use the modified Package only within your corporation or organization. c) rename any non-standard executables so the names do not conflict with standard executables, which must also be provided, and provide a separate manual page for each non-standard executable that clearly documents how it differs from the Standard Version. d) make other distribution arrangements with the Copyright Holder. 4. You may distribute the programs of this Package in object code or executable form, provided that you do at least ONE of the following: a) distribute a Standard Version of the executables and library files, together with instructions (in the manual page or equivalent) on where to get the Standard Version. b) accompany the distribution with the machine-readable source of the Package with your modifications. c) give non-standard executables non-standard names, and clearly document the differences in manual pages (or equivalent), together with instructions on where to get the Standard Version. d) make other distribution arrangements with the Copyright Holder. 5. You may charge a reasonable copying fee for any distribution of this Package. You may charge any fee you choose for support of this Package. You may not charge a fee for this Package itself. However, you may distribute this Package in aggregate with other (possibly commercial) programs as part of a larger (possibly commercial) software distribution provided that you do not advertise this Package as a product of your own. You may embed this Package's interpreter within an executable of yours (by linking); this shall be construed as a mere form of aggregation, provided that the complete Standard Version of the interpreter is so embedded. 6. The scripts and library files supplied as input to or produced as output from the programs of this Package do not automatically fall under the copyright of this Package, but belong to whoever generated them, and may be sold commercially, and may be aggregated with this Package. If such scripts or library files are aggregated with this Package via the so-called "undump" or "unexec" methods of producing a binary executable image, then distribution of such an image shall neither be construed as a distribution of this Package nor shall it fall under the restrictions of Paragraphs 3 and 4, provided that you do not represent such an executable image as a Standard Version of this Package. 7. C subroutines (or comparably compiled subroutines in other languages) supplied by you and linked into this Package in order to emulate subroutines and variables of the language defined by this Package shall not be considered part of this Package, but are the equivalent of input as in Paragraph 6, provided these subroutines do not change the language in any way that would cause it to fail the regression tests for the language. 8. Aggregation of this Package with a commercial distribution is always permitted provided that the use of this Package is embedded; that is, when no overt attempt is made to make this Package's interfaces visible to the end user of the commercial distribution. Such use shall not be construed as a distribution of this Package. 9. The name of the Copyright Holder may not be used to endorse or promote products derived from this software without specific prior written permission. 10. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. The End Changes100644001750001750 6413215037672667 16123 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042Revision history for Perl module Net::Whois::Raw. 2.99042 Jul 22 2015 Alexander Nalobin - recursive_whois: allow case insensitive match of OrgID from Slaven Rezic 2.99041 May 28 2025 Alexander Nalobin - Fix whois server for .by 2.99040 June 24 2024 Alexander Nalobin - Added .спб.рф domain 2.99039 Apr 16 2024 Alexander Nalobin - https://github.com/regru/Net-Whois-Raw/pull/26 2.99038 Feb 29 2024 Alexander Nalobin - Fix whois servers for some CentralNic tlds 2.99037 Jun 21 2022 Alexander Nalobin - Fix whois servers for .ai 2.99036 Jun 21 2022 Alexander Nalobin - Fix whois servers for .cat and .tel 2.99035 May 25 2022 Alexander Nalobin - Added .ink, .wiki, .design not found patterns 2.99034 Apr 18 2022 Alexander Nalobin - .ink, .wiki, .design moved from centralnic 2.99033 Sep 29 2021 Alexander Nalobin - utf8 encoding fix in pwhois script 2.99032 Aug 17 2021 Alexander Nalobin - Fix whois server for .mx 2.99031 Sep 1 2020 Alexander Tsoy - Fix whois server for .mx 2.99030 Aug 7 2020 Chase Venters - Fix whois server for .in (India) 2.99029 Jun 26 2020 Alexander Nalobin - Fix whois servers of some tlds - Small refactor for get_server() 2.99028 May 9 2020 Eugeny Subachev - Deleting duplicates from notfound and servers - Fix whois server of xn--ses554g tld 2.99027 Feb 24 2020 Alexander Nalobin - pwhois script refactoring - Can pass arbitrary query part to pwhois script 2.99026 Oct 25 2019 Alexander Nalobin - Change whois.rightside.co whois server to whois.donuts.co 2.99025 Oct 24 2019 Eugeny Subachev - Fixed 'not found' pattern for whois.nic.so - New tld .NET.SO 2.99024 Oct 10 2019 Eugeny Subachev - A lot of new tlds added 2.99023 Oct 09 2019 Eugeny Subachev - New tlds .ORG.HN, .NET.HN 2.99022 Jul 12 2019 Dave Hayes Fix caching for QRY_ALL (https://github.com/regru/Net-Whois-Raw/pull/19) 2.99021 Nov 20 2018 Eugeny Subachev - Fixed/added 'not found' patterns of net.ua vg gd kiwi sx TLDs. 2.99020 Sep 24 2018 Alexander Nalobin - fix recursive whois regexp. Now matches \r\n line endings. 2.99019 Sep 24 2018 Alexander Nalobin - fix precedence in 2.99016 fix, thanx to Slaven Rezić. 2.99018 Aug 29 2018 Eugeny Subachev - - Fixed/added 'not found' patterns of hn com.hn cd TLDs. 2.99017 Aug 28 2018 Eugeny Subachev - Added whois servers of some TLDs. - Fixed/added 'not found' patterns of many whois servers. 2.99016 Jul 18 2018 Alexander Nalobin - fixed recursion to referal whois servers in QRY_FIRST mode 2.99015 Jun 14 2018 Sergei Sedinkin - new whois server for .net.ru, .org.ru and .pp.ru domains 2.99014 May 8 2018 Alexander Nalobin - whois.unitedtld.com is no longer a whois server (https://github.com/regru/Net-Whois-Raw/issues/16) 2.99013 Dec 13 2017 Alexander Nalobin - Added "notfound" and "strip" patterns for whois.registry.ripn.net 2.99012 Dec 11 2017 Vadim Likhota - update notfound data and whois servers for some tlds 2.99011 Nov 23 2017 Alexander Nalobin - Skip urls as recursive whois servers 2.99010 Jul 31 2017 Alexander Nalobin - CI regexp in recursive whois server match 2.99009 Jun 24 2017 Gregory Oschwald - Do not warn if newsrv is undefined 2.99008 Jun 7 2017 Alexander Nalobin - can bypass recursing to custom servers ($Net::Whois::Raw::Data::whois_servers_no_recurse) 2.99007 May 22 2017 Vadiml Likhota - revert broken $which_whois default behavior 2.99006 Feb 1 2017 Alexander Nalobin - pwhois script approves IDN domains (ɢoogle.com) 2.99005 Jan 26 2017 Oleg Gavrin - speed optimizations 2.99004 2017 Vadiml Likhota - fix whois for .LA 2.99003 Nov 22 2016 Oleg Gavrin, Christian Walde, Vadim Likhota, Alexander Nalobin - maintanance tool for Data.pm - a lot of new gTLDs whois servers added and fixed - "not found" patterns fixed - new tlds .NG, *.TH, .ID - fix whois for .AU, .TH 2.99002 Oct 17 2016 Alexander Nalobin, Vadim Likhota, Anton Chuvashev - get rid of unused DBI dependency - whois.iana.org for tld only query - new tlds .RADIO.AM, .RADIO.FM, .SHOP, .SHOPPING, .GAMES - new tld .HELP 2.99001 Aug 01 2016 Vadim Likhota - new tlds .PROMO, .ART, .FORUM - fix whois for .JOBS, .LA, .MOBI - set default whois whois.nic.TLD 2.99 Jul 05 2016 Andrey Voyshko - new tlds .GROUP 2.98 Jun 22 2016 Anton Chuvashev - new tlds .TUBE 2.97 Jun 06 2016 Vadim Likhota - fix whois for .NET.RU, .ORG.RU, .PP.RU - new zones .STORE, .VIP 2.96 Mar 31 2016 Anton Chuvashev - new tlds .GAME, .PROMO 2.95 May 24 2016 Alexander Nalobin - new tld .VIP - Update ZA, PRIV.AT whois, not available/exceed sentences thanx to @zdm 2.94 Mar 31 2016 Alexander Nalobin - new tlds .CAFE, .QA - new 'not found' message of whois-dub.mm-registry.com 2.93 Mar 06 2016 Vadim Likhota - fix whois for .CC, .RU.NET, .COM.RU, .EXNET.RU, *.RU & *.SU geodomains - new tlds .CLOUD, .BET, .PET, .AUTO, .CAR, .CARS, .BEST, .BROKER, .CAREER, .COURSES, .EARTH, .FILM, .FOREX, .MEN, .SRL, .STUDY, .FAMILY, .LIVE, .STUDIO 2.92 Feb 10 2016 Vadim Likhota - fix clear disclaimer for .ME, .MOBY .NAME, and .ORG - fix whois for .OOO, .LA, .PRO and .PW - new tlds .CONTACT, .FAN, .PID and .REALTY 2.91 Oct 28 2015 Vadim Likhota - even more new tlds of whois.centralnic.com 2.89, 2.90 Oct 27 2015 Alexander Nalobin - more new tlds of whois.centralnic.com 2.88 Oct 27 2015 Alexander Nalobin - new tld .SITE 2.87 Sep 28 2015 Alexander Nalobin & Hugo Salgado - basic IPv6 server support 2.86 Sep 01 2015 Alexander Nalobin - QRY_LAST/QRY_FIRST caching issue fix 2.85 Jul 09 2015 Alexander Nalobin - new tld .PRESS 2.84 Mar 27 2015 Alexander Nalobin - new tld .TATAR 2.83 Mar 24 2015 Alexander Nalobin - Fix getting whois of ARIN IP addresses - Fix .sh и .pro "not found" patterns 2.82 Jan 23 2015 Alexander Nalobin - whois.jprs.jp whois server's encoding is UTF-8 2.81 Jan 21 2015 Igor Zhuk - new tld .MOSCOW 2.80 Dec 03 2014 Alexander Nalivayko - new tld .OOO 2.79 Oct 18 2014 Dmitriy Shamatrin - Added possibility to specify list of ips for selected whois servers - Refactored logic for @SRC_IPS 2.78 Oct 07 2014 Alexander Nalobin - new tld .МОСКВА ( XN--80ADXHKS ) 2.77 Jul 17 2014 Dmitriy Seluzhitskiy - new tld .WIEN 2.76 Jul 2 2014 Alexander Nalobin - hide internet dependent tests 2.75 Jul 2 2014 Alexander Nalobin - deps fix 2.74 Jul 1 2014 Alexander Nalobin - tests cleaning 2.73 Jun 25 2014 Dmitriy Seluzhitskiy - new tlds of http://uniregistry.com 2.72 Jun 17 2014 Dmitriy Seluzhitskiy - new tlds of http://mm-registry.com 2.71 Jun 03 2014 Dmitriy Seluzhitskiy - Add whois for .PW 2.70 Jun 02 2014 Alexander Nalobin - RT#96078 Fixed LANG handling in pwhois script 2.69 May 27 2014 Dmitriy Seluzhitskiy - change whois for .орг 2.68 May 21 2014 Dmitriy Seluzhitskiy - new tlds of donuts.co 2.67 May 08 2014 Dmitriy Seluzhitskiy - new tlds .LUXURY 2.66 May 08 2014 Dmitriy Seluzhitskiy - new tlds of United TLD Holdco Ltd (http://rightside.co) 2.65 Apr 24 2014 Dmitriy Seluzhitskiy - new tlds .CLUB 2.64 Apr 22 2014 Dmitriy Seluzhitskiy - new tlds .PINK .RED .SHIKSHA .KIM .BLUE 2.63 Apr 17 2014 Dmitriy Seluzhitskiy - Add whois.nic.build for .BUILD 2.62 Apr 16 2014 Dmitriy Seluzhitskiy - Add whois.dot-kiwi.com for .KIWI 2.61 Apr 02 2014 Dmitriy Seluzhitskiy - Add zones for whois.uniregistry.net 2.60 Mar 21 2014 Dmitriy Shamatrin - Added query suffix - Added timeout to 02-internet.t for hangs prevention 2.59 Mar 12 2014 Dmitriy Seluzhitskiy - Fixed .domains whois error 2.58 Mar 12 2014 Dmitriy Seluzhitskiy - Add whois servers for gtld: .berlin 2.57 Feb 25 2014 Victor Efimov - Fix whois server for .BZ 2.56 Feb 25 2014 Anton Chuvashev - new tlds XN--D1ACJ3B, XN--80ASWG, XN--80ASEHDB 2.55 Feb 24 2014 Alexander Nalobin - RT#91930 Boilerplate stripping 2.54 Feb 18 2014 Dmitriy Seluzhitskiy - Add whois server for gtld, managed by Sugar Glen, LLC (http://donuts.co) 2.53 Feb 07 2014 Alexander Nalobin - TODAY whois server added 2.52 Jan 24 2014 Alexander Nalobin - Handling exceed limits of whois.name.com and in recursive queries ( set $CHECK_EXCEED = 2 ) 2.51 Jan 16 2014 Victor Efimov - RT#60339 fixed regexp for parsing .TJ web whois - RT#64960 extend regexp for ReferralServer parsing (for recursive whois) - Several timeout/alarm issues: Fix race-condition between ALRM handler cleared and alarm timer cleared (could result process to exit with signalal - i.e. not possible to catch as die(), and no destructions called). Fix action-at-distance - we were clearing alarm timer to zero, if alarm is not used (i.e if TIMEOUT zero). Substract time spent in request from outer alarm - Fixed: unicode whois was damaging when using caching Under POSIX systems pwhois now uses TMPDIR env, not TEMP. 2.50 Jan 13 2014 Alexander Nalobin - Handling exceed limits of whois.nic.cz - IO whois updated. - BY whois added. 2.49 Dec 13 2013 Victor Efimov - IN.NET, HR whois server added - AC whois server fixed 2.48 Sep 19 2013 Walery Studennikov - Fixed encoding for com.ua domains 2.47 Sep 13 2013 Timur Nozadze - Fixed "not found" parsing form whois.centralnic.com 2.46 Feb 12 2013 Alexander Nalobin - Fixed TJ web whois (broken html) 2.45 Jan 31 2013 Alexander Nalobin - Using whois.netcom.cm for CM instead of web whois - TV whois server updated - BZ web whois updated - MU, IN, CN web whois removed 2.44 Jan 11 2013 Alexander Nalobin - IPv6 whois support with Regexp::IPv6 2.43 Aug 21 2012 gleecology - IPv6 whois support 2.42 Jul 11 2012 Alexander Nalobin - utf8 encoding fix 2.41 Mar 14 2012 Timur Nozadze - Case-insensitive match for "not found" messages 2.40 Jan 31 2012 Alex Bykov - Now you can redefine SOCK_CLASS::getline method as you want - require_once for Data::Dumper 2.39 Dec 26 2011 Walery Studennikov - internet tests updated - Net::Whois::Raw::Data addons / updates, thanx to Guillaume 2.38 Dec 09 2011 Walery Studennikov - Confess instead of die to simplify error tracing 2.37 Nov 24 2011 Walery Studennikov - Fixed whois server address for *.ua domains 2.36 Oct 25 2011 Ilya Chesnokov - Fixed regexp for .PRO whois check 2.35 Sep 06 2011 Ilya Chesnokov - Added whois server for .XXX zone - Fixed BZ whois (restored whois.belizenic.bz server) 2.34 Aug 01 2011 Ilya Chesnokov - Added whois server for .IN.UA zone 2.33 Jul 29 2011 Ilya Chesnokov - Added whois server for .CO.UA zone 2.32 May 19 2011 Timur Nozadze - Deleted whitespaces removing from the whois result 2.31 Feb 28 2011 Ilya Chesnokov - Added whois server for .SO zone 2.30 Feb 09 2011 Walery Studennikov - confess -> die :: no need to die such verbosely 2.29 Jan 31 2011 Walery Studennikov - Further migration from whois.relcom.ru to whois.nic.ru 2.28 Jan 24 2011 Walery Studennikov - whois.relcom.ru is no more. Using whois.nic.ru instead. - Removed crutches for whois.relcom.ru / www_whois 2.27 Nov 11 2010 Timur Nozadze - Added domain name validation in pwhois - Updated some 'not found' string 2.26 Oct 06 2010 Timur Nozadze - Fixed problem with passing server parameter from command line in pwhois - Fixed problem with encoding detection in pwhois on Windows - Added convertation to punycode in pwhois 2.25 Sep 02 2010 Ilya Chesnokov - And then again to www_whois (but to another URL) 2.24 Sep 01 2010 Ilya Chesnokov - For .BZ domains whois server changed from www_whois to whois.belizenic.bz 2.23 Aug 25 2010 Walery Studennikov - Fixed problem with tests for .TJ domains 2.22 Apr 26 2010 Walery Studennikov - Fixed $CACHE_TIME parameter documentation - Fixed .CM zone processing - Added real whois server for .KG zone 2.21 Apr 20 2010 Ilya Chesnokov - Added whois servers for zones: .MD, .GD, .HT, .IM, .KI, .LC, .TRAVEL, .FM, .CO - Fixed whois servers for zones: .LA, .SB, .VN - Fixed %strip hash for .CX, .MU, .NL, .TL - Added .CM zone 2.20 Apr 01 2010 Walery Studennikov - $Net::Whois::Raw::USE_CNAMES option removed (who needs it??) - Crutch for rechecking RELCOM-domains through WWW - added 'not found' string for .kg domains 2.19 Mar 26 2010 Walery Studennikov - Exceed patterns updated for whois.eu - Fixed whois_config (CHECK_EXCEED support) 2.18 Mar 25 2010 Walery Studennikov - Coro tests are turned off by default 2.17 Feb 24 2010 Roman V. Nikolaev - external hooks support: whois_query_sockparams, whois_query_socket, whois_query_ua 2.16 Feb 24 2010 Alexander Ponomarev - fixed 'www whois' test 2.15 Feb 1 2010 Andrey Suslov - added more tests to MANIFEST 2.14 Feb 1 2010 Andrey Suslov - search DNS-servers in .org, .biz, .name zones through a whois-server of appropriate zone 2.13 Jan 17 2010 Andrey Suslov - fixed 'v-string' portability warning (Ticket https://rt.cpan.org/Public/Bug/Display.html?id=53084) 2.12 Dec 8 2009 Walery Studennikov - now we require perl 5.8.1 and Encode 2.11 Dec 1 2009 David T Dzhanaev - fixed 02-internet.t tests broken when no connection (Ticket https://rt.cpan.org/Public/Bug/Display.html?id=41712) - fixed Cache broken in taint mode (Ticket https://rt.cpan.org/Public/Bug/Display.html?id=47216) 2.10 Nov 30 2009 David T Dzhanaev - fixed -A param in pwhois (Ticket https://rt.cpan.org/Public/Bug/Display.html?id=52144) 2.09 Nov 26 2009 David T Dzhanaev - support geographic domains for .RU and .SU zones 2.08 Nov 24 2009 David T Dzhanaev - multiple ccTLD zones added - fixed case-sensitive search for an appropriate whois 2.07 Nov 24 2009 Walery Studennikov - support for cyrillic .RF domain - fixes for multilingual TLDs 2.06 Oct 22 2009 Ilya Chesnokov - added internal answer postprocessing 2.05 Sep 21 2009 Ilya Chesnokov, Vadim Likhota - fix for .MN zone - fixes for COM.UA ORG.UA KIEV.UA BIZ.UA zones - add zone PP.UA 2.04 Sep 16 2009 Walery Studennikov - Support for list of whois servers which has no idn support 2.03 Sep 10 2009 Andrey Kuzmin - add five zones: COM.UA ORG.UA KIEV.UA BIZ.UA NOV.RU 2.02 Aug 28 2009 - fix for twocows (by DAVINCHI) - fix for "perl spits out an error if $res_srv is undefined" (by Ian Stuart) 2.01 May 14 2009 Walery Studennikov - support exceed pattern for .ws 2.00 Mar 31 2009 Walery Studennikov, Vadim Likhota - core now uses unicode (MAJOR CHANGE!!!!) - all the data in Net::Whois::Raw::Data are counterchecked - duplicating 'strip_whois' and 'check_existance' functions are deleated from Net::Whois::Raw::Common, now only the data from Net::Whois::Raw::Data are used instead of them - now flags OMIT_MSG and CHECK_FAIL supports only true and false values. Support for OMIT_MSG == 2 and CHECK_FAIL == 2 was dropped. - fixes for .CN and .VN domains 1.67 Mar 30 2009 Alexey Sharipov - fixed caching issues 1.66 Mar 26 2009 Walery Studennikov - fixed tests 1.65 Mar 25 2009 Walery Studennikov - add whois server for .TEL domains - SPB.RU and MSK.RU zones are removed from www_whois 1.64 Feb 25 2009 Vadim Likhota, Walery Studennikov - add www.nic.tj whois via www_whois_query (now whois.nic.tj not work) 1.63 Feb 09 2009 Walery Studennikov - turn off test for www_whois_query for 'nic.ac'. It fails too often 1.62 Feb 04 2009 Walery Studennikov - fixed getting whois info via HTTP from nic.ac 1.61 Jan 27 2009 Vadim Likhota, Walery Studennikov - add whois.nic.name for .NS query for .name domains in addition for whois.nsiregistry.net - add Test::More to module requirements - add colourable user agent to satisfy http://nic.ac/ 1.60 Nov 14 2008 Walery Studennikov - pwhois script rewritten (use Getopt::Long) - small bugfixes + code layout foxes 1.59 Nov 14 2008 ivan baktsheev - now client can offer his own dns resolver and smart local socket selection - added option to change default socket - added "banned" message from internic 1.58 Nov 07 2008 Walery Studennikov - Added .BZ support (www_whois) 1.57 Aug 11 2008 Walery Studennikov - Removed annoying warning from Net/Whois/Raw.pm 1.56 Jul 31 2008 Pavel Odintsov - .vn support fixed - HTTP POST requests fixed 1.54 Jun 28 2008 Matsui Shinsuke - .ac support added 1.53 Mar 31 2008 Sergey Kotenko - fixed warnings on cache writing 1.52 Mar 26 2008 Walery Studennikov - .asia support added 1.51 Mar 12 2008 Sergey Kotenko - test 02-internet.t fixed to work correctly on MS Windows. 1.50 Mar 11 2008 Sergey Kotenko - version bounce due to a large refactoring - some more code moved to Net::Whois::Raw::Common - new caching mechanism - tests writen for Net::Whois::Raw::Common - tests writen for checking the correctness of whois-servers 1.43 Feb 29 2008 Sergey Kotenko - common code moved to Net::Whois::Raw::Common. Can be used by other modules. 1.42 Feb 25 2008 Sergey Kotenko - added whois server (http) for .VN 1.41 Feb 08 2008 Sergey Kotenko - added %Net::Whois::Raw::POSTPROCESS 1.40 Feb 04 2008 Sergey Kotenko - fixed parsing of excessive querying for whois.ripn.net 1.39 Nov 22 2007 Walery Studennikov - added strip patterns for whois.nordnet.net 1.38 Nov 21 2007 Walery Studennikov - added strip patterns for whois.dotster.com 1.37 Nov 20 2007 Walery Studennikov - added strip patterns for whois.godaddy.com, whois.paycenter.com.cn, whois.enom.com 1.36 Nov 15 2007 Walery Studennikov - update documentation (setup variables description) - change "use vars" to "our" in Net::Whois::Raw::Data - start to build postprocessing framework (added %Net::Whois::Raw::Data::postprocess) 1.35 Nov 06 2007 Walery Studennikov - strip copyright notices for .mobi domains 1.33 Oct 10 2007 Walery Srudennikov - added whois servers for many CentralNIC TLDs in New::Whois::Raw::Data 1.32 Sep 07 2007 Walery Srudennikov - added support for WHOIS requests for any object (not only for domain), for example, WHOIS requests for registrars now supported 1.31 Sep 06 2007 Walery Studennikov - fexes in pwhois caused by today's module changes 1.30 Sep 06 2007 Walery Studennikov - Carp::confess instead of die when can't connect - Don't use Exporter anymore; revised export list (can cause some incompatibilities, so version number bumped) 1.24 Aug 15 2007 Walery Studennikov - More descriptive error message when can't create socket 1.23 May 22 2007 - Added $DEBUG initialization (Walery Studennikov) - Path for obtaining complete WHOIS info for .name domains (Yulia Shtyrjakova) 1.22 May 16 2007 Walery Studennikov - Removed legacy RACE encoding support - Default cache time set to 60 minutes - Fixed timeout behaviour. Now timeouts are more robust (Ticket http://rt.cpan.org/Ticket/Display.html?id=27097) - Small refactoring 1.21 Apr 13 2007 Danil Krivopustov - fixes for Net::Whois::Raw::Data 1.20 Nov 18 2006 Walery Studennikov - !INTERFACE CHANGE: CACHE_TIME now specifies time in minutes, not in hours. Hours are too rough for some applications. Sorry :( - Bumped version number for the above reason 1.14 Aug 24 2006 Doug Barton - Addons to Net::Whois::Raw::Data 1.13 Aug 20 2006 Doug Barton - Addons + restyling of Net::Whois::Raw::Data 1.12 Aug 16 2006 Roman Filippov - changed whois server for .gs 1.11 Aug 10 2006 - changed whois server for .aero (Danil Krivopustov) - added fail check for whois.melbourneit.com (Yulia Shtyrjakova) 1.10 Jul 30 2006 K. J. Cheetham - addons to %Net::Whois::Raw::Data::exceed hash 1.09 Jul 27 2006 Reto Grossenbacher - fixed strip patterns for yesterday's changes 1.08 Jul 26 2006 Reto Grossenbacher - changed WHOIS servers for .CH and .LI domains 1.07 Apr 12 2006 Martin Lee - replaced .JP whois server address 1.06 Apr 03 2006 Walery Studennikov - fix manual page for pwhois script 1.05 Apr 03 2006 Walery Studennikov - added new options to pwhois script 1.04 Mar 22 2006 Bram - added whois.eu server 1.03 Mar 21 2006 David Parry - change whois server name for .CA 1.02 Feb 04 2006 Walery Studennikov - change version numbering scheme - change pynycode names of IDN names 1.1.2 Jan 18 2006 Walery Studennikov - switch .spb.ru and .msk.ru to HTTP 1.1.1 Jan 18 2006 Walery Studennikov - fix WHOIS-over-HTTP: added missing function koi2win, 1.1.0 Jan 16 2006 Walery Studennikov - improved obtaining WHOIS of IP addresses. Patterns for recursive WHOIS queries were borrowed from Net::Whois::IP. Many thanks to Net::Whois::IP author Ben Schmitz 1.0.1 Jan 13 2006 Danil Krivopustov - fixed obtaining WHOIS of IP addresses (split_domname function) 1.0.0 Jan 11 2006 Walery Studennikov - new major release: added obtaining WHOIS results via HTTP: now .IN and .KZ domains are queried via HTTP by default. To force querying other domain via HTTP you should provide server name 'www_whois' 0.99 Jan 10 2006 Walery Studennikov - added whois server for .KZ 0.98 Sep 19 2005 Bernd Ahlers - small typo fixes 0.97 Jul 26 2005 Bernd Ahlers - update for DENIC whois server 0.96 Jun 28 2005 Walery Studennikov - ??? 0.95 May 16 2005 Walery Studennikov - new parameter "-a" (source ip address) in pwhois script 0.94 Apr 26 2005 Marc Jauvin - TIMEOUT implementation fix 0.93 Apr 13 2005 Walery Studennikov - updated WHOIS server for AU zone 0.92 Mar 28 2005 Walery Studennikov - new fail check patterns 0.91 Mar 04 2005 Walery Studennikov - fixed bug (introduced in v0.90) that caused fault of DNS server whois queries - new test for DNS servers whois 0.90 Mar 03 2005 Walery Studennikov - total rewrite / restructuring of module - new exported function: get_whois 0.43 Feb 04 2005 Walery Studennikov - new options (exported variables): @SRC_IPS, $CHECK_EXCEED 0.42 Jan 11 2005 Sun Guonian - update hostname of CN whois server 0.41 Dec 17 2004 Luis Moreno - fix caching when using a particular whois server in whois function 0.40 Dec 09 2004 Walery Studennikov - add fail pattern for whois.dns.be 0.39 Oct 29 2004 Walery Studennikov - more fixes for Raw.pm that ensures that we do not get confused when looking up a domain which has many entries in the whois database (for WHOIS.CRSNIC.NET) 0.38 Sep 23 2004 Walery Studennikov - fixed recursive whois requests for .ws domains - strip patterns for whois.directnic.com - fix strip mechanism in case of recusive whois requests 0.37 Aug 11 2004 Walery Studennikov - fixed recursive whois requests for .tv domains 0.36 Jul 22 2004 Richard Poole - fix for Raw.pm that ensures that we do not get confused when looking up a domain which has many entries in the whois database (for WHOIS.CRSNIC.NET) 0.35 Jun 29 2004 Walery Studennikov - fix of regexp pattern in check_existance 0.34 May 18 2004 Richard Poole - new whois server in Data.pm - whois.centralnic.com 0.33 Apr 21 2004 Walery Studennikov - new whois server in Data.pm - whois.regtime.net 0.32 Apr 07 2004 IVAN - small fix allows the module to work under 5.005 0.31 Mar 19 2004 Walery Studennikov - more robust recursive whois queries 0.30 Mar 15 2004 Walery Studennikov - added strip rules for whois.dns.be 0.29 Feb 24 2004 Walery Studennikov - fixed extra rules which strips the copyright message or disclaimer - removed pwhois.PL. "pwhois" is shipped now instead. - data structures in Net/Whois/Raw/Data.pm reformatted - new strip patterns for whois.crsnic.net 0.28 Feb 20 2004 Alex Kapranoff - fixed documentation for pwhois.PL 0.27 Feb 10 2004 Alex Kapranoff - patch to check availability of .info and .biz domains 0.26 Jan 09 2004 Walery Studennikov - added recursive whois requests for .cc domains - fixed recursive whois requests for whois.crsnic.net 0.25 Nov 21 2003 Walery Studennikov - fixed multilingual domains whois via whois.melbourneit.com server - whois_config function for setting config variables (if setting imported variables $OMIT_MSG, $CHECK_FAIL etc. doesn't work for some reason, for example because of namespace problems in mod_perl scripts) 0.24 Nov 18 2003 Walery Studennikov - fixed whois server for .org domains and add new whois servers for multilingual domains - fixed recursive whois requests for .org domains - new fail-check and strip patterns added - more verbose error messages - added support for third level domains - some bugfixes 0.23 Mar 25 2003 - only exports &whois by default, the other variables are exportable still. - incorporated new whois servers ( thanks Toni Mueller ) - now tests the main tlds - added some more regexen to strip out disclaimers and such ( for $OMIT_MSG > 2 ). - moved %servers to %Net::Whois::Raw::Data::servers 0.01 Jul 05 2000 - original version; created by h2xs 1.19 META.yml100644001750001750 233715037672667 16060 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042--- abstract: 'Get Whois information of domains and IP addresses.' author: - 'Alexander Nalobin ' build_requires: File::Temp: '0' Socket: '0' Test::More: '0' Test::RequiresInternet: '0' configure_requires: ExtUtils::MakeMaker: '0' dynamic_config: 0 generated_by: 'Dist::Zilla version 6.032, CPAN::Meta::Converter version 2.150010' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: '1.4' name: Net-Whois-Raw requires: Carp: '0' Data::Dumper: '0' Encode: '0' File::Temp: '0' Getopt::Long: '0' HTTP::Headers: '0' HTTP::Request: '0' IO::Socket::IP: '0' LWP::UserAgent: '0' Net::IDN::Punycode: '0' Regexp::IPv6: '0' URI::URL: '0' perl: 5.008_001 strict: '0' utf8: '0' warnings: '0' resources: bugtracker: https://github.com/regru/Net-Whois-Raw/issues repository: git://github.com/regru/Net-Whois-Raw.git version: '2.99042' x_contributors: - 'Ariel Brosh ' - 'Gabor Szabo ' - 'Corris Randall ' - 'Walery Studennikov ' x_generated_by_perl: v5.38.2 x_serialization_backend: 'YAML::Tiny version 1.74' x_spdx_expression: 'Artistic-1.0-Perl OR GPL-1.0-or-later' MANIFEST100644001750001750 110015037672667 15723 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042# This file was automatically generated by Dist::Zilla::Plugin::Manifest v6.032. COPYRIGHT Changes LICENSE MANIFEST META.json META.yml Makefile.PL README bin/pwhois dist.ini lib/Net/Whois/Raw.pm lib/Net/Whois/Raw/Common.pm lib/Net/Whois/Raw/Data.pm maintain/pwhois-maintain.pl maintain/pwhois-maintain/func.js maintain/pwhois-maintain/index.html maintain/pwhois-maintain/logic.js t/01-local.t t/02-www_parse_tj_cgi_whois.t t/03-read_write_cache.t t/04-qrycache.t t/all_tlds.pl t/author-pod-spell.t t/coro-domains.pl t/example-domains-load-balancing.pl t/internet.pl t/ipv6.pl dist.ini100644001750001750 166315037672667 16254 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042name = Net-Whois-Raw author = Alexander Nalobin license = Perl_5 copyright_holder = Alexander Nalobin copyright_year = 2002-2025 version = 2.99042 [Metadata] ; Names also used by Test::PodSpelling x_contributors = Ariel Brosh x_contributors = Gabor Szabo x_contributors = Corris Randall x_contributors = Walery Studennikov [@Filter] -bundle = @Basic -remove = Readme -remove = GatherDir [AutoPrereqs] skip = Win32API::Registry skip = DBI [Prereqs] File::Temp = 0 [ExecDir] [PodWeaver] [PkgVersion] [TestRelease] [Test::PodSpelling] stopword = ip stopword = ips stopword = jwhois stopword = params stopword = pwhois stopword = punycode stopword = TLDs stopword = WHOIS stopword = SRV stopword = whois [ConfirmRelease] [UploadToCPAN] [GitHub::Meta] repo = regru/Net-Whois-Raw [MetaJSON] [GatherDir] exclude_filename = maintain/new-gtlds.html META.json100644001750001750 416215037672667 16226 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042{ "abstract" : "Get Whois information of domains and IP addresses.", "author" : [ "Alexander Nalobin " ], "dynamic_config" : 0, "generated_by" : "Dist::Zilla version 6.032, CPAN::Meta::Converter version 2.150010", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : 2 }, "name" : "Net-Whois-Raw", "prereqs" : { "configure" : { "requires" : { "ExtUtils::MakeMaker" : "0" } }, "develop" : { "requires" : { "Test::Spelling" : "0.17" } }, "runtime" : { "requires" : { "Carp" : "0", "Data::Dumper" : "0", "Encode" : "0", "File::Temp" : "0", "Getopt::Long" : "0", "HTTP::Headers" : "0", "HTTP::Request" : "0", "IO::Socket::IP" : "0", "LWP::UserAgent" : "0", "Net::IDN::Punycode" : "0", "Regexp::IPv6" : "0", "URI::URL" : "0", "perl" : "5.008_001", "strict" : "0", "utf8" : "0", "warnings" : "0" } }, "test" : { "requires" : { "File::Temp" : "0", "Socket" : "0", "Test::More" : "0", "Test::RequiresInternet" : "0" } } }, "release_status" : "stable", "resources" : { "bugtracker" : { "web" : "https://github.com/regru/Net-Whois-Raw/issues" }, "repository" : { "type" : "git", "url" : "git://github.com/regru/Net-Whois-Raw.git", "web" : "https://github.com/regru/Net-Whois-Raw" } }, "version" : "2.99042", "x_contributors" : [ "Ariel Brosh ", "Gabor Szabo ", "Corris Randall ", "Walery Studennikov " ], "x_generated_by_perl" : "v5.38.2", "x_serialization_backend" : "Cpanel::JSON::XS version 4.37", "x_spdx_expression" : "Artistic-1.0-Perl OR GPL-1.0-or-later" } COPYRIGHT100644001750001750 36415037672667 16060 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042Copyright 2003-2009 Walery Studennikov Copyright 2003-2003 Corris Randall Copyright 2003-2003 Gabor Szabo Copyright 2000-2002 Ariel Brosh This package is free software. You may redistribute it or modify it under the same terms as Perl itself. t000755001750001750 015037672667 14705 5ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042ipv6.pl100644001750001750 41715037672667 16250 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/tuse strict; use warnings; use Test::RequiresInternet; use Test::More tests => 2; use_ok 'Net::Whois::Raw'; # this test requires ipv6 connection like eval{ whois( '2606:2800:220:1:248:1893:25c8:1946', '2001:500:31::46' ) }, qr/ARIN/, 'ipv6 connection to whois server'; bin000755001750001750 015037672667 15212 5ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042pwhois100755001750001750 1622315037672667 16635 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/bin#!/usr/bin/env perl # PODNAME: pwhois # ABSTRACT: Get Whois information of domains and IP addresses. use strict; use warnings; use Net::Whois::Raw; use Getopt::Long; use Encode; use Net::IDN::Punycode qw( :all ); use utf8; my $help; my $do_strip; my $do_strip_more; my $do_checkfail; my $do_checkfail_more; my $debug = 0; my $timeout = 10; my $enable_caching; my @source_addresses; my $return_first; my $return_last; my $return_all; Getopt::Long::Configure( 'bundling', 'no_ignore_case' ); GetOptions( 'help|h' => \$help, 'strip|s' => \$do_strip, 'checkfail|c' => \$do_checkfail, 'debug|d+' => \$debug, 'timeout|T=i' => \$timeout, 'enable_caching|t' => \$enable_caching, 'src_addr|a=s@' => \@source_addresses, 'return_first|F' => \$return_first, 'return_last|L' => \$return_last, 'return_all|A' => \$return_all, ) or die; if ( $help || !@ARGV ) { print q{ Usage: $0 [ -s ] [ -c ] [ -d ] [ -T ] [ -a ] [ -t ] [ -F | -L | -A ] [ ] Switches: -s attempt to strip the copyright message or disclaimer. -c attempts to return an empty answer for failed searches. -T set timeout for connection attempts -t enables caching. -a specify an ip address that should be used as source address -d enables debugging messages. -F returns results of the first query of recursive whois requests -L returns results of the last query of recursive whois requests (the default) -A returns results of the all queries of recursive whois requests }; exit; } $Net::Whois::Raw::DEBUG = $debug; $Net::Whois::Raw::OMIT_MSG = $do_strip ? 1 : 0; $Net::Whois::Raw::CHECK_FAIL = $do_checkfail ? 1 : 0; $Net::Whois::Raw::TIMEOUT = $timeout; @Net::Whois::Raw::SRC_IPS = @source_addresses if @source_addresses; if ( $enable_caching ) { if ( $^O eq 'MSWin32' ) { $Net::Whois::Raw::CACHE_DIR = $ENV{TEMP} || "C:\\temp"; } else { $Net::Whois::Raw::CACHE_DIR = $ENV{TMPDIR} || '/tmp'; } } else { $Net::Whois::Raw::CACHE_DIR = undef; } my ( $input_cp, $output_cp ) = detect_encodings(); my ( $query, $server ) = @ARGV; $query = decode_query( $query, $input_cp ); # Split domain name and optional part prepended by '?' character. my ( $dname, $options ) = split /[?]/, $query; unless ( validate_domain_name( $dname ) ) { print encode_output( "\nIncorrect dname:\n$dname\n", $output_cp ); exit -1; } $query = to_punycode( $dname ); $query .= '?' . $options if defined $options; my ( $result, $result_server ); my $which_whois = $return_first ? 'QRY_FIRST' : $return_all ? 'QRY_ALL' : 'QRY_LAST'; eval { ( $result, $result_server ) = Net::Whois::Raw::get_whois( $query, $server, $which_whois ); 1; } or do { my $err = $@; $err =~ s/\s+at \S+ line \d+\.$//; print "\nWhois information could not be fetched:\n$err\n"; exit -1; }; if ( $result && ref $result eq 'ARRAY' ) { make_output( $_->{text}, $_->{srv}, $output_cp ) for @$result; } elsif ( $result ) { make_output( $result, $result_server, $output_cp ); } else { print STDERR "Failed.\n"; } # Prepare and print output sub make_output { my ( $result, $server, $cp ) = @_; $result = encode_output( $result, $cp ); print "[$server]\n", $result, "\n"; } # Encode output sub encode_output { my ( $output, $cp ) = @_; if ( $cp =~ /utf\-?8/ ) { $output = encode_utf8( $output ); } else { $output = encode( $cp, $output ); } return $output; } # Detect terminal input and output encodings sub detect_encodings { my ( $input_cp, $output_cp ); if ( $^O =~ /Win/ ) { # Read encoding from registry require Win32API::Registry; Win32API::Registry->import( qw( :ALL ) ); my ( $key, $type, $data ); RegOpenKeyEx( HKEY_LOCAL_MACHINE(), 'SYSTEM\\CurrentControlSet\\Control\\Nls\\CodePage', 0, KEY_READ(), $key ) or die "Can't read system encodings from registry: " . regLastError(); RegQueryValueEx( $key, 'ACP', [], $type, $data, [] ) or die "Can't read system encodings from registry: " . regLastError(); $input_cp = 'cp' . $data; RegQueryValueEx( $key, 'OEMCP', [], $type, $data, [] ) or die "Can't read system encodings from registry: " . regLastError(); $output_cp = 'cp' . $data; } else { # Read encoding from environment my $cp = $ENV{LANG}; if ( $cp ) { $cp =~ s/^[a-z]{2}_[A-Z]{2}[.]//; } else { $cp = 'utf-8'; } $input_cp = $output_cp = lc $cp; } return $input_cp, $output_cp; } sub decode_query { my ( $query, $input_cp ) = @_; $query = decode( $input_cp, $query ); # Lowercase latin and cyrillic characters $query =~ tr/A-ZА-ЯЁ\xAA\xA5\xB2\xAF/a-zа-яё\xBA\xB4\xB3\xBF/; return $query; } # Decode domain name to punycode if needed sub to_punycode { my ( $dname ) = @_; return $dname if $dname =~ /^[a-z0-9.\-]*$/; return join '.', map { /^[a-z0-9.-]*$/ ? $_ : 'xn--' . Net::IDN::Punycode::encode_punycode( $_ ) } split /[.]/, $dname; } sub validate_domain_name { my ( $dname ) = @_; return 0 unless $dname; $dname =~ /(.+?)\.([^.]+)$/; my ( $name, $tld ) = ( $1, $2 ); # query with tld only return 1 unless $name; return 0 if $name =~ /^-/; return 0 if $name =~ /-$/; return 0 if $name =~ /^..--/ && $dname !~ /^xn--/; # Only latin and cyrillic characters allowed now # return 0 if $dname =~ m/[^-a-z0-9\.ёа-я\xAA\xBA\xB4\xB2\xB3\xAF\xBF\xA1\xA2]/; return 1; } __END__ =pod =encoding UTF-8 =head1 NAME pwhois - Get Whois information of domains and IP addresses. =head1 VERSION version 2.99042 =head1 SYNOPSIS pwhois perl.com pwhois gnu.org pwhois -s police.co.il pwhois -c there.is.no.tld.called.foobar pwhois yahoo.com whois.networksolutions.com pwhois -T 10 funet.fi etc etc..... =head1 DESCRIPTION Just invoke with a domain name, optionally with a whois server name. Switches: B<-s> attempt to strip the copyright message or disclaimer. B<-c> attempts to return an empty answer for failed searches. B<-e> forces die if connection rate to server have been exceeded. B<-T> set timeout for connection attempts B<-t> enables caching. B<-a> specify an ip address that should be used as source address B<-d> enables debugging messages. B<-F> returns results of the first query of recursive whois requests B<-L> returns results of the last query of recursive whois requests (the default) B<-A> returns results of the all queries of recursive whois requests =head1 NAME pwhois - Perl written whois client =head1 AUTHORS Ariel Brosh B Walery Studennikov B Current Maintainer: Alexander Nalobin B =head1 SEE ALSO L. =head1 AUTHOR Alexander Nalobin =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2002-2025 by Alexander Nalobin. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut Makefile.PL100644001750001750 350715037672667 16561 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v6.032. use strict; use warnings; use 5.008001; use ExtUtils::MakeMaker; my %WriteMakefileArgs = ( "ABSTRACT" => "Get Whois information of domains and IP addresses.", "AUTHOR" => "Alexander Nalobin ", "CONFIGURE_REQUIRES" => { "ExtUtils::MakeMaker" => 0 }, "DISTNAME" => "Net-Whois-Raw", "EXE_FILES" => [ "bin/pwhois" ], "LICENSE" => "perl", "MIN_PERL_VERSION" => "5.008001", "NAME" => "Net::Whois::Raw", "PREREQ_PM" => { "Carp" => 0, "Data::Dumper" => 0, "Encode" => 0, "File::Temp" => 0, "Getopt::Long" => 0, "HTTP::Headers" => 0, "HTTP::Request" => 0, "IO::Socket::IP" => 0, "LWP::UserAgent" => 0, "Net::IDN::Punycode" => 0, "Regexp::IPv6" => 0, "URI::URL" => 0, "strict" => 0, "utf8" => 0, "warnings" => 0 }, "TEST_REQUIRES" => { "File::Temp" => 0, "Socket" => 0, "Test::More" => 0, "Test::RequiresInternet" => 0 }, "VERSION" => "2.99042", "test" => { "TESTS" => "t/*.t" } ); my %FallbackPrereqs = ( "Carp" => 0, "Data::Dumper" => 0, "Encode" => 0, "File::Temp" => 0, "Getopt::Long" => 0, "HTTP::Headers" => 0, "HTTP::Request" => 0, "IO::Socket::IP" => 0, "LWP::UserAgent" => 0, "Net::IDN::Punycode" => 0, "Regexp::IPv6" => 0, "Socket" => 0, "Test::More" => 0, "Test::RequiresInternet" => 0, "URI::URL" => 0, "strict" => 0, "utf8" => 0, "warnings" => 0 ); unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) { delete $WriteMakefileArgs{TEST_REQUIRES}; delete $WriteMakefileArgs{BUILD_REQUIRES}; $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs; } delete $WriteMakefileArgs{CONFIGURE_REQUIRES} unless eval { ExtUtils::MakeMaker->VERSION(6.52) }; WriteMakefile(%WriteMakefileArgs); 01-local.t100644001750001750 766415037672667 16557 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/t#!/usr/bin/env perl use strict; use warnings; use Test::More tests => 29; use_ok 'Net::Whois::Raw'; use_ok 'Net::Whois::Raw::Common'; ok( Net::Whois::Raw::Common::domain_level( 'reg.ru' ) == 2, 'domain_level' ); ok( Net::Whois::Raw::Common::domain_level(' www.reg.ru' ) == 3, 'domain_level' ); my ($name, $tld) = Net::Whois::Raw::Common::split_domain( 'reg.ru' ); ok( $name eq 'reg' && $tld eq 'ru', 'split_domain' ); ($name, $tld) = Net::Whois::Raw::Common::split_domain( 'REG.RU' ); ok( $name eq 'REG' && $tld eq 'RU', 'split_domain'); ($name, $tld) = Net::Whois::Raw::Common::split_domain( 'auto.msk.ru' ); ok( $name eq 'auto' && $tld eq 'msk.ru', 'split_domain' ); ok( Net::Whois::Raw::Common::is_ipaddr( '122.234.214.214' ), 'is_ipaddr' ); ok( !Net::Whois::Raw::Common::is_ipaddr( 'a22.b34.214.214' ), 'is_ipaddr' ); ok( Net::Whois::Raw::Common::is_ip6addr( '2002::2eb6:195b' ), 'is_ip6addr' ); ok( !Net::Whois::Raw::Common::is_ip6addr( '2002::2eb6:195g' ), 'is_ip6addr' ); ok( Net::Whois::Raw::Common::is_ip6addr( '::ffff:c000:0280' ), 'is_ip6addr (ipv4)' ); ok( Net::Whois::Raw::Common::get_dom_tld( '125.214.84.1' ) eq 'IP', 'get_dom_tld' ); ok( Net::Whois::Raw::Common::get_dom_tld( 'REGRU-REG-RIPN' ) eq 'NOTLD', 'get_dom_tld' ); ok( Net::Whois::Raw::Common::get_dom_tld( 'yandex.ru' ) eq 'ru', 'get_dom_tld' ); ok( Net::Whois::Raw::Common::get_dom_tld( 'auto.msk.ru' ) eq 'msk.ru', 'get_dom_tld' ); ok( Net::Whois::Raw::Common::get_real_whois_query( 'sourceforge.net', 'whois.crsnic.net' ) eq 'domain sourceforge.net', 'get_real_whois_query' ); ok( Net::Whois::Raw::Common::get_real_whois_query( 'mobile.de', 'whois.denic.de' ) eq '-T dn,ace -C ISO-8859-1 mobile.de', 'get_real_whois_query' ); ok( Net::Whois::Raw::Common::get_real_whois_query( 'nic.name', 'whois.nic.name' ) eq 'domain=nic.name', 'get_real_whois_query' ); ok( Net::Whois::Raw::Common::get_real_whois_query( 'reg.ru', 'whois.ripn.net' ) eq 'reg.ru', 'get_real_whois_query' ); is( Net::Whois::Raw::Common::get_server( 'reg.ru' ), 'whois.ripn.net', 'get_server' ); is( Net::Whois::Raw::Common::get_server( 'nic.vn' ), 'www_whois', 'get_server' ); is( Net::Whois::Raw::Common::get_server( undef, undef, 'spb.ru' ), 'whois.flexireg.net', 'get_server' ); for ('ReferralServer: rwhois://rwhois.theplanet.com:4321') { my ($res) = Net::Whois::Raw::_referral_server(); is $res, 'rwhois.theplanet.com:4321', "_referral_server should work for rwhois:// and port"; } for ('ReferralServer: whois://some-host.com') { ok $_ =~ /ReferralServer: whois:\/\/([-.\w]+)/, "this test example match regexp used in previous versions of module"; my ($res) = Net::Whois::Raw::_referral_server(); is $res, 'some-host.com', "_referral_server should work for whois:// without port"; } is Net::Whois::Raw::Common::_strip_trailer_lines( q{ blah-blah-blah >>> Last update of WHOIS database: 2014-02-24T04:01:25-0800 <<< The Data in MarkMonitor.com's WHOIS database is provided by MarkMonitor.com for } ), "\nblah-blah-blah\n", '_strip_trailer_lines'; is Net::Whois::Raw::Common::_strip_trailer_lines( q{ Record created on 24-Sep-1998 Database last updated on 12-Sep-2013 The Data in the Safenames Registrar WHOIS database is provided by Safenames for information purposes only, and to assist persons in obtaining information about or related to a domain name registration record. Safenames does not guarantee its accuracy. Additionally, the data may not reflect updates to billing contact information.} ), "\nRecord created on 24-Sep-1998\n", '_strip_trailer_lines'; is Net::Whois::Raw::Common::_strip_trailer_lines( q{ Domain Last Updated Date: Sat Jun 04 15:25:01 GMT 2011 >>>> Whois database was last updated on: Mon Feb 24 12:49:50 GMT 2014 <<<< NeuStar, Inc., the Registry Operator for .BIZ, has collected this information} ), "\nDomain Last Updated Date: Sat Jun 04 15:25:01 GMT 2011\n", '_strip_trailer_lines'; internet.pl100644001750001750 316515037672667 17237 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/t#!/usr/bin/perl -w use strict; use warnings; use Data::Dumper; use Test::RequiresInternet; use Test::More tests => 10; use_ok 'Net::Whois::Raw'; $Net::Whois::Raw::CHECK_FAIL = 1; $Net::Whois::Raw::OMIT_MSG = 1; $Net::Whois::Raw::CHECK_EXCEED = 1; my @domains = qw( yahoo.com freebsd.org reg.ru ns1.nameself.com.NS XN--C1AD6A.XN--P1AI ); # registrars like whois( 'REGRU-RU', 'whois.ripn.net' ), qr/www.reg.ru/; # domains for my $domain ( @domains ) { my $txt = whois( $domain ); $domain =~ s/.NS$//i; ok $txt && $txt =~ /$domain/i, "$domain resolved"; } no warnings; $Net::Whois::Raw::CHECK_FAIL = 0; $Net::Whois::Raw::OMIT_MSG = 0; $Net::Whois::Raw::CHECK_EXCEED = 0; my $whois = whois( 'reg.ru' ); my ( $processed ) = Net::Whois::Raw::Common::process_whois( 'reg.ru', 'whois.ripn.net', $whois, 2, 2, 2 ); ok length( $processed ) < length( $whois ) && $processed =~ /reg\.ru/, 'process_whois'; # Net::Whois::Raw::Common::write_to_cache my $test_domain = 'google.com'; my $tmp_dir; if ( $^O =~ /mswin/i ) { $tmp_dir = $ENV{TEMP} . '\net-whois-raw-common-test-' . time; } else { $tmp_dir = '/tmp/net-whois-raw-common-test-' . time; } my $cache_file = "$tmp_dir/$test_domain.00"; $Net::Whois::Raw::CACHE_DIR = $tmp_dir; $whois = whois( $test_domain, undef, 'QRY_FIRST' ); ok -e $cache_file, 'write_to_cache'; # Net::Whois::Raw::Common::get_from_cache open my $cache, '>>', $cache_file; print $cache 'net-whois-raw-common-test'; close $cache; like whois( $test_domain, undef, 'QRY_FIRST' ), qr/net-whois-raw-common-test/s, 'get_from_cache'; unlink <$tmp_dir/*>; rmdir $tmp_dir; all_tlds.pl100644001750001750 372115037672667 17203 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/t#!/usr/bin/perl -w use strict; use LWP::UserAgent; use Test::More; use Net::Whois::Raw; use Test::RequiresInternet; no warnings; $Net::Whois::Raw::CHECK_FAIL = 2; $Net::Whois::Raw::OMIT_MSG = 2; $Net::Whois::Raw::CHECK_EXCEED = 2; $Net::Whois::Raw::TIMEOUT = 10; my $DEBUG = 0; my $fake_domain = 'fake123domain'; my %pseudo_tlds = map {$_ => 1} qw/ARPA NS RIPE IP/; my $tests_number = keys( %Net::Whois::Raw::Data::servers ) * 2; for my $tld ( sort keys %Net::Whois::Raw::Data::servers ) { SKIP: { skip( "Pseudo tld $tld", 2 ) if $pseudo_tlds{ $tld }; my $server = $Net::Whois::Raw::Data::servers{ $tld }; my $domain = get_domain( $tld ); skip( "Cant find domain in .$tld", 2 ) unless $domain; my $whois = eval { whois( $domain ) }; print "---------------\n$whois\n-------------\n" if $DEBUG; if ( $@ ) { ok 0, "TLD: $tld,\tdomain: $domain,\tserver: $server\t - timeout"; } else { ok $whois, "TLD: $tld,\tdomain: $domain,\tserver: $server"; } $domain = "$fake_domain.$tld"; $whois = eval { whois( $domain ) }; if ( $@ ) { ok 0, "TLD: $tld,\tdomain: $domain,\tserver: $server\t - timeout"; } else { ok !$whois, "TLD: $tld,\tdomain: $domain,\tserver: $server"; } print "\n"; } }; sub get_domain { my $tld = shift; my $content = get_google( $tld ); my ( $domain ) = $content =~ /new( GET => 'http://www.google.com.ua/search?q=site:' . $tld ); my $res = $ua->request( $req ); return $res->content; } 04-qrycache.t100644001750001750 174515037672667 17261 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/t#!/usr/bin/perl -w use strict; use warnings; use Data::Dumper; use Test::RequiresInternet; use Test::More tests => 3; use_ok 'Net::Whois::Raw'; # Most of this lifted from internet.pl my $test_domain = 'google.com'; my $tmp_dir; if ( $^O =~ /mswin/i ) { $tmp_dir = $ENV{TEMP} . '\net-whois-raw-cache-test-' . time; } else { $tmp_dir = '/tmp/net-whois-raw-cache-test-' . time; } my $cache_file = "$tmp_dir/$test_domain-QRY_ALL.00"; { no warnings; $Net::Whois::Raw::CACHE_DIR = $tmp_dir; } my $first_result = whois( $test_domain, undef, 'QRY_ALL' ); ok -e $cache_file, 'write_to_cache_all'; my $cached_result = whois( $test_domain, undef, 'QRY_ALL' ); ok defined($cached_result), "returned_cached_result"; # So...the cached result return is different and yet valid. Commented out for now # as the "defined" test actually tests the bug I found in this module. # is_deeply $cached_result, $first_result, "cached_results_match"; unlink <$tmp_dir/*>; rmdir $tmp_dir; coro-domains.pl100644001750001750 451215037672667 17776 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/t#!/usr/bin/perl -w use strict; use Test::More tests => 6; BEGIN { use Socket; eval " use Coro; use Coro::AnyEvent; use Coro::Socket; use Coro::LWP; "; $::require_coro = $@ if $@; use_ok('Net::Whois::Raw',qw( whois )); $Net::Whois::Raw::CHECK_FAIL = 1; $Net::Whois::Raw::OMIT_MSG = 1; $Net::Whois::Raw::CHECK_EXCEED = 1; }; my @domains = qw( yahoo.com freebsd.org reg.ru ns1.nameself.com.NS belizenic.bz ); my $dns_cache = {}; SKIP: { print "The following tests requires internet connection. Checking...\n"; skip "Looks like no internet connection", 5 unless get_connected(); print "The following tests requires Coro. Checking...\n"; skip "Looks like no Coro installed", 5 unless require_coro (); my @coros = (); # domains foreach my $domain ( @domains ) { push @coros, Coro->new (sub { my $txt = whois( $domain ); $domain =~ s/.NS$//i; ok($txt && $txt =~ /$domain/i, "domain '$domain' resolved"); }); } $_->ready foreach @coros; $_->join foreach @coros; }; sub get_connected { require LWP::UserAgent; my $ua = LWP::UserAgent->new( timeout => 10 ); my $res = $ua->get( 'http://www.google.com' ); return $res->is_success; } sub require_coro { no warnings 'once'; *Net::Whois::Raw::whois_socket_fixup = sub { my $class = shift; my $sock = shift; return Coro::Socket->new_from_fh ($sock, partial => 1); }; *Net::Whois::Raw::whois_query_sockparams = sub { my $class = shift; my $domain = shift; my $name = shift; if (! $dns_cache->{$name}) { my $ip = inet_ntoa (inet_aton ($name)); $dns_cache->{$name} = $ip; } return ( PeerAddr => $dns_cache->{$name}, PeerPort => 43, # LocalHost => , # LocalPort => ); }; return ! $::require_coro; } author-pod-spell.t100644001750001750 106515037672667 20433 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/t BEGIN { unless ($ENV{AUTHOR_TESTING}) { print qq{1..0 # SKIP these tests are for testing by the author\n}; exit } } use strict; use warnings; use Test::More; # generated by Dist::Zilla::Plugin::Test::PodSpelling 2.007006 use Test::Spelling 0.17; use Pod::Wordlist; add_stopwords(); all_pod_files_spelling_ok( qw( bin lib ) ); __DATA__ Alexander Ariel Brosh Common Corris Data Gabor Nalobin Net Randall Raw SRV Studennikov Szabo TLDs WHOIS Walery Whois alexander bin corris despair ip ips jwhois lib params punycode pwhois schop szabgab whois Whois000755001750001750 015037672667 17027 5ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/lib/NetRaw.pm100644001750001750 5101415037672667 20277 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/lib/Net/Whoispackage Net::Whois::Raw; $Net::Whois::Raw::VERSION = '2.99042'; # ABSTRACT: Get Whois information of domains and IP addresses. require 5.008_001; use Net::Whois::Raw::Common (); use Net::Whois::Raw::Data (); use warnings; use strict; use Carp; use IO::Socket::IP; use Encode; use utf8; our @EXPORT = qw( whois get_whois ); our ($OMIT_MSG, $CHECK_FAIL, $CHECK_EXCEED, $CACHE_DIR, $TIMEOUT, $DEBUG) = (0) x 7; our $CACHE_TIME = 60; our $SET_CODEPAGE = ''; our $SILENT_MODE = 0; our $QUERY_SUFFIX = ''; our (%notfound, %strip, @SRC_IPS, %POSTPROCESS); # internal variable, used for save whois_server->ip relations my $_IPS = {}; our $class = __PACKAGE__; my $last_cache_clear_time; sub whois_config { my ($par) = @_; my @parnames = qw(OMIT_MSG CHECK_FAIL CHECK_EXCEED CACHE_DIR CACHE_TIME TIMEOUT @SRC_IPS); foreach my $parname (@parnames) { if (exists($par->{$parname})) { no strict 'refs'; ${$parname} = $par->{$parname}; } } } sub whois_config_data { my $net_whois_raw_data = shift; no strict 'refs'; foreach my $k (keys %$net_whois_raw_data) { %{'Net::Whois::Raw::Data::'.$k} = ( %{'Net::Whois::Raw::Data::'.$k}, %{ $net_whois_raw_data->{ $k } || {} }, ); } } # get cached whois sub whois { my ($dom, $server, $which_whois) = @_; $which_whois ||= 'QRY_LAST'; my $res = Net::Whois::Raw::Common::get_from_cache( "$dom-$which_whois", $CACHE_DIR, $CACHE_TIME ); my ($res_text, $res_srv, $res_text2); if ($res) { if ($which_whois eq 'QRY_FIRST') { $res_text = $res->[0]->{text}; $res_srv = $res->[0]->{srv}; } elsif ($which_whois eq 'QRY_LAST' || !defined($which_whois)) { $res_text = $res->[-1]->{text}; $res_srv = $res->[-1]->{srv}; } elsif ($which_whois eq 'QRY_ALL') { return $res; } } else { ($res_text, $res_srv) = get_whois($dom, $server, $which_whois); } $res_srv = '' if $res_srv && $res_srv eq 'www_whois'; if ( defined $res_text && $which_whois ne 'QRY_ALL' ) { utf8::decode( $res_text ); # Perl whyly loss utf8 flag $res_text = encode( $SET_CODEPAGE, $res_text ) if $SET_CODEPAGE; } return wantarray ? ($res_text, $res_srv) : $res_text; } # obtain whois sub get_whois { my ($dom, $srv, $which_whois) = @_; $which_whois ||= 'QRY_LAST'; my $whois = get_all_whois( $dom, $srv, $which_whois eq 'QRY_FIRST' ) or return undef; Net::Whois::Raw::Common::write_to_cache( "$dom-$which_whois", $whois, $CACHE_DIR ); if ($which_whois eq 'QRY_LAST') { my $thewhois = $whois->[-1]; return wantarray ? ($thewhois->{text}, $thewhois->{srv}) : $thewhois->{text}; } elsif ($which_whois eq 'QRY_FIRST') { my $thewhois = $whois->[0]; return wantarray ? ($thewhois->{text}, $thewhois->{srv}) : $thewhois->{text}; } else { return $whois; } } sub get_all_whois { my ($dom, $srv, $norecurse) = @_; my $is_ns = 0; $is_ns = 1 if $dom =~ s/[.]NS$//i; $srv ||= Net::Whois::Raw::Common::get_server( $dom, $is_ns ); if ($srv eq 'www_whois') { my ($responce, $ishtml) = www_whois_query( $dom ); return $responce ? [ { text => $responce, srv => $srv } ] : $responce; } my @whois = recursive_whois( $dom, $srv, [], $norecurse, $is_ns ); my $whois_answers = process_whois_answers( \@whois, $dom ); return $whois_answers; } sub process_whois_answers { my ( $raw_whois, $dom ) = @_; my @processed_whois; my $level = 0; for my $whois_rec ( @$raw_whois ) { $whois_rec->{level} = $level; my ( $text, $error ) = Net::Whois::Raw::Common::process_whois( $dom, $whois_rec->{srv}, $whois_rec->{text}, $CHECK_FAIL, $OMIT_MSG, $CHECK_EXCEED, ); die $error if $error && $error eq 'Connection rate exceeded' && ( $level == 0 || $CHECK_EXCEED == 2 ); if ( $text || $level == 0 ) { $whois_rec->{text} = $text; push @processed_whois, $whois_rec; } $level++; } return \@processed_whois; } sub _referral_server { /ReferralServer:\s*r?whois:\/\/([-.\w]+(?:\:\d+)?)/ } sub recursive_whois { my ( $dom, $srv, $was_srv, $norecurse, $is_ns ) = @_; my $lines = whois_query( $dom, $srv, $is_ns ); my $whois = join '', @$lines; my ( $newsrv, $registrar ); for ( @$lines ) { $registrar ||= /Registrar/ || /Registered through/; # Skip urls as recursive whois servers if ( $registrar && !$norecurse && /whois server:\s*(?:https?:\/\/)?([a-z0-9\-_\.]+)\b/i ) { $newsrv = lc $1; } elsif ( $whois =~ /To single out one record, look it up with \"xxx\",/s ) { return recursive_whois( "=$dom", $srv, $was_srv ); } elsif ( !$norecurse && ( my ( $rs ) = _referral_server() ) ) { $newsrv = $rs; last; } elsif ( /Contact information can be found in the (\S+)\s+database/ ) { $newsrv = $Net::Whois::Raw::Data::ip_whois_servers{ $1 }; } elsif ( ( /OrgID:\s+(\w+)/i || /descr:\s+(\w+)/ ) && Net::Whois::Raw::Common::is_ipaddr( $dom ) ) { my $val = $1; if ( $val =~ /^(?:RIPE|APNIC|KRNIC|LACNIC)$/ ) { $newsrv = $Net::Whois::Raw::Data::ip_whois_servers{ $val }; last; } } elsif ( /^\s+Maintainer:\s+RIPE\b/ && Net::Whois::Raw::Common::is_ipaddr( $dom ) ) { $newsrv = $Net::Whois::Raw::Data::servers{RIPE}; } elsif ( $is_ns && $srv ne $Net::Whois::Raw::Data::servers{NS} ) { $newsrv = $Net::Whois::Raw::Data::servers{NS}; } } if ( defined $newsrv && ( # Bypass recursing to custom servers $Net::Whois::Raw::Data::whois_servers_no_recurse{ $newsrv } # Bypass recursing to WHOIS servers with no IDN support || $dom =~ /^xn--/i && $newsrv && $Net::Whois::Raw::Data::whois_servers_with_no_idn_support{ $newsrv } ) ) { $newsrv = undef; } my @whois_recs = ( { text => $whois, srv => $srv } ); if ( $newsrv && $newsrv ne $srv ) { warn "recurse to $newsrv\n" if $DEBUG; return () if grep { $_ eq $newsrv } @$was_srv; my @new_whois_recs = eval { recursive_whois( $dom, $newsrv, [ @$was_srv, $srv ], 0, $is_ns ) }; my $new_whois = scalar @new_whois_recs ? $new_whois_recs[0]->{text} : ''; my $notfound = $Net::Whois::Raw::Data::notfound{ $newsrv }; if ( $new_whois && !$@ && not ( $notfound && $new_whois =~ /$notfound/im ) ) { if ( $is_ns ) { unshift @whois_recs, @new_whois_recs; } else { push @whois_recs, @new_whois_recs; } } else { warn "recursive query failed\n" if $DEBUG; } } return @whois_recs; } sub whois_query { my ($dom, $srv, $is_ns) = @_; # Prepare query my $whoisquery = Net::Whois::Raw::Common::get_real_whois_query($dom, $srv, $is_ns); # Prepare for query my (@sockparams, $sock); my (undef, $tld) = Net::Whois::Raw::Common::split_domain($dom); $tld = uc $tld; my $rotate_reference = undef; ### get server for query my $server4query = Net::Whois::Raw::Common::get_server($dom); if ( Net::Whois::Raw::Common::is_ip6addr( $srv ) ) { $srv = "[$srv]"; } my $srv_and_port = $srv =~ /\:\d+$/ ? $srv : "$srv:43"; if ($class->can('whois_query_sockparams')) { @sockparams = $class->whois_query_sockparams ($dom, $srv); } # hook for outside defined socket elsif ($class->can('whois_query_socket')) { $sock = $class->whois_query_socket ($dom, $srv); } elsif (my $ips_arrayref = get_ips_for_query($server4query)) { $rotate_reference = $ips_arrayref; } elsif (scalar(@SRC_IPS)) { $rotate_reference = \@SRC_IPS; } else { @sockparams = $srv_and_port; } if ($rotate_reference) { my $src_ip = $rotate_reference->[0]; push @$rotate_reference, shift @$rotate_reference; # rotate ips @sockparams = (PeerAddr => $srv_and_port, LocalAddr => $src_ip); } print "QUERY: $whoisquery; SRV: $srv, ". "OMIT_MSG: $OMIT_MSG, CHECK_FAIL: $CHECK_FAIL, CACHE_DIR: $CACHE_DIR, ". "CACHE_TIME: $CACHE_TIME, TIMEOUT: $TIMEOUT\n" if $DEBUG >= 2; my $prev_alarm = undef; my $t0 = time(); my @lines; # Make query { local $SIG{'ALRM'} = sub { die "Connection timeout to $srv" }; eval { $prev_alarm = alarm $TIMEOUT if $TIMEOUT; unless ( $sock ) { $sock = IO::Socket::IP->new( @sockparams ) or die "$srv: $IO::Socket::errstr: " . join( ', ', @sockparams ); } if ($class->can ('whois_socket_fixup')) { my $new_sock = $class->whois_socket_fixup ($sock); $sock = $new_sock if $new_sock; } if ($DEBUG > 2) { require Data::Dumper; print "Socket: ". Data::Dumper::Dumper($sock); } if ($QUERY_SUFFIX) { $whoisquery .= $QUERY_SUFFIX; } $sock->print( $whoisquery, "\r\n" ); # TODO: $soc->read, parameters for read chunk size, max content length # Now you can redefine SOCK_CLASS::getline method as you want while (my $str = $sock->getline) { push @lines, $str; } $sock->close; }; { local $@; # large code block below, so preserve previous exception. if (defined $prev_alarm) { # if we ever set new alarm if ($prev_alarm == 0) { # there was no alarm previously alarm 0; # clear it } else { # there was an alarm previously $prev_alarm -= (time()- $t0); # try best to substract time elapsed $prev_alarm = 1 if $prev_alarm < 1; # we still need set it to something non-zero alarm $prev_alarm; # set it } } } Carp::confess $@ if $@; } foreach (@lines) { s/\r//g; } print "Received ".scalar(@lines)." lines\n" if $DEBUG >= 2; return \@lines; } sub www_whois_query { my ($dom) = (lc shift); my ($resp, $url); my ($name, $tld) = Net::Whois::Raw::Common::split_domain( $dom ); my $http_query_urls = Net::Whois::Raw::Common::get_http_query_url($dom); foreach my $qurl ( @{$http_query_urls} ) { # load-on-demand unless ($INC{'LWP/UserAgent.pm'}) { require LWP::UserAgent; require HTTP::Request; require HTTP::Headers; require URI::URL; import LWP::UserAgent; import HTTP::Request; import HTTP::Headers; import URI::URL; } my $referer = delete $qurl->{form}{referer} if $qurl->{form} && defined $qurl->{form}{referer}; my $method = ( $qurl->{form} && scalar(keys %{$qurl->{form}}) ) ? 'POST' : 'GET'; my $ua; # hook for outside defined lwp if ($class->can ('whois_query_ua')) { $ua = $class->whois_query_ua ($dom); } unless($ua){ $ua = new LWP::UserAgent( parse_head => 0 ); $ua->agent('Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9.0.5) Gecko/2008121622 Fedora/3.0.5-1.fc10 Firefox/3.0.5'); } my $header = HTTP::Headers->new; $header->header('Referer' => $referer) if $referer; my $req = new HTTP::Request $method, $qurl->{url}, $header; if ($method eq 'POST') { require URI::URL; import URI::URL; my $curl = url("http:"); $req->content_type('application/x-www-form-urlencoded'); $curl->query_form( %{$qurl->{form}} ); $req->content( $curl->equery ); } $resp = eval { local $SIG{ALRM} = sub { die "www_whois connection timeout" }; alarm 10; $ua->request($req)->content; }; alarm 0; if ( !$resp || $@ || $resp =~ /www_whois connection timeout/ || $resp =~ /^500 Can\'t connect/ ) { undef $resp; } else { $url = $qurl->{url}; last; } } return undef unless $resp; chomp $resp; $resp =~ s/\r//g; my $ishtml; $resp = Net::Whois::Raw::Common::parse_www_content($resp, $tld, $url, $CHECK_EXCEED); return wantarray ? ($resp, $ishtml) : $resp; } sub import { my $mypkg = shift; my $callpkg = caller; no strict 'refs'; # export subs *{"$callpkg\::$_"} = \&{"$mypkg\::$_"} foreach ((@EXPORT, @_)); } sub set_ips_for_server { my ($server, $ips) = @_; croak "Missing params" if (!$ips || !$server); $server = lc $server; $_IPS->{$server} = $ips; } sub get_ips_for_query { my ($server) = @_; $server = lc $server; if ($_IPS->{$server}) { return $_IPS->{$server}; } return undef; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Net::Whois::Raw - Get Whois information of domains and IP addresses. =head1 VERSION version 2.99042 =head1 SYNOPSIS use Net::Whois::Raw; $dominfo = whois('perl.com'); ($dominfo, $whois_server) = whois('funet.fi'); $reginfo = whois('REGRU-REG-RIPN', 'whois.ripn.net'); $arrayref = get_whois('yahoo.co.uk', undef, 'QRY_ALL'); $text = get_whois('yahoo.co.uk', undef, 'QRY_LAST'); ($text, $srv) = get_whois('yahoo.co.uk', undef, 'QRY_FIRST'); $Net::Whois::Raw::OMIT_MSG = 1; # This will attempt to strip several known copyright # messages and disclaimers sorted by servers. # Default is to give the whole response. $Net::Whois::Raw::CHECK_FAIL = 1; # This will return undef if the response matches # one of the known patterns for a failed search, # sorted by servers. # Default is to give the textual response. $Net::Whois::Raw::CHECK_EXCEED = 0 | 1 | 2; # When this option is true, "die" will be called # if connection rate to specific whois server have been # exceeded. # If set to 2, will die in recursive queries too. $Net::Whois::Raw::CACHE_DIR = "/var/spool/pwhois/"; # Whois information will be # cached in this directory. Default is no cache. $Net::Whois::Raw::CACHE_TIME = 60; # Cache files will be cleared after not accessed # for a specific number of minutes. Documents will not be # cleared if they keep get requested for, independent # of disk space. $Net::Whois::Raw::TIMEOUT = 10; # Cancel the request if connection is not made within # a specific number of seconds. @Net::Whois::Raw::SRC_IPS = (11.22.33.44); # List of local IP addresses to # use for WHOIS queries. Addresses will be used used # successively in the successive queries $Net::Whois::Raw::POSTPROCESS{whois.crsnic.net} = \&my_func; # Call to a user-defined subroutine on whois result, # depending on whois-server. # Above is equil to: # ($text, $srv) = whois('example.com'); # $text = my_func($text) if $srv eq 'whois.crsnic.net'; $Net::Whois::Raw::QUERY_SUFFIX = '/e'; # This will add specified suffix to whois query. # It may be used for english output forcing. =head1 DESCRIPTION Net::Whois::Raw queries WHOIS servers about domains. The module supports recursive WHOIS queries. Also queries via HTTP is supported for some TLDs. Setting the variables $OMIT_MSG and $CHECK_FAIL will match the results against a set of known patterns. The first flag will try to omit the copyright message/disclaimer, the second will attempt to determine if the search failed and return undef in such a case. B: these checks merely use pattern matching; they will work on several servers but certainly not on all of them. =head1 NAME Net::Whois::Raw — Get Whois information of domains and IP addresses. =head1 FUNCTIONS =over 3 =item whois( DOMAIN [, SRV [, WHICH_WHOIS]] ) Returns Whois information for C in punycode. Without C argument default Whois server for specified domain name zone will be used. Use 'www_whois' as server name to force WHOIS querying via HTTP (only few TLDs are supported in HTTP queries). Caching is supported: if $CACHE_DIR variable is set and there is cached entry for that domain - information from the cache will be used. C argument - look get_whois docs below. =item get_whois( DOMAIN [, SRV [, WHICH_WHOIS]] ) Lower-level function to query Whois information for C. Caching IS NOT supported (caching is implemented only in higher-level C function). Without C argument default Whois server for specified domain name zone will be used. C argument is used to access a results if recursive queries; possible values: C<'QRY_FIRST'> - returns results of the first query. Does not make recursive queries. In scalar context returns just whois text. In list context returns two values: whois text and whois server which was used to make query). C<'QRY_LAST'> - returns results of the last query. In scalar context returns just whois text. In list context returns two values: whois text and whois server which was used to make query). This is the default option. C<'QRY_ALL'> - returns results of the all queries of the recursive chain. Reference to array of references to hashes is returned. Hash keys: C - result of whois query, C - whois server which was used to make query. =back =head1 USER DEFINED FUNCTIONS =over 3 =item whois_query_sockparams( DOMAIN, SRV ) You can set your own IO::Socket::INET params like this: *Net::Whois::Raw::whois_query_sockparams = sub { my $class = shift; my $domain = shift; my $name = shift; return ( PeerAddr => $name, PeerPort => 43, # LocalHost => , # LocalPort => ); }; =item whois_query_socket( DOMAIN, SRV ) You can set your own IO::Socket::INET like this: *Net::Whois::Raw::whois_query_socket = sub { my $class = shift; my $domain = shift; my $name = shift; $name .= ':43'; return IO::Socket::INET->new(); }; =item whois_query_ua( DOMAIN, SRV ) You can set your own LWP::UserAgent like this: *Net::Whois::Raw::whois_query_ua = sub { my $class = shift; my $domain = shift; return LWP::UserAgent->new(); }; =item set_ips_for_server('whois.ripn.net', ['127.0.0.1']); You can specify IPs list which will be used for queries to desired whois server. It can be useful if you have few interfaces, but you need to access whois server from specified ips. =back =head1 AUTHOR Original author Ariel Brosh B, Inspired by jwhois.pl available on the net. Since Ariel has passed away in September 2002: Past maintainers Gabor Szabo B, Corris Randall B, Walery Studennikov B Current Maintainer: Alexander Nalobin B =head1 CREDITS See file "Changes" in the distribution for the complete list of contributors. =head1 CHANGES See file "Changes" in the distribution =head1 NOTE Some users complained that the B statements in the module make their CGI scripts crash. Please consult the entries on B and B on L about exception handling in Perl. =head1 COPYRIGHT Copyright 2000--2002 Ariel Brosh. Copyright 2003--2003 Gabor Szabo. Copyright 2003--2003 Corris Randall. Copyright 2003--now() Walery Studennikov This package is free software. You may redistribute it or modify it under the same terms as Perl itself. I apologize for any misunderstandings caused by the lack of a clear licence in previous versions. =head1 COMMERCIAL SUPPORT Not available anymore. =head1 LEGAL Notice that registrars forbid querying their whois servers as a part of a search engine, or querying for a lot of domains by script. Also, omitting the copyright information (that was requested by users of this module) is forbidden by the registrars. =head1 SEE ALSO L, L. =head1 AUTHOR Alexander Nalobin =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2002-2025 by Alexander Nalobin. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut 03-read_write_cache.t100644001750001750 124415037672667 20723 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/t#!/usr/bin/perl -w use strict; use warnings; use utf8; use Test::More tests => 2; use Net::Whois::Raw::Common; use File::Temp qw( tempdir ); my $temp = tempdir( "__Net_Whois_Raw_${$}_XXXXXXXX", TMPDIR => 1, CLEANUP => 1 ); my @expected = ( 'some result', 'wide русский текст', 'latin1 μ' ); my $data = [ map { { text => $_ } } @expected ]; Net::Whois::Raw::Common::write_to_cache( 'test.com', $data, $temp ); my $r = Net::Whois::Raw::Common::get_from_cache( 'test.com', $temp, 10 ); is_deeply [ map { $_->{text} } @{ $r } ], \@expected, 'should read from cache right'; is_deeply [ map { $_->{text} } @{ $data } ], \@expected, 'should not damage cache' ; Raw000755001750001750 015037672667 17560 5ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/lib/Net/WhoisData.pm100644001750001750 52436515037672667 21206 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/lib/Net/Whois/Rawpackage Net::Whois::Raw::Data; $Net::Whois::Raw::Data::VERSION = '2.99042'; # ABSTRACT: Config for Net::Whois::Raw. use utf8; use warnings; use strict; our @www_whois = qw( VN TJ ); # Candidates for www_whois: BD, DO, ES, EG, MG, SH, TM, TP, ZA our %servers = qw( RU whois.ripn.net NET.RU whois.nic.net.ru ORG.RU whois.nic.net.ru PP.RU whois.nic.net.ru SU whois.ripn.net XN--P1AI whois.ripn.net XN--D1ACJ3B whois.ripn.net MADRID whois.madrid.rs.corenic.net XN--80ADXHKS whois.nic.xn--80adxhks XN--80ASEHDB whois.online.rs.corenic.net XN--80ASWG whois.site.rs.corenic.net XN--P1ACF whois.nic.xn--p1acf RU.NET whois.flexireg.net COM.RU whois.flexireg.net EXNET.SU whois.flexireg.net ABKHAZIA.SU whois.flexireg.net ADYGEYA.RU whois.flexireg.net ADYGEYA.SU whois.flexireg.net AKTYUBINSK.SU whois.flexireg.net AMURSK.RU whois.nic.ru ARKHANGELSK.SU whois.flexireg.net ARMENIA.SU whois.flexireg.net ASHGABAD.SU whois.flexireg.net AZERBAIJAN.SU whois.flexireg.net BALASHOV.SU whois.flexireg.net BASHKIRIA.RU whois.flexireg.net BASHKIRIA.SU whois.flexireg.net BELGOROD.RU whois.nic.ru BELGOROD.SU whois.nic.ru BIR.RU whois.flexireg.net BRYANSK.SU whois.flexireg.net BUKHARA.SU whois.flexireg.net CBG.RU whois.flexireg.net CHELYABINSK.RU whois.nic.ru CHIMKENT.SU whois.flexireg.net CMW.RU whois.nic.ru DAGESTAN.RU whois.flexireg.net DAGESTAN.SU whois.flexireg.net DUDINKA.RU whois.nic.ru EAST-KAZAKHSTAN.SU whois.flexireg.net FAREAST.RU whois.nic.ru GEORGIA.SU whois.flexireg.net GROZNY.RU whois.flexireg.net GROZNY.SU whois.flexireg.net IVANOVO.SU whois.flexireg.net JAMBYL.SU whois.flexireg.net JAR.RU whois.nic.ru JOSHKAR-OLA.RU whois.nic.ru KALMYKIA.RU whois.flexireg.net KALMYKIA.SU whois.flexireg.net KALUGA.SU whois.flexireg.net KARACOL.SU whois.flexireg.net KARAGANDA.SU whois.flexireg.net KARELIA.SU whois.flexireg.net KCHR.RU whois.nic.ru KHAKASSIA.SU whois.flexireg.net KOMI.SU whois.nic.ru KRASNODAR.SU whois.flexireg.net KURGAN.SU whois.flexireg.net KUSTANAI.RU whois.flexireg.net KUSTANAI.SU whois.flexireg.net LENUG.SU whois.flexireg.net MANGYSHLAK.SU whois.flexireg.net MARINE.RU whois.flexireg.net MORDOVIA.RU whois.flexireg.net MORDOVIA.SU whois.flexireg.net MSK.RU whois.flexireg.net MSK.SU whois.flexireg.net MURMANSK.SU whois.flexireg.net MYTIS.RU whois.flexireg.net NALCHIK.RU whois.flexireg.net NALCHIK.SU whois.flexireg.net NAVOI.SU whois.flexireg.net NNOV.RU whois.nnov.ru NORILSK.RU whois.nic.ru NORTH-KAZAKHSTAN.SU whois.flexireg.net NOV.RU whois.flexireg.net NOV.SU whois.flexireg.net OBNINSK.SU whois.flexireg.net PALANA.RU whois.nic.ru PENZA.SU whois.flexireg.net POKROVSK.SU whois.flexireg.net PYATIGORSK.RU whois.flexireg.net SIMBIRSK.RU whois.nic.ru SOCHI.SU whois.flexireg.net SPB.RU whois.flexireg.net SPB.SU whois.flexireg.net TASHKENT.SU whois.flexireg.net TERMEZ.SU whois.flexireg.net TOGLIATTI.SU whois.flexireg.net TROITSK.SU whois.flexireg.net TSARITSYN.RU whois.nic.ru TSELINOGRAD.SU whois.flexireg.net TULA.SU whois.flexireg.net TUVA.SU whois.flexireg.net VLADIKAVKAZ.RU whois.flexireg.net VLADIKAVKAZ.SU whois.flexireg.net VLADIMIR.RU whois.flexireg.net VLADIMIR.SU whois.flexireg.net VOLOGDA.SU whois.flexireg.net YAKUTIA.SU whois.nic.ru YEKATERINBURG.RU whois.nic.ru XN--90A1AF.XN--P1AI whois.flexireg.net NS whois.nsiregistry.net RIPE whois.ripe.net IP whois.arin.net AERO whois.aero ARPA whois.iana.org ASIA whois.nic.asia BIZ whois.biz CAT whois.nic.cat CC whois.nic.cc COM whois.crsnic.net EDU whois.educause.edu GOV whois.dotgov.gov INFO whois.afilias.net INT whois.iana.org JOBS whois.nic.jobs MIL whois.nic.mil MOBI whois.afilias.net MUSEUM whois.museum NAME whois.nic.name NET whois.crsnic.net NOTLD whois.iana.org ORG whois.pir.org PRO whois.nic.pro TEL whois.nic.tel TRAVEL whois.nic.travel ACADEMY whois.donuts.co ACCOUNTANTS whois.donuts.co AGENCY whois.donuts.co APARTMENTS whois.donuts.co ASSOCIATES whois.donuts.co BAND whois.donuts.co BARGAINS whois.donuts.co BIKE whois.donuts.co BINGO whois.donuts.co BOUTIQUE whois.donuts.co BUILDERS whois.donuts.co BUSINESS whois.donuts.co CAB whois.donuts.co CAFE whois.donuts.co CAMERA whois.donuts.co CAMP whois.donuts.co CAPITAL whois.donuts.co CARDS whois.donuts.co CARE whois.donuts.co CAREERS whois.donuts.co CASH whois.donuts.co CASINO whois.donuts.co CATERING whois.donuts.co CENTER whois.donuts.co CHAT whois.donuts.co CHEAP whois.donuts.co CHURCH whois.donuts.co CITY whois.donuts.co CLAIMS whois.donuts.co CLEANING whois.donuts.co CLINIC whois.donuts.co CLOTHING whois.donuts.co COACH whois.donuts.co CODES whois.donuts.co COFFEE whois.donuts.co COMMUNITY whois.donuts.co COMPANY whois.donuts.co COMPUTER whois.donuts.co CONDOS whois.donuts.co CONSTRUCTION whois.donuts.co CONTRACTORS whois.donuts.co COOL whois.donuts.co COUPONS whois.donuts.co CREDIT whois.donuts.co CREDITCARD whois.donuts.co CRUISES whois.donuts.co DATING whois.donuts.co DEALS whois.donuts.co DELIVERY whois.donuts.co DENTAL whois.donuts.co DIAMONDS whois.donuts.co DIGITAL whois.donuts.co DIRECT whois.donuts.co DIRECTORY whois.donuts.co DISCOUNT whois.donuts.co DOCTOR whois.donuts.co DOG whois.donuts.co DOMAINS whois.donuts.co EDUCATION whois.donuts.co EMAIL whois.donuts.co ENERGY whois.donuts.co ENGINEERING whois.donuts.co ENTERPRISES whois.donuts.co EQUIPMENT whois.donuts.co ESTATE whois.donuts.co EVENTS whois.donuts.co EXCHANGE whois.donuts.co EXPERT whois.donuts.co EXPOSED whois.donuts.co EXPRESS whois.donuts.co FAIL whois.donuts.co FAMILY whois.donuts.co FARM whois.donuts.co FINANCE whois.donuts.co FINANCIAL whois.donuts.co FISH whois.donuts.co FITNESS whois.donuts.co FLIGHTS whois.donuts.co FLORIST whois.donuts.co FOOTBALL whois.donuts.co FOUNDATION whois.donuts.co FUND whois.donuts.co FURNITURE whois.donuts.co FYI whois.donuts.co GALLERY whois.donuts.co GAMES whois.donuts.co GIFTS whois.donuts.co GLASS whois.donuts.co GMBH whois.donuts.co GOLD whois.donuts.co GOLF whois.donuts.co GRAPHICS whois.donuts.co GRATIS whois.donuts.co GRIPE whois.donuts.co GROUP whois.donuts.co GUIDE whois.donuts.co GURU whois.donuts.co HEALTHCARE whois.donuts.co HOCKEY whois.donuts.co HOLDINGS whois.donuts.co HOLIDAY whois.donuts.co HOUSE whois.donuts.co IMMO whois.donuts.co INDUSTRIES whois.donuts.co INSTITUTE whois.donuts.co INSURE whois.donuts.co INTERNATIONAL whois.donuts.co INVESTMENTS whois.donuts.co JETZT whois.donuts.co JEWELRY whois.donuts.co KITCHEN whois.donuts.co LAND whois.donuts.co LEASE whois.donuts.co LEGAL whois.donuts.co LIFE whois.donuts.co LIGHTING whois.donuts.co LIMITED whois.donuts.co LIMO whois.donuts.co LIVE whois.donuts.co LOANS whois.donuts.co LTD whois.donuts.co MAISON whois.donuts.co MANAGEMENT whois.donuts.co MARKETING whois.donuts.co MBA whois.donuts.co MEDIA whois.donuts.co MEMORIAL whois.donuts.co MONEY whois.donuts.co MOVIE whois.donuts.co NETWORK whois.donuts.co NEWS whois.donuts.co PARTNERS whois.donuts.co PARTS whois.donuts.co PHOTOGRAPHY whois.donuts.co PHOTOS whois.donuts.co PICTURES whois.donuts.co PIZZA whois.donuts.co PLACE whois.donuts.co PLUMBING whois.donuts.co PLUS whois.donuts.co PRODUCTIONS whois.donuts.co PROPERTIES whois.donuts.co RECIPES whois.donuts.co REISEN whois.donuts.co RENTALS whois.donuts.co REPAIR whois.donuts.co REPORT whois.donuts.co RESTAURANT whois.donuts.co RIP whois.donuts.co RUN whois.donuts.co SALON whois.donuts.co SALE whois.donuts.co SARL whois.donuts.co SCHOOL whois.donuts.co SCHULE whois.donuts.co SERVICES whois.donuts.co SHOES whois.donuts.co SHOPPING whois.donuts.co SHOW whois.donuts.co SINGLES whois.donuts.co SOCCER whois.donuts.co SOLAR whois.donuts.co SOLUTIONS whois.donuts.co STUDIO whois.donuts.co STYLE whois.donuts.co SUPPLIES whois.donuts.co SUPPLY whois.donuts.co SUPPORT whois.donuts.co SURGERY whois.donuts.co SYSTEMS whois.donuts.co TAX whois.donuts.co TAXI whois.donuts.co TEAM whois.donuts.co TECHNOLOGY whois.donuts.co TENNIS whois.donuts.co THEATER whois.donuts.co TIENDA whois.donuts.co TIPS whois.donuts.co TIRES whois.donuts.co TODAY whois.donuts.co TOOLS whois.donuts.co TOURS whois.donuts.co TOWN whois.donuts.co TOYS whois.donuts.co TRAINING whois.donuts.co UNIVERSITY whois.donuts.co VACATIONS whois.donuts.co VENTURES whois.donuts.co VIAJES whois.donuts.co VIDEO whois.donuts.co VILLAS whois.donuts.co VIN whois.donuts.co VISION whois.donuts.co VOYAGE whois.donuts.co WATCH whois.donuts.co WINE whois.donuts.co WORKS whois.donuts.co WORLD whois.donuts.co WTF whois.donuts.co XN--CZRS0T whois.donuts.co XN--FJQ720A whois.donuts.co XN--UNUP4Y whois.donuts.co XN--VHQUV whois.donuts.co ZONE whois.donuts.co AUDIO whois.uniregistry.net AUTO whois.uniregistry.net BLACKFRIDAY whois.uniregistry.net CAR whois.uniregistry.net CARS whois.uniregistry.net CHRISTMAS whois.uniregistry.net CLICK whois.uniregistry.net DIET whois.uniregistry.net FLOWERS whois.uniregistry.net GAME whois.uniregistry.net GIFT whois.uniregistry.net GUITARS whois.uniregistry.net HELP whois.uniregistry.net HIPHOP whois.uniregistry.net HIV whois.uniregistry.net HOSTING whois.uniregistry.net JUEGOS whois.uniregistry.net LINK whois.uniregistry.net LOL whois.uniregistry.net MOM whois.uniregistry.net PHOTO whois.uniregistry.net PICS whois.uniregistry.net PROPERTY whois.uniregistry.net SEXY whois.uniregistry.net TATTOO whois.uniregistry.net BERLIN whois.nic.berlin BEST whois.nic.best BROKER whois.nic.broker BUILD whois.nic.build CAREER whois.nic.career COURSES whois.nic.courses CLOUD whois.nic.cloud CLUB whois.nic.club EARTH whois.nic.earth FILM whois.nic.film FOREX whois.nic.forex KIWI whois.nic.kiwi LUXURY whois.nic.luxury MEN whois.nic.men MENU whois.nic.menu MOSCOW whois.nic.moscow ONE whois.nic.one OOO whois.nic.ooo SHOP whois.nic.shop SRL whois.nic.srl STUDY whois.nic.study TATAR whois.nic.tatar TOP whois.nic.top TRADING whois.nic.trading TUBE whois.nic.tube WIEN whois.nic.wien UNO whois.nic.uno XXX whois.nic.xxx BOX whois.nic.box EPSON whois.nic.epson IINET whois.nic.iinet KRD whois.nic.krd MELBOURNE whois.nic.melbourne SAXO whois.nic.saxo BET whois.afilias.net BLACK whois.afilias.net BLUE whois.afilias.net GREEN whois.afilias.net KIM whois.afilias.net LGBT whois.afilias.net LOTTO whois.afilias.net LLC whois.afilias.net ORGANIC whois.afilias.net PET whois.afilias.net PINK whois.afilias.net POKER whois.afilias.net RED whois.afilias.net SHIKSHA whois.afilias.net VOTE whois.afilias.net VOTO whois.afilias.net XN--6FRZ82G whois.afilias.net ACTOR whois.nic.actor AIRFORCE whois.nic.airforce ARMY whois.nic.army ATTORNEY whois.nic.attorney AUCTION whois.nic.auction BABY whois.nic.baby BOSTON whois.nic.boston BUZZ whois.nic.buzz CONSULTING whois.nic.consulting CYOU whois.nic.cyou DANCE whois.nic.dance DEGREE whois.nic.degree DEMOCRAT whois.nic.democrat DENTIST whois.nic.dentist ENGINEER whois.nic.engineer FORSALE whois.nic.forsale FUN whois.nic.fun FUTBOL whois.nic.futbol GIVES whois.nic.gives HAUS whois.nic.haus HEALTH whois.nic.health HOSPITAL whois.nic.hospital IMMOBILIEN whois.nic.immobilien KAUFEN whois.nic.kaufen LAWYER whois.nic.lawyer MARKET whois.nic.market MODA whois.nic.moda MORTGAGE whois.nic.mortgage NAVY whois.nic.navy NAGOYA whois.nic.nagoya NINJA whois.nic.ninja NYC whois.nic.nyc PUB whois.nic.pub QPON whois.nic.qpon REHAB whois.nic.rehab REPUBLICAN whois.nic.republican REVIEWS whois.nic.reviews ROCKS whois.nic.rocks SOCIAL whois.nic.social SOFTWARE whois.nic.software STREAM whois.nic.stream TOKYO whois.nic.tokyo VET whois.nic.vet YOKOHAMA whois.nic.yokohama AC whois.nic.ac AG whois.nic.ag ALSACE whois-alsace.nic.fr AM whois.amnic.net AQUARELLE whois-aquarelle.nic.fr AS whois.nic.as AT whois.nic.at CO.AT whois.nic.at OR.AT whois.nic.at AU whois.audns.net.au BE whois.dns.be BG whois.register.bg BJ whois.nic.bj BOSTIK whois-bostik.nic.fr BR whois.registro.br BY whois.cctld.by BZ whois2.afilias-grs.net CA whois.cira.ca CD whois.nic.cd CH whois.nic.ch CI whois.nic.ci CL whois.nic.cl CM whois.netcom.cm CN whois.cnnic.net.cn CO whois.nic.co COM.CO whois.nic.co CORSICA whois-corsica.nic.fr CX whois.nic.cx CZ whois.nic.cz DE whois.denic.de DK whois.dk-hostmaster.dk DM whois.nic.dm EE whois.eenet.ee EU whois.eu FI whois.ficora.fi FM whois.nic.fm FO whois.ripe.net FR whois.nic.fr FROGANS whois-frogans.nic.fr GD whois.nic.gd GG whois.channelisles.net GI whois2.afilias-grs.net GS whois.nic.gs GY whois.registry.gy HK whois.hkirc.hk HM whois.registry.hm HN whois.nic.hn HR whois.dns.hr HT whois.nic.ht HU whois.nic.hu IE whois.domainregistry.ie IL whois.isoc.org.il IM whois.nic.im IN whois.registry.in IO whois.nic.io IR whois.nic.ir IS whois.isnic.is IT whois.nic.it JE whois.channelisles.net JP whois.jprs.jp KE whois.kenic.or.ke KG whois.domain.kg KI whois.nic.ki KR whois.nic.or.kr KZ whois.nic.kz LANCASTER whois-lancaster.nic.fr LC whois2.afilias-grs.net LECLERC whois-leclerc.nic.fr LI whois.nic.li LT whois.domreg.lt LU whois.dns.lu LV whois.nic.lv LY whois.nic.ly MA whois.iam.net.ma MC whois.ripe.net MD whois.nic.md ME whois.nic.me MG whois.nic.mg MMA whois-mma.nic.fr MN whois2.afilias-grs.net MS whois.nic.ms MU whois.nic.mu MUTUELLE whois-mutuelle.nic.fr MX whois.mx MY whois.mynic.my NA whois.na-nic.com.na NF whois.nic.nf NL whois.domain-registry.nl NO whois.norid.no NU whois.nic.nu NZ whois.srs.net.nz OVH whois-ovh.nic.fr PARIS whois-paris.nic.fr PL whois.dns.pl PM whois.nic.pm PR whois.nic.pr PT whois.dns.pt PW whois.nic.pw PY whois.i-dns.net QA whois.registry.qa RE whois.nic.re RO whois.rotld.ro RS whois.rnids.rs SA whois.saudinic.net.sa SB whois.nic.sb SC whois2.afilias-grs.net SE whois.iis.se SG whois.nic.net.sg SH whois.nic.sh SI whois.arnes.si SK whois.sk-nic.sk SM whois.ripe.net SNCF whois-sncf.nic.fr SO whois.nic.so ST whois.nic.st SX whois.sx TC whois.nic.tc TF whois.nic.tf TH whois.thnic.co.th TK whois.dot.tk TL whois.nic.tl TM whois.nic.tm TO whois.tonic.to TOTAL whois-total.nic.fr TR whois.nic.tr TV whois.nic.tv TW whois.twnic.net.tw UA whois.com.ua UK whois.nic.uk US whois.nic.us UZ whois.cctld.uz VC whois2.afilias-grs.net VE whois.nic.ve WF whois.nic.wf WS whois.worldsite.ws XN--80AO21A whois.nic.kz XN--E1A4C whois.eu XN--J6W193G whois.hkirc.hk XN--KPRW13D whois.twnic.net.tw XN--KPRY57D whois.twnic.net.tw XN--MGBA3A4F16A whois.nic.ir XN--WGBL6A whois.registry.qa XN--Y9A3AQ whois.amnic.net YT whois.nic.yt ASN.AU whois.aunic.net COM.AU whois.aunic.net CONF.AU whois.aunic.net CSIRO.AU whois.aunic.net EDU.AU whois.aunic.net GOV.AU whois.aunic.net ID.AU whois.aunic.net INFO.AU whois.aunic.net NET.AU whois.aunic.net ORG.AU whois.aunic.net EMU.ID.AU whois.aunic.net WATTLE.ID.AU whois.aunic.net ADM.BR whois.nic.br ADV.BR whois.nic.br AGR.BR whois.nic.br AM.BR whois.nic.br ARQ.BR whois.nic.br ART.BR whois.nic.br ATO.BR whois.nic.br BIO.BR whois.nic.br BMD.BR whois.nic.br CIM.BR whois.nic.br CNG.BR whois.nic.br CNT.BR whois.nic.br COM.BR whois.nic.br ECN.BR whois.nic.br EDU.BR whois.nic.br ENG.BR whois.nic.br ESP.BR whois.nic.br ETC.BR whois.nic.br ETI.BR whois.nic.br FAR.BR whois.nic.br FM.BR whois.nic.br FND.BR whois.nic.br FOT.BR whois.nic.br FST.BR whois.nic.br G12.BR whois.nic.br GGF.BR whois.nic.br GOV.BR whois.nic.br IMB.BR whois.nic.br IND.BR whois.nic.br INF.BR whois.nic.br JOR.BR whois.nic.br LEL.BR whois.nic.br MAT.BR whois.nic.br MED.BR whois.nic.br MIL.BR whois.nic.br MUS.BR whois.nic.br NET.BR whois.nic.br NOM.BR whois.nic.br NOT.BR whois.nic.br NTR.BR whois.nic.br ODO.BR whois.nic.br OOP.BR whois.nic.br ORG.BR whois.nic.br PPG.BR whois.nic.br PRO.BR whois.nic.br PSC.BR whois.nic.br PSI.BR whois.nic.br QSL.BR whois.nic.br REC.BR whois.nic.br SLG.BR whois.nic.br SRV.BR whois.nic.br TMP.BR whois.nic.br TRD.BR whois.nic.br TUR.BR whois.nic.br TV.BR whois.nic.br VET.BR whois.nic.br ZLG.BR whois.nic.br AC.CN whois.cnnic.net.cn AH.CN whois.cnnic.net.cn BJ.CN whois.cnnic.net.cn COM.CN whois.cnnic.net.cn CQ.CN whois.cnnic.net.cn FJ.CN whois.cnnic.net.cn GD.CN whois.cnnic.net.cn GOV.CN whois.cnnic.net.cn GS.CN whois.cnnic.net.cn GX.CN whois.cnnic.net.cn GZ.CN whois.cnnic.net.cn HA.CN whois.cnnic.net.cn HB.CN whois.cnnic.net.cn HE.CN whois.cnnic.net.cn HI.CN whois.cnnic.net.cn HK.CN whois.cnnic.net.cn HL.CN whois.cnnic.net.cn HN.CN whois.cnnic.net.cn JL.CN whois.cnnic.net.cn JS.CN whois.cnnic.net.cn JX.CN whois.cnnic.net.cn LN.CN whois.cnnic.net.cn MO.CN whois.cnnic.net.cn NET.CN whois.cnnic.net.cn NM.CN whois.cnnic.net.cn NX.CN whois.cnnic.net.cn ORG.CN whois.cnnic.net.cn QH.CN whois.cnnic.net.cn SC.CN whois.cnnic.net.cn SD.CN whois.cnnic.net.cn SH.CN whois.cnnic.net.cn SN.CN whois.cnnic.net.cn SX.CN whois.cnnic.net.cn TJ.CN whois.cnnic.net.cn TW.CN whois.cnnic.net.cn XJ.CN whois.cnnic.net.cn XZ.CN whois.cnnic.net.cn YN.CN whois.cnnic.net.cn ZJ.CN whois.cnnic.net.cn AC.FJ whois.domains.fj BIZ.FJ whois.domains.fj COM.FJ whois.domains.fj INFO.FJ whois.domains.fj MIL.FJ whois.domains.fj NAME.FJ whois.domains.fj NET.FJ whois.domains.fj ORG.FJ whois.domains.fj PRO.FJ whois.domains.fj CO.GY whois.registry.gy COM.GY whois.registry.gy NET.GY whois.registry.gy COM.HK whois.hknic.net.hk GOV.HK whois.hknic.net.hk NET.HK whois.hknic.net.hk ORG.HK whois.hknic.net.hk AC.JP whois.jprs.jp AD.JP whois.jprs.jp CO.JP whois.jprs.jp GR.JP whois.jprs.jp NE.JP whois.jprs.jp OR.JP whois.jprs.jp AC.MA whois.iam.net.ma CO.MA whois.iam.net.ma GOV.MA whois.iam.net.ma NET.MA whois.iam.net.ma ORG.MA whois.iam.net.ma PRESS.MA whois.iam.net.ma COM.MX whois.mx GOB.MX whois.mx NET.MX whois.mx COM.MT whois.nic.mt ORG.MT whois.nic.mt NET.MT whois.nic.mt EDU.MT whois.nic.mt CO.RS whois.rnids.rs EDU.RS whois.rnids.rs IN.RS whois.rnids.rs ORG.RS whois.rnids.rs XN--90A3AC whois.rnids.rs AC.TH whois.thnic.co.th CO.TH whois.thnic.co.th GO.TH whois.thnic.co.th MI.TH whois.thnic.co.th OR.TH whois.thnic.co.th NET.TH whois.thnic.co.th IN.TH whois.thnic.co.th COM.TW whois.twnic.net IDV.TW whois.twnic.net NET.TW whois.twnic.net ORG.TW whois.twnic.net COM.UA whois.com.ua NET.UA whois.net.ua ORG.UA whois.com.ua BIZ.UA whois.biz.ua CO.UA whois.co.ua PP.UA whois.pp.ua KIEV.UA whois.com.ua DN.UA whois.dn.ua LG.UA whois.lg.ua OD.UA whois.od.ua IN.UA whois.in.ua AC.UK whois.ja.net CO.UK whois.nic.uk ME.UK whois.nic.uk GOV.UK whois.ja.net LTD.UK whois.nic.uk NET.UK whois.nic.uk ORG.UK whois.nic.uk PLC.UK whois.nic.uk AFRICA africa-whois.registry.net.za CAPETOWN capetown-whois.registry.net.za CO.ZA whois.registry.net.za DURBAN durban-whois.registry.net.za JOBURG joburg-whois.registry.net.za NET.ZA net-whois.registry.net.za ORG.ZA org-whois.registry.net.za WEB.ZA web-whois.registry.net.za NGO whois.publicinterestregistry.net ONG whois.publicinterestregistry.net XN--C1AVG whois.publicinterestregistry.net XN--E1APQ whois.i-dns.net XN--I1B6B1A6A2E whois.publicinterestregistry.net XN--J1AEF whois.i-dns.net XN--NQV7F whois.publicinterestregistry.net XN--NQV7FS00EMA whois.publicinterestregistry.net XN--P1AG ru.whois.i-dns.net AE.ORG whois.centralnic.com AFRICA.COM whois.centralnic.com AR.COM whois.centralnic.com BR.COM whois.centralnic.com CN.COM whois.centralnic.com CO.COM whois.centralnic.com DE.COM whois.centralnic.com COM.DE whois.centralnic.com EU.COM whois.centralnic.com GB.COM whois.centralnic.com GB.NET whois.centralnic.com GR.COM whois.centralnic.com HU.COM whois.centralnic.com HU.NET whois.centralnic.com IN.NET whois.centralnic.com JP.NET whois.centralnic.com JPN.COM whois.centralnic.com KR.COM whois.centralnic.com MEX.COM whois.centralnic.com NO.COM whois.centralnic.com QC.COM whois.centralnic.com RADIO.AM whois.centralnic.com RADIO.FM whois.centralnic.com RU.COM whois.centralnic.com SA.COM whois.centralnic.com SE.COM whois.centralnic.com COM.SE whois.centralnic.com SE.NET whois.centralnic.com UK.COM whois.centralnic.com UK.NET whois.centralnic.com US.COM whois.centralnic.com UY.COM whois.centralnic.com ZA.COM whois.centralnic.com ART whois.nic.art BAR whois.nic.bar COLLEGE whois.nic.college CONTACT whois.nic.contact COOP whois.nic.coop FAN whois.nic.fan FANS whois.nic.fans FEEDBACK whois.nic.feedback FORUM whois.nic.forum HOST whois.nic.host LOVE whois.nic.love LPL whois.nic.lpl LPLFINANCIAL whois.nic.lplfinancial ONLINE whois.nic.online PID whois.nic.pid PRESS whois.nic.press PROTECTION whois.nic.protection REALTY whois.nic.realty REIT whois.nic.reit RENT whois.nic.rent REST whois.nic.rest SECURITY whois.nic.security SITE whois.nic.site SPACE whois.nic.space STORAGE whois.nic.storage STORE whois.nic.store TECH whois.nic.tech THEATRE whois.nic.theatre TICKETS whois.nic.tickets WEBSITE whois.nic.website XYZ whois.nic.xyz ORG.NS whois.pir.org BIZ.NS whois.biz NAME.NS whois.nic.name COM.TR whois.nic.tr ORG.HN whois.nic.hn NET.HN whois.nic.hn COM.HN whois.nic.hn VIP whois.nic.vip PROMO whois.nic.promo ALLFINANZ whois.ksregistry.net ARCHI whois.ksregistry.net BIO whois.ksregistry.net BMW whois.ksregistry.net CAM whois.ksregistry.net DESI whois.ksregistry.net DVAG whois.ksregistry.net FRESENIUS whois.ksregistry.net MINI whois.ksregistry.net POHL whois.ksregistry.net SAARLAND whois.ksregistry.net SKI whois.ksregistry.net SPIEGEL whois.ksregistry.net TUI whois.ksregistry.net XN--VERMGENSBERATER-CTB whois.ksregistry.net XN--VERMGENSBERATUNG-PWB whois.ksregistry.net ZUERICH whois.ksregistry.net AE whois.aeda.net.ae XN--MGBAAM7A8H whois.aeda.net.ae ABARTH whois.afilias-srs.net ABBOTT whois.afilias-srs.net ABBVIE whois.afilias-srs.net ACO whois.afilias-srs.net ACTIVE whois.afilias-srs.net ADULT whois.afilias-srs.net AGAKHAN whois.afilias-srs.net AIGO whois.afilias-srs.net AKDN whois.afilias-srs.net ALFAROMEO whois.afilias-srs.net ALIPAY whois.afilias-srs.net ALLSTATE whois.afilias-srs.net ALLY whois.afilias-srs.net APPLE whois.afilias-srs.net AUDI whois.afilias-srs.net AUTOS whois.afilias-srs.net AVIANCA whois.afilias-srs.net BCG whois.afilias-srs.net BEATS whois.afilias-srs.net BESTBUY whois.afilias-srs.net BLOCKBUSTER whois.afilias-srs.net BNL whois.afilias-srs.net BNPPARIBAS whois.afilias-srs.net BOATS whois.afilias-srs.net BOEHRINGER whois.afilias-srs.net BUGATTI whois.afilias-srs.net BUY whois.afilias-srs.net CASE whois.afilias-srs.net CASEIH whois.afilias-srs.net CBS whois.afilias-srs.net CEB whois.afilias-srs.net CERN whois.afilias-srs.net CHRYSLER whois.afilias-srs.net CIPRIANI whois.afilias-srs.net CLINIQUE whois.afilias-srs.net CREDITUNION whois.afilias-srs.net CRUISE whois.afilias-srs.net DABUR whois.afilias-srs.net DELTA whois.afilias-srs.net DISH whois.afilias-srs.net DODGE whois.afilias-srs.net DOT whois.afilias-srs.net DTV whois.afilias-srs.net DUNLOP whois.afilias-srs.net DVR whois.afilias-srs.net ECO whois.afilias-srs.net EDEKA whois.afilias-srs.net EMERCK whois.afilias-srs.net ESURANCE whois.afilias-srs.net EXTRASPACE whois.afilias-srs.net FAGE whois.afilias-srs.net FEDEX whois.afilias-srs.net FERRARI whois.afilias-srs.net FIAT whois.afilias-srs.net FIDO whois.afilias-srs.net GALLUP whois.afilias-srs.net GEA whois.afilias-srs.net GODADDY whois.afilias-srs.net GOODHANDS whois.afilias-srs.net GOODYEAR whois.afilias-srs.net HDFC whois.afilias-srs.net HDFCBANK whois.afilias-srs.net HELSINKI whois.afilias-srs.net HERMES whois.afilias-srs.net HKT whois.afilias-srs.net HOMEDEPOT whois.afilias-srs.net HOMES whois.afilias-srs.net HUGHES whois.afilias-srs.net ICBC whois.afilias-srs.net IMAMAT whois.afilias-srs.net ISMAILI whois.afilias-srs.net IST whois.afilias-srs.net ISTANBUL whois.afilias-srs.net ITV whois.afilias-srs.net IVECO whois.afilias-srs.net JCP whois.afilias-srs.net JEEP whois.afilias-srs.net JIO whois.afilias-srs.net JLL whois.afilias-srs.net KOSHER whois.afilias-srs.net LAMBORGHINI whois.afilias-srs.net LAMER whois.afilias-srs.net LANCIA whois.afilias-srs.net LASALLE whois.afilias-srs.net LATINO whois.afilias-srs.net LDS whois.afilias-srs.net LOCKER whois.afilias-srs.net LTDA whois.afilias-srs.net MARRIOTT whois.afilias-srs.net MASERATI whois.afilias-srs.net MCKINSEY whois.afilias-srs.net METLIFE whois.afilias-srs.net MIT whois.afilias-srs.net MOPAR whois.afilias-srs.net MORMON whois.afilias-srs.net MOTORCYCLES whois.afilias-srs.net NATURA whois.afilias-srs.net NEWHOLLAND whois.afilias-srs.net NOKIA whois.afilias-srs.net NOWTV whois.afilias-srs.net NRA whois.afilias-srs.net OLLO whois.afilias-srs.net ONL whois.afilias-srs.net ORIENTEXPRESS whois.afilias-srs.net ORIGINS whois.afilias-srs.net OTT whois.afilias-srs.net PCCW whois.afilias-srs.net PNC whois.afilias-srs.net PORN whois.afilias-srs.net PROGRESSIVE whois.afilias-srs.net PWC whois.afilias-srs.net REDUMBRELLA whois.afilias-srs.net RELIANCE whois.afilias-srs.net RICH whois.afilias-srs.net RICHARDLI whois.afilias-srs.net RIL whois.afilias-srs.net ROGERS whois.afilias-srs.net SBI whois.afilias-srs.net SCHAEFFLER whois.afilias-srs.net SCHOLARSHIPS whois.afilias-srs.net SEW whois.afilias-srs.net SEX whois.afilias-srs.net SHAW whois.afilias-srs.net SHOWTIME whois.afilias-srs.net SHRIRAM whois.afilias-srs.net SINA whois.afilias-srs.net SLING whois.afilias-srs.net SRT whois.afilias-srs.net STADA whois.afilias-srs.net STAR whois.afilias-srs.net STATEBANK whois.afilias-srs.net STOCKHOLM whois.afilias-srs.net TEMASEK whois.afilias-srs.net THD whois.afilias-srs.net TRAVELERS whois.afilias-srs.net TRAVELERSINSURANCE whois.afilias-srs.net TRV whois.afilias-srs.net TVS whois.afilias-srs.net UCONNECT whois.afilias-srs.net UPS whois.afilias-srs.net VEGAS whois.afilias-srs.net VIG whois.afilias-srs.net VIKING whois.afilias-srs.net VOLKSWAGEN whois.afilias-srs.net WEIBO whois.afilias-srs.net WOLTERSKLUWER whois.afilias-srs.net XN--3OQ18VL8PN36A whois.afilias-srs.net XN--4GBRIM whois.afilias-srs.net XN--5TZM5G whois.afilias-srs.net XN--9KRT00A whois.afilias-srs.net XN--B4W605FERD whois.afilias-srs.net XN--ESTV75G whois.afilias-srs.net XN--FZYS8D69UVGM whois.afilias-srs.net XN--JLQ61U9W7B whois.afilias-srs.net YACHTS whois.afilias-srs.net ZARA whois.afilias-srs.net BOM whois.gtlds.nic.br FINAL whois.gtlds.nic.br GLOBO whois.gtlds.nic.br RIO whois.gtlds.nic.br UOL whois.gtlds.nic.br BAIDU whois.ngtld.cn XN--1QQW23A whois.ngtld.cn XN--55QX5D whois.ngtld.cn XN--IO0A7I whois.ngtld.cn XN--XHQ521B whois.ngtld.cn ADS whois.nic.google ANDROID whois.nic.google APP whois.nic.google BOO whois.nic.google CAL whois.nic.google CHANNEL whois.nic.google CHROME whois.nic.google DAD whois.nic.google DAY whois.nic.google DCLK whois.nic.google DEV whois.nic.google DOCS whois.nic.google DRIVE whois.nic.google EAT whois.nic.google ESQ whois.nic.google FLY whois.nic.google FOO whois.nic.google GBIZ whois.nic.google GLE whois.nic.google GMAIL whois.nic.google GOOG whois.nic.google GOOGLE whois.nic.google GUGE whois.nic.google HANGOUT whois.nic.google HERE whois.nic.google HOW whois.nic.google ING whois.nic.google MEET whois.nic.google MEME whois.nic.google MOV whois.nic.google NEW whois.nic.google NEXUS whois.nic.google PAGE whois.nic.google PLAY whois.nic.google PROD whois.nic.google PROF whois.nic.google RSVP whois.nic.google SOY whois.nic.google XN--FLW351E whois.nic.google XN--Q9JYB4C whois.nic.google XN--QCKA1PMC whois.nic.google YOUTUBE whois.nic.google ZIP whois.nic.google ANQUAN whois.teleinfo.cn SHOUJI whois.teleinfo.cn XIHUAN whois.teleinfo.cn XN--3DS443G whois.teleinfo.cn XN--FIQ228C5HS whois.teleinfo.cn XN--VUQ861B whois.teleinfo.cn YUN whois.teleinfo.cn NOWRUZ whois.agitsys.net PARS whois.agitsys.net SHIA whois.agitsys.net TCI whois.agitsys.net XN--MGBT3DHD whois.agitsys.net WANG whois.gtld.knet.cn XN--30RR7Y whois.gtld.knet.cn XN--3BST00M whois.gtld.knet.cn XN--6QQ986B3XL whois.gtld.knet.cn XN--9ET52U whois.gtld.knet.cn XN--CZRU2D whois.gtld.knet.cn XN--FIQ64B whois.gtld.knet.cn MK whois.marnet.mk XN--D1ALF whois.marnet.mk DZ whois.nic.dz XN--LGBBAT1AD8J whois.nic.dz DATSUN whois.nic.gmo FUJITSU whois.nic.gmo GOO whois.nic.gmo HISAMITSU whois.nic.gmo HITACHI whois.nic.gmo INFINITI whois.nic.gmo JCB whois.nic.gmo MITSUBISHI whois.nic.gmo MTPC whois.nic.gmo NISSAN whois.nic.gmo PANASONIC whois.nic.gmo PIONEER whois.nic.gmo SHARP whois.nic.gmo YODOBASHI whois.nic.gmo OM whois.registry.om XN--MGB9AWBF whois.registry.om SY whois.tld.sy XN--OGBPF8FL whois.tld.sy XN--FIQS8S cwhois.cnnic.cn XN--FIQZ9S cwhois.cnnic.cn NET.SO whois.nic.so INT.RU whois.int.ru PRIV.AT whois.nic.priv.at AI whois.nic.ai BN whois.bnnic.bn AARP whois.nic.aarp ABC whois.nic.abc ABUDHABI whois.nic.abudhabi ACCOUNTANT whois.nic.accountant ADAC whois.nic.adac AEG whois.nic.aeg AF whois.nic.af AFAMILYCOMPANY whois.nic.afamilycompany AFL whois.nic.afl AIRBUS whois.nic.airbus AIRTEL whois.nic.airtel ALIBABA whois.nic.alibaba ALSTOM whois.nic.alstom AMERICANFAMILY whois.nic.americanfamily AMFAM whois.nic.amfam ANZ whois.nic.anz AOL whois.nic.aol ARTE whois.nic.arte ASDA whois.nic.asda AUSPOST whois.nic.auspost AW whois.nic.aw BANK whois.nic.bank BARCELONA whois.nic.barcelona BARCLAYCARD whois.nic.barclaycard BARCLAYS whois.nic.barclays BAREFOOT whois.nic.barefoot BASKETBALL whois.nic.basketball BAUHAUS whois.nic.bauhaus BAYERN whois.nic.bayern BBC whois.nic.bbc BBT whois.nic.bbt BBVA whois.nic.bbva BCN whois.nic.bcn BEAUTY whois.nic.beauty BENTLEY whois.nic.bentley BID whois.nic.bid BLANCO whois.nic.blanco BLOG whois.nic.blog BMS whois.nic.bms BO whois.nic.bo BOFA whois.nic.bofa BOND whois.nic.bond BOOTS whois.nic.boots BOSCH whois.nic.bosch BRADESCO whois.nic.bradesco BRIDGESTONE whois.nic.bridgestone BROADWAY whois.nic.broadway BROTHER whois.nic.brother BRUSSELS whois.nic.brussels BZH whois.nic.bzh BW whois.nic.net.bw BI whois1.nic.bi CANCERRESEARCH whois.nic.cancerresearch CANON whois.nic.canon PE kero.yachay.pe COLOGNE whois-fe1.pdt.cologne.tango.knipp.de GMX whois-fe1.gmx.tango.knipp.de KOELN whois-fe1.pdt.koeln.tango.knipp.de MOVISTAR whois-fe.movistar.tango.knipp.de TELEFONICA whois-fe.telefonica.tango.knipp.de SMART whois-gtld.smart.com.ph TN whois.ati.tn UG whois.co.ug GQ whois.dominio.gq CF whois.dot.cf ML whois.dot.ml POST whois.dotpostregistry.net EUS whois.eus.coreregistry.net GAL whois.gal.coreregistry.net MANGO whois.mango.coreregistry.net SCOT whois.scot.coreregistry.net IKANO whois.ikano.tld-box.at VOTING whois.voting.tld-box.at KY whois.kyregistry.ky NC whois.nc CAPITALONE whois.nic.capitalone CASA whois.nic.casa CBA whois.nic.cba CEO whois.nic.ceo CFA whois.nic.cfa CFD whois.nic.cfd CHANEL whois.nic.chanel CHINTAI whois.nic.chintai CITYEATS whois.nic.cityeats CLUBMED whois.nic.clubmed COMCAST whois.nic.comcast COMMBANK whois.nic.commbank COMPARE whois.nic.compare COMSEC whois.nic.comsec COOKING whois.nic.cooking COOKINGCHANNEL whois.nic.cookingchannel CR whois.nic.cr CRICKET whois.nic.cricket CSC whois.nic.csc CUISINELLA whois.nic.cuisinella CYMRU whois.nic.cymru DATE whois.nic.date DDS whois.nic.dds DELOITTE whois.nic.deloitte DESIGN whois.nic.design DIY whois.nic.diy DOHA whois.nic.doha DOWNLOAD whois.nic.download DUBAI whois.nic.dubai DUCK whois.nic.duck EC whois.nic.ec ERICSSON whois.nic.ericsson ERNI whois.nic.erni EUROVISION whois.nic.eurovision FAIRWINDS whois.nic.fairwinds FAITH whois.nic.faith FASHION whois.nic.fashion FIDELITY whois.nic.fidelity FIRESTONE whois.nic.firestone FIRMDALE whois.nic.firmdale FISHING whois.nic.fishing FOODNETWORK whois.nic.foodnetwork FRL whois.nic.frl FRONTDOOR whois.nic.frontdoor FUJIXEROX whois.nic.fujixerox GALLO whois.nic.gallo GDN whois.nic.gdn GENT whois.nic.gent GENTING whois.nic.genting GEORGE whois.nic.george GGEE whois.nic.ggee GIVING whois.nic.giving GL whois.nic.gl GLADE whois.nic.glade GLOBAL whois.nic.global GOLDPOINT whois.nic.goldpoint GOP whois.nic.gop HAMBURG whois.nic.hamburg HGTV whois.nic.hgtv HONDA whois.nic.honda HORSE whois.nic.horse HYUNDAI whois.nic.hyundai IBM whois.nic.ibm ICE whois.nic.ice ICU whois.nic.icu IFM whois.nic.ifm INK whois.nic.ink INSURANCE whois.nic.insurance IRISH whois.nic.irish ISELECT whois.nic.iselect JAGUAR whois.nic.jaguar JAVA whois.nic.java JUNIPER whois.nic.juniper KDDI whois.nic.kddi KERRYHOTELS whois.nic.kerryhotels KERRYLOGISTICS whois.nic.kerrylogistics KERRYPROPERTIES whois.nic.kerryproperties KFH whois.nic.kfh KIA whois.nic.kia KN whois.nic.kn KOMATSU whois.nic.komatsu KUOKGROUP whois.nic.kuokgroup KYOTO whois.nic.kyoto LA whois.lanic.la LACAIXA whois.nic.lacaixa LADBROKES whois.nic.ladbrokes LANCOME whois.nic.lancome LANDROVER whois.nic.landrover LAT whois.nic.lat LATROBE whois.nic.latrobe LAW whois.nic.law LEFRAK whois.nic.lefrak LEGO whois.nic.lego LEXUS whois.nic.lexus LIAISON whois.nic.liaison LIDL whois.nic.lidl LIFESTYLE whois.nic.lifestyle LINDE whois.nic.linde LIPSY whois.nic.lipsy LIXIL whois.nic.lixil LOAN whois.nic.loan LOCUS whois.nic.locus LOTTE whois.nic.lotte LUNDBECK whois.nic.lundbeck MACYS whois.nic.macys MAKEUP whois.nic.makeup MAN whois.nic.man MARKETS whois.nic.markets MED whois.nic.med MLS whois.nic.mls MOE whois.nic.moe MONASH whois.nic.monash MONSTER whois.nic.monster MTN whois.nic.mtn MTR whois.nic.mtr MZ whois.nic.mz NAB whois.nic.nab NADEX whois.nic.nadex NATIONWIDE whois.nic.nationwide NEC whois.nic.nec NG whois.nic.net.ng NETBANK whois.nic.netbank NEXT whois.nic.next NEXTDIRECT whois.nic.nextdirect NICO whois.nic.nico NIKON whois.nic.nikon NISSAY whois.nic.nissay NORTON whois.nic.norton OBI whois.nic.obi OBSERVER whois.nic.observer OFF whois.nic.off OLAYAN whois.nic.olayan OLAYANGROUP whois.nic.olayangroup OMEGA whois.nic.omega ONYOURSIDE whois.nic.onyourside ORACLE whois.nic.oracle ORANGE whois.nic.orange UY whois.nic.org.uy OSAKA whois.nic.osaka PARTY whois.nic.party PHILIPS whois.nic.philips PHYSIO whois.nic.physio PLAYSTATION whois.nic.playstation POLITIE whois.nic.politie QUEBEC whois.nic.quebec QUEST whois.nic.quest RACING whois.nic.racing RADIO whois.nic.radio RAID whois.nic.raid REALESTATE whois.nic.realestate REDSTONE whois.nic.redstone REISE whois.nic.reise REVIEW whois.nic.review REXROTH whois.nic.rexroth RICOH whois.nic.ricoh RIGHTATHOME whois.nic.rightathome RODEO whois.nic.rodeo RUHR whois.nic.ruhr RWE whois.nic.rwe SAMSCLUB whois.nic.samsclub SAMSUNG whois.nic.samsung SANDVIK whois.nic.sandvik SANOFI whois.nic.sanofi SAP whois.nic.sap SBS whois.nic.sbs SCA whois.nic.sca SCB whois.nic.scb SCHMIDT whois.nic.schmidt SCHWARZ whois.nic.schwarz SCIENCE whois.nic.science SCJOHNSON whois.nic.scjohnson SEAT whois.nic.seat SEEK whois.nic.seek SELECT whois.nic.select SES whois.nic.ses SFR whois.nic.sfr SHANGRILA whois.nic.shangrila SHELL whois.nic.shell SKIN whois.nic.skin SKY whois.nic.sky SN whois.nic.sn SOFTBANK whois.nic.softbank SONY whois.nic.sony SPREADBETTING whois.nic.spreadbetting STARHUB whois.nic.starhub STATOIL whois.nic.statoil STC whois.nic.stc STCGROUP whois.nic.stcgroup SUCKS whois.nic.sucks SURF whois.nic.surf SWATCH whois.nic.swatch SWISS whois.nic.swiss SYMANTEC whois.nic.symantec TAB whois.nic.tab TAIPEI whois.nic.taipei TATAMOTORS whois.nic.tatamotors TELECITY whois.nic.telecity TG whois.nic.tg TIAA whois.nic.tiaa TIFFANY whois.nic.tiffany TIROL whois.nic.tirol TORAY whois.nic.toray TOSHIBA whois.nic.toshiba TOYOTA whois.nic.toyota TRADE whois.nic.trade TRAVELCHANNEL whois.nic.travelchannel UBANK whois.nic.ubank UBS whois.nic.ubs VANA whois.nic.vana VANGUARD whois.nic.vanguard VERISIGN whois.nic.verisign VERSICHERUNG whois.nic.versicherung VG whois.nic.vg VISA whois.nic.visa VISTA whois.nic.vista VIVA whois.nic.viva VLAANDEREN whois.nic.vlaanderen VODKA whois.nic.vodka VOLVO whois.nic.volvo WALES whois.nic.wales WALMART whois.nic.walmart WARMAN whois.nic.warman WEBCAM whois.nic.webcam WEBER whois.nic.weber WED whois.nic.wed WHOSWHO whois.nic.whoswho WIN whois.nic.win WME whois.nic.wme WTC whois.nic.wtc XEROX whois.nic.xerox XFINITY whois.nic.xfinity XIN whois.nic.xin XN--11B4C3D whois.nic.xn--11b4c3d ID whois.pandi.or.id PF whois.registry.pf TZ whois.tznic.or.tz XN--55QW42G whois.conac.cn XN--ZFR164B whois.conac.cn XN--J1AMH whois.dotukr.com XN--90AE whois.imena.bg MO whois.monic.mo XN--MIX891F whois.monic.mo XN--MGBERP4A5D4AR whois.nic.net.sa XN--3PXU8K whois.nic.xn--3pxu8k XN--42C2D9A whois.nic.xn--42c2d9a XN--45Q11C whois.nic.xn--45q11c XN--5SU34J936BGSG whois.nic.xn--5su34j936bgsg XN--9DBQ2A whois.nic.xn--9dbq2a XN--C2BR7G whois.nic.xn--c2br7g XN--EFVY88H whois.nic.xn--efvy88h XN--FHBEI whois.nic.xn--fhbei XN--HXT814E whois.nic.xn--hxt814e XN--KPUT3I whois.nic.xn--kput3i XN--MGBA7C0BBN0A whois.nic.xn--mgba7c0bbn0a XN--MGBCA7DZDO whois.nic.xn--mgbca7dzdo XN--MK1BU44C whois.nic.xn--mk1bu44c XN--MXTQ1M whois.nic.xn--mxtq1m XN--NGBE9E0A whois.nic.xn--ngbe9e0a XN--PSSY2U whois.nic.xn--pssy2u XN--T60B56A whois.nic.xn--t60b56a XN--TCKWE whois.nic.xn--tckwe XN--W4R85EL8FHU5DNRA whois.nic.xn--w4r85el8fhu5dnra XN--W4RS40L whois.nic.xn--w4rs40l XPERIA whois.nic.xperia ZM whois.nic.zm XN--YGBI2AMMX whois.pnina.ps XN--SES554G whois.nic.xn--ses554g XN--CLCHC0EA0B2G2A9GCD whois.sgnic.sg XN--YFRO4I67O whois.sgnic.sg XN--O3CW4H whois.thnic.co.th XN--NODE whois.itdc.ge XN--3E0B707E whois.kr XN--CG4BKI whois.kr SANDVIKCOROMANT whois.nic.sandvikcoromant SCOR whois.nic.scor SEVEN whois.nic.seven SYDNEY whois.nic.sydney TDK whois.nic.tdk TEVA whois.nic.teva TRUST whois.nic.trust VIRGIN whois.nic.virgin VISTAPRINT whois.nic.vistaprint WALTER whois.nic.walter WOODSIDE whois.nic.woodside XN--KCRX77D1X4A whois.nic.xn--kcrx77d1x4a XN--NGBC5AZD whois.nic.xn--ngbc5azd COUNTRY whois.nic.country ABOGADO whois.nic.abogado BEER whois.nic.beer BUDAPEST whois.nic.budapest FIT whois.nic.fit GARDEN whois.nic.garden LONDON whois.nic.london LUXE whois.nic.luxe MIAMI whois.nic.miami NRW whois.nic.nrw WEDDING whois.nic.wedding WORK whois.nic.work YOGA whois.nic.yoga AX whois.ax XN--90AIS whois.cctld.by GF whois.mediaserv.net AMSTERDAM whois.nic.amsterdam ARAB whois.nic.arab AUDIBLE whois.nic.audible AUTHOR whois.nic.author AWS whois.nic.aws BIBLE whois.nic.bible BOOK whois.nic.book BOT whois.nic.bot CALL whois.nic.call CATHOLIC whois.nic.catholic CHARITY whois.nic.charity CIRCLE whois.nic.circle CPA whois.nic.cpa DATA whois.nic.data DEAL whois.nic.deal DNP whois.nic.dnp DO whois.nic.do FAST whois.nic.fast FIRE whois.nic.fire FOX whois.nic.fox FREE whois.nic.free GAY whois.nic.gay GE whois.nic.ge GOT whois.nic.got HOT whois.nic.hot IMDB whois.nic.imdb INC whois.nic.inc JOT whois.nic.jot JOY whois.nic.joy KINDLE whois.nic.kindle LIKE whois.nic.like LS whois.nic.ls MOBILE whois.nic.mobile MOI whois.nic.moi MR whois.nic.mr MW whois.nic.mw NHK whois.nic.nhk NOW whois.nic.now OKINAWA whois.nic.okinawa OTSUKA whois.nic.otsuka PAY whois.nic.pay PHARMACY whois.nic.pharmacy PHONE whois.nic.phone PIN whois.nic.pin PRIME whois.nic.prime READ whois.nic.read RMIT whois.nic.rmit ROOM whois.nic.room RUGBY whois.nic.rugby RYUKYU whois.nic.ryukyu SAFE whois.nic.safe SAFETY whois.nic.safety SAVE whois.nic.save SECURE whois.nic.secure SILK whois.nic.silk SMILE whois.nic.smile SPORT whois.nic.sport SPOT whois.nic.spot SS whois.nic.ss SUZUKI whois.nic.suzuki TALK whois.nic.talk TD whois.nic.td TUNES whois.nic.tunes TUSHU whois.nic.tushu UNICOM whois.nic.unicom WANGGOU whois.nic.wanggou WIKI whois.nic.wiki WOW whois.nic.wow XN--80AQECDR1A whois.nic.xn--80aqecdr1a XN--8Y0A063A whois.nic.xn--8y0a063a XN--MGBAB2BD whois.nic.xn--mgbab2bd XN--MGBI4ECEXP whois.nic.xn--mgbi4ecexp XN--NGBRX whois.nic.xn--ngbrx XN--TIQ49XQYJ whois.nic.xn--tiq49xqyj YAMAXUN whois.nic.yamaxun YOU whois.nic.you ZAPPOS whois.nic.zappos XN--2SCRJ9C whois.registry.in ); our %ip_whois_servers = qw( AFRINIC whois.afrinic.net APNIC whois.apnic.net ARIN whois.arin.net LACNIC whois.lacnic.net RIPE whois.ripe.net JPNIC whois.nic.ad.jp KRNIC whois.krnic.net ); # for not utf8 our %codepages = ( 'whois.nic.cl' => 'iso-8859-1', 'whois.ttpia.com' => 'iso-8859-1', 'whois.registro.br' => 'iso-8859-1', 'whois.cira.ca' => 'iso-8859-1', 'whois.denic.de' => 'iso-8859-1', 'whois.eenet.ee' => 'iso-8859-1', 'whois.ficora.fi' => 'iso-8859-1', 'whois.isnic.is' => 'iso-8859-1', 'whois.nic.hu' => 'iso-8859-1', 'whois.dns.pt' => 'iso-8859-1', 'whois.net.ua' => 'koi8-u', 'whois.biz.ua' => 'koi8-u', 'whois.co.ua' => 'koi8-u', 'whois.dn.ua' => 'koi8-u', 'whois.lg.ua' => 'koi8-u', 'whois.od.ua' => 'koi8-u', 'whois.in.ua' => 'koi8-u', 'whois.nic.or.kr' => 'euc-kr', 'whois.domain.kg' => 'cp-1251', ); our %notfound = ( 'whois.arin.net' => '^No match found', 'whois.ripe.net' => 'No entries found', 'whois.ripn.net' => '(?:No entries found|The queried object does not exist)', 'whois.registry.ripn.net' => '(?:No entries found|The queried object does not exist)', 'whois.nic.net.ru' => 'No entries found for the selected source', 'whois.nic.ru' => 'No entries found', 'whois.nnov.ru' => 'No entries found', 'whois.int.ru' => 'No entries found', 'whois.reg.ru' => '^Domain \S+ not found', 'whois.com.ua' => 'No entries found for', 'whois.co.ua' => 'No entries found', 'whois.biz.ua' => 'No entries found', 'whois.net.ua' => 'No match record found|No entries found', 'delta.hostmaster.net.ua' => 'No entries found for domain', 'whois.pp.ua' => 'No entries found', 'whois.dn.ua' => 'No match record found', 'whois.lg.ua' => 'No match record found', 'whois.od.ua' => 'Domain name does not exist', 'whois.in.ua' => 'Domain name does not exist', 'whois.aero' => '^NOT FOUND', 'whois.nic.asia' => '^NOT FOUND', 'whois.biz' => '^No Data Found', 'whois.nic.tel' => '^No Data Found', 'whois.nic.cat' => 'no matching objects found', 'whois.educause.edu' => '^No Match', 'whois.nic.mil' => '^No match for', 'whois.museum' => 'NOT FOUND', 'whois.afilias.net' => '^NOT FOUND', 'whois.crsnic.net' => '^No match for', 'whois.networksolutions.com' => '(?i)no match', 'whois.dotmobiregistry.net' => '^NOT FOUND', 'whois.nic.name' => 'No match for domain', 'whois.iana.org' => '^Domain \S+ not found', 'whois.pir.org' => '^NOT FOUND', 'ccwhois.verisign-grs.com' => '^No match for', 'jobswhois.verisign-grs.com' => '^No match for', 'tvwhois.verisign-grs.com' => '^No match for', 'whois.registrypro.pro' => '^NOT FOUND', 'whois.worldsite.ws' => 'The queried object does not exist: ', 'whois.nic.travel' => '^No Data Found', 'whois.donuts.co' => 'Domain not found', 'whois.nic.menu' => 'No Data Found', 'whois.uniregistry.net' => 'object does not exist', 'whois.nic.uno' => '^No Data Found', 'whois.nic.berlin' => '^The queried object does not exis', 'whois.nic.kiwi' => 'Status\: Not Registered|Not found', 'whois.nic.build' => 'No Data Found', 'whois.nic.club' => '^No Data Found', 'whois.nic.luxury' => 'No Data Found', 'whois.publicinterestregistry.net' => 'NOT FOUND', 'whois-dub.mm-registry.com' => 'The queried object does not exist', 'whois.nic.ag' => 'NOT FOUND', 'whois.nic.as' => '^NOT FOUND', 'whois.nic.at' => 'nothing found', 'whois.nic.br' => 'No match for', 'whois.amnic.net' => 'No match', 'whois.aunic.net' => 'No Data Found', 'whois.dns.be' => 'Status:\s+AVAILABLE', 'whois.register.bg' => '(?:^Domain name \S+ does not exist|registration status\: available)', 'whois.registro.br' => 'No match for', 'whois.registry.hm' => 'Domain not found', 'whois.nic.ht' => 'No Object Found', 'whois.cira.ca' => '^Domain status\:\s+available', 'whois.nic.cd' => 'Domain Status: No Object Found', 'whois.nic.ch' => '^We do not have an entry in our database matching your', 'whois.nic.ci' => 'No Object Found', 'whois.nic.cl' => '\: no entries found', 'whois.nic.cx' => 'No Object Found', 'whois.nic.cz' => 'no entries found', 'whois.denic.de' => 'Status\: free', 'whois.member.denic.de' => 'Status\: free', 'whois.nic.dm' => '^not found\.', 'whois.dk-hostmaster.dk' => 'No entries found for the selected source', 'whois.eenet.ee' => 'Domain not found', 'whois.eu' => 'Status:\s+AVAILABLE', 'whois.ficora.fi' => 'Domain not found', 'whois.domains.fj' => 'The domain \S+ was not found', 'whois.nic.fm' => 'DOMAIN NOT FOUND', 'whois.nic.fr' => 'No entries found', 'whois.channelisles.net' => '^NOT FOUND', 'whois.nic.gd' => '^not found\.|DOMAIN NOT FOUND', 'whois.nic.gs' => 'No Object Found', 'whois.registry.gy' => 'No Object Found', 'whois.hkirc.hk' => '^The domain has not been registered', 'whois.hknic.net.hk' => '^The domain has not been registered', 'whois.nic.hu' => 'No match', 'whois.domainregistry.ie' => 'Not Registered', 'whois.isoc.org.il' => 'No data was found', 'whois.nic.im' => 'The domain \S+ was not found', 'whois.nic.io' => '^NOT FOUND', 'whois.isnic.is' => 'No entries found', 'whois.nic.it' => 'Status:\s+AVAILABLE', 'whois.nic.ir' => 'No entries found', 'whois.jprs.jp' => 'No match', 'whois.kenic.or.ke' => 'No match found', 'whois.nic.ki' => 'No Object Found', 'whois.nic.or.kr' => 'requested domain was not found', 'whois.nic.kz' => 'Nothing found for this query', 'whois.nic.la' => 'DOMAIN NOT FOUND', 'whois.nic.li' => 'We do not have an entry', 'whois.domreg.lt' => 'Status:\s+available', 'whois.dns.lu' => 'No such domain', 'whois.nic.lv' => 'Status\: free', 'whois.nic.ly' => 'Not found', 'whois.iam.net.ma' => 'No Object Found', 'whois.nic.md' => 'No match for', 'whois.nic.mg' => 'No Object Found', 'whois.nic.ms' => 'No Object Found', 'whois.nic.mt' => 'Domain is not registered', 'whois.nic.mu' => 'No Object Found', 'whois.mx' => 'Object_Not_Found', 'whois.mynic.my' => '^Domain Name \S+ does not', 'whois.na-nic.com.na' => 'No Object Found', 'whois.nic.nf' => 'No Object Found', 'whois.domain-registry.nl' => '^\S+ is free', 'whois.norid.no' => '\sNo match', 'whois.nic.nu' => 'domain \S+ not found', 'whois.srs.net.nz' => 'query_status\: (500 Invalid|220 Avail)', 'whois.dns.pl' => 'No information available about domain name', 'whois.nic.pm' => 'No entries found', 'whois.nic.pr' => 'domain \S+ is not registered', 'whois.dns.pt' => 'no match', 'whois.nic.re' => 'No entries found', 'whois.rotld.ro' => 'No entries found', 'whois.rnids.rs' => 'Domain is not registered', 'whois.saudinic.net.sa' => 'No Match for', 'whois.nic.sb' => 'No Object Found', 'whois.iis.se' => 'domain \S+ not found', 'whois.nic.net.sg' => '^Domain Not Found', 'whois.nic.sh' => '^NOT FOUND', 'whois.arnes.si' => 'No entries found', 'whois.nic.st' => '^No entries found', 'whois.sx' => 'Not found', 'whois.nic.tc' => 'No Object Found', 'whois.adamsnames.com' => '^\S+ is not registered', 'whois.nic.tl' => 'No Object Found', 'whois.nic.tf' => 'No entries found', 'whois.dot.tk' => 'domain name not known', 'whois.nic.tm' => 'Domain \S+ is available', 'whois.tonic.to' => 'No match for', 'whois.twnic.net' => 'No Found', 'whois.twnic.net.tw' => '^No Found', 'whois.nic.uk' => 'No match for', 'whois.ja.net' => 'No such domain', 'whois.nic.us' => '^No Data Found', 'whois.cctld.uz' => 'not found in database', 'whois.nic.ve' => 'No match for', 'whois.nic.wf' => 'No entries found', 'whois.nic.yt' => 'No entries found', 'whois.nic.pw' => 'DOMAIN NOT FOUND', 'whois.nic.vip' => 'This domain name has not been registered\.', 'whois.nsiregistry.net' => 'No match for', 'whois.007names.com' => '^The Domain Name \S+ does not exist', 'whois.0101domain.com' => 'No match for domain', 'whois.1stdomain.net' => '^No domain found', 'whois.123registration.com' => '^No match for', # 'whois.1isi.com' -- empty on not fount # 'whois.35.com' -- empty on not fount 'whois.4domains.com' => 'Domain Not Found', # Answer on first query -- "Please try again in 4 seconds" 'whois.activeregistrar.com' => '^Domain name not found', 'whois.addresscreation.com' => '^No match for', # 'whois.advantage-interactive.com' -- show empty fields 'whois2.afilias-grs.net' => '^NOT FOUND', 'whois.aitdomains.com' => '^No match for', 'whois.alldomains.com' => '^No match for', 'whois.centralnic.com' => '(?:DOMAIN NOT FOUND|Status:\s+free)', 'whois.communigal.net' => '^NOT FOUND', 'whois.desertdevil.com' => 'No match for domain', 'whois.directi.com' => 'No Match for', 'whois.directnic.com' => '^No match for', 'whois.domaindiscover.com' => '^No match for', 'whois.domainstobeseen.com' => 'No match for', 'whois.dotregistrar.com' => '^No match for', 'whois.dotster.com' => 'No match for', 'whois.ename.com' => 'Out of Registry', 'whois.enameco.com' => 'No match for', 'whois.gandi.net' => 'Not found', 'whois.gdns.net' => '^Domain Not Found', 'whois.getyername.com' => '^No match for', 'whois.godaddy.com' => '^No match for', 'whois.joker.com' => 'object\(s\) not found', 'whois.markmonitor.com' => 'No entries found', 'whois.melbourneit.com' => '^Invalid/Unsupported whois name check', 'whois.moniker.com' => '^No Match', 'whois.names4ever.com' => '^No match for', # 'whois.namesbeyond.com' ??? my IP in black list 'whois.nameisp.com' => 'domain not found', # 'whois.namescout.com' -- need big timeout 'whois.namesystem.com' => '^Sorry, Domain does not exist', 'whois.nordnet.net' => 'No match for', 'whois.paycenter.com.cn' => 'no data found', 'whois.pir.net' => 'NOT FOUND', 'whois.plisk.com' => 'No match for', 'whois.publicdomainregistry.com' => 'No match for', 'whois.regtime.net' => 'Domain \S+ not found', 'whois.schlund.info' => '^Domain \S+ is not registered here', 'whois.thnic.net' => 'No entries found', 'whois.tucows.com' => '^Can.t get information on non-local domain', 'whois.ttpia.com' => 'No match for', 'whois.worldnames.net' => 'NO MATCH for domain', # 'whois.yournamemonkey.com' -- need try again 'whois.cnnic.net.cn' => '^No matching record', 'whois.nic.co' => '^No Data Found', 'whois.nic.me' => 'NOT FOUND', 'whois.domain.kg' => 'Data not found. This domain is available for registration.', 'whois.nic.one' => 'No Data Found', # for VN | TJ zones 'www_whois' => '(Available|no records found|is free|Not Registered)', 'whois.nic.xxx' => 'NOT FOUND', 'whois.online.rs.corenic.net' => 'no matching objects found', 'whois.site.rs.corenic.net' => 'no matching objects found', 'whois.nic.xn--80adxhks' => 'Domain not found', 'whois.nic.moscow' => 'Domain not found', 'whois.nic.tatar' => 'queried object does not exist', 'whois.nic.press' => 'DOMAIN NOT FOUND', 'whois.registry.qa' => 'No Data Found', 'whois.registry.net.za' => '^Available', 'net-whois.registry.net.za' => '^Available', 'org-whois.registry.net.za' => '^Available', 'www-whois.registry.net.za' => '^Available', 'web-whois.registry.net.za' => '^Available', 'whois.i-dns.net' => '^NOMATCH', 'whois.dns.hr' => 'No entries found', 'whois.flexireg.net' => 'Domain not found', 'whois.netcom.cm' => 'Not Registered', 'whois.nic.ac' => 'NOT FOUND', 'whois.audns.net.au' => '^No Data Found', 'whois.nic.best' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.bj' => 'No Object Found', 'whois.nic.broker' => 'No match for', 'whois.nic.career' => 'No match for', 'whois.nic.cc' => 'No match for', 'whois.nic.cloud' => 'No Data Found', 'whois.nic.courses' => 'No Data Found', 'whois.nic.earth' => '^No Data Found', 'whois.nic.film' => 'No Data Found', 'whois.nic.forex' => 'No match for', 'whois.nic.men' => 'No Data Found', 'whois.nic.ooo' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.priv.at' => 'No entries found for the selected source', 'whois.nic.pro' => 'NOT FOUND', 'whois.nic.so' => 'No Object Found', 'whois.nic.srl' => 'NOT FOUND', 'whois.nic.study' => 'No Data Found', 'whois.nic.top' => 'The queried object does not exist', 'whois.nic.trading' => 'No match for', 'whois.nic.tv' => 'No match for', 'whois.nic.xn--p1acf' => 'No Object Found', 'whois.rightside.co' => 'Domain not found', 'whois.sk-nic.sk' => 'Domain not found', 'whois.ksregistry.net' => 'The queried object does not exist', 'whois-alsace.nic.fr' => 'The queried object does not exist: Domain name', 'whois-aquarelle.nic.fr' => 'The queried object does not exist: Domain name', 'whois-bostik.nic.fr' => 'The queried object does not exist: Domain name', 'whois.aeda.net.ae' => 'No Data Found', 'whois.afilias-srs.net' => 'NOT FOUND', 'whois.nic.ai' => '^Domain \S+ not registered', 'whois.bnnic.bn' => 'Domain Not Found', 'whois.gtlds.nic.br' => 'The queried object does not exist: ', 'whois.ngtld.cn' => 'No matching record\.', 'whois.nic.aarp' => 'No match for "', 'whois.nic.abc' => 'No match for "', 'whois.nic.abudhabi' => 'No Data Found', 'whois.nic.accountant' => '^No Data Found', 'whois.nic.adac' => 'DOMAIN NOT FOUND', 'whois.nic.aeg' => 'No match for "', 'whois.nic.af' => 'Domain Status: No Object Found', 'whois.nic.afamilycompany' => 'No match for "', 'whois.nic.afl' => 'No Data Found', 'whois.nic.airbus' => 'No match for "', 'whois.nic.airtel' => 'No match for "', 'whois.nic.alstom' => 'The queried object does not exist: no matching objects found', 'whois.nic.americanfamily' => 'No match for "', 'whois.nic.amfam' => 'No match for "', 'whois.nic.anz' => 'No Data Found', 'whois.nic.aol' => 'No match for "', 'whois.nic.arte' => 'No match for "', 'whois.nic.asda' => 'No match for "', 'whois.nic.auspost' => 'No Data Found', 'whois.nic.aw' => '\.aw is free', 'whois.nic.bank' => 'No match for "', 'whois.nic.barcelona' => 'The queried object does not exist: no matching objects found', 'whois.nic.barclaycard' => 'No Data Found', 'whois.nic.barclays' => 'No Data Found', 'whois.nic.barefoot' => 'No match for "', 'whois.nic.basketball' => 'DOMAIN NOT FOUND', 'whois.nic.bauhaus' => 'The queried object does not exist: no matching objects found', 'whois.nic.bayern' => 'This domain name has not been registered\.', 'whois.nic.bbc' => 'This domain name has not been registered\.', 'whois.nic.bbt' => 'No match for "', 'whois.nic.bbva' => 'No match for "', 'whois.nic.bcn' => 'The queried object does not exist: no matching objects found', 'whois.nic.beauty' => 'No match for "', 'whois.nic.bentley' => 'This domain name has not been registered\.', 'whois.nic.bid' => '^No Data Found', 'whois.nic.blanco' => 'No match for "', 'whois.nic.blog' => 'This domain name has not been registered\.', 'whois.nic.bms' => 'No match for "', 'whois.nic.bo' => 'whois\.nic\.bo solo acepta consultas con dominios \.bo', 'whois.nic.bofa' => 'No match for "', 'whois.nic.bond' => 'No Data Found', 'whois.nic.boots' => 'No Data Found', 'whois.nic.bosch' => 'No match for "', 'whois.nic.bradesco' => 'This domain name has not been registered\.', 'whois.nic.bridgestone' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.broadway' => 'This domain name has not been registered\.', 'whois.nic.brother' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.brussels' => 'The queried object does not exist', 'whois.nic.bzh' => 'The queried object does not exist: Domain name', 'whois.nic.google' => 'Domain not found\.', 'whois.nic.net.bw' => 'Domain Status: No Object Found', 'whois.teleinfo.cn' => 'No matching record', 'whois1.nic.bi' => 'Domain Status: No Object Found', 'capetown-whois.registry.net.za' => 'Available', 'whois.nic.cancerresearch' => 'No Data Found', 'whois.nic.canon' => 'The queried object does not exist: DOMAIN NOT FOUND', 'durban-whois.registry.net.za' => 'Available', 'joburg-whois.registry.net.za' => 'Available', 'africa-whois.registry.net.za' => 'Available', 'kero.yachay.pe' => 'Domain Status: No Object Found', 'whois-corsica.nic.fr' => 'The queried object does not exist: Domain name', 'whois-fe.movistar.tango.knipp.de' => 'The queried object does not exist: no matching objects found', 'whois-fe.telefonica.tango.knipp.de' => 'The queried object does not exist: no matching objects found', 'whois-fe1.gmx.tango.knipp.de' => 'The queried object does not exist: no matching objects found', 'whois-fe1.pdt.cologne.tango.knipp.de' => 'The queried object does not exist: no matching objects found', 'whois-fe1.pdt.koeln.tango.knipp.de' => 'The queried object does not exist: no matching objects found', 'whois-frogans.nic.fr' => 'The queried object does not exist: Domain name', 'whois-gtld.smart.com.ph' => 'DOMAIN NOT FOUND', 'whois-lancaster.nic.fr' => 'The queried object does not exist: Domain name', 'whois-leclerc.nic.fr' => 'The queried object does not exist: Domain name', 'whois-mma.nic.fr' => 'The queried object does not exist: Domain name', 'whois-mutuelle.nic.fr' => 'The queried object does not exist: Domain name', 'whois-ovh.nic.fr' => 'The queried object does not exist: Domain name', 'whois-paris.nic.fr' => 'The queried object does not exist: Domain name', 'whois-sncf.nic.fr' => 'The queried object does not exist: Domain name', 'whois-total.nic.fr' => 'The queried object does not exist: Domain name', 'whois.agitsys.net' => 'Domain Status: No Object Found', 'whois.ati.tn' => 'NO OBJECT FOUND!', 'whois.co.ug' => '^No entries found', 'whois.dominio.gq' => 'Invalid query or domain name not known in Dominio GQ Domain Registry', 'whois.dot.cf' => 'Invalid query or domain name not known in Dot CF Domain Registry', 'whois.dot.ml' => 'Invalid query or domain name not known in Point ML Domain Registry', 'whois.dotpostregistry.net' => 'NOT FOUND', 'whois.eus.coreregistry.net' => 'The queried object does not exist: no matching objects found', 'whois.gal.coreregistry.net' => 'The queried object does not exist: no matching objects found', 'whois.gtld.knet.cn' => 'The queried object does not exist: ', 'whois.ikano.tld-box.at' => 'The queried object does not exist', 'whois.kyregistry.ky' => 'The queried object does not exist: Domain ', 'whois.madrid.rs.corenic.net' => 'The queried object does not exist: no matching objects found', 'whois.mango.coreregistry.net' => 'no matching objects found', 'whois.marnet.mk' => 'No entries found', 'whois.nc' => 'No entries found in the .nc database', 'whois.nic.alibaba' => '^NOT FOUND', 'whois.nic.alipay' => '^NOT FOUND', 'whois.nic.capitalone' => 'No match for "', 'whois.nic.casa' => 'This domain name has not been registered\.', 'whois.nic.cba' => 'No Data Found', 'whois.nic.ceo' => '^No Data Found', 'whois.nic.cfa' => 'No match for "', 'whois.nic.cfd' => 'No match for "', 'whois.nic.chanel' => 'No match for "', 'whois.nic.chintai' => 'No Data Found', 'whois.nic.cityeats' => 'No match for "', 'whois.nic.clubmed' => 'No match for "', 'whois.nic.comcast' => 'This domain name has not been registered\.', 'whois.nic.commbank' => 'No Data Found', 'whois.nic.compare' => 'No Data Found', 'whois.nic.comsec' => 'No match for "', 'whois.nic.cooking' => 'This domain name has not been registered\.', 'whois.nic.cookingchannel' => 'No match for "', 'whois.nic.country', => 'Domain \S+ is available for registration', 'whois.nic.cr' => 'no entries found', 'whois.nic.cricket' => '^No Data Found', 'whois.nic.csc' => 'No match for "', 'whois.nic.cuisinella' => 'No Data Found', 'whois.nic.cymru' => 'This domain name has not been registered\.', 'whois.nic.date' => '^No Data Found', 'whois.nic.dds' => 'This domain name has not been registered\.', 'whois.nic.deloitte' => 'Status: AVAILABLE \(No match for domain "', 'whois.nic.diy' => 'No match for "', 'whois.nic.doha' => 'No Data Found', 'whois.nic.download' => '^No Data Found', 'whois.nic.dubai' => 'No Data Found', 'whois.nic.duck' => 'No match for "', 'whois.nic.dz' => 'NO OBJECT FOUND!', 'whois.nic.ec' => 'Status: Not Registered', 'whois.nic.ericsson' => 'No match for "', 'whois.nic.erni' => 'The queried object does not exist: no matching objects found', 'whois.nic.eurovision' => 'The queried object does not exist: no matching objects found', 'whois.nic.fairwinds' => 'No match for "', 'whois.nic.faith' => '^No Data Found', 'whois.nic.fashion' => 'This domain name has not been registered\.', 'whois.nic.fidelity' => 'No match for "', 'whois.nic.firestone' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.firmdale' => 'Domain Not Found', 'whois.nic.fishing' => 'This domain name has not been registered\.', 'whois.nic.foodnetwork' => 'No match for "', 'whois.nic.frl' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.frontdoor' => 'No match for "', 'whois.nic.fujixerox' => 'No match for "', 'whois.nic.gallo' => 'No match for "', 'whois.nic.gdn' => 'Domain Not Found', 'whois.nic.gent' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.genting' => 'No match for "', 'whois.nic.george' => 'No match for "', 'whois.nic.ggee' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.giving' => 'No Data Found', 'whois.nic.gl' => 'Domain Status: No Object Found', 'whois.nic.glade' => 'No match for "', 'whois.nic.global' => 'NOT FOUND', 'whois.nic.gmo' => '^The queried object does not exist', 'whois.nic.goldpoint' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.gop' => 'This domain name has not been registered\.', 'whois.dotgov.gov' => 'No match for "', 'whois.nic.hamburg' => 'The queried object does not exist', 'whois.nic.hgtv' => 'No match for "', 'whois.nic.honda' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.horse' => 'This domain name has not been registered\.', 'whois.nic.hyundai' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.ibm' => 'No Data Found', 'whois.nic.ice' => 'No match for "', 'whois.nic.icu' => '(?:^registration status\: invalid|The queried object does not exist: DOMAIN NOT FOUND)', 'whois.nic.ifm' => 'The queried object does not exist: no matching objects found', 'whois.nic.insurance' => 'No match for "', 'whois.nic.irish' => '^Domain not found', 'whois.nic.airforce' => '^Domain not found', 'whois.nic.market' => '^Domain not found', 'whois.nic.forsale' => '^Domain not found', 'whois.nic.degree' => '^Domain not found', 'whois.nic.gives' => '^Domain not found', 'whois.nic.rehab' => '^Domain not found', 'whois.nic.dentist' => '^Domain not found', 'whois.nic.software' => '^Domain not found', 'whois.nic.auction' => '^Domain not found', 'whois.nic.engineer' => '^Domain not found', 'whois.nic.vet' => '^Domain not found', 'whois.nic.attorney' => '^Domain not found', 'whois.nic.lawyer' => '^Domain not found', 'whois.nic.haus' => '^Domain not found', 'whois.nic.rocks' => '^Domain not found', 'whois.nic.consulting' => '^Domain not found', 'whois.nic.kaufen' => '^Domain not found', 'whois.nic.actor' => '^Domain not found', 'whois.nic.moda' => '^Domain not found', 'whois.nic.pub' => '^Domain not found', 'whois.nic.social' => '^Domain not found', 'whois.nic.futbol' => '^Domain not found', 'whois.nic.reviews' => '^Domain not found', 'whois.nic.ninja' => '^Domain not found', 'whois.nic.immobilien' => '^Domain not found', 'whois.nic.democrat' => '^Domain not found', 'whois.nic.dance' => '^Domain not found', 'whois.nic.hospital' => '^Domain not found', 'whois.nic.buzz' => '^No Data Found', 'whois.nic.nyc' => '^No Data Found', 'whois.nic.qpon' => '^No Data Found', 'whois.nic.stream' => '^No Data Found', 'whois.nic.baby' => '^No Data Found', 'whois.nic.health' => '^No Data Found', 'whois.nic.tokyo' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.nagoya' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.yokohama' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.fun' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.boston' => 'This domain name has not been registered\.', 'whois.nic.tr' => 'No match found for', 'whois.nic.wien' => '^Available', 'whois.nic.hn' => 'Domain Status: No Object Found', 'whois.nic.iselect' => 'No Data Found', 'whois.nic.jaguar' => 'No match for "', 'whois.nic.java' => 'No match for "', 'whois.nic.jobs' => 'No match for "', 'whois.nic.juniper' => 'No match for "', 'whois.nic.kddi' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.kerryhotels' => 'No match for "', 'whois.nic.kerrylogistics' => 'No match for "', 'whois.nic.kerryproperties' => 'No match for "', 'whois.nic.kfh' => 'DOMAIN NOT FOUND', 'whois.nic.kia' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.kn' => 'Domain Status: No Object Found', 'whois.nic.komatsu' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.kuokgroup' => 'No match for "', 'whois.nic.kyoto' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.lanic.la' => 'DOMAIN NOT FOUND', 'whois.nic.lacaixa' => 'The queried object does not exist: no matching objects found', 'whois.nic.ladbrokes' => 'No match for "', 'whois.nic.lancome' => 'No match for "', 'whois.nic.landrover' => 'No match for "', 'whois.nic.lat' => 'The queried object does not exists \(El objeto consultado no existe\)', 'whois.nic.latrobe' => 'No Data Found', 'whois.nic.law' => 'This domain name has not been registered\.', 'whois.nic.lefrak' => 'No match for "', 'whois.nic.lego' => 'No match for "', 'whois.nic.lexus' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.liaison' => 'No match for "', 'whois.nic.lidl' => 'Status: AVAILABLE \(No match for domain "', 'whois.nic.lifestyle' => 'No match for "', 'whois.nic.linde' => 'No match for "', 'whois.nic.lipsy' => 'No match for "', 'whois.nic.lixil' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.loan' => '^No Data Found', 'whois.nic.locus' => 'This domain name has not been registered\.', 'whois.nic.lotte' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.lundbeck' => 'No match for "', 'whois.nic.macys' => 'No match for "', 'whois.nic.makeup' => 'No match for "', 'whois.nic.man' => 'The queried object does not exist: no matching objects found', 'whois.nic.markets' => 'No match for "', 'whois.nic.med' => 'No match for "', 'whois.nic.mls' => 'No match for "', 'whois.nic.moe' => '^No Data Found', 'whois.nic.monash' => 'No Data Found', 'whois.nic.monster' => '^NOT FOUND', 'whois.nic.mtn' => 'No Data Found', 'whois.nic.mtr' => 'The domain has not been registered\.', 'whois.nic.mz' => 'Domain Status: No Object Found', 'whois.nic.nab' => 'No match for "', 'whois.nic.nadex' => 'No match for "', 'whois.nic.nationwide' => 'No match for "', 'whois.nic.nec' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.net.ng' => 'Domain Status: No Object Found', 'whois.nic.netbank' => 'No Data Found', 'whois.nic.next' => 'No match for "', 'whois.nic.nextdirect' => 'No match for "', 'whois.nic.nico' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.nikon' => 'No match for "', 'whois.nic.nissay' => 'No match for "', 'whois.nic.norton' => 'No match for "', 'whois.nic.obi' => 'No match for "', 'whois.nic.observer' => 'DOMAIN NOT FOUND', 'whois.nic.off' => 'No match for "', 'whois.nic.olayan' => 'No Data Found', 'whois.nic.olayangroup' => 'No Data Found', 'whois.nic.omega' => 'No match for "', 'whois.nic.onyourside' => 'No match for "', 'whois.nic.oracle' => 'No match for "', 'whois.nic.orange' => 'No match for "', 'whois.nic.org.uy' => 'No match for', 'whois.nic.osaka' => '^No Data Found', 'whois.nic.party' => '^No Data Found', 'whois.nic.philips' => 'No Data Found', 'whois.nic.physio' => 'No Data Found', 'whois.nic.playstation' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.politie' => 'Domain Status: free', 'whois.nic.promo' => 'NOT FOUND', 'whois.nic.quebec' => 'The queried object does not exist: no matching objects found', 'whois.nic.quest' => 'No Data Found', 'whois.nic.racing' => '^No Data Found', 'whois.nic.radio' => 'The queried object does not exist: no matching objects found', 'whois.nic.raid' => 'No match for "', 'whois.nic.realestate' => 'No match for "', 'whois.nic.redstone' => 'NOT FOUND', 'whois.nic.reise' => 'Domain not found\.', 'whois.nic.review' => '^No Data Found', 'whois.nic.rexroth' => 'No match for "', 'whois.nic.ricoh' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.rightathome' => 'No match for "', 'whois.nic.rodeo' => 'This domain name has not been registered\.', 'whois.nic.ruhr' => 'The queried object does not exist: no matching objects found', 'whois.nic.rwe' => 'No match for "', 'whois.nic.samsclub' => 'No match for "', 'whois.nic.samsung' => '^DOMAIN NOT FOUND', 'whois.nic.sandvik' => 'No Data Found', 'whois.nic.sanofi' => 'No match for "', 'whois.nic.sap' => 'The queried object does not exist: no matching objects found', 'whois.nic.sbs' => 'No match for "', 'whois.nic.sca' => 'No match for "', 'whois.nic.scb' => 'NOT FOUND', 'whois.nic.schwarz' => 'Status: AVAILABLE \(No match for domain "', 'whois.nic.schmidt' => '^No Data Found', 'whois.nic.science' => '^No Data Found', 'whois.nic.scjohnson' => 'No match for "', 'whois.nic.seat' => 'The queried object does not exist: no matching objects found', 'whois.nic.ses' => 'No match for "', 'whois.nic.seek' => '^No Data Found', 'whois.nic.sfr' => 'DOMAIN NOT FOUND', 'whois.nic.shangrila' => 'No match for "', 'whois.nic.shell' => 'No match for "', 'whois.nic.skin' => 'No match for "', 'whois.nic.sky' => 'No match for "', 'whois.nic.select' => '^No Data Found', 'whois.nic.sn' => 'NOT FOUND', 'whois.nic.softbank' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.sony' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.spreadbetting' => 'No match for "', 'whois.nic.starhub' => '^No Data Found', 'whois.nic.statoil' => 'No match for "', 'whois.nic.stc' => 'DOMAIN NOT FOUND', 'whois.nic.stcgroup' => 'DOMAIN NOT FOUND', 'whois.nic.sucks' => '^No Data Found', 'whois.nic.surf' => 'This domain name has not been registered\.', 'whois.nic.swatch' => 'No match for "', 'whois.nic.swiss' => 'The queried object does not exist: no matching objects found', 'whois.nic.symantec' => 'No match for "', 'whois.nic.tab' => '^No Data Found', 'whois.nic.taipei' => '^No Data Found', 'whois.nic.tatamotors' => 'No match for "', 'whois.nic.telecity' => 'This domain name has not been registered\.', 'whois.nic.tg' => 'NO OBJECT FOUND!', 'whois.nic.tiaa' => 'No match for "', 'whois.nic.tiffany' => 'No match for "', 'whois.nic.tirol' => 'The queried object does not exist', 'whois.nic.toray' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.toshiba' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.toyota' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.trade' => '^No Data Found', 'whois.nic.travelchannel' => 'No match for "', 'whois.nic.tube' => '^No Data Found', 'whois.nic.ubank' => 'No match for "', 'whois.nic.ubs' => 'No match for "', 'whois.nic.vana' => 'No match for "', 'whois.nic.vanguard' => 'No match for "', 'whois.nic.verisign' => 'No match for "', 'whois.nic.versicherung' => 'The queried object does not exist', 'whois.nic.vg' => 'not found|DOMAIN NOT FOUND', 'whois.nic.visa' => 'No match for "', 'whois.nic.viva' => 'DOMAIN NOT FOUND', 'whois.nic.vlaanderen' => 'The queried object does not exist', 'whois.nic.vodka' => 'This domain name has not been registered\.', 'whois.nic.volvo' => 'No match for "', 'whois.nic.wales' => 'This domain name has not been registered\.', 'whois.nic.walmart' => 'No match for "', 'whois.nic.warman' => 'No match for "', 'whois.nic.webcam' => '^No Data Found', 'whois.nic.weber' => 'No match for "', 'whois.nic.wed' => 'Domain Status: No Object Found', 'whois.nic.whoswho' => '^No Data Found', 'whois.nic.win' => '^No Data Found', 'whois.nic.wme' => 'DOMAIN NOT FOUND', 'whois.nic.xerox' => 'No match for "', 'whois.nic.xfinity' => 'This domain name has not been registered\.', 'whois.nic.xin' => 'NOT FOUND', 'whois.nic.xn--11b4c3d' => 'No match for "', 'whois.pandi.or.id' => 'DOMAIN NOT FOUND', 'whois.registry.om' => 'No Data Found', 'whois.registry.pf' => 'Domain unknown', 'whois.scot.coreregistry.net' => 'The queried object does not exist: no matching objects found', 'whois.tld.sy' => 'Domain Status: No Object Found', 'whois.tznic.or.tz' => 'No entries found', 'whois.voting.tld-box.at' => 'The queried object does not exist', 'cwhois.cnnic.cn' => 'No matching record\.', 'whois.conac.cn' => 'Not find MatchingRecord', 'whois.dotukr.com' => 'No match for domain', 'whois.imena.bg' => 'does not exist in database!', 'whois.monic.mo' => 'No match for', 'whois.nic.net.sa' => 'No Match for', 'whois.nic.xn--3pxu8k' => 'No match for "', 'whois.nic.xn--42c2d9a' => 'No match for "', 'whois.nic.xn--45q11c' => 'The queried object does not exist: ', 'whois.nic.xn--5su34j936bgsg' => 'No match for "', 'whois.nic.xn--9dbq2a' => 'No match for "', 'whois.nic.xn--c2br7g' => 'No match for "', 'whois.nic.xn--efvy88h' => 'The queried object does not exist: ', 'whois.nic.xn--fhbei' => 'No match for "', 'whois.nic.xn--hxt814e' => 'The queried object does not exist: ', 'whois.nic.xn--kput3i' => 'NOT FOUND', 'whois.nic.xn--mgbca7dzdo' => 'No Data Found', 'whois.nic.xn--mk1bu44c' => 'No match for "', 'whois.nic.xn--mxtq1m' => 'Not Found\.', 'whois.nic.xn--ngbe9e0a' => 'DOMAIN NOT FOUND', 'whois.nic.xn--pssy2u' => 'No match for "', 'whois.nic.xn--t60b56a' => 'No match for "', 'whois.nic.xn--tckwe' => 'No match for "', 'whois.nic.xn--w4r85el8fhu5dnra' => 'No match for "', 'whois.nic.xn--w4rs40l' => 'No match for "', 'whois.nic.xperia' => 'No match for "', 'whois.nic.zm' => 'Domain Status: No Object Found', 'whois.pnina.ps' => 'Domain Status: No Object Found', 'whois.registry.knet.cn' => 'The queried object does not exist: ', 'whois.sgnic.sg' => 'Domain Not Found', 'whois.thnic.co.th' => 'No match for', 'whois.itdc.ge' => 'NO OBJECT FOUND', 'whois.kr' => 'The requested domain was not found', 'whois.nic.sandvikcoromant' => 'No Data Found', 'whois.nic.scor' => 'No Data Found', 'whois.nic.seven' => 'No Data Found', 'whois.nic.sydney' => 'No Data Found', 'whois.nic.tdk' => 'No Data Found', 'whois.nic.teva' => 'No Data Found', 'whois.nic.trust' => 'No Data Found', 'whois.nic.virgin' => 'No Data Found', 'whois.nic.vistaprint' => 'No Data Found', 'whois.nic.walter' => 'No Data Found', 'whois.nic.woodside' => 'No Data Found', 'whois.nic.xn--kcrx77d1x4a' => 'No Data Found', 'whois.nic.xn--ngbc5azd' => 'No Data Found', 'whois.nic.shop' => 'The queried object does not exist: ', 'whois.nic.abogado' => 'This domain name has not been registered', 'whois.nic.beer' => 'This domain name has not been registered', 'whois.nic.budapest' => 'This domain name has not been registered', 'whois.nic.fit' => 'This domain name has not been registered', 'whois.nic.garden' => 'This domain name has not been registered', 'whois.nic.london' => 'This domain name has not been registered', 'whois.nic.luxe' => 'This domain name has not been registered', 'whois.nic.miami' => 'This domain name has not been registered', 'whois.nic.nrw' => 'The queried object does not exist: no matching objects found', 'whois.nic.wedding' => 'This domain name has not been registered', 'whois.nic.work' => 'This domain name has not been registered', 'whois.nic.yoga' => 'This domain name has not been registered', 'whois.ax' => 'Domain not found', 'whois.cctld.by' => 'object does not exist', 'whois.mediaserv.net' => 'NO OBJECT FOUND!', 'whois.nic.amsterdam' => 'Domain Status: free', 'whois.nic.arab' => 'No Data Found', 'whois.nic.audible' => 'This domain name has not been registered\.', 'whois.nic.author' => 'This domain name has not been registered\.', 'whois.nic.aws' => 'This domain name has not been registered\.', 'whois.nic.bible' => 'No Data Found', 'whois.nic.book' => 'This domain name has not been registered\.', 'whois.nic.bot' => 'This domain name has not been registered\.', 'whois.nic.call' => 'This domain name has not been registered\.', 'whois.nic.catholic' => 'No Data Found', 'whois.nic.charity' => 'Domain not found\.', 'whois.nic.circle' => 'This domain name has not been registered\.', 'whois.nic.cpa' => 'No Data Found', 'whois.nic.data' => 'NOT FOUND', 'whois.nic.deal' => 'This domain name has not been registered\.', 'whois.nic.dnp' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.do' => 'Domain Status: No Object Found', 'whois.nic.fast' => 'This domain name has not been registered\.', 'whois.nic.fire' => 'This domain name has not been registered\.', 'whois.nic.fox' => 'No Data Found', 'whois.nic.free' => 'This domain name has not been registered\.', 'whois.nic.gay' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.ge' => 'No match for "', 'whois.nic.got' => 'This domain name has not been registered\.', 'whois.nic.hot' => 'This domain name has not been registered\.', 'whois.nic.imdb' => 'This domain name has not been registered\.', 'whois.nic.inc' => 'is available for registration', 'whois.nic.jot' => 'This domain name has not been registered\.', 'whois.nic.joy' => 'This domain name has not been registered\.', 'whois.nic.kindle' => 'This domain name has not been registered\.', 'whois.nic.like' => 'This domain name has not been registered\.', 'whois.nic.ls' => 'no entries found', 'whois.nic.mobile' => 'NOT FOUND', 'whois.nic.moi' => 'This domain name has not been registered\.', 'whois.nic.mr' => 'Domain Status: No Object Found', 'whois.nic.mw' => 'no entries found', 'whois.nic.nhk' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.now' => 'This domain name has not been registered\.', 'whois.nic.okinawa' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.otsuka' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.pay' => 'This domain name has not been registered\.', 'whois.nic.pharmacy' => 'No Data Found', 'whois.nic.phone' => 'NOT FOUND', 'whois.nic.pin' => 'This domain name has not been registered\.', 'whois.nic.prime' => 'This domain name has not been registered\.', 'whois.nic.read' => 'This domain name has not been registered\.', 'whois.nic.rmit' => 'No Data Found', 'whois.nic.room' => 'This domain name has not been registered\.', 'whois.nic.rugby' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.ryukyu' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.safe' => 'This domain name has not been registered\.', 'whois.nic.safety' => 'No Data Found', 'whois.nic.save' => 'This domain name has not been registered\.', 'whois.nic.secure' => 'This domain name has not been registered\.', 'whois.nic.silk' => 'This domain name has not been registered\.', 'whois.nic.smile' => 'This domain name has not been registered\.', 'whois.nic.sport' => 'The queried object does not exist: no matching objects found', 'whois.nic.spot' => 'This domain name has not been registered\.', 'whois.nic.ss' => 'Domain Status: No Object Found', 'whois.nic.suzuki' => 'The queried object does not exist: DOMAIN NOT FOUND', 'whois.nic.talk' => 'This domain name has not been registered\.', 'whois.nic.td' => 'Domain Status: No Object Found', 'whois.nic.tunes' => 'This domain name has not been registered\.', 'whois.nic.tushu' => 'This domain name has not been registered\.', 'whois.nic.unicom' => 'The queried object does not exist', 'whois.nic.wanggou' => 'This domain name has not been registered\.', 'whois.nic.wow' => 'This domain name has not been registered\.', 'whois.nic.xn--80aqecdr1a' => 'No Data Found', 'whois.nic.xn--8y0a063a' => 'The queried object does not exist', 'whois.nic.xn--mgbab2bd' => 'The queried object does not exist: no matching objects found', 'whois.nic.xn--mgbi4ecexp' => 'No Data Found', 'whois.nic.xn--ngbrx' => 'No Data Found', 'whois.nic.xn--tiq49xqyj' => 'No Data Found', 'whois.nic.yamaxun' => 'This domain name has not been registered\.', 'whois.nic.you' => 'This domain name has not been registered\.', 'whois.nic.zappos' => 'This domain name has not been registered\.', 'whois.registry.in' => 'No Data Found', 'whois.nic.cyou' => 'DOMAIN NOT FOUND', 'whois.nic.box' => 'No Data Found', 'whois.nic.epson' => 'No Data Found', 'whois.nic.iinet' => 'No Data Found', 'whois.nic.krd' => 'No Data Found', 'whois.nic.melbourne' => 'No Data Found', 'whois.nic.saxo' => 'No Data Found', 'whois.nic.ink' => 'No Data Found', 'whois.nic.wiki' => 'No Data Found', 'whois.nic.design' => 'No Data Found', ); # Common whois stripping REs our @strip_regexps = ( qr{ ^ (?: \W* Last \s update \s of \s WHOIS \s database | Database \s last \s updated | \W* Whois \s database \s was \s last \s updated \s on ) \b .+ \z }xmsi, ); our %strip = ( 'whois.arin.net' => [ '^The ARIN Registration Services Host contains', '^Network Information:.*Networks', '^Please use the whois server at', '^Information and .* for .* Information.', ], 'whois.ripe.net' => [ '^%', ], 'whois.nic.berlin' => [ '^%', ], 'whois.nic.wien' => [ '^%', ], 'whois-dub.mm-registry.com' => [ '^[^A-Z]', '^TERMS OF USE', ], 'whois.ripn.net' => [ '^%', 'Last updated on ', ], 'whois.registry.ripn.net' => [ '^%', 'Last updated on ', ], 'whois.publicinterestregistry.net' => [ '^[^A-Z]', '^Access to Public Interest Registry', ], 'whois.aero' => [ '^Access to \.AERO WHOIS', '^determining the contents', '^Afilias registry database', '^Afilias Limited for informational', '^guarantee its accuracy', '^access\. You agree that', '^and that, under no', '^enable, or otherwise support', '^facsimile of mass unsolicited', '^to entities other than the', '^\(b\) enable high volume', '^queries or data to the systems', '^Afilias except as reasonably', '^modify existing registrations', '^the right to modify these terms', '^you agree to abide by this policy', '^Name Server: $', ], 'whois.nic.asia' => [ '^DotAsia WHOIS LEGAL STATEMENT AND', '^by DotAsia and the access to', '^for information purposes only', '^domain name is still available', '^the registration records of', '^circumstances, be held liable', '^be wrong, incomplete, or not', '^you agree not to use the', '^otherwise support the transmission', '^other solicitations whether via', '^possible way; or to cause nuisance', '^sending \(whether by automated', '^volumes or other possible means', '^above, it is explicitly forbidden', '^in any form and by any means', '^quantitatively or qualitatively', '^database without prior and explicit', '^hereof, or to apply automated', '^You agree that any reproduction', '^purposes will always be considered', '^the content of the WHOIS database', '^by this policy and accept that', '^WHOIS services in order to protect', '^integrity of the database', '^Nameservers: $', ], 'whois.biz' => [ '^>>>> Whois database was last updated', '^NeuLevel, Inc\., the Registry', '^for the WHOIS database through', '^is provided to you for', '^persons in determining contents', '^NeuLevel registry database', '^"as is" and does not guarantee', '^agree that you will use this', '^circumstances will you use', '^support the transmission of', '^solicitations via direct mail', '^contravention of any applicable', '^enable high volume, automated', '^\(or its systems\)\. Compilation', '^WHOIS database in its entirety', '^allowed without NeuLevel', '^right to modify or change these', '^subsequent notification of any kind', '^whatsoever, you agree to abide by', '^NOTE\: FAILURE TO LOCATE A RECORD', '^OF THE AVAILABILITY OF A DOMAIN NAME', '^NeuStar, Inc\., the Registry', '^NeuStar registry database', '^allowed without NeuStar', ], 'whois.nic.cat' => [ '^%', ], 'ccwhois.verisign-grs.com' => [ # .CC '^>>> Last update of', '^NOTICE\: The expiration date', 'sponsorship of the domain name', '^currently set to expire', '^expiration date of the', '^sponsoring registrar\. Users', '^Whois database to view the', '^for this registration', '^TERMS OF USE\: You are', '^database through the use', '^automated except as reasonably', '^modify existing registrations', '^database is provided by', '^assist persons in obtaining', '^registration record\. VeriSign does', '^By submitting a Whois query', '^use\: You agree that you may use', '^under no circumstances will you', '^otherwise support the transmission', '^advertising or solicitations via', '^\(2\) enable high volume, automated', '^VeriSign \(or its computer systems\)', '^dissemination or other use of this', '^the prior written consent of', '^processes that are automated and', '^Whois database except as reasonably', '^or modify existing registrations', '^your access to the Whois database', '^operational stability\. VeriSign', '^Whois database for failure to', '^reserves the right to modify', '^The Registry database contains', '^and Registrars\.', ], 'whois.networksolutions.com' => [ # for .net '^NOTICE AND TERMS OF USE', '^database through the use', '^Data in Network Solutions', '^purposes only, and to assist', '^to a domain name registration', '^By submitting a WHOIS query', '^You agree that you may use', '^circumstances will you use', '^the transmission of mass', '^via e-mail, telephone, or', '^electronic processes that', '^compilation, repackaging', '^prohibited without the', '^high-volume, automated', '^database\. Network Solutions', '^database in its sole discretion', '^querying of the WHOIS database', '^Network Solutions reserves', '^Get a FREE domain name', '^http\:\/\/www\.network', '^Visit AboutUs\.org for', '^ [ '^This Registry database', '^The data in the EDUCAUSE', '^by EDUCAUSE for information', '^assist in the process', '^or related to \.edu domain', '^The EDUCAUSE Whois database', '^\.EDU domain\.', '^A Web interface for the \.EDU', '^available at\: http', '^By submitting a Whois query', '^will not be used to allow', '^the transmission of unsolicited', '^solicitations via e-mail', '^harvest information from this', '^except as reasonably necessary', '^domain names\.', '^You may use \"%\" as a', '^information regarding the use', '^type\: help', ], 'whois.dotgov.gov' => [ '^% DOTGOV WHOIS Server ready', '^Please be advised that this whois server only', 'No match for', ], 'whois.nic.mil' => [ '^To single out one record', '^handle, shown in parenthesis', '^Please be advised that this whois', '^All INTERNET Domain, IP Network Number,', '^the Internet Registry, RS.INTERNIC.NET.', ], 'whois.dotmobiregistry.net' => [ # .mobi '^mTLD WHOIS LEGAL STATEMENT', '^by mTLD and the access to', '^for information purposes only.', '^domain name is still available', '^the registration records of', '^circumstances, be held liable', '^be wrong, incomplete, or not', '^you agree not to use the information', '^otherwise support the transmission', '^other solicitations whether via', '^possible way; or to cause', '^sending \(whether by automated,', '^volumes or other possible means\)', '^above, it is explicitly forbidden', '^in any form and by any means', '^quantitatively or qualitatively', '^database without prior and explicit', '^hereof, or to apply automated,', '^You agree that any reproduction', '^purposes will always be considered', '^the content of the WHOIS database.', '^by this policy and accept that mTLD', '^WHOIS services in order to protect', '^integrity of the database.', '^For more information on Whois', ], 'whois.museum' => [ '^%', ], 'whois.nic.name' => [ '^Disclaimer: VeriSign, Inc', '^completeness and accuracy of', '^that the results are error-free', '^through the Whois service are on', '^warranties', '^BY USING THE WHOIS SERVICE AND', '^HEREIN OR IN ANY REPORT GENERATED', '^ACCEPTED THAT VERISIGN, INC', '^ANY DAMAGES OF ANY KIND ARISING', '^REPORT OR THE INFORMATION PROVIDED', '^OMISSIONS OR MISSING INFORMATION', '^INFORMATION PROVIDED BY THE WHOIS', '^CONTEMPLATION OF LEGAL PROCEEDINGS', '^DO SUCH RESULTS CONSTITUTE A LEGAL OPINION', '^results of the Whois constitutes', '^conditions and limitations', '^lawful purposes, in particular', '^obligations', '^limited to, unsolicited email', '^other improper purpose', '^documented by VeriSign, Inc', '^\s+\*\*\*', '^For more information on Whois', '^https\:', ], 'whois.afilias.net' => [ '^Access to AFILIAS WHOIS', '^[^A-Z]', '^Name Server: $', ], 'whois.nic.me' => [ '^WHOIS TERMS & CONDITIONS', '^assist persons in determining', '^record in the \.ME registry', '^\.ME Registry for', '^guarantee its accuracy', '^access\. You agree that', '^and that, under no circumstances', '^enable, or otherwise', '^facsimile, or other', '^advertising or solicitations', '^existing customers', '^processes that send', '^except as reasonably necessary', '^registrations\. All rights', '^these terms at any time', '^policy\.', ], 'whois.nic.club' => [ '>>>> Whois database was last updated [\s\w]+', ], 'whois.nic.luxury' => [ '>>> Last update of WHOIS', '^This is the future of Luxury', ], 'whois.crsnic.net' => [ # .com main .net '^TERMS OF USE:', '^database through', '^automated except', '^modify existing', '^Services\' \(\"VeriSign\"\)', '^information purposes only', '^about or related to a', '^guarantee its accuracy\.', '^by the following terms', '^for lawful purposes and', '^to: (1) allow, enable,', '^unsolicited, commercial', '^or facsimile; or \(2\)', '^that apply to VeriSign', '^repackaging, dissemination', '^prohibited without the', '^use electronic processes', '^query the Whois database', '^domain names or modify', '^to restrict your access', '^operational stability\.', '^Whois database for', '^reserves the right', '^NOTICE AND TERMS OF USE:', '^Data in Network Solutions', '^purposes only, and to assist', '^to a domain name registration', '^By submitting a WHOIS query,', '^You agree that you may use', '^circumstances will you use', '^the transmission of mass', '^via e-mail, telephone, or', '^electronic processes that', '^compilation, repackaging,', '^high-volume, automated,', '^database. Network Solutions', '^database in its sole discretion,', '^querying of the WHOIS database', '^Network Solutions reserves the', '^NOTICE: The expiration date', '^registrar\'s sponsorship of', '^currently set to expire\.', '^date of the domain name', '^registrar. Users may', '^view the registrar\'s', '^to: \(1\) allow, enable,', '^The Registry database', '^Registrars\.', '^Domain not found locally,', '^Local WHOIS DB must be out', '^Whois Server Version', '^Domain names in the .com', '^with many different', '^for detailed information\.', '^>>> Last update of whois database', ], 'whois.iana.org' => [ '^q', ], 'whois.pir.org' => [ '^Access to Public Interest Registry', '^cord is provided by Public Interest Registry', '^use this data only for lawful purposes and that', '^al advertising or solicitations', '^or, a Registrar, or Afilias except', '^By submitting this query', ], 'whois.registrypro.pro' => [ '^Whois data provided by RegistryPro', '^RegistryPro Whois Terms of Use', '^Access to RegistryPro', '^is strictly limited to', '^guarantee the accuracy', '^only for lawful purposes', '^data to\: \(a\) allow, enable', '^telephone, or facsimile of', '^solicitations to entities', '^customer; or \(b\) enable', '^send queries or data to the', '^Operator or any ICANN-accredited', '^to register domain names or', '^reserves the right to modify', '^discretion\. Failure to adhere to', '^restriction or termination of', '^By submitting this query, you', '^All rights reserved\. RegistryPro', ], 'jobswhois.verisign-grs.com' => [ # .JOBS '^>>> Last update of', '^NOTICE\: The expiration date', 'sponsorship of the domain name', '^currently set to expire', '^expiration date of the', '^sponsoring registrar\. Users', '^Whois database to view the', '^for this registration', '^TERMS OF USE\: You are', '^database through the use', '^automated except as reasonably', '^modify existing registrations', '^database is provided by', '^assist persons in obtaining', '^registration record\. VeriSign does', '^By submitting a Whois query', '^use\: You agree that you may use', '^under no circumstances will you', '^otherwise support the transmission', '^advertising or solicitations via', '^\(2\) enable high volume, automated', '^VeriSign \(or its computer systems\)', '^dissemination or other use of this', '^the prior written consent of', '^processes that are automated and', '^Whois database except as reasonably', '^or modify existing registrations', '^your access to the Whois database', '^operational stability\. VeriSign', '^Whois database for failure to', '^reserves the right to modify', '^The Registry database contains', '^and Registrars\.', ], 'tvwhois.verisign-grs.com' => [ # .TV '^>>> Last update of', '^NOTICE\: The expiration date', 'sponsorship of the domain name', '^currently set to expire', '^expiration date of the', '^sponsoring registrar\. Users', '^Whois database to view the', '^for this registration', '^TERMS OF USE\: You are', '^database through the use', '^automated except as reasonably', '^modify existing registrations', '^database is provided by', '^assist persons in obtaining', '^registration record\. VeriSign does', '^By submitting a Whois query', '^use\: You agree that you may use', '^under no circumstances will you', '^otherwise support the transmission', '^advertising or solicitations via', '^\(2\) enable high volume, automated', '^VeriSign \(or its computer systems\)', '^dissemination or other use of this', '^the prior written consent of', '^processes that are automated and', '^Whois database except as reasonably', '^or modify existing registrations', '^your access to the Whois database', '^operational stability\. VeriSign', '^Whois database for failure to', '^reserves the right to modify', '^The Registry database contains', '^and Registrars\.', ], 'whois.enom.com' => [ # .TV .CC '^=-=-=-=', '^Visit AboutUs.org for more', '^ [ '^Welcome to the .* Whois Server', '^Use of this service for any', '^than determining the', '^in the .* to be registered', '^prohibited.', ], 'whois.nic.pw' => [ '^This whois service', '^[^A-Z]', '^\s+$', ], 'whois.nic.ag' => [ '^Access to CCTLD WHOIS', '^determining the contents', '^Afilias registry database', '^Afilias Limited for', '^guarantee its accuracy', '^access\. You agree that', '^and that, under no', '^enable, or otherwise', '^facsimile of mass', '^to entities other than', '^\(b\) enable high volume', '^queries or data to the', '^Afilias except as reasonably', '^modify existing registrations', '^the right to modify these', '^you agree to abide by this', '^Name Server: $', ], 'whois.nic.at' => [ '^%', ], 'whois.aunic.net' => [ # .au '^%', ], 'whois.dns.be' => [ 'Status:\s+AVAILABLE', ], 'whois.registro.br' => [ '^%', ], 'whois.cira.ca' => [ '^%', ], 'whois.nic.ch' => [ '^whois: This information is subject', '^See http', ], 'whois.nic.ci' => [ '^All rights reserved', '^Copyright \"Generic NIC', ], 'whois.nic.cl' => [ '^ACE\:', '^Ъltima modificaciуn', '\(Database last updated on\)', '^Mбs informaciуn', 'www\.nic\.cl\/cgi-bin', '^Este mensajes estб impreso', '^\(This message is printed', '^\s+\(\)$', ], 'whois.nic.cx' => [ '^TERMS OF USE\: You are not', '^CiiA makes every effort to maintain the completeness', 'CiiA, All rights reserved', '^Domain Information$', ], 'whois.nic.cz' => [ '^%', ], 'whois.denic.de' => [ '^%', ], 'whois.nic.dm' => [ '^TERMS OF USE\: You are not', '^database through the use', '^automated\. Whois database', '^community on behalf of', '^The data is for information', '^guarantee its accuracy', '^by the following terms of', '^for lawful purposes and that', '^to\: \(1\) allow, enable', '^unsolicited, commercial', '^or facsimile; or \(2', '^that apply to CoCCA it', '^compilation, repackaging,', '^expressly prohibited\.', '^CoCCA Helpdesk', '^Domain Information$', ], 'whois.eenet.ee' => [ '^The registry database contains', '^\.ORG\.EE and \.MED\.EE domains', '^Registrar\: EENET', '^URL\: http', ], 'whois.dk-hostmaster.dk' => [ '^#', ], 'whois.eu' => [ '^%', ], 'whois.ficora.fi' => [ '^More information is available', '^Copyright \(c\) Finnish', ], 'whois.nic.fr' => [ '^%%', ], 'whois.channelisles.net' => [ # .GG .JE '^status\:', '^The CHANNELISLES.NET', '^for domains registered', '^The WHOIS facility is', '^basis only\. Island Networks', '^or otherwise of information', '^the WHOIS, you accept this', '^Please also note that some', '^unavailable for registration', '^for a number of reasons', '^Other names for', '^nonetheless be unavailable', '^WHOIS database copyright', ], 'whois.hkirc.hk' => [ '^Whois server', '^Domain names in the', '^and .* can now be registered', '^Go to http://www.hkdnr.net.hk', '^---------', '^The Registry contains ONLY', '^.* and .*\\.HK domains.', ], 'whois2.afilias-grs.net' => [ # .GI .HN .LC .SC .VC '^Access to CCTLD WHOIS', '^determining the contents', '^Afilias registry database', '^Afilias Limited for', '^guarantee its accuracy', '^access\. You agree that', '^and that, under no', '^enable, or otherwise', '^facsimile of mass unsolicited', '^to entities other than', '^\(b\) enable high volume', '^queries or data to the', '^Afilias except as reasonably', '^modify existing registrations', '^the right to modify these', '^you agree to abide by this policy', '^Name Server: $', ], 'whois.nic.gs' => [ '^TERMS OF USE\: You are not', '^database through the use', '^automated\. Whois database', '^community on behalf of CoCCA', '^The data is for information', '^guarantee its accuracy', '^by the following terms', '^for lawful purposes and', '^to\: \(1\) allow, enable', '^unsolicited, commercial', '^or facsimile; or \(2\) enable', '^that apply to CoCCA it', '^compilation, repackaging', '^expressly prohibited', '^CoCCA Helpdesk', '^Domain Information$', ], 'whois.hkirc.hk' => [ '----------------', '^ Whois server by HKDNR', '^ Domain names in the \.com\.hk', '^ \.gov\.hk, idv\.hk\. and', '^ Go to http', '^ The Registry contains ONLY', '^WHOIS Terms of Use', '^By using this WHOIS', '^The data in HKDNR', '^You are not authorised to', '^You agree that you will', '^a\. use the data for', '^b\. enable high volume', '^c\. without the prior', '^d\. use such data', '^HKDNR in its sole discretion', '^HKDNR may modify these', '^Company Chinese name', # What is Code Page? ], 'whois.nic.hu' => [ '% Whois server', '^Rights restricted by', 'Legal usage of this', '^abide by the rules', '^http\:', 'A szolgaltatas csak a', '^elйrhetх feltйtelek', '^hasznбlhatу legбlisan', ], 'whois.domainregistry.ie' => [ '^%', ], 'whois.isoc.org.il' => [ '^%', ], 'whois.registry.in' => [ # .IN '^Access to \.IN WHOIS', '^determining the contents', '^\.IN registry database', '^\.IN Registry for informational', '^guarantee its accuracy', '^access\. You agree', '^and that, under no', '^enable, or otherwise', '^facsimile of mass unsolicited', '^to entities other than', '^\(b\) enable high volume', '^queries or data to the', '^Afilias except as reasonably', '^modify existing registrations', '^the right to modify these', '^you agree to abide by this', '^Name Server: $', ], 'whois.isnic.is' => [ '^%', ], 'whois.nic.it' => [ '^\*', ], 'whois.jprs.jp' => [ '^\[\s', ], 'whois.kenic.or.ke' => [ '^%', '^remarks\:', ], 'whois.nic.or.kr' => [ '^іЧАУј­№ц АМё§АМ .krАМ ѕЖґС °жїмґ', ], 'whois.nic.kz' => [ '^Whois Server for the KZ', '^This server is maintained', ], 'whois.nic.li' => [ '^whois\: This information', '^See http', ], 'whois.domreg.lt' => [ '^%', ], 'whois.dns.lu' => [ '^%', ], 'whois.nic.lv' => [ '^%', ], 'whois.nic.ms' => [ '^TERMS OF USE\: You are not', '^database through the use', '^automated\.', '^The data is for information', '^guarantee its accuracy', '^by the following terms of', '^for lawful purposes and', '^to\: \(1\) allow, enable', '^unsolicited, commercial', '^or facsimile; or \(2\) enable', '^expressly prohibited', '^Domain Information$' ], 'whois.nic.mu' => [ '^TERMS OF USE\: You are not', '^Internet Direct Ltd makes every effort to maintain the completeness', 'Internet Direct Ltd, All rights reserved', '^Domain Information$', ], 'whois.mx' => [ '^La informacion que ha', '^relacionados con la delegacion', '^administrado por NIC Mexico', '^Queda absolutamente prohibido', '^de Correos Electronicos no', '^de productos y servicios', '^de NIC Mexico\.', '^La base de datos generada', '^por las leyes de Propiedad', '^sobre la materia\.', '^Si necesita mayor informacion', '^comunicarse a ayuda@nic', '^Si desea notificar sobre correo', '^de enviar su mensaje a abuse', ], 'whois.mynic.my' => [ '^Welcome to \.my DOMAIN', '----------', 'For alternative search', 'whois -h whois\.domainregistry\.my', 'Type the command as below', 'Note\: Code is previously', 'Please note that the query limit is 500 per day from the same IP', # !!! 'SEARCH BY DOMAIN NAME', '^Disclaimer', '^MYNIC, the Registry for', '^database through a MYNIC-Accredited', '^you for informational purposes', '^determining contents of a', '^database\.', '^MYNIC makes this information', '^its accuracy\.', '^By submitting a WHOIS query', '^lawful purposes and that', '^\(1\) to allow, enable, or', 'commercial advertising or', '^\(2\) for spamming or', '^\(3\) to enable high volume', 'registry \(or its systems\) or', '^\(4\) for any other abusive purpose', '^Compilation, repackaging', '^its entirety, or of a substantial', "^MYNIC's prior written permission", '^these conditions at any time', '^kind\. By executing this query', '^these terms\.', '^NOTE\: FAILURE TO LOCATE', '^AVAILABILITY OF A DOMAIN NAME', '^All domain names are subject to', '^Registration of Domain Name', '^For details, please visit', ], 'whois.na-nic.com.na' => [ '^TERMS OF USE\: You are not', '^the use of electronic', '^WHOIS is NA-NiC', '^internet community\. The', '^its accuracy\. By submitting', '^lawful purposes and', '^enable, or otherwise support', '^advertising or solicitations', '^automated, electronic processes', '^member computer systems\). The', '^this Data is expressly prohibited', '^Copyright 1991, 1995 Dr Lisse', '^Domain Information$', ], 'whois.domain-registry.nl' => [ 'Record maintained by', 'Copyright notice', 'No part of this publication', 'retrieval system, or', 'mechanical, recording, or', 'Foundation for Internet', 'Registrars are bound by', 'except in case of reasonable', 'and solely for those business', 'terms and Conditions for', 'Any use of this material', 'similar activities is', 'Stichting Internet', 'of any such activities or', 'Copyright \(c\) The', 'Netherlands \(SIDN\)', '^These restrictions apply equally', '^reproductions and publications', '^reasonable, necessary and solely', '^activities referred to in the', '^Registrars', '^action. Anyone who is aware', '^in the Netherlands', '^\(SIDN\) Dutch Copyright Act', '^subsection 1, clause 1\).', ], 'whois.norid.no' => [ '^%', ], 'whois.nic.nu' => [ '------------', '^\.NU Domain Ltd', '^Owner and Administrative Contact information for', '^registered in \.nu is', '^Copyright by \.NU Domain', '^Database last updated', ], 'whois.srs.net.nz' => [ '^%', ], 'whois.dns.pl' => [ '^no option', '^WHOIS displays data with a', '^Registrant data available at', ], 'whois.nic.pm' => [ '^%%', ], 'whois.nic.pr' => [ '^Whois Disclaimer', '^The data in nic\.pr', '^purposes only, that is to', '^a domain name registration', '^and does not guarantee its', '^will use this data only for', '^you use this data to', '^mass unsolicited, commercial', '^mail, including spam or by', '^processes or robotic', '^purposes that apply to nic', '^nation or other use of this', '^consent of nic\.pr\. Nic', '^mitting this query, you', ], 'whois.nic.re' => [ '^%%', ], 'whois.rotld.ro' => [ '^%', ], 'whois.iis.se' => [ '^#', ], 'whois.nic.net.sg' => [ '----------', 'SGNIC WHOIS Server', '^The following data is', '^Registrant\:', '^Note\: With immediate effect', '^Contact will not be shown', '^Technical Contact details', '^Any party who has', '^contacts from the domain', '^using the organization', ], 'whois.nic.sh' => [ '^NIC Whois Server', ], 'whois.arnes.si' => [ '^%', ], 'whois.nic.st' => [ '^The data in the .* database is provided', '^The .* Registry does not guarantee', '^The data in the .* database is protected', '^By submitting a .* query, you agree that you will', '^The Domain Council of .* reserves the right', ], 'whois.nic.tf' => [ '^%%', ], 'whois.dot.tk' => [ 'Rights restricted by', 'http\:\/\/www\.dot\.tk', 'Your selected domain name', 'cancelled, suspended, refused', 'It may be available for', 'In the interim, the rights', 'transferred to Malo Ni', 'Please be advised that', 'Malo Ni Advertising', 'that was previously', 'Please review http', 'Due to restrictions in', 'about the previous', 'to the general public', 'Dot TK is proud to work', 'agencies to stop spam', 'other illicit content on', 'Dot TK Registry directly', 'usage of this domain by', 'Record maintained by', ], 'whois.tonic.to' => [ '^Tonic whoisd', ], 'whois.twnic.net.tw' => [ '^Registrar:', '^URL: http://rs.twnic.net.tw', ], 'whois.net.ua' => [ '^% This is the Ukrainian', '^% Rights restricted by', '^%$', '^% % \.UA whois', '^% ========', '% The object shown', '% It has been obtained', '^% \(whois\.', '^%$', '^% REDIRECT BEGIN', '^% REDIRECT END', ], 'whois.dn.ua' => [ '^%', ], 'whois.lg.ua' => [ '^%', ], 'whois.od.ua' => [ '^%', ], 'whois.com.ua' => [ '^% This is the Ukrainian', '^% Rights restricted', '^%$', '^% % .UA whois', '^% =====', ], 'whois.nic.uk' => [ '^This WHOIS information is', '^for \.uk domain names', 'Copyright Nominet UK 1996 - 2009', '^You may not access the', '^by the terms of use available', '^includes restrictions on', '^repackaging, recompilation', '^or hiding any or all of this', '^limits\. The data is provided', '^register\. Access may be withdrawn', 'WHOIS lookup made at', '^--', ], 'whois.nic.us' => [ '^>>>> Whois database was last', '^NeuStar, Inc\., the Registry', '^information for the WHOIS', '^This information is provided', '^designed to assist persons', '^registration record in the', '^information available to you', '^By submitting a WHOIS query', '^lawful purposes and that', '^\(1\) to allow, enable', '^unsolicited, commercial', '^electronic mail, or by telephone', '^data and privacy protection', '^electronic processes that', '^repackaging, dissemination', '^entirety, or of a substantial', 'prior written permission', '^change these conditions at', '^of any kind\. By executing', '^abide by these terms', '^NOTE\: FAILURE TO LOCATE A', '^OF THE AVAILABILITY', '^All domain names are subject', '^rules\. For details, please', ], 'whois.nic.wf' => [ '^%%', ], 'whois.nic.yt' => [ '^%%', ], 'whois.ename.com' => [ # add .com .net .edu '^For more information, please go', ], 'whois.ttpia.com' => [ # add .com .net .edu ' Welcome to TTpia.com', ' Tomorrow is From Today', ], 'whois.directnic.com' => [ '^By submitting a WHOIS query', '^lawful purposes\. You also agree', '^this data to:', '^email, telephone,', '^or solicitations to', '^customers; or to \(b\) enable', '^that send queries or data to', '^ICANN-Accredited registrar\.', '^The compilation, repackaging,', '^data is expressly prohibited', '^directNIC.com\.', '^directNIC.com reserves the right', '^database in its sole discretion,', '^excessive querying of the database', '^this policy\.', '^directNIC reserves the right to', '^NOTE: THE WHOIS DATABASE IS A', '^LACK OF A DOMAIN RECORD DOES', '^Intercosmos Media Group, Inc', '^Registrar WHOIS database for', '^may only be used to assist in', '^registration record\.', '^directNIC makes this information', '^its accuracy\.', ], 'whois.alldomains.com' => [ '^MarkMonitor.com - ', '^------------------', '^For Global Domain ', '^and Enterprise DNS,', '^------------------', '^The Data in MarkMon', '^for information pur', '^about or related to', '^does not guarantee ', '^that you will use t', '^circumstances will ', '^support the transmi', '^solicitations via e', '^electronic processe', '^MarkMonitor.com res', '^By submitting this ', ], 'whois.gdns.net' => [ '^\\w+ Whois Server', '^Access to .* WHOIS information is provided to', '^determining the contents of a domain name', '^registrar database. The data in', '^informational purposes only, and', '^Compilation, repackaging, dissemination,', '^in its entirety, or a substantial portion', 'prior written permission. By', '^by this policy. All rights reserved.', ], 'whois.worldnames.net' => [ '^----------------------------------', '^.\\w+ Domain .* Whois service', '^Copyright by .* Domain LTD', '^----------------------------------', '^Database last updated', ], 'whois.godaddy.com' => [ '^The data contained in GoDaddy.com,', '^while believed by the company to be', '^with no guarantee or warranties', '^information is provided for the sole', '^in obtaining information about domain', '^Any use of this data for any other', '^permission of GoDaddy.com, Inc.', '^you agree to these terms of usage', '^you agree not to use this data to', '^dissemination or collection of this', '^purpose, such as the transmission of', '^and solicitations of any kind, including', '^not to use this data to enable high volume,', '^processes designed to collect or compile', '^including mining this data for your own', '^Please note: the registrant of the domain', '^in the "registrant" field. In most cases,', '^is not the registrant of domain names listed', ], 'whois.paycenter.com.cn' => [ '^The Data in Paycenter\'s WHOIS database is', '^for information purposes, and to assist', '^information about or related to a domain', '^record\.', '^Paycenter does not guarantee its accuracy.', '^a WHOIS query, you agree that you will use', '^for lawful purposes and that, under no', '^you use this Data to:', '^\(1\) allow, enable, or otherwise support', '^of mass unsolicited, commercial', '^via e-mail \(spam\); or', '^\(2\) enable high volume, automated,', '^apply to Paycenter or its systems.', '^Paycenter reserves the right to modify', '^By submitting this query, you agree to', ], 'whois.dotster.com' => [ '^The information in this whois database is', '^purpose of assisting you in obtaining', '^name registration records. This information', '^and we do not guarantee its accuracy. By', '^query, you agree that you will use this', '^purposes and that, under no circumstances', '^to: \(1\) enable high volume, automated,', '^stress or load this whois database system', '^information; or \(2\) allow,enable, or', '^transmission of mass, unsolicited, commercial', '^solicitations via facsimile, electronic mail,', '^entitites other than your own existing customers.', '^compilation, repackaging, dissemination or other', '^is expressly prohibited without prior written', '^company. We reserve the right to modify these', '^time. By submitting an inquiry, you agree to', '^and limitations of warranty. Please limit', '^minute and one connection.', ], 'whois.nordnet.net' => [ '^Serveur Whois version', '^\*\*\*\*\*\*\*\*\*', '^\* Base de Donnees des domaines COM, NET et ORG', '^\* enregistres par NORDNET. ', '^\* Ces informations sont affichees par le serve', '^\* Whois de NORDNET, le Registrar du ', '^\* Groupe FRANCE-TELECOM ', '^\* Elles ne peuvent etre utilisees sans l accor', '^\* prealable de NORDNET. ', '^\* ', '^\* Database of registration for COM, NET and ', '^\* ORG by NORDNET. ', '^\* This informations is from NORDNET s Whois ', '^\* Server, the Registrar for the ', '^\* Group FRANCE-TELECOM. ', '^\* Use of this data is strictly prohibited with', '^\* out proper authorisation of NORDNET.', '^Deposez votre domaine sur le site http://www.nordnet.net', '^Copyright Nordnet Registrar', ], 'whois.nsiregistry.net' => [ '^Domain names in the \.com and', '^with many different competing', '^for detailed information', '^>>> Last update of whois database', '^NOTICE: The expiration date', "^registrar's sponsorship", '^currently set to expire', '^date of the domain name', '^registrar\. Users may', '^view the registrar', '^TERMS OF USE: You are not', '^database through the use', '^automated except as reasonably', '^modify existing registrations', 'is provided by VeriSign for $', '^information purposes only', '^about or related to a domain', '^guarantee its accuracy', '^by the following terms of', '^for lawful purposes and', '^to: \(1\) allow, enable', '^unsolicited, commercial', '^or facsimile; or \(2\) enable', '^that apply to VeriSign', '^repackaging, dissemination', '^prohibited without the prior', '^use electronic processes that', '^query the Whois database except', '^domain names or modify existing', '^to restrict your access to the', '^operational stability\. VeriSign', '^Whois database for failure to', '^reserves the right to modify', '^The Registry database contains', '^Registrars\.$', '^Whois Server Version', ], 'whois.nic.travel' => [ '^>>>> Whois database was last updated', '^Tralliance, Inc., the Registry Operator', '^for the WHOIS database through', '^is provided to you for', '^persons in determining', '^Tralliance registry database', '^"as is" and does not', '^agree that you will', '^circumstances will', '^support the transmission', '^solicitations via direct mail', '^contravention of any applicable', '^enable high volume, automated', '^\(or its systems\). Compilation', '^WHOIS database in its entirety', '^allowed without Tralliance', '^right to modify or change', '^subsequent notification of any', '^whatsoever, you agree to abide', '^NOTE: FAILURE TO LOCATE A RECORD', '^OF THE AVAILABILITY OF A DOMAIN NAME', ], 'whois.donuts.co' => [ '^Terms of Use:', '>>> Last update of WHOIS database', ], 'whois.uniregistry.net' => [ '>>> Last update of WHOIS database', '^Access to WHOIS information', '^This service is intended only', '^[^A-Z]', '^\s+$', ], 'whois.nic.uno' => [ '^>>>> Whois database was last updated', '^The WHOIS service offered by Dot Latin LLC', '^By executing a query', '^NOTE: FAILURE TO LOCATE A RECORD', '^All domain names are subject to certain', ], 'whois.nic.menu' => [ '>>> Last update of WHOIS database', '^The data contained in Wedding TLD2', '^This information is provided', '^By submitting an inquiry', '^You further agree not to use', '^Wedding TLD2, LLC reserves', ], 'whois.nic.kiwi' => [ '^>>> Last update', '^TERMS OF USE:', '^The data', '^[^A-Z]', ], 'whois.nic.build' => [ '^>>> Last update of WHOIS database', '^The data', '^[^A-Z]', ], 'whois.nic.ht' => [ '^TERMS OF USE: You are not authorized', '^database through the use of electronic', '^automated. Whois database is provided', '^community on by of Consortium FDS/RDDH', '^The data is for information purposes only.', '^guarantee its accuracy. By submitting a', '^by the following terms of use:', '^for lawful purposes and that under', '^to: \(1\) allow, enable, or', '^unsolicited, commercial', '^or facsimile; or \(2\) enable', '^that apply to Consortium FDS/RDDH', '^compilation, repackaging', '^expressly prohibited.', '^Domain Information$', ], 'whois.nic.ki' => [ '^TERMS OF USE: You are not', '^database through the', '^automated. Whois database', '^community on behalf of CoCCA', '^The data is for information purposes', '^guarantee its accuracy. By', '^by the following terms of use', '^for lawful purposes and that', '^to: \(1\) allow, enable, or', '^unsolicited, commercial', '^or facsimile; or \(2\) enable', '^that apply to CoCCA it\'s members', '^compilation, repackaging', '^expressly prohibited.', ], 'whois.nic.la' => [ '^This whois service is provided by', '^pertaining to Internet domain names', '^using this service you are agreeing', '^here for any purpose other than', '^to store or reproduce this data', ], 'whois.nic.sb' => [ '^TERMS OF USE: You are not authorized', '^The data is for information purposes only', '^CoCCA Helpdesk \| http://helpdesk.cocca.cx', '^Domain Information$', ], 'whois.nic.tl' => [ '^TERMS OF USE: You are not authorized', '^database through the use of', '^automated. Whois database is', '^community on behalf of CoCCA', '^The data is for information', '^guarantee its accuracy. By', '^by the following terms of use', '^for lawful purposes and that', '^to: \(1\) allow, enable, or', '^unsolicited, commercial', '^or facsimile; or', '^that apply to CoCCA', '^compilation, repackaging', '^expressly prohibited', '^CoCCA Helpdesk', '^Domain Information$', ], 'whois.nic.fm' => [ '^TERMS OF USE', '^dotFM makes every effort', 'is a registered trademark of BRS Media Inc.', '^Domain Information$', ], 'whois.nic.co' => [ '^>>>> Whois database was last', '^.CO Internet, S.A.S., the', '^information for the WHOIS', '^This information is provided', '^designed to assist persons', '^registration record in the', '^information available to you', '^By submitting a WHOIS query', '^lawful purposes and that', '^\(1\) to allow, enable', '^unsolicited, commercial', '^electronic mail, or by', '^data and privacy protection', '^electronic processes that', '^repackaging, dissemination', '^entirety, or of a substantial', '^.CO Internet', '^change these conditions at', '^of any kind. By executing', '^abide by these terms.', '^NOTE: FAILURE TO LOCATE', '^OF THE AVAILABILITY', '^All domain names are subject', '^rules. For details, please', ], 'whois.domain.kg' => [ '^%', ], 'whois.belizenic.bz' => [ '^The data in BelizeNIC registrar WHOIS database is provided to you by', '^BelizeNIC registrar for information purposes only, that is, to assist you in', '^obtaining information about or related to a domain name registration', '^record. BelizeNIC registrar makes this information available "as is,"', '^and', '^does not guarantee its accuracy. By submitting a WHOIS query, you', '^agree that you will use this data only for lawful purposes and that,', '^under no circumstances', '^or otherwise support the transmission of mass unsolicited, commercial', '^advertising or solicitations via direct mail, electronic mail, or by', '^telephone; ', '^that apply to BelizeNIC', '^repackaging, dissemination or other use of this data is expressly', '^prohibited without the prior written consent of BelizeNIC registrar.', '^BelizeNIC registrar reserves the right to modify these terms at any time.', '^By submitting this query, you agree to abide by these terms.', ], 'whois.nic.xxx' => [ '^Access to the .XXX WHOIS information is provided to assist persons in', '^determining the contents of a domain name registration record in the', '^ICM Registry database. The data in this record is provided by', '^ICM Registry for informational purposes only, and ICM does not', '^guarantee its accuracy. This service is intended only for query-based', '^access. You agree that you will use this data only for lawful purposes', '^and that, under no circumstances will you use this data to', '^enable, or otherwise support the transmission by e-mail, telephone, or', '^facsimile of mass unsolicited, commercial advertising or solicitations', '^to entities other than the data recipient', '^\(b\) enable high volume, automated, electronic processes that send', '^queries or data to the systems of Registry Operator, a Registrar, or', '^ICM except as reasonably necessary to register domain names or', '^modify existing registrations. All rights reserved. ICM reserves', '^the right to modify these terms at any time. By submitting this query,', '^you agree to abide by this policy.', ], 'whois.online.rs.corenic.net' => [ '^%' ], 'whois.site.rs.corenic.net' => [ '^%' ], 'whois.nic.xn--80adxhks' => [ '^%' ], 'whois.nic.moscow' => [ '^%' ], 'whois.centralnic.com' => [ '^>>> Last update of WHOIS database:', '^For more information on Whois status codes, please visit https://icann.org/epp', '^This whois service is provided by CentralNic Ltd and only contains', '^information pertaining to Internet domain names registered by our', '^our customers. By using this service you are agreeing (1) not to use any', '^information presented here for any purpose other than determining', '^ownership of domain names, (2) not to store or reproduce this data in ', '^any way, (3) not to use any high-volume, automated, electronic processes', '^to obtain data from this service. Abuse of this service is monitored and', '^actions in contravention of these terms will result in being permanently', '^blacklisted. All data is (c) CentralNic Ltd https://www.centralnic.com/', '^Access to the whois service is rate limited. For more information, please', '^see https://registrar-console.centralnic.com/pub/whois_guidance.', ], ); our %exceed = ( 'whois.eu' => '(?:Excessive querying, grace period of|Still in grace period, wait)', 'whois.dns.lu' => 'Excessive querying, grace period of', 'whois.mynic.my' => 'Query limitation is', 'whois.ripn.net' => 'exceeded allowed connection rate', 'whois.registry.ripn.net' => 'exceeded allowed connection rate', 'whois.domain-registry.nl' => 'too many requests', 'whois.nic.uk' => 'and will be replenished', 'whois.networksolutions.com' => 'contained within a list of IP addresses that may have failed', 'whois.worldsite.ws' => 'You exceeded the maximum', 'whois.tucows.com' => '(?:Maximum Daily connection limit reached|exceeded maximum connection limit)', 'whois.centralnic.com' => 'Query rate of \\d+', 'whois.pir.org' => 'WHOIS LIMIT EXCEEDED', 'whois.nic.ms' => 'Look up quota exceeded', 'whois.nic.gs' => 'look up quota exceeded', 'whois.nic.tl' => 'Lookup quota exceeded', 'whois.nic.mg' => 'Lookup quota exceeded', 'whois.nic.li' => 'You have exceeded this limit', 'whois.nic.ch' => 'You have exceeded this limit', 'whois.nic.cz' => 'Your connection limit exceeded', 'whois.name.com' => 'Too many connection attempts. Please try again in a few seconds.', 'whois.netcom.cm' => 'Lookup quota exceeded', 'whois.nic.bj' => 'Lookup quota exceeded', ); our $default_ban_time = 60; our %ban_time = ( 'whois.ripn.net' => 60, 'whois.registry.ripn.net' => 60, ); # Whois servers which has no idn support our %whois_servers_with_no_idn_support = ( 'whois.melbourneit.com' => 1, ); # Internal postprocessing subroutines our %postprocess = ( 'whois.pp.ua' => sub { $_[0] =~ s/[\x00\x0A]+$//; $_[0]; }, ); # Special query prefix strings for some servers our %query_prefix = ( 'whois.crsnic.net' => 'domain ', 'whois.denic.de' => '-T dn,ace -C ISO-8859-1 ', 'whois.nic.name' => 'domain=', 'whois.nic.name.ns' => 'nameserver=', 'whois.pir.org.ns' => 'HO ', 'whois.biz.ns' => 'nameserver ', 'whois.nsiregistry.net.ns' => 'nameserver = ', 'whois.arin.net' => 'n + ', ); # Servers (within ports) to bypass recursion our %whois_servers_no_recurse = ( # 'rwhois.servercentral.net:4321' => 1, ); 1; __END__ =pod =encoding UTF-8 =head1 NAME Net::Whois::Raw::Data - Config for Net::Whois::Raw. =head1 VERSION version 2.99042 =head1 AUTHOR Alexander Nalobin =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2002-2025 by Alexander Nalobin. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut maintain000755001750001750 015037672667 16242 5ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042pwhois-maintain.pl100754001750001750 1075515037672667 22100 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/maintain#!/usr/bin/env perl use strict; use warnings; use Getopt::Long; use LWP::Simple; use Template; use File::Slurp; use FindBin; use lib "$FindBin::Bin/../lib"; use Net::Whois::Raw; use constant { GTLD_URL => 'http://data.iana.org/TLD/tlds-alpha-by-domain.txt', NOTFOUND_DOMAIN => '3b43763b-09b87hidaf', }; sub usage() { die "usage: $0 --check-for-new-gtlds [--cache-dir /path/to/whois-cachedir] [--max-new num] --check-for-new-gtlds - try to find whois servers for gTLDs which are not in Data.pm yet --cache-dir - cache dir for whois responses, cache lifetime is 24 hrs --max-new - stop when specified number of new gTLDs found Workflow: 1. $0 --check-for-new-gtlds --cache-dir /tmp 2. chromium new-gtlds.html 3. Check Not Found pattern for each TLD (edit if wrong), accept or skip TLD 4. Press `Process` button. Accepted TLDs will be added to output, skipped will not. 5. Copy and paste output from textarea to Data.pm 6. Save and commit Data.pm\n"; } GetOptions( 'check-for-new-gtlds' => \my $check_for_new_gtlds, 'cache-dir=s' => \my $cache_dir, 'max-new=i' => \my $max_new, ) || usage; $Net::Whois::Raw::TIMEOUT = 10; if ($cache_dir) { $Net::Whois::Raw::CACHE_DIR = $cache_dir; $Net::Whois::Raw::CACHE_TIME = 24*60; # one day } if ($check_for_new_gtlds) { my @new; # get TLD list my $raw_list = get(GTLD_URL) or die "Can't get TLD list"; for my $tld (split /\n/, $raw_list) { # skip empty lines and comments next if $tld =~ /^\s*#/; $tld =~ s/\s//g; next if !$tld; # check if we already have such TLD $tld = uc $tld; next if exists $Net::Whois::Raw::Data::servers{$tld}; # get whois server for TLD using whois.iana.org print "new TLD found: $tld\n"; print "\tdetermining whois server\n"; my $tld_info = eval { whois($tld, 'whois.iana.org', 'QRY_FIRST') } or warn "can't receive whois response for `$tld'\n" and next; my ($whois_server) = $tld_info =~ /^\s*whois:\s*(\S+)/im or warn "can't find whois server for `$tld'" and next; my $notfound = 0; my $notfound_pat; unless ( exists $Net::Whois::Raw::Data::notfound{$whois_server} ) { # receive "not found" response, so we can make "not found" pattern print "\tdetermining `not found` response\n"; $notfound = eval { whois(NOTFOUND_DOMAIN.".$tld", $whois_server, 'QRY_LAST') } or warn "can't receive `not found` response for `$tld`\n"; if ($notfound) { $notfound =~ s/^\s+//; # try to suggest not found pattern ($notfound_pat) = $notfound =~ /([^\n]+)/; $notfound_pat =~ s/\s+$//; my $fix_re = NOTFOUND_DOMAIN.'.*'; $notfound_pat =~ s/$fix_re//i; $notfound_pat =~ s/([\[\].+'\(\)?*\{\}])/\\$1/g; # used in regexp # prevent duplicates $Net::Whois::Raw::Data::notfound{$whois_server} = 0; } } push @new, { tld => $tld, whois_server => $whois_server, notfound => $notfound, notfound_pat => $notfound_pat, }; if ($max_new && @new == $max_new) { print "--max-new limit exceeded\n"; last; } } unless (@new) { print "No new GTLD records found. Data.pm is up to date\n"; exit; } # tlds with not found message at the top @new = sort { $a->{whois_server} cmp $b->{whois_server} or defined($b->{notfound}) <=> defined($a->{notfound}) or ($b->{notfound}&&1||0) <=> ($a->{notfound}&&1||0) } @new; # generate HTML my $lib_path = $FindBin::Bin.'/pwhois-maintain'; my $template = read_file( $lib_path.'/index.html', {binmode => ':utf8'} ); my $tpl = Template->new; $tpl->process(\$template, { new => \@new, source => scalar read_file( $FindBin::Bin.'/../lib/Net/Whois/Raw/Data.pm', {binmode => ':utf8'} ), }, \my $html) or die "Can't process template: ", $tpl->error; write_file( 'new-gtlds.html', {binmode => ':utf8'}, \$html ); print "Done! Now open `new-gtlds.html' in your favorite browser.\n"; } else { usage; } Common.pm100644001750001750 3573415037672667 21542 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/lib/Net/Whois/Rawpackage Net::Whois::Raw::Common; $Net::Whois::Raw::Common::VERSION = '2.99042'; # ABSTRACT: Helper for Net::Whois::Raw. use Encode; use warnings; use strict; use Regexp::IPv6 qw($IPv6_re); use Net::Whois::Raw::Data (); use Net::Whois::Raw (); use utf8; # func prototype sub untaint(\$); # get whois from cache sub get_from_cache { my ($query, $cache_dir, $cache_time) = @_; return undef unless $cache_dir; mkdir $cache_dir unless -d $cache_dir; my $now = time; # clear the cache foreach my $fn ( glob("$cache_dir/*") ) { my $mtime = ( stat($fn) )[9] or next; my $elapsed = $now - $mtime; untaint $fn; untaint $elapsed; unlink $fn if ( $elapsed / 60 >= $cache_time ); } my $result; if ( -e "$cache_dir/$query.00" ) { my $level = 0; while ( open( my $cache_fh, '<', "$cache_dir/$query.".sprintf( "%02d", $level ) ) ) { $result->[$level]->{srv} = <$cache_fh>; chomp $result->[$level]->{srv}; $result->[$level]->{text} = join "", <$cache_fh>; if ( !$result->[$level]->{text} and $Net::Whois::Raw::CHECK_FAIL ) { $result->[$level]->{text} = undef ; } else { $result->[$level]->{text} = decode_utf8( $result->[$level]->{text} ); } $level++; close $cache_fh; } } return $result; } # write whois to cache sub write_to_cache { my ($query, $result, $cache_dir) = @_; return unless $cache_dir && $result; mkdir $cache_dir unless -d $cache_dir; untaint $query; untaint $cache_dir; my $level = 0; foreach my $res ( @{$result} ) { local $res->{text} = $res->{whois} if not exists $res->{text}; next if defined $res->{text} && !$res->{text} || !defined $res->{text}; my $enc_text = $res->{text}; utf8::encode( $enc_text ); my $postfix = sprintf("%02d", $level); if ( open( my $cache_fh, '>', "$cache_dir/$query.$postfix" ) ) { print $cache_fh $res->{srv} ? $res->{srv} : ( $res->{server} ? $res->{server} : '') , "\n"; print $cache_fh $enc_text ? $enc_text : ''; close $cache_fh; chmod 0666, "$cache_dir/$query.$postfix"; } $level++; } } # remove copyright messages, check for existance sub process_whois { my ( $query, $server, $whois, $CHECK_FAIL, $OMIT_MSG, $CHECK_EXCEED ) = @_; $server = lc $server; my ( $name, $tld ) = split_domain( $query ); # use string as is no utf8; if ( $CHECK_EXCEED ) { my $exceed = $Net::Whois::Raw::Data::exceed{ $server }; if ( $exceed && $whois =~ /$exceed/s) { return $whois, 'Connection rate exceeded'; } } $whois = _strip_trailer_lines( $whois ) if $OMIT_MSG; if ( $CHECK_FAIL || $OMIT_MSG ) { my $notfound = $Net::Whois::Raw::Data::notfound{ $server }; my $strip = $Net::Whois::Raw::Data::strip{ $server }; my @strip = $strip ? @$strip : (); my @lines; MAIN: for ( split /\n/, $whois ) { if ( $CHECK_FAIL && $notfound && /$notfound/ ) { return undef, "Not found"; } if ( $OMIT_MSG ) { for my $re ( @strip ) { next MAIN if /$re/; } } push @lines, $_; } $whois = join "\n", @lines, ''; if ( $OMIT_MSG ) { $whois =~ s/(?:\s*\n)+$/\n/s; $whois =~ s/^\n+//s; $whois =~ s|\n{3,}|\n\n|sg; } } if ( defined $Net::Whois::Raw::Data::postprocess{ $server } ) { $whois = $Net::Whois::Raw::Data::postprocess{ $server }->( $whois ); } if ( defined $Net::Whois::Raw::POSTPROCESS{ $server } ) { $whois = $Net::Whois::Raw::POSTPROCESS{ $server }->( $whois ); } if ( defined $Net::Whois::Raw::Data::codepages{ $server } ) { $whois = decode( $Net::Whois::Raw::Data::codepages{ $server }, $whois ); } else { utf8::decode( $whois ); } return $whois, undef; } # Tries to strip trailer lines of whois sub _strip_trailer_lines { my ( $whois ) = @_; for my $re ( @Net::Whois::Raw::Data::strip_regexps ) { $whois =~ s/$re//; } return $whois; } # get whois-server for domain / tld sub get_server { my ( $dom, $is_ns, $tld ) = @_; $tld ||= get_dom_tld( $dom ); $tld = uc $tld; if ( grep { $_ eq $tld } @Net::Whois::Raw::Data::www_whois ) { return 'www_whois'; } if ( $is_ns ) { return $Net::Whois::Raw::Data::servers{ $tld . '.NS' } || $Net::Whois::Raw::Data::servers{ 'NS' }; } return lc( $Net::Whois::Raw::Data::servers{ $tld } || "whois.nic.$tld" ); } sub get_real_whois_query{ my ( $whoisquery, $srv, $is_ns ) = @_; $srv .= '.ns' if $is_ns; if ( $srv eq 'whois.crsnic.net' && domain_level( $whoisquery ) == 2 ) { return "domain $whoisquery"; } elsif ( $Net::Whois::Raw::Data::query_prefix{ $srv } ) { return $Net::Whois::Raw::Data::query_prefix{ $srv } . $whoisquery; } return $whoisquery; } # get domain TLD sub get_dom_tld { my ($dom) = @_; my $tld; if ( is_ipaddr($dom) || is_ip6addr($dom) ) { $tld = "IP"; } elsif ( domain_level($dom) == 1 ) { $tld = "NOTLD"; } else { my @tokens = split( /\./, $dom ); # try to get the longest known tld for this domain for my $i ( 1..$#tokens ) { my $tld_try = join '.', @tokens[$i..$#tokens]; if ( exists $Net::Whois::Raw::Data::servers{ uc $tld_try } ) { $tld = $tld_try; last; } } $tld = $tokens[-1] unless $tld; } return $tld; } # get URL for query via HTTP # %param: domain* sub get_http_query_url { my ($domain) = @_; my ($name, $tld) = split_domain($domain); my @http_query_data; # my ($url, %form); if ($tld eq 'ru' || $tld eq 'su') { my $data = { url => "http://www.nic.ru/whois/?domain=$name.$tld", form => '', }; push @http_query_data, $data; } elsif ($tld eq 'ip') { my $data = { url => "http://www.nic.ru/whois/?ip=$name", form => '', }; push @http_query_data, $data; } elsif ($tld eq 'ws') { my $data = { url => "http://worldsite.ws/utilities/lookup.dhtml?domain=$name&tld=$tld", form => '', }; push @http_query_data, $data; } elsif ($tld eq 'kz') { my $data = { url => "http://www.nic.kz/cgi-bin/whois?query=$name.$tld&x=0&y=0", form => '', }; push @http_query_data, $data; } elsif ($tld eq 'vn') { # VN doesn't have web whois at the moment... my $data = { url => "http://www.tenmien.vn/jsp/jsp/tracuudomain1.jsp", form => { cap2 => ".$tld", referer => 'http://www.vnnic.vn/english/', domainname1 => $name, }, }; push @http_query_data, $data; } elsif ($tld eq 'ac') { my $data = { url => "http://nic.ac/cgi-bin/whois?query=$name.$tld", form => '', }; push @http_query_data, $data; } elsif ($tld eq 'bz') { my $data = { url => "http://www.test.bz/Whois/index.php?query=$name&output=nice&dotname=.$tld&whois=Search", }; push @http_query_data, $data; } elsif ($tld eq 'tj') { #my $data = { # url => "http://get.tj/whois/?lang=en&domain=$domain", # from => '', #}; #push @http_query_data, $data; # first level on nic.tj #$data = { # url => "http://www.nic.tj/cgi/lookup2?domain=$name", # from => '', #}; #push @http_query_data, $data; # second level on nic.tj my $data = { url => "http://www.nic.tj/cgi/whois?domain=$name", from => '', }; push @http_query_data, $data; #$data = { # url => "http://ns1.nic.tj/cgi/whois?domain=$name", # from => '', #}; #push @http_query_data, $data; #$data = { # url => "http://62.122.137.16/cgi/whois?domain=$name", # from => '', #}; #push @http_query_data, $data; } # return $url, %form; return \@http_query_data; } sub have_reserve_url { my ( $tld ) = @_; my %tld_list = ( 'tj' => 1, ); return defined $tld_list{$tld}; } # Parse content received from HTTP server # %param: resp*, tld* sub parse_www_content { my ($resp, $tld, $url, $CHECK_EXCEED) = @_; chomp $resp; $resp =~ s/\r//g; my $ishtml; if ( $tld eq 'ru' || $tld eq 'su' ) { $resp = decode( 'koi8-r', $resp ); (undef, $resp) = split('',$resp); ($resp) = split('', $resp); $resp =~ s/ / /gi; $resp =~ s/<([^>]|\n)*>//gi; return 0 if $resp=~ m/Доменное имя .*? не зарегистрировано/i; $resp = 'ERROR' if $resp =~ m/Error:/i || $resp !~ m/Информация о домене .+? \(по данным WHOIS.RIPN.NET\):/; #TODO: errors } elsif ($tld eq 'ip') { $resp = decode_utf8( $resp ); return 0 unless $resp =~ m|

(.+?)

|s; $resp = $1; $resp =~ s|||g; $resp =~ s|
||g; $resp =~ s|
||g; $resp =~ s| | |g; } elsif ($tld eq 'ws') { $resp = decode_utf8( $resp ); if ($resp =~ /Whois information for .+?:(.+?)/s) { $resp = $1; $resp =~ s|||isg; $resp =~ s|||isg; $ishtml = 1; } else { return 0; } } elsif ($tld eq 'kz') { $resp = decode_utf8( $resp ); if ($resp =~ /Domain Name\.{10}/s && $resp =~ /
(.+?)<\/pre>/s) {
            $resp = $1;
        }
        else {
            return 0;
        }
    }
    elsif ($tld eq 'vn') {

        $resp = decode_utf8( $resp );

        if ($resp =~ /\(\s*?(Domain .+?:\s*registered)\s*?\)/i )  {
            $resp = $1;
        }
        else {
            return 0;
        }

        #
        # if ($resp =~/#ENGLISH.*?<\/tr>(.+?)<\/table>/si) {
        #    $resp = $1;
        #    $resp =~ s|||ig;
        #    $resp =~ s| ||ig;
        #    $resp =~ s|
|\n|ig; # $resp =~ s|
\s*\s*(.*?)\s*\s*\s*(.*?)\s*\s*|$1 $2\n|isg; # $resp =~ s|^\s*||mg; # } elsif ($tld eq 'ac') { $resp = decode_utf8( $resp ); if ($CHECK_EXCEED && $resp =~ /too many requests/is) { die "Connection rate exceeded"; } elsif ($resp =~ /(.+?)/is) { $resp = $1; $resp =~ s|||ig; $resp =~ s|||ig; $resp =~ s|||ig; $resp =~ s|\s*\s*(.*?)\s*\s*\s*(.*?)\s*\s*|$1 $2\n|isg; $resp =~ s|||ig; $resp =~ s|||ig; $resp =~ s|^\s*||mg; } else { return 0; } } elsif ($tld eq 'bz') { $resp = decode_utf8( $resp ); if ( $resp =~ m{
(.+)
}xms ) { $resp = $1; if ( $resp =~ /NOT\s+FOUND/ || $resp =~ /No\s+Domain/ ) { # Whois info not found return 0; } $resp =~ s|<[^<>]+>||ig; } else { return 0; } } elsif ( $tld eq 'tj' && $url =~ m|^http\://get\.tj| ) { $resp = decode_utf8( $resp ); if ($resp =~ m|\n(.+?)|s ) { $resp = $1; $resp =~ s|<[^<>]+>||ig; $resp =~ s|Whois\n|\n|s; return 0 if $resp =~ m|Domain \S+ is free|s; $resp =~ s|Domain \S+ is already taken\.\n|\n|s; $resp =~ s| | |ig; $resp =~ s|«|"|ig; $resp =~ s|»|"|ig; $resp =~ s|\n\s+|\n|sg; $resp =~ s|\s+\n|\n|sg; $resp =~ s|\n\n|\n|sg; } else { return 0; } } elsif ( $tld eq 'tj' && $url =~ m|\.nic\.tj/cgi/lookup| ) { $resp = decode_utf8( $resp ); if ($resp =~ m|\n?(.+?)\n?|s) { $resp = $1; return 0 if $resp =~ m|may be available|s; $resp =~ s|\n\s+|\n|sg; $resp =~ s|\s+\n|\n|sg; $resp =~ s|\n\n|\n|sg; $resp =~ s|]*? > (.+) (:?
) }sxmi ) { $resp = $1; $resp =~ s|||ig; $resp =~ s|| |ig; $resp =~ s|||ig; $resp =~ s|||ig; $resp =~ s|«|"|ig; $resp =~ s|»|"|ig; $resp =~ s| | |ig; $resp =~ s|\n\s+|\n|sg; $resp =~ s|\s+\n|\n|sg; $resp =~ s|\n\n|\n|sg; } else { return 0; } } else { return 0; } return $resp; } # check, if it's IP-address? sub is_ipaddr { $_[0] =~ /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/; } # check, if it's IPv6-address? sub is_ip6addr { my ( $ip ) = @_; return 0 unless defined $ip; return $ip =~ /^$IPv6_re$/; } # get domain level sub domain_level { my ($str) = @_; my $dotcount = $str =~ tr/././; return $dotcount + 1; } # split domain on name and TLD sub split_domain { my ($dom) = @_; my $tld = get_dom_tld( $dom ); my $name; if (uc $tld eq 'IP' || $tld eq 'NOTLD') { $name = $dom; } else { $name = substr( $dom, 0, length($dom) - length($tld) - 1 ); } return ($name, $tld); } # sub dlen { my ($str) = @_; return length($str) * domain_level($str); } # clear the data's taintedness sub untaint (\$) { my ($str) = @_; $$str =~ m/^(.*)$/; $$str = $1; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Net::Whois::Raw::Common - Helper for Net::Whois::Raw. =head1 VERSION version 2.99042 =head1 AUTHOR Alexander Nalobin =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2002-2025 by Alexander Nalobin. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut 02-www_parse_tj_cgi_whois.t100644001750001750 1442315037672667 22243 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/t#!/usr/bin/perl -w use strict; use Test::More tests => 2; use Net::Whois::Raw::Common; my $string = do { local $/; }; ok !utf8::is_utf8( $string ), 'make sure it\'s bytes'; use Data::Dumper; my $got = Net::Whois::Raw::Common::parse_www_content( $string, 'tj', 'http://www.nic.tj/cgi/whois?domain=get', 1 ); my $expected = qq{ domain name get.tj description \x{420}\x{435}\x{433}\x{438}\x{441}\x{442}\x{440}\x{430}\x{446}\x{438}\x{44f} \x{434}\x{43e}\x{43c}\x{435}\x{43d}\x{43d}\x{44b}\x{445} \x{438}\x{43c}\x{435}\x{43d} submitted by company \x{41e}\x{41e}\x{41e} \"\x{410}\x{440}\x{437}\x{43e}\x{43d}\", Alpha Dimension Group address 734000, \x{433}. \x{414}\x{443}\x{448}\x{430}\x{43d}\x{431}\x{435}, \x{43f}\x{440}. \x{420}\x{443}\x{434}\x{430}\x{43a}\x{438} 90, \x{43e}\x{444}\x{438}\x{441} 2 phone (992 48) 7016444 e-mail corp\@get.tj domain owner name \x{41e}\x{41e}\x{41e} \"\x{410}\x{440}\x{437}\x{43e}\x{43d}\", Alpha Dimension Group address: street \x{43f}\x{440}. \x{420}\x{443}\x{434}\x{430}\x{43a}\x{438} 90, \x{43e}\x{444}\x{438}\x{441} 2 city \x{414}\x{443}\x{448}\x{430}\x{43d}\x{431}\x{435} state \x{422}\x{430}\x{434}\x{436}\x{438}\x{43a}\x{438}\x{441}\x{442}\x{430}\x{43d} administrative contact name \x{41e}\x{41e}\x{41e} \"\x{410}\x{440}\x{437}\x{43e}\x{43d}\", Alpha Dimension Group address: street \x{43f}\x{440}. \x{420}\x{443}\x{434}\x{430}\x{43a}\x{438} 90, \x{43e}\x{444}\x{438}\x{441} 2 city \x{414}\x{443}\x{448}\x{430}\x{43d}\x{431}\x{435} postal code 734000 state \x{422}\x{430}\x{434}\x{436}\x{438}\x{43a}\x{438}\x{441}\x{442}\x{430}\x{43d} phone (992 48) 7016444 fax (992 48) 7016444 e-mail corp\@get.tj technical contact name \x{41e}\x{41e}\x{41e} \"\x{410}\x{440}\x{437}\x{43e}\x{43d}\", Alpha Dimension Group address: street \x{43f}\x{440}. \x{420}\x{443}\x{434}\x{430}\x{43a}\x{438} 90, \x{43e}\x{444}\x{438}\x{441} 2 city \x{414}\x{443}\x{448}\x{430}\x{43d}\x{431}\x{435} postal code 734000 state \x{422}\x{430}\x{434}\x{436}\x{438}\x{43a}\x{438}\x{441}\x{442}\x{430}\x{43d} phone (992 48) 7016444 fax (992 48) 7016444 e-mail corp\@get.tj dns-servers for domain primary DNS-server: hostname ns1.ht-systems.ru ip-address 78.110.50.60 secondary DNS-server: hostname ns2.ht-systems.ru ip-address 195.128.51.62 registration data registrar GET.TJ registration date 12 Jul 2007 }; is $got, $expected, 'should match the fixture'; __DATA__ get.tj
domain nameget.tj
descriptionРегистрация доменных имен
submitted by
companyООО «Арзон», Alpha Dimension Group
address734000, г. Душанбе, пр. Рудаки 90, офис 2
phone(992 48) 7016444
e-mailcorp@get.tj
domain owner
nameООО «Арзон», Alpha Dimension Group
address: 
streetпр. Рудаки 90, офис 2
cityДушанбе
stateТаджикистан
administrative contact
nameООО «Арзон», Alpha Dimension Group
address: 
streetпр. Рудаки 90, офис 2
cityДушанбе
postal code734000
stateТаджикистан
phone(992 48) 7016444
fax(992 48) 7016444
e-mailcorp@get.tj
technical contact
nameООО «Арзон», Alpha Dimension Group
address: 
streetпр. Рудаки 90, офис 2
cityДушанбе
postal code734000
stateТаджикистан
phone(992 48) 7016444
fax(992 48) 7016444
e-mailcorp@get.tj
dns-servers for domain
primary DNS-server: 
hostnamens1.ht-systems.ru
ip-address78.110.50.60
secondary DNS-server: 
hostnamens2.ht-systems.ru
ip-address195.128.51.62
registration data
registrar GET.TJ
registration date12 Jul 2007


pwhois-maintain000755001750001750 015037672667 21351 5ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/maintainfunc.js100644001750001750 1101315037672667 23016 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/maintain/pwhois-maintain// combine back str group to string function combine_str_group(group, is_hash_style) { var records = []; for (var r in group.records) { r = group.records[r]; if (is_hash_style) { records.push( " " + r.left + ' '.repeat(group.indent - r.left.length - 3) + "=> " + r.right ); } else { records.push( ' ' + r.left + ' '.repeat(group.indent - r.left.length) + r.right ); } } if (!is_hash_style && group.affected) records.sort(); return records.join('\n'); } // inject new not found pattern in the right place function inject_new_notfound_pattern(pat, server, group) { // check indent width: '' + spaces + => if (server.length + 6 > group.indent) { group.indent = server.length + 6; } group.records.push({ left: "'" + server + "'", right: "'" + pat + "'," }) } // check is server name a equals server name b, at least partly function server_names_cmp(a, b) { // server.whois.ru.com -> ['server', 'whois.ru.com'] var parts_a = a.split('.'); var len = parts_a.length - 1; var tld_finish = len - 1; for (; tld_finish > 0; tld_finish--) { if (parts_a[tld_finish] == 'nic' || parts_a[tld_finish].length > 3) break; } parts_a[tld_finish] += '.' + parts_a.splice(tld_finish+1).join('.'); // same for b var parts_b = b.split('.'); len = parts_b.length - 1; tld_finish = len - 1; for (; tld_finish > 0; tld_finish--) { if (parts_b[tld_finish] == 'nic' || parts_b[tld_finish].length > 3) break; } parts_b[tld_finish] += '.' + parts_b.splice(tld_finish+1).join('.'); // now cmp from the end var len_a = parts_a.length; var len_b = parts_b.length; var i, j = 1; for (i=len_a-1; i>=0 && j<=len_b; i--, j++) { if (parts_a[i] != parts_b[len_b-j]) break; } // return rating return (len_a-i-1)/len_a * (j-1)/len_b; } // inject new tld server in the right place function inject_new_whois_server(tld, server, groups) { var rating = {}; for (var i=0; i indent) { indent = tld.length + 2; } groups.push({ indent: indent, affected: false, records: [{ left: tld, right: server }] }); } else { // group found var group = groups[ srk[0] ]; if (tld.length + 2 > group.indent) { group.indent = tld.length + 2; } group.affected = true; group.records.push({ left: tld, right: server }); } } // split str group to left and right parts // with indent width info saved function parse_str_group(str) { str = $.trim(str); var lines = str.split('\n'); var result = { indent: null, affected: false, records: [] }; for (var line in lines) { line = $.trim(lines[line]); if (!result.indent) { var parts = adequate_split(line, /\s+/, 3); result.indent = line.length - parts[parts.length-1].length; } var parts = adequate_split(line, /\s+/, 3); result.records.push({ left: parts[0], right: parts[parts.length-1] // => }); } return result; } // "sds dsfds dfd dfd".split(/\s+/, 3) -> ['sds', 'dsfds', 'dfd'] // JavaScript are u kidding me? function adequate_split(str, pat, limit) { var res = []; var i; for (i = 0; i < limit-1; i++) { var match; if (match = str.match(pat)) { res.push(str.substring(0, match.index)); str = str.substring(match.index+match[0].length); } else { res.push(str); break; } } if (i == limit-1) res.push(str); return res; } logic.js100644001750001750 772315037672667 23155 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/maintain/pwhois-maintain$(function() { $('#process').click(function() { var new_tlds = []; var not_selected = 0; var server_empty = 0; var first = true; // push all input into array $('#result tr').each(function() { if (first) { first = false; return; } var self = $(this); var tld = self.find('td[data-id="tld"]').text(); var td_whois = self.find('td[data-id="whois_server"]'); var whois_server = td_whois.find('input[type="text"]').val(); var selected = td_whois.find('input[type="radio"]:checked').val(); var notfound_pat = self.find('td[data-id="notfound"] input[data-id="notfound_pat"]').val(); new_tlds.push({ tld: tld, whois_server: whois_server, notfound_pat: notfound_pat, selected: selected }); if (!selected) not_selected++; if (!whois_server) server_empty++; }) // check for user errors if (server_empty || not_selected) { if ( !confirm((server_empty ? server_empty + ' whois servers empty, ' : '') + (not_selected ? not_selected + ' items not processed, ' : '') + 'are u sure u want to continue? All of this tlds will be skipped') ) { return; } } this.disabled = true; // get servers from perl sourcecode var source = $('#source').val(); var match = source.match(/our\s+%servers\s*=\s*qw\(((?:.|\n)+?)\);/); if (!match) { alert('Unexpected fail: can not find %servers in Data.pm'); return; } var raw_servers = match[1]; var raw_servers_groups = raw_servers.split(/\n[ \t]*\n/); var servers_groups = []; for (var rsg in raw_servers_groups) { servers_groups.push( parse_str_group( raw_servers_groups[rsg] ) ); } // get not found patterns from perl sourcecode match = source.match(/our\s+%notfound\s*=\s*\(\n((?:.|\n)+?)\);/); if (!match) { alert('Unexpected fail: can not find %notfound in Data.pm'); return; } var raw_notfound = match[1]; var raw_notfound_groups = raw_notfound.split(/\n[ \t]*\n/); // always push to last nf group var notfound_group = parse_str_group( raw_notfound_groups[raw_notfound_groups.length - 1] ); // process for (var tld_r in new_tlds) { tld_r = new_tlds[tld_r]; if (tld_r.selected != 'accept' || !tld_r.whois_server) { continue; } // whois server inject_new_whois_server(tld_r.tld, tld_r.whois_server, servers_groups); // not found pattern if (tld_r.notfound_pat) inject_new_notfound_pattern(tld_r.notfound_pat, tld_r.whois_server, notfound_group); } // combine back to string for (var i in servers_groups) { raw_servers_groups[i] = combine_str_group( servers_groups[i] ); } raw_servers = raw_servers_groups.join('\n\n'); raw_notfound_groups[raw_notfound_groups.length - 1] = combine_str_group( notfound_group, true ); raw_notfound = raw_notfound_groups.join('\n\n'); // replace in source code source = source.replace(/our\s+%servers\s*=\s*qw\(\s*(?:.|\n)+?\);/, 'our %servers = qw(\n' + raw_servers + '\n);'); source = source.replace(/our\s+%notfound\s*=\s*\(\s*(?:.|\n)+?\);/, 'our %notfound = (\n' + raw_notfound + '\n);'); $('#source').val(source); $('#source_block').show(); $('html, body').animate({ scrollTop: $("#source_block").offset().top }, 2000); }) }) index.html100644001750001750 573615037672667 23521 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/maintain/pwhois-maintain New gTLDs found [% FOREACH i IN new %] [% END %]
TLDWhois serverNot Found pattern
[% i.tld %]

[% IF i.notfound or not i.notfound.defined %]
[% IF i.notfound %] [% ELSE %] couldn't receive response from the whois server [% END %] [% ELSE %] Not Found pattern already in Data.pm or above [% END %]
example-domains-load-balancing.pl100644001750001750 1232215037672667 23336 0ustar00nalobinnalobin000000000000Net-Whois-Raw-2.99042/t#!/usr/bin/perl -w use strict; use Test::More (tests => 6, skip_all => 'tmp'); exit; sub ip_to_dword { my $ip = shift; # assume ipv4 return unpack('B32', pack('C4C4C4C4', split(/\./, $ip))); } sub dword_to_ip { my $dword = shift; return join '.', unpack('C4C4C4C4', pack('B32', $dword)); } BEGIN { use Socket; eval " use Coro; use Coro::AnyEvent; use Coro::Socket; use Coro::LWP; use Coro::Timer; use DBI:SQLite; "; $::require_coro = $@ if $@; unlink "db.sqlite"; $ENV{DBI_DSN} ||= 'DBI:SQLite:dbname=db.sqlite'; $ENV{DBI_USER} ||= ''; $ENV{DBI_PASS} ||= ''; use DBI; $::dbh = DBI->connect; $::dbh->do ('create table whois_quota ( name varchar(200), ip varchar(15), ip_expire integer, quota integer );'); $::dbh->do ('create table whois_connection ( local_ip integer, remote_ip integer, created integer, domain varchar(300) );'); $::dbh->do ('create table whois_ip ( local_ip varchar(15) );'); # TODO: FILL IP LIST into whois_ip $::dbh->do ('insert into whois_ip values (?);', {}, ip_to_dword ('192.168.2.2')); $::dbh->do ('insert into whois_ip values (?);', {}, ip_to_dword ('10.0.2.6')); use_ok('Net::Whois::Raw',qw( whois )); $Net::Whois::Raw::CHECK_FAIL = 1; $Net::Whois::Raw::OMIT_MSG = 1; $Net::Whois::Raw::CHECK_EXCEED = 1; }; my @domains = qw( yahoo.com freebsd.org reg.ru ns1.nameself.com.NS belizenic.bz ); my $dns_cache = {}; SKIP: { print "The following tests requires internet connection. Checking...\n"; skip "Looks like no internet connection", 5 unless get_connected(); print "The following tests requires Coro. Checking...\n"; skip "Looks like no Coro installed", 5 unless require_coro (); my @coros = (); # domains foreach my $domain ( @domains ) { push @coros, Coro->new (sub { my $txt = whois( $domain ); $::dbh->do ('delete from whois_connection where domain = ?', {}, $domain); $domain =~ s/.NS$//i; ok($txt && $txt =~ /$domain/i, "domain '$domain' resolved"); }); } $_->ready foreach @coros; $_->join foreach @coros; }; sub get_connected { require LWP::UserAgent; my $ua = LWP::UserAgent->new( timeout => 10 ); my $res = $ua->get( 'http://www.google.com' ); return $res->is_success; } sub require_coro { no warnings 'once'; *Net::Whois::Raw::whois_socket_fixup = sub { my $class = shift; my $sock = shift; return Coro::Socket->new_from_fh ($sock, partial => 1); }; *Net::Whois::Raw::whois_query_sockparams = sub { my $class = shift; my $domain = shift; my $name = shift; # TODO: YOU MUST PLACE QUOTA CHECK HERE # my $sth = $::dbh->prepare ('select * from '); my $ip; if (! $dns_cache->{$name}) { $ip = inet_ntoa (inet_aton ($name)); # TODO: use coro::util for resolve $dns_cache->{$name} = $ip; } else { $ip = $dns_cache->{$name}; } my $ip_num = ip_to_dword ($ip); my $sth = $::dbh->prepare ( 'select local_ip from whois_ip where local_ip not in (select local_ip from whois_connection where remote_ip = ? group by local_ip) limit 1;' ); my $rows_affected = $sth->execute ($ip_num); my $result = $sth->fetchall_arrayref ({}); $sth->finish; if (@$result == 0) { # no free ips, try to use minimally loaded $sth = $::dbh->prepare ('select local_ip, count(local_ip) as local_ip_c from whois_connection where remote_ip = ? and created > ? group by local_ip order by count(local_ip) asc limit 1;'); $rows_affected = $sth->execute ($ip_num); $result = $sth->fetchall_arrayref ({}); } $::dbh->do ( 'insert into whois_connection values (?, ?, ?, ?);', {}, $result->[0]->{local_ip}, $ip_num, time, $domain ); return ( PeerAddr => $dns_cache->{$name}, PeerPort => 43, LocalHost => dword_to_ip ($result->[0]->{local_ip}), # LocalPort => ); }; return ! $::require_coro; }