Zonemaster-CLI-v1.0.5/0000755000175000017500000000000013000173045013432 5ustar matsdmatsdZonemaster-CLI-v1.0.5/share/0000755000175000017500000000000013000173045014534 5ustar matsdmatsdZonemaster-CLI-v1.0.5/share/en.po0000644000175000017500000001343513000170027015501 0ustar matsdmatsdmsgid "" msgstr "" "Language: en\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: 0.0.5\n" "PO-Revision-Date: 2014-08-28\n" "Last-Translator: calle@init.se\n" "Language-Team: Zonemaster Team\n" "MIME-Version: 1.0\n" msgid "Print version information and exit." msgstr "Print version information and exit." msgid "The minimum severity level to display" msgstr "The minimum severity level to display" msgid "The locale to use for messages translation." msgstr "The locale to use for messages translation." msgid "Flag indicating if output should be in JSON or not." msgstr "Flag indicating if output should be in JSON or not." msgid "Flag indicating if output should be translated to human language or dumped raw." msgstr "Flag indicating if output should be translated to human language or dumped raw." msgid "Print timestamp on entries." msgstr "Print timestamp on entries." msgid "Print level on entries." msgstr "Print level on entries." msgid "Print the name of the module on entries." msgstr "Print the name of the module on entries." msgid "A name/ip string giving a nameserver for undelegated tests. Can be given multiple times." msgstr "A name/ip string giving a nameserver for undelegated tests. Can be given multiple times." msgid "Name of a file to save DNS data to after running tests." msgstr "Name of a file to save DNS data to after running tests." msgid "Name of a file to restore DNS data from before running test." msgstr "Name of a file to restore DNS data from before running test." msgid "Flag to permit or deny queries being sent via IPv4. --ipv4 permits IPv4 traffic, --no-ipv4 forbids it." msgstr "Flag to permit or deny queries being sent via IPv4. --ipv4 permits IPv4 traffic, --no-ipv4 forbids it." msgid "Flag to permit or deny queries being sent via IPv6. --ipv6 permits IPv6 traffic, --no-ipv6 forbids it." msgstr "Flag to permit or deny queries being sent via IPv6. --ipv6 permits IPv6 traffic, --no-ipv6 forbids it." msgid "Instead of running a test, list all available tests." msgstr "Instead of running a test, list all available tests." msgid "Specify test to run. Should be either the name of a module, or the name of a module and the name of a method in that module separated by a \"/\" character (Example: \"Basic/basic1\"). The method specified must be one that takes a zone object as its single argument. This switch can be repeated" msgstr "Specify test to run. Should be either the name of a module, or the name of a module and the name of a method in that module separated by a \"/\" character (Example: \"Basic/basic1\"). The method specified must be one that takes a zone object as its single argument. This switch can be repeated" msgid "As soon as a message at this level or higher is logged, execution will stop" msgstr "As soon as a message at this level or higher is logged, execution will stop" msgid "Name of configuration file to load." msgstr "Name of configuration file to load." msgid "Name of policy file to load." msgstr "Name of policy file to load." msgid "Strings with DS data on the form \"keytag,algorithm,type,digest\"" msgstr "Strings with DS data on the form \"keytag,algorithm,type,digest\"" msgid "Print a count of the number of messages at each level" msgstr "Print a count of the number of messages at each level" msgid "Boolean flag for activity indicator. Defaults to on if STDOUT is a tty, off if it is not." msgstr "Boolean flag for activity indicator. Defaults to on if STDOUT is a tty, off if it is not." msgid "Name of the character encoding used for command line arguments" msgstr "Name of the character encoding used for command line arguments" msgid "Must give the name of a domain to test.\n" msgstr "Must give the name of a domain to test.\n" msgid "Failed to recognize stop level '" msgstr "Failed to recognize stop level '" msgid "--level must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 or DEBUG3.\n" msgstr "--level must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 or DEBUG3.\n" msgid "Loading policy from " msgstr "Loading policy from " msgid "Loading configuration from " msgstr "Loading configuration from " msgid "Seconds " msgstr "Seconds " msgid "Level " msgstr "Level " msgid "Module " msgstr "Module " msgid "Message" msgstr "Message" msgid "\n\n Level\tNumber of log entries" msgstr "\n\n Level\tNumber of log entries" msgid "%8s\t%5d entries.\n" msgstr "%8s\t%5d entries.\n" msgid "Warning: Net::LDNS not compiled with libidn, cannot handle non-ASCII names correctly." msgstr "Warning: Net::LDNS not compiled with libidn, cannot handle non-ASCII names correctly." msgid "Warning: setting locale %s failed (is it installed on this system?).\n\n" msgstr "Warning: setting locale %s failed (is it installed on this system?).\n\n" msgid "CRITICAL" msgstr "CRITICAL" msgid "ERROR" msgstr "ERROR" msgid "WARNING" msgstr "WARNING" msgid "NOTICE" msgstr "NOTICE" msgid "INFO" msgstr "INFO" msgid "DEBUG" msgstr "DEBUG" msgid "======= " msgstr "======= " msgid "========= " msgstr "========= " msgid "============ " msgstr "============ " msgid "=======" msgstr "=======" msgid "Looks OK." msgstr "Looks OK." msgid "At the end of a run, print a summary of the times the zone's name servers took to answer." msgstr "At the end of a run, print a summary of the times the zone's name servers took to answer." msgid "Print the effective configuration used in JSON format, then exit." msgstr "Print the effective configuration used in JSON format, then exit." msgid "Print the effective policy used in JSON format, then exit." msgstr "Print the effective policy used in JSON format, then exit." msgid "Local IP address that the test engine should try to send its requests from." msgstr "Local IP address that the test engine should try to send its requests from." Zonemaster-CLI-v1.0.5/share/fr.po0000644000175000017500000001554113000170027015506 0ustar matsdmatsdmsgid "" msgstr "" "Language: fr\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: 0.0.5\n" "PO-Revision-Date: 2014-08-28\n" "Last-Translator: vincent.levigneron@afnic.fr\n" "Language-Team: Zonemaster Team\n" "MIME-Version: 1.0\n" msgid "Print version information and exit." msgstr "Affichage des informations sur les versions de l'outil et des modules de tests." msgid "The minimum severity level to display. Must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO or DEBUG." msgstr "Option avec comme argument le niveau de gravité minimum qui sera affiché. Doit avoir pour valeur CRITICAL, ERROR, WARNING, NOTICE, INFO ou DEBUG." msgid "The locale to use for messages translation." msgstr "La \"locale\" à utiliser pour la traduction des messages." msgid "Flag indicating if output should be in JSON or not." msgstr "Option signalant que le format de sortie utilisé sera du JSON ou non." msgid "Flag indicating if output should be translated to human language or dumped raw." msgstr "Option signalant que le format de sortie sera traduit en langage humain ou affiché en mode brut." msgid "Print timestamp on entries." msgstr "Affichage de l'horodatage (en secondes) pour suivre l'état de l'avancement de l'analyse." msgid "Print level on entries." msgstr "Affichage du niveau de gravité pour chaque résultat de test." msgid "Print the name of the module on entries." msgstr "Pour chaque résultat de test, affichage du nom du module qui en est à l'origine." msgid "A name/ip string giving a nameserver for undelegated tests. Can be given multiple times." msgstr "Un nom ou une adresse IP correspondant à un serveur de noms pour les tests sur des zones non déléguées. Peut être utilisée plusieurs fois." msgid "Name of a file to save DNS data to after running tests." msgstr "Option avec comme argument le nom du fichier dans lequel seront sauvegardés les résultats des requêtes DNS nécessaires à l'analyse de la zone." msgid "Name of a file to restore DNS data from before running test." msgstr "Option avec comme argument le nom du fichier à partir duquel seront restaurés les résultats des requêtes DNS nécessaires à l'analyse de la zone." msgid "Flag to permit or deny queries being sent via IPv4. --ipv4 permits IPv4 traffic, --no-ipv4 forbids it." msgstr "Option signalant que les requêtes pourront ou non être transmises en IPv4. --ipv4 autorise l'usage d'IPv4, alors que --no-ipv4 l'interdit." msgid "Flag to permit or deny queries being sent via IPv6. --ipv6 permits IPv6 traffic, --no-ipv6 forbids it." msgstr "Option signalant que les requêtes pourront ou non être transmises en IPv6. --ipv6 autorise l'usage d'IPv6, alors que --no-ipv6 l'interdit." msgid "Instead of running a test, list all available tests." msgstr "Cette option permet d'afficher la liste de tous les tests disponibles. Ceux-ci ne seront pas exécutés." msgid "Specify test to run. Should be either the name of a module, or the name of a module and the name of a method in that module separated by a \"/\" character (Example: \"Basic/basic1\"). The method specified must be one that takes a zone object as its single argument. This switch can be repeated." msgstr "Permet d'indiquer quel test doit être exécuté. Peut être un nom de module seul, ou celui-ci associé à un nom de test, les deux étant séparés par le caractère \"/\" (Exemple: \"Basic/basic1\"). Cette option peut être répétée plusieurs fois." msgid "As soon as a message at this level or higher is logged, execution will stop. Must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO or DEBUG." msgstr "Dès qu'un résultat de test avec ce niveau de gravité ou supérieur sera rencontré, l'exécution s'arrêtera. Doit avoir pour valeur CRITICAL, ERROR, WARNING, NOTICE, INFO ou DEBUG." msgid "Name of configuration file to load." msgstr "Option avec comme argument le nom du fichier de configuration à charger." msgid "Name of policy file to load." msgstr "Option avec comme argument le nom du fichier contenant la politique de tests qui sera appliquée." msgid "Strings with DS data on the form \"keytag,algorithm,type,digest\"" msgstr "Option avec comme argument les informations pour le traitement de la DS. Le format à utiliser est \"keytag,algorithm,type,digest\"." msgid "Print a count of the number of messages at each level" msgstr "Affichage du nombre total de résultats, pour chaque niveau de gravité, présents dans le journal (log)." msgid "Boolean flag for activity indicator. Defaults to on if STDOUT is a tty, off if it is not." msgstr "Cette option permet d'activer ou non l'indicateur de progression (défaut=activé si STDOUT est un terminal)." msgid "Name of the character encoding used for command line arguments" msgstr "Nom de l'encodage de caractères utilisé pour les arguments de la ligne de commande." msgid "Must give the name of a domain to test.\n" msgstr "Il est nécessaire d'indiquer un nom de domaine pour lancer le test.\n" msgid "Failed to recognize stop level '" msgstr "Impossible de reconnaître le niveau de gravité provoquant l'arrêt de l'analyse '" msgid "--level must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 or DEBUG3.\n" msgstr "--level doit avoir pour valeur CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 ou DEBUG3.\n" msgid "Loading policy from " msgstr "Chargement de la politique de tests depuis le fichier " msgid "Loading configuration from " msgstr "Chargement de la configuration depuis le fichier " msgid "Seconds " msgstr "Durée " msgid "Level " msgstr "Niveau " msgid "Module " msgstr "Module " msgid "Message" msgstr "Message" msgid "\n\n Level\tNumber of log entries" msgstr "\n\n Niveau\tOccurences dans le log" msgid "%8s\t%5d entries.\n" msgstr "%8s\t%5d entrées.\n" msgid "Warning: Net::LDNS not compiled with libidn, cannot handle non-ASCII names correctly." msgstr "Attention: Net::LDNS n'est pas compilé avec libidn, impossible de traiter correctement les noms non ASCII." msgid "Warning: setting locale %s failed (is it installed on this system?).\n\n" msgstr "Attention: La \"locale\" positionnée %s n'est pas correctement prise en compte (Est-elle installée sur votre système ?).\n\n" msgid "CRITICAL" msgstr "CRITICAL" msgid "ERROR" msgstr "ERROR" msgid "WARNING" msgstr "WARNING" msgid "NOTICE" msgstr "NOTICE" msgid "INFO" msgstr "INFO" msgid "DEBUG" msgstr "DEBUG" msgid "======= " msgstr "======= " msgid "========= " msgstr "========= " msgid "============ " msgstr "============ " msgid "=======" msgstr "=======" msgid "Looks OK." msgstr "Le résultat semble concluant." msgid "At the end of a run, print a summary of the times the zone's name servers took to answer." msgstr "A la fin de l'exécution, affichage d'un récapitulatif sur les temps de réponses des serveurs de noms de la eone interrogés au cours de l'analyse." Zonemaster-CLI-v1.0.5/share/Makefile0000644000175000017500000000057413000170027016177 0ustar matsdmatsdPOFILES = $(wildcard *.po) MOFILES := $(POFILES:.po=.mo) MSGFMT = msgfmt --check %.mo: %.po @mkdir -p locale/$*/LC_MESSAGES @${MSGFMT} -o locale/$*/LC_MESSAGES/Zonemaster-CLI.mo $< @echo locale/$*/LC_MESSAGES/Zonemaster-CLI.mo all: ${MOFILES} @echo @echo Remember to make sure all of the above names are in the @echo MANIFEST file, or they will not be installed. @echo Zonemaster-CLI-v1.0.5/share/sv.po0000644000175000017500000001374013000170027015526 0ustar matsdmatsdmsgid "" msgstr "" "Language: en\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Project-Id-Version: 0.0.5\n" "PO-Revision-Date: 2014-09-09 15:20+0200\n" "Last-Translator: calle@init.se\n" "Language-Team: Zonemaster Team\n" "MIME-Version: 1.0\n" msgid "Print version information and exit." msgstr "Skriv ut versionsinformation och avsluta." msgid "The minimum severity level to display" msgstr "Den lägsta allvarlighetsgrad som skall skrivas ut." msgid "The locale to use for messages translation." msgstr "Den locale som skall användas för utskrifter." msgid "Flag indicating if output should be in JSON or not." msgstr "Flagga som avgör om utskrift skall göras som JSON." msgid "Flag indicating if output should be translated to human language or dumped raw." msgstr "Flagga som avgör om resultat skall skrivas ut i råformat." msgid "Print timestamp on entries." msgstr "Skriv ut tidsstämplar." msgid "Print level on entries." msgstr "Skriv ut allvarlighetsnivåer." msgid "Print the name of the module on entries." msgstr "Skriv ut modulnamn." msgid "A name/ip string giving a nameserver for undelegated tests. Can be given multiple times." msgstr "Ett par av namn/IP som anger en namnserver att använda för odelegerade tester. Kan ges flera gånger." msgid "Name of a file to save DNS data to after running tests." msgstr "Namn på en fll att spara DNS-data i efter en körning." msgid "Name of a file to restore DNS data from before running test." msgstr "Namn på en fil att läsa in DNS-data från innan tester körs." msgid "Flag to permit or deny queries being sent via IPv4. --ipv4 permits IPv4 traffic, --no-ipv4 forbids it." msgstr "Flagga som tillåter eller förbjuder användning av IPv4. --ipv4 tillåter, --no-ipv4 förbjuder." msgid "Flag to permit or deny queries being sent via IPv6. --ipv6 permits IPv6 traffic, --no-ipv6 forbids it." msgstr "Flagga som tillåter eller förbjuder användning av IPv6. --ipv6 tillåter, --no-ipv6 förbjuder." msgid "Instead of running a test, list all available tests." msgstr "Istället för att köra tester, skriv ut en lista med alla tillgängliga tester." msgid "Specify test to run. Should be either the name of a module, or the name of a module and the name of a method in that module separated by a \"/\" character (Example: \"Basic/basic1\"). The method specified must be one that takes a zone object as its single argument. This switch can be repeated" msgstr "Specificera tester att köra. Skall vara antingen namnet på en testmodul, eller namnet på en modul och namnet på en testmetod i den modulen separerade med ett snedstreck (exempel: \"Basic/basic1\"). Den utpekade metoden måste vara en som tar enbart ett zon-objekt som argument. Den här flaggan kan anges flera gånger." msgid "As soon as a message at this level or higher is logged, execution will stop" msgstr "Avsluta testkörningen så snart ett meddelande med denna nivå eller högre registreras." msgid "Name of configuration file to load." msgstr "Namnet på en konfigurationsfil att läsa in." msgid "Name of policy file to load." msgstr "Namnet på en policy-fil att läsa in." msgid "Strings with DS data on the form \"keytag,algorithm,type,digest\"" msgstr "En sträng med DS-data på formatet \"keytag,algoritm,typ,digest\"." msgid "Print a count of the number of messages at each level" msgstr "Skriv ut en summering av antalet registrerade meddelanden på varje nivå." msgid "Boolean flag for activity indicator. Defaults to on if STDOUT is a tty, off if it is not." msgstr "Flagga för om en aktivitets-indikator skall användas. Normalt på om STDOUT är en tty, och av annars." msgid "Name of the character encoding used for command line arguments" msgstr "Namnet på den teckenkodning som används för kommandoradsargumenten." msgid "Must give the name of a domain to test.\n" msgstr "Måste ange namnet på en domän att testa.\n" msgid "Failed to recognize stop level '" msgstr "Kände inte igen avslutsnivån '" msgid "--level must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 or DEBUG3.\n" msgstr "--level måste vara en av CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 eller DEBUG3.\n" msgid "Loading policy from " msgstr "Laddar policy från " msgid "Loading configuration from " msgstr "Laddar konfiguration från " msgid "Seconds " msgstr " Sekund " msgid "Level " msgstr "Nivå " msgid "Module " msgstr "Modul " msgid "Message" msgstr "Meddelande" msgid "\n\n Level\tNumber of log entries" msgstr "\n\n Nivå \tAntal loggmeddelanden" msgid "%8s\t%5d entries.\n" msgstr "%8s\t%5d meddelanden.\n" msgid "Warning: Net::LDNS not compiled with libidn, cannot handle non-ASCII names correctly." msgstr "Varning: Net::LDNS är inte kompilerad med IDNA-stöd, så enbart ASCII-namn kan hanteras." msgid "Warning: setting locale %s failed (is it installed on this system?).\n\n" msgstr "Varning: misslyckades med att sätta locale till '%s' (är den installerad på det här systemet?).\n\n" msgid "CRITICAL" msgstr "KRITISKT" msgid "ERROR" msgstr "FEL" msgid "WARNING" msgstr "VARNING" msgid "NOTICE" msgstr "NOTIS" msgid "INFO" msgstr "INFO" msgid "DEBUG" msgstr "DEBUG" msgid "======= " msgstr "======= " msgid "========= " msgstr "==== " msgid "============ " msgstr "============ " msgid "=======" msgstr "==========" msgid "Looks OK." msgstr "Ser OK ut." msgid "At the end of a run, print a summary of the times the zone's name servers took to answer." msgstr "Efter att körningen avslutats, skriv ut en summering av zonens namnservrars svarstider." msgid "Print the effective configuration used in JSON format, then exit." msgstr "Skriv ut den effektiva konfigurationen i JSON-format, sedan avsluta." msgid "Print the effective policy used in JSON format, then exit." msgstr "Skriv ut den effektiva policyn i JSON-format, sedan avsluta." msgid "Local IP address that the test engine should try to send its requests from." msgstr "Lokal IP adress som testmotorn skall skicka sin trafik från." Zonemaster-CLI-v1.0.5/share/locale/0000755000175000017500000000000013000173045015773 5ustar matsdmatsdZonemaster-CLI-v1.0.5/share/locale/sv/0000755000175000017500000000000013000173045016423 5ustar matsdmatsdZonemaster-CLI-v1.0.5/share/locale/sv/LC_MESSAGES/0000755000175000017500000000000013000173045020210 5ustar matsdmatsdZonemaster-CLI-v1.0.5/share/locale/sv/LC_MESSAGES/Zonemaster-CLI.mo0000644000175000017500000001416113000170027023301 0ustar matsdmatsd3GLh iX  XKxYYx 3Of2f4 :EaKv  ( < 7O #  > 5 = AU : (  # ; !D ?f + %  U FV !^ ' 0 ;gIYX hd 4;6brb8Q= =   ,.[?a7-&F.JuD<$au)AA/D3tZe  %*1( ,-3'+ 0$ " !#&.)/2 Level Number of log entries%8s %5d entries. --level must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 or DEBUG3. ============== ========= ============ A name/ip string giving a nameserver for undelegated tests. Can be given multiple times.As soon as a message at this level or higher is logged, execution will stopAt the end of a run, print a summary of the times the zone's name servers took to answer.Boolean flag for activity indicator. Defaults to on if STDOUT is a tty, off if it is not.CRITICALDEBUGERRORFailed to recognize stop level 'Flag indicating if output should be in JSON or not.Flag indicating if output should be translated to human language or dumped raw.Flag to permit or deny queries being sent via IPv4. --ipv4 permits IPv4 traffic, --no-ipv4 forbids it.Flag to permit or deny queries being sent via IPv6. --ipv6 permits IPv6 traffic, --no-ipv6 forbids it.INFOInstead of running a test, list all available tests.Level Loading configuration from Loading policy from Local IP address that the test engine should try to send its requests from.Looks OK.MessageModule Must give the name of a domain to test. NOTICEName of a file to restore DNS data from before running test.Name of a file to save DNS data to after running tests.Name of configuration file to load.Name of policy file to load.Name of the character encoding used for command line argumentsPrint a count of the number of messages at each levelPrint level on entries.Print the effective configuration used in JSON format, then exit.Print the effective policy used in JSON format, then exit.Print the name of the module on entries.Print timestamp on entries.Print version information and exit.Seconds Specify test to run. Should be either the name of a module, or the name of a module and the name of a method in that module separated by a "/" character (Example: "Basic/basic1"). The method specified must be one that takes a zone object as its single argument. This switch can be repeatedStrings with DS data on the form "keytag,algorithm,type,digest"The locale to use for messages translation.The minimum severity level to displayWARNINGWarning: Net::LDNS not compiled with libidn, cannot handle non-ASCII names correctly.Warning: setting locale %s failed (is it installed on this system?). Language: en Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Project-Id-Version: 0.0.5 PO-Revision-Date: 2014-09-09 15:20+0200 Last-Translator: calle@init.se Language-Team: Zonemaster Team MIME-Version: 1.0 Nivå Antal loggmeddelanden%8s %5d meddelanden. --level måste vara en av CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 eller DEBUG3. ================= ==== ============ Ett par av namn/IP som anger en namnserver att använda för odelegerade tester. Kan ges flera gånger.Avsluta testkörningen så snart ett meddelande med denna nivå eller högre registreras.Efter att körningen avslutats, skriv ut en summering av zonens namnservrars svarstider.Flagga för om en aktivitets-indikator skall användas. Normalt på om STDOUT är en tty, och av annars.KRITISKTDEBUGFELKände inte igen avslutsnivån 'Flagga som avgör om utskrift skall göras som JSON.Flagga som avgör om resultat skall skrivas ut i råformat.Flagga som tillåter eller förbjuder användning av IPv4. --ipv4 tillåter, --no-ipv4 förbjuder.Flagga som tillåter eller förbjuder användning av IPv6. --ipv6 tillåter, --no-ipv6 förbjuder.INFOIstället för att köra tester, skriv ut en lista med alla tillgängliga tester.Nivå Laddar konfiguration från Laddar policy från Lokal IP adress som testmotorn skall skicka sin trafik från.Ser OK ut.MeddelandeModul Måste ange namnet på en domän att testa. NOTISNamn på en fil att läsa in DNS-data från innan tester körs.Namn på en fll att spara DNS-data i efter en körning.Namnet på en konfigurationsfil att läsa in.Namnet på en policy-fil att läsa in.Namnet på den teckenkodning som används för kommandoradsargumenten.Skriv ut en summering av antalet registrerade meddelanden på varje nivå.Skriv ut allvarlighetsnivåer.Skriv ut den effektiva konfigurationen i JSON-format, sedan avsluta.Skriv ut den effektiva policyn i JSON-format, sedan avsluta.Skriv ut modulnamn.Skriv ut tidsstämplar.Skriv ut versionsinformation och avsluta. Sekund Specificera tester att köra. Skall vara antingen namnet på en testmodul, eller namnet på en modul och namnet på en testmetod i den modulen separerade med ett snedstreck (exempel: "Basic/basic1"). Den utpekade metoden måste vara en som tar enbart ett zon-objekt som argument. Den här flaggan kan anges flera gånger.En sträng med DS-data på formatet "keytag,algoritm,typ,digest".Den locale som skall användas för utskrifter.Den lägsta allvarlighetsgrad som skall skrivas ut.VARNINGVarning: Net::LDNS är inte kompilerad med IDNA-stöd, så enbart ASCII-namn kan hanteras.Varning: misslyckades med att sätta locale till '%s' (är den installerad på det här systemet?). Zonemaster-CLI-v1.0.5/share/locale/fr/0000755000175000017500000000000013000173045016402 5ustar matsdmatsdZonemaster-CLI-v1.0.5/share/locale/fr/LC_MESSAGES/0000755000175000017500000000000013000173045020167 5ustar matsdmatsdZonemaster-CLI-v1.0.5/share/locale/fr/LC_MESSAGES/Zonemaster-CLI.mo0000644000175000017500000001567013000170027023266 0ustar matsdmatsd0C( )JX\  X8YYy 3Of3f4 ;Fb w (<7 #< ` >} 5  ( 3 #O s "| ? + f r Uz F  "%`8  T m S&Fza#=hB 16> FET8IaUxi>8RwYO$ t~x84k{<%  * !# . "+-)&0/,('$ Level Number of log entries%8s %5d entries. --level must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 or DEBUG3. ============== ========= ============ A name/ip string giving a nameserver for undelegated tests. Can be given multiple times.As soon as a message at this level or higher is logged, execution will stop. Must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO or DEBUG.At the end of a run, print a summary of the times the zone's name servers took to answer.Boolean flag for activity indicator. Defaults to on if STDOUT is a tty, off if it is not.CRITICALDEBUGERRORFailed to recognize stop level 'Flag indicating if output should be in JSON or not.Flag indicating if output should be translated to human language or dumped raw.Flag to permit or deny queries being sent via IPv4. --ipv4 permits IPv4 traffic, --no-ipv4 forbids it.Flag to permit or deny queries being sent via IPv6. --ipv6 permits IPv6 traffic, --no-ipv6 forbids it.INFOInstead of running a test, list all available tests.Level Loading configuration from Loading policy from Looks OK.MessageModule Must give the name of a domain to test. NOTICEName of a file to restore DNS data from before running test.Name of a file to save DNS data to after running tests.Name of configuration file to load.Name of policy file to load.Name of the character encoding used for command line argumentsPrint a count of the number of messages at each levelPrint level on entries.Print the name of the module on entries.Print timestamp on entries.Print version information and exit.Seconds Specify test to run. Should be either the name of a module, or the name of a module and the name of a method in that module separated by a "/" character (Example: "Basic/basic1"). The method specified must be one that takes a zone object as its single argument. This switch can be repeated.Strings with DS data on the form "keytag,algorithm,type,digest"The locale to use for messages translation.The minimum severity level to display. Must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO or DEBUG.WARNINGWarning: Net::LDNS not compiled with libidn, cannot handle non-ASCII names correctly.Warning: setting locale %s failed (is it installed on this system?). Language: fr Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Project-Id-Version: 0.0.5 PO-Revision-Date: 2014-08-28 Last-Translator: vincent.levigneron@afnic.fr Language-Team: Zonemaster Team MIME-Version: 1.0 Niveau Occurences dans le log%8s %5d entrées. --level doit avoir pour valeur CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 ou DEBUG3. ============== ========= ============ Un nom ou une adresse IP correspondant à un serveur de noms pour les tests sur des zones non déléguées. Peut être utilisée plusieurs fois.Dès qu'un résultat de test avec ce niveau de gravité ou supérieur sera rencontré, l'exécution s'arrêtera. Doit avoir pour valeur CRITICAL, ERROR, WARNING, NOTICE, INFO ou DEBUG.A la fin de l'exécution, affichage d'un récapitulatif sur les temps de réponses des serveurs de noms de la eone interrogés au cours de l'analyse.Cette option permet d'activer ou non l'indicateur de progression (défaut=activé si STDOUT est un terminal).CRITICALDEBUGERRORImpossible de reconnaître le niveau de gravité provoquant l'arrêt de l'analyse 'Option signalant que le format de sortie utilisé sera du JSON ou non.Option signalant que le format de sortie sera traduit en langage humain ou affiché en mode brut.Option signalant que les requêtes pourront ou non être transmises en IPv4. --ipv4 autorise l'usage d'IPv4, alors que --no-ipv4 l'interdit.Option signalant que les requêtes pourront ou non être transmises en IPv6. --ipv6 autorise l'usage d'IPv6, alors que --no-ipv6 l'interdit.INFOCette option permet d'afficher la liste de tous les tests disponibles. Ceux-ci ne seront pas exécutés.Niveau Chargement de la configuration depuis le fichier Chargement de la politique de tests depuis le fichier Le résultat semble concluant.MessageModule Il est nécessaire d'indiquer un nom de domaine pour lancer le test. NOTICEOption avec comme argument le nom du fichier à partir duquel seront restaurés les résultats des requêtes DNS nécessaires à l'analyse de la zone.Option avec comme argument le nom du fichier dans lequel seront sauvegardés les résultats des requêtes DNS nécessaires à l'analyse de la zone.Option avec comme argument le nom du fichier de configuration à charger.Option avec comme argument le nom du fichier contenant la politique de tests qui sera appliquée.Nom de l'encodage de caractères utilisé pour les arguments de la ligne de commande.Affichage du nombre total de résultats, pour chaque niveau de gravité, présents dans le journal (log).Affichage du niveau de gravité pour chaque résultat de test.Pour chaque résultat de test, affichage du nom du module qui en est à l'origine.Affichage de l'horodatage (en secondes) pour suivre l'état de l'avancement de l'analyse.Affichage des informations sur les versions de l'outil et des modules de tests.Durée Permet d'indiquer quel test doit être exécuté. Peut être un nom de module seul, ou celui-ci associé à un nom de test, les deux étant séparés par le caractère "/" (Exemple: "Basic/basic1"). Cette option peut être répétée plusieurs fois.Option avec comme argument les informations pour le traitement de la DS. Le format à utiliser est "keytag,algorithm,type,digest".La "locale" à utiliser pour la traduction des messages.Option avec comme argument le niveau de gravité minimum qui sera affiché. Doit avoir pour valeur CRITICAL, ERROR, WARNING, NOTICE, INFO ou DEBUG.WARNINGAttention: Net::LDNS n'est pas compilé avec libidn, impossible de traiter correctement les noms non ASCII.Attention: La "locale" positionnée %s n'est pas correctement prise en compte (Est-elle installée sur votre système ?). Zonemaster-CLI-v1.0.5/share/locale/en/0000755000175000017500000000000013000173045016375 5ustar matsdmatsdZonemaster-CLI-v1.0.5/share/locale/en/LC_MESSAGES/0000755000175000017500000000000013000173045020162 5ustar matsdmatsdZonemaster-CLI-v1.0.5/share/locale/en/LC_MESSAGES/Zonemaster-CLI.mo0000644000175000017500000001365613000170027023263 0ustar matsdmatsd3GLh iX  XKxYYx 3Of2f4 :EaKv  ( < 7O #  > 5 = AU : (  # ; !D ?f + %  U FV zX  "X0KYY/ 3OfCf4 KVrK  (<#7`#>5NAf:( #(L!U?w+% UFg %*1( ,-3'+ 0$ " !#&.)/2 Level Number of log entries%8s %5d entries. --level must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 or DEBUG3. ============== ========= ============ A name/ip string giving a nameserver for undelegated tests. Can be given multiple times.As soon as a message at this level or higher is logged, execution will stopAt the end of a run, print a summary of the times the zone's name servers took to answer.Boolean flag for activity indicator. Defaults to on if STDOUT is a tty, off if it is not.CRITICALDEBUGERRORFailed to recognize stop level 'Flag indicating if output should be in JSON or not.Flag indicating if output should be translated to human language or dumped raw.Flag to permit or deny queries being sent via IPv4. --ipv4 permits IPv4 traffic, --no-ipv4 forbids it.Flag to permit or deny queries being sent via IPv6. --ipv6 permits IPv6 traffic, --no-ipv6 forbids it.INFOInstead of running a test, list all available tests.Level Loading configuration from Loading policy from Local IP address that the test engine should try to send its requests from.Looks OK.MessageModule Must give the name of a domain to test. NOTICEName of a file to restore DNS data from before running test.Name of a file to save DNS data to after running tests.Name of configuration file to load.Name of policy file to load.Name of the character encoding used for command line argumentsPrint a count of the number of messages at each levelPrint level on entries.Print the effective configuration used in JSON format, then exit.Print the effective policy used in JSON format, then exit.Print the name of the module on entries.Print timestamp on entries.Print version information and exit.Seconds Specify test to run. Should be either the name of a module, or the name of a module and the name of a method in that module separated by a "/" character (Example: "Basic/basic1"). The method specified must be one that takes a zone object as its single argument. This switch can be repeatedStrings with DS data on the form "keytag,algorithm,type,digest"The locale to use for messages translation.The minimum severity level to displayWARNINGWarning: Net::LDNS not compiled with libidn, cannot handle non-ASCII names correctly.Warning: setting locale %s failed (is it installed on this system?). Language: en Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Project-Id-Version: 0.0.5 PO-Revision-Date: 2014-08-28 Last-Translator: calle@init.se Language-Team: Zonemaster Team MIME-Version: 1.0 Level Number of log entries%8s %5d entries. --level must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 or DEBUG3. ============== ========= ============ A name/ip string giving a nameserver for undelegated tests. Can be given multiple times.As soon as a message at this level or higher is logged, execution will stopAt the end of a run, print a summary of the times the zone's name servers took to answer.Boolean flag for activity indicator. Defaults to on if STDOUT is a tty, off if it is not.CRITICALDEBUGERRORFailed to recognize stop level 'Flag indicating if output should be in JSON or not.Flag indicating if output should be translated to human language or dumped raw.Flag to permit or deny queries being sent via IPv4. --ipv4 permits IPv4 traffic, --no-ipv4 forbids it.Flag to permit or deny queries being sent via IPv6. --ipv6 permits IPv6 traffic, --no-ipv6 forbids it.INFOInstead of running a test, list all available tests.Level Loading configuration from Loading policy from Local IP address that the test engine should try to send its requests from.Looks OK.MessageModule Must give the name of a domain to test. NOTICEName of a file to restore DNS data from before running test.Name of a file to save DNS data to after running tests.Name of configuration file to load.Name of policy file to load.Name of the character encoding used for command line argumentsPrint a count of the number of messages at each levelPrint level on entries.Print the effective configuration used in JSON format, then exit.Print the effective policy used in JSON format, then exit.Print the name of the module on entries.Print timestamp on entries.Print version information and exit.Seconds Specify test to run. Should be either the name of a module, or the name of a module and the name of a method in that module separated by a "/" character (Example: "Basic/basic1"). The method specified must be one that takes a zone object as its single argument. This switch can be repeatedStrings with DS data on the form "keytag,algorithm,type,digest"The locale to use for messages translation.The minimum severity level to displayWARNINGWarning: Net::LDNS not compiled with libidn, cannot handle non-ASCII names correctly.Warning: setting locale %s failed (is it installed on this system?). Zonemaster-CLI-v1.0.5/script/0000755000175000017500000000000013000173045014736 5ustar matsdmatsdZonemaster-CLI-v1.0.5/script/zonemaster-cli0000755000175000017500000001410013000170027017611 0ustar matsdmatsd#!/usr/bin/env perl use 5.14.2; use warnings; use Zonemaster::CLI; use File::Spec; use autodie; my $homedir = ((getpwuid($<))[7]) || $ENV{HOME}; my $conffile = File::Spec->catfile($homedir, '.zonemaster', 'cli.args'); if (-r $conffile) { open my $fh, '<', $conffile; my @lines = $fh->getlines; chomp(@lines); unshift @ARGV, @lines; } Zonemaster::CLI->new_with_options->run; =head1 NAME zonemaster-cli - run Zonemaster tests from the command line =head1 SYNOPSIS zonemaster-cli nic.se zonemaster-cli --test=delegation --level=debug --no-time afnic.fr zonemaster-cli --list_tests =head1 DESCRIPTION L is a command-line interface to the L test engine. It does nothing itself except take the instructions the user provides as command line arguments, transform them into suitable API calls to the engine, run the requested test and print the resulting messages. The messages will be translated by the engine's translation module, and possibly have a timestamp and a module name prepended when printed. =head1 OPTIONS =over =item -h -? --usage --help Any of these print a rather too long summary of the command line switches, then quits the program. =item --version Prints the versions of this program, the L framework and the loaded test modules. =item --level=LEVEL Specify the minimum level that a message needs to have in order to be printed. That is, messages with this level or higher will be printed. The levels are, in order from highest to lowest, CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 and DEBUG3. The lowest two levels show some of the internal workings of the test engine, and are probably not useful for ordinary users. =item --locale=LOCALE Specifies which locale to tell the translation system to use. If not given, the translation system itself will look at environment variables to try to guess. If the requested translation does not exist, it will fallback to the local locale, and if that doesn't exist either to English. =item --json Print results as JSON instead of human language. =item --json_stream Stream the results as JSON objects, useful to follow the progress in a machine readable way. =item --json_translate For streaming JSON output, include the translated message of the tag. =item --raw, --no-raw Print messages as raw dumps instead of passing them through the translation system. =item --time, --no-time Turn the printing of timestamps on or off (default on). =item --show_level, --no-show_level Turn the printing of the message severity level on or off (default on). =item --show_module, --no-show_module Turn the printing of which module produced a message on or off (default off). =item --ns=NAME[/IP] Provide information about a nameserver, for undelegated tests. The argument must be either a domain name and an IP address (v4 or v6) separated by a single slash character (/), or only a name, in which case a lookup for A and AAAA records for that name will be done in the live global DNS tree and the results of that lookup used. This switch can (and probably should) be given multiple times. As long as any of these switches are present, their aggregate content will be used as the entirety of the parent-side delegation information. =item --save=FILENAME After the entire test has finished running, write the contents of the accumulated packet cache to a file with the given name. =item --restore=FILENAME Before starting the test, prime the packet cache with the contents from the file with the given name. The format of the file should be that produced by the save functions. =item --ipv4, --no-ipv4 Allow or disallow the sending of IPv4 packets (default on). =item --ipv6, --no-ipv6 Allow or disallow the sending of IPv6 packets (default on). =item --list_tests Instead of running a test, list all the tests presented by the testing modules. =item --test=MODULE, --test=MODULE/METHOD Run only the specified tests. You can either give the name of a testing module, in which case that module will be asked to run all its tests, or you can give the name of a module followed by a slash and the name of a method in that module. The specified method will be called with a zone object as its single argument. It's up to the user to make sure that that is the kind of argument the method expects. =item --stop_level=LEVEL As soon as a message of the given level or higher is logged, terminate the testing process. =item --config=FILE Load configuration from the file with the given name. =item --policy=FILE Load policy information from the file with the given name. =item --ds=KEYTAG,ALGORITHM,TYPE,DIGEST Provide a DS record for undelegated testing (that is, a test where the delegating nameserver information is given via --ns switches). The four pieces of data should be in the same format they would have in a zone file. =item --count, --no-count After the test run is finished, turn on or off the printing of a summary with the numbers of messages of the various levels that were logged during the run (default off). =item --progress, --no-progress Turn on or off the printing of a "spinner" showing that something is happening during the test run. The default is to print it if the process' standard output is a TTY, and to not print otherwise. =item --encoding=ENCODING Specify the character encoding that is used for command line arguments. This will be used to convert non-ASCII names to IDNA format, on which the tests will then be run. The default value will be taken from the C environment variable if possible, and set to UTF-8 if not. =back =head1 CONFIGURATION If there is a readable file F<.zonemaster/cli.args> in the user's home directory, each line in that file will be prepended as an argument on the command line. For example, if one would like to by default run with the log level set to DEBUG and with translation to human-readable messages turned off, one could put this in the config file: --raw --level=DEBUG Any arguments actually given on the command line will override what's in the config file. =head1 SEE ALSO L =head1 AUTHOR Calle Dybedahl Zonemaster-CLI-v1.0.5/script/zonemaster-info0000755000175000017500000000653513000170027020012 0ustar matsdmatsd#!/usr/bin/env perl use 5.14.4; use warnings; use Zonemaster; use POSIX qw[strftime]; my %algo = %Zonemaster::Test::DNSSEC::algo_properties; my %digest = ( 1 => 'SHA-1', 2 => 'SHA-256', 3 => 'GOST R 34.11-94', 4 => 'SHA-384', ); my $name = shift @ARGV; if ( not $name ) { say "Need a zone name to work with."; exit; } my $zone = Zonemaster->zone( $name ); say "Zone: " . $zone->name->string; say "Parent zone: " . $zone->parent->name->string; say ""; say "Glue nameserver list: "; foreach my $ns ( @{ $zone->glue } ) { say "\t$ns"; } say ""; say "Authoritative nameserver list: "; foreach my $ns ( @{ $zone->ns } ) { say "\t$ns"; } my $ds_p = $zone->parent->query_one( $zone->name->string, 'DS' ); my @ds = $ds_p->get_records( 'DS' ); say ''; if ( @ds ) { say "Parent has DS record(s) for " . $zone->name->string . "."; foreach my $ds ( @ds ) { printf "\tKey tag: %d\tDigest algorithm: %s\n", $ds->keytag, $digest{ $ds->digtype }; } } else { say "Parent does not have DS records for " . $zone->name->string . "."; } my $dnskey_p = $zone->query_one( $zone->name->string, 'DNSKEY' ); my @dnskey; @dnskey = $dnskey_p->get_records_for_name( 'DNSKEY', $zone->name->string ) if $dnskey_p; say ''; if ( @dnskey ) { say "DNSKEY records:"; foreach my $key ( @dnskey ) { printf "\tTag: %d\tAlgorithm: %s\n", $key->keytag, $algo{ $key->algorithm }{description}; } } else { say "No DNSKEY records returned."; } my $soa_p = $zone->query_auth( $zone->name->string, 'SOA', { dnssec => 1 } ); if ( $soa_p ) { my ( $soa ) = $soa_p->get_records_for_name( 'SOA', $zone->name->string ); my @rrsig = grep { $_->typecovered eq 'SOA' } $soa_p->get_records_for_name( 'RRSIG', $zone->name->string ); say ''; say "SOA record:"; say "\tMNAME: " . $soa->mname; say "\tRNAME: " . $soa->rname; say "\tSerial: " . $soa->serial; say "\tRefresh: " . $soa->refresh; say "\tRetry: " . $soa->retry; say "\tExpire: " . $soa->expire; say "\tMinimum: " . $soa->minimum; if ( @rrsig ) { say "\nSOA record signature(s):"; foreach my $sig ( @rrsig ) { say "\tKeytag: " . $sig->keytag; say "\tAlgorithm: " . $algo{ $sig->algorithm }{description}; say "\tLabels: " . $sig->labels; say "\tSigner: " . $sig->signer; say "\tInception: " . strftime( "%F %T", localtime $sig->inception ); say "\tExpiration: " . strftime( "%F %T", localtime $sig->expiration ); say ''; } } } else { say "No SOA record."; } =head1 NAME zonemaster-info - print some information about a zone's DNS info =head1 SYNOPSIS zonemaster-info example.org =head1 DESCRIPTION For the given domain, it prints the following pieces of information. =over =item * The name of the parent zone. =item * The names and IP addresses of the nameservers listed at the parent side. =item * The names and IP addresses of the nameservers listed at the child side. =item * Information about the domain's DS records, if any. =item * Information about the domain's DNSKEY records, if any. =item * Information about the domain's SOA record. =item * Information about the domain's SOA record's RRSIG records, if any. =back =head1 SEE ALSO L =head1 AUTHOR Calle Dybedahl Zonemaster-CLI-v1.0.5/USING.md0000644000175000017500000001116213000170027014637 0ustar matsdmatsd## Using the CLI ### Invoking the command line tool The most basic use of the `zonemaster-cli` command is to just test a domain like this: $ zonemaster-cli example.com The output comes continously as the tests are performed. Seconds Level Message ======= ========= ======= 1.16 NOTICE No illegal characters in the domain name (example.com). 2.01 WARNING SOA 'refresh' value (10800) is less than the recommended one (14400). 13.86 CRITICAL All nameservers are in the same AS (12345). 13.87 NOTICE 123.456.789.0 returned no DS records for example.com. If your machine is for some reason not configured for use with IPv6 you want to disable the use of IPv6 with the `--no-ipv6` option. If you want to see how your domain is configured to be used with no IPv4 available for the client there is also the `--no-ipv4` option - however, both cannot be used at the same time. To see all command line options, use the `--help` command. $ zonemaster-cli --help ### Test reports The different message levels are CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 and DEBUG3. The default reporting level is NOTICE and higher. To change the level of reporting you can use the command line switch --level=LEVEL. The DEBUG levels are mainly used by developers, and are useful to debug the different test cases. The default level reporting is in plain english, but other output formats are also available. The `--lang=raw` option will give you the technical language output; instead of english the messages will be displayed as a combination of test level and test case message for easy mapping into each test case executed by Zonemaster. This means that the output is not dependent on any language changes, and better suited for automatic parsing of the output. For even better automatic parsing of the output, the option to have the output reported in JSON might can be used. Use `--lang=json` to have the output in JSON format. The JSON format is described in the [JSON Output](json-output.md) document. More detailed documentation can by found in the [manual page](zonemaster-cli.md) ### Advanced use There are some nice features available that can be of some use for advanced users. **Save and restore** You can record all data from a test session using the `--save filename` option to record all DNS data. This can later be replayed for Zonemaster using `--restore filename`, and this will make Zonemaster to use the saved DNS traffic for testing rather than using the live DNS tree. You can use this if you change your policy (see Policy configuration below) and see how this change will affect any previous tests, or if you find a strange error in a DNS configuration that is hard to duplicate - then this saved file can be sent to a developer that can take a closer look into the issue. **Only run specific test** If you only want to run a specific test rather than the whole suite of tests, you can do that as well. If you want to see if the name servers for a domain are in enough different ASNs, you can run this test case: $ zonemaster-cli --test Connectivity/connectivity03 example.com For more information on the available tests, you can list them right from the command line tool: $ zonemaster-cli --list_tests **Halt early** If you want to check a domain for some problem, but do not wish to wait until all tests are finished you can have Zonemaster exit when the first error of a certain severity level has been reached: $ zonemaster-cli --stop_level NOTICE example.com This will halt execution as soon as a NOTICE or higher message is received. ### Pre-delegation Testing Before you do any delegation change at the level of the parent, either changing the NS records, glue address records or DS records, you might want to perform a check of your new child zone configuration so that everything you plan to change is in order. Zonemaster can do this for your, all you have to do is give Zonemaster all the parent data you plan to have for your new configuration. Any DNS lookups going for the parent will instead be answered by the data you entered. $ zonemaster-cli --ns ns1.example.com/192.168.23.23 \ --ns ns2.example.com/192.168.24.24 \ --ds 12345,3,1,123456789abcdef67890123456789abcdef67890 Any number of NS records and DS records can be given multiple times. The syntax of the NS records is name/address, and the address can be both IPv4 and IPv6. The DS syntax is keytag,algorithm,type,digest. You can also choose to do a Pre-delegation test using only the new DS record, but keep the NS records from the parent by only specifying the DS record and no NS records on the command line. Zonemaster-CLI-v1.0.5/docs/0000755000175000017500000000000013000173045014362 5ustar matsdmatsdZonemaster-CLI-v1.0.5/docs/installation.md0000644000175000017500000000362713000170027017412 0ustar matsdmatsd# Zonemaster CLI installation guide This is the installation instructions for the Zonemaster CLI utility. The documentation covers the following operating systems: * [1] Ubuntu 12.04 (LTS) * [2] Ubuntu 14.04 (LTS) * [3] Debian Wheezy (version 7) * [4] FreeBSD 10.1 * [5] CentOS 7 ## Prerequisite Before you install the Zonemaster CLI utility, you need the Zonemaster Engine test framework installed. Please see the [Zonemaster Engine installation instructions](https://github.com/dotse/zonemaster-engine/blob/master/docs/installation.md). ###  Instructions for Ubuntu 12.04, Ubuntu 14.04 and Debian 7 1) Install necessary packages. `sudo apt-get install libmoosex-getopt-perl libtext-reflow-perl libmodule-install-perl` 2) Install non-packaged software `sudo cpan -i Zonemaster::CLI` 3) Now you are ready to run the zonemaster-cli command: `zonemaster-cli example.com` ## Instructions for FreeBSD 10.1 1) First install the Zonemaster Engine, following the instructions above. 2) Still as root, install necessary packages. `pkg install p5-MooseX-Getopt p5-Text-Reflow p5-Module-Install` 3) Still as root, install non-packaged software. `cpan -i Zonemaster::CLI` 4) The CLI tool is now installed and can be run by any user. $ zonemaster-cli example.com ## Instructions for CentOS 7 First install the Zonemaster Engine, following the instructions above. 1) Install the CPAN packages. `sudo cpan -i Zonemaster::CLI` ------- Copyright (c) 2013, 2014, 2015, IIS (The Internet Infrastructure Foundation) Copyright (c) 2013, 2014, 2015, AFNIC Creative Commons Attribution 4.0 International License You should have received a copy of the license along with this work. If not, see . Zonemaster-CLI-v1.0.5/MANIFEST.SKIP0000644000175000017500000000016013000170027015322 0ustar matsdmatsd.git .gitignore .perltidyrc .perlcriticrc .travis.yml MYMETA.json MYMETA.yml ^Makefile$ ^blib .tar.gz$ .bak$ ~$ Zonemaster-CLI-v1.0.5/META.yml0000644000175000017500000000154113000173023014700 0ustar matsdmatsd--- abstract: 'run Zonemaster tests from the command line' author: - 'Calle Dybedahl ' build_requires: ExtUtils::MakeMaker: 6.59 Test::More: 0 configure_requires: ExtUtils::MakeMaker: 6.59 Module::Install: 0 distribution_type: module dynamic_config: 1 generated_by: 'Module::Install version 1.06' license: bsd meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: Zonemaster-CLI no_index: directory: - inc - share - t requires: Getopt::Long::Descriptive: 0 JSON::XS: 0 Locale::TextDomain: 0 MooseX::Getopt: 0 Net::LDNS: 0.65 Text::Reflow: 0 Zonemaster: 0 perl: 5.14.2 resources: bugtracker: https://github.com/dotse/zonemaster-cli/issues license: http://www.opensource.org/licenses/BSD-3-Clause repository: https://github.com/dotse/zonemaster-cli version: v1.0.5 Zonemaster-CLI-v1.0.5/Makefile.PL0000644000175000017500000000214413000170027015402 0ustar matsdmatsduse 5.014002; use strict; use warnings FATAL => 'all'; use inc::Module::Install; use ExtUtils::MakeMaker (); name 'Zonemaster-CLI'; author q{Calle Dybedahl }; license 'bsd'; all_from 'lib/Zonemaster/CLI.pm'; perl_version 5.014002; tests_recursive( 't' ); resources( license => 'http://www.opensource.org/licenses/BSD-3-Clause', repository => 'https://github.com/dotse/zonemaster-cli', bugtracker => 'https://github.com/dotse/zonemaster-cli/issues', ); configure_requires( 'Module::Install' => 0, ); build_requires( 'Test::More' => 0, ); # Dirty hack to avoid complaints about unparsable version number from # old versions of ExtUtils::MakeMaker. if ( eval { ExtUtils::MakeMaker->VERSION(6.68) } ) { requires 'Zonemaster' => 'v1.0.4'; } else { requires 'Zonemaster' => 0; } requires( 'MooseX::Getopt' => 0, 'Getopt::Long::Descriptive' => 0, 'Net::LDNS' => 0.65, 'Locale::TextDomain' => 0, 'Text::Reflow' => 0, 'JSON::XS' => 0, ); install_script 'zonemaster-cli'; install_share; WriteAll; Zonemaster-CLI-v1.0.5/lib/0000755000175000017500000000000013000173045014200 5ustar matsdmatsdZonemaster-CLI-v1.0.5/lib/Zonemaster/0000755000175000017500000000000013000173045016327 5ustar matsdmatsdZonemaster-CLI-v1.0.5/lib/Zonemaster/CLI.pm0000755000175000017500000004313713000172777017322 0ustar matsdmatsd# Brief help module to define the exception we use for early exits. package Zonemaster::Exception::NormalExit; use Moose; extends 'Zonemaster::Exception'; # The actual interesting module. package Zonemaster::CLI v1.0.5; use 5.014002; use warnings; use Locale::TextDomain 'Zonemaster-CLI'; use Moose; with 'MooseX::Getopt'; use Zonemaster; use Zonemaster::Logger::Entry; use Zonemaster::Translator; use Zonemaster::Util qw[pod_extract_for]; use Zonemaster::Exception; use Scalar::Util qw[blessed]; use Encode; use Net::LDNS; use POSIX qw[setlocale LC_MESSAGES]; use List::Util qw[max]; use Text::Reflow qw[reflow_string]; use JSON::XS; our %numeric = Zonemaster::Logger::Entry->levels; our $JSON = JSON::XS->new->allow_blessed->convert_blessed->canonical; STDOUT->autoflush( 1 ); has 'version' => ( is => 'ro', isa => 'Bool', default => 0, required => 0, documentation => __( 'Print version information and exit.' ), ); has 'level' => ( is => 'ro', isa => 'Str', required => 0, default => 'NOTICE', documentation => __( 'The minimum severity level to display. Must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO or DEBUG.' ), ); has 'locale' => ( is => 'ro', isa => 'Str', required => 0, documentation => __( 'The locale to use for messages translation.' ), ); has 'json' => ( is => 'ro', isa => 'Bool', default => 0, documentation => __( 'Flag indicating if output should be in JSON or not.' ), ); has 'json_stream' => ( is => 'ro', isa => 'Bool', default => 0, documentation => __( 'Flag indicating if output should be streaming JSON or not.' ), ); has 'json_translate' => ( is => 'ro', isa => 'Bool', default => 0, documentation => __( 'Flag indicating if streaming JSON output should include the translated message of the tag or not.' ), ); has 'raw' => ( is => 'ro', isa => 'Bool', default => 0, documentation => __( 'Flag indicating if output should be translated to human language or dumped raw.' ), ); has 'time' => ( is => 'ro', isa => 'Bool', documentation => __( 'Print timestamp on entries.' ), default => 1, ); has 'show_level' => ( is => 'ro', isa => 'Bool', documentation => __( 'Print level on entries.' ), default => 1, ); has 'show_module' => ( is => 'ro', isa => 'Bool', documentation => __( 'Print the name of the module on entries.' ), default => 0, ); has 'ns' => ( is => 'ro', isa => 'ArrayRef', documentation => __( 'A name/ip string giving a nameserver for undelegated tests, or just a name which will be looked up for IP addresses. Can be given multiple times.' ), ); has 'save' => ( is => 'ro', isa => 'Str', required => 0, documentation => __( 'Name of a file to save DNS data to after running tests.' ), ); has 'restore' => ( is => 'ro', isa => 'Str', required => 0, documentation => __( 'Name of a file to restore DNS data from before running test.' ), ); has 'ipv4' => ( is => 'ro', isa => 'Bool', default => 1, documentation => __( 'Flag to permit or deny queries being sent via IPv4. --ipv4 permits IPv4 traffic, --no-ipv4 forbids it.' ), ); has 'ipv6' => ( is => 'ro', isa => 'Bool', default => 1, documentation => __( 'Flag to permit or deny queries being sent via IPv6. --ipv6 permits IPv6 traffic, --no-ipv6 forbids it.' ), ); has 'list_tests' => ( is => 'ro', isa => 'Bool', default => 0, documentation => __( 'Instead of running a test, list all available tests.' ), ); has 'test' => ( is => 'ro', isa => 'ArrayRef', required => 0, documentation => __( 'Specify test to run. Should be either the name of a module, or the name of a module and the name of a method in that module separated by a "/" character (Example: "Basic/basic1"). The method specified must be one that takes a zone object as its single argument. This switch can be repeated.' ) ); has 'stop_level' => ( is => 'ro', isa => 'Str', required => 0, documentation => __( 'As soon as a message at this level or higher is logged, execution will stop. Must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO or DEBUG.' ) ); has 'config' => ( is => 'ro', isa => 'Str', required => 0, documentation => __( 'Name of configuration file to load.' ), ); has 'policy' => ( is => 'ro', isa => 'Str', required => 0, documentation => __( 'Name of policy file to load.' ), ); has 'ds' => ( is => 'ro', isa => 'ArrayRef[Str]', required => 0, documentation => __( 'Strings with DS data on the form "keytag,algorithm,type,digest"' ), ); has 'count' => ( is => 'ro', isa => 'Bool', required => 0, documentation => __( 'Print a count of the number of messages at each level' ), ); has 'progress' => ( is => 'ro', isa => 'Bool', default => !!( -t STDOUT ), documentation => __( 'Boolean flag for activity indicator. Defaults to on if STDOUT is a tty, off if it is not.' ), ); has 'encoding' => ( is => 'ro', isa => 'Str', default => sub { my $locale = $ENV{LC_CTYPE} // 'C'; my ( $e ) = $locale =~ m|\.(.*)$|; $e //= 'UTF-8'; return $e; }, documentation => __( 'Name of the character encoding used for command line arguments' ), ); has 'nstimes' => ( is => 'ro', isa => 'Bool', required => 0, default => 0, documentation => __('At the end of a run, print a summary of the times the zone\'s name servers took to answer.'), ); has 'dump_config' => ( is => 'ro', isa => 'Bool', required => 0, default => 0, documentation => __( 'Print the effective configuration used in JSON format, then exit.' ), ); has 'dump_policy' => ( is => 'ro', isa => 'Bool', required => 0, default => 0, documentation => __( 'Print the effective policy used in JSON format, then exit.' ), ); has 'sourceaddr' => ( is => 'ro', isa => 'Maybe[Str]', required => 0, default => undef, documentation => __( 'Local IP address that the test engine should try to send its requests from.' ), ); has 'elapsed' => ( is => 'ro', isa => 'Bool', required => 0, default => 0, documentation => 'Print elapsed time at end of run.', ); sub run { my ( $self ) = @_; my @accumulator; my %counter; my $printed_something; if ( $self->locale ) { my $loc = setlocale( LC_MESSAGES, $self->locale ); if ( not defined $loc ) { printf STDERR __( "Warning: setting locale %s failed (is it installed on this system?).\n\n" ), $self->locale; } } if ( $self->version ) { print_versions(); exit; } if ( $self->list_tests ) { print_test_list(); } Zonemaster->config->ipv4_ok(0+$self->ipv4); Zonemaster->config->ipv6_ok(0+$self->ipv6); if ($self->sourceaddr) { Zonemaster->config->resolver_source($self->sourceaddr); } if ( $self->policy ) { say __( "Loading policy from " ) . $self->policy . '.' if not ($self->dump_config or $self->dump_policy); Zonemaster->config->load_policy_file( $self->policy ); } if ( $self->config ) { say __( "Loading configuration from " ) . $self->config . '.' if not ($self->dump_config or $self->dump_policy); Zonemaster->config->load_config_file( $self->config ); } if ( $self->dump_config ) { do_dump_config(); } if ( $self->dump_policy ) { foreach my $mod (Zonemaster->modules) { Zonemaster->config->load_module_policy($mod) } do_dump_policy(); } if ( $self->stop_level and not defined( $numeric{ $self->stop_level } ) ) { die __( "Failed to recognize stop level '" ) . $self->stop_level . "'.\n"; } if ( not defined $numeric{ $self->level } ) { die __( "--level must be one of CRITICAL, ERROR, WARNING, NOTICE, INFO, DEBUG, DEBUG2 or DEBUG3.\n" ); } my $translator; $translator = Zonemaster::Translator->new unless ( $self->raw or $self->json or $self->json_stream ); $translator->locale( $self->locale ) if $translator and $self->locale; eval { $translator->data } if $translator; # Provoke lazy loading of translation data my $json_translator; if ( $self->json_translate ) { $json_translator = Zonemaster::Translator->new; $json_translator->locale( $self->locale ) if $self->locale; eval { $json_translator->data }; } if ( $self->restore ) { Zonemaster->preload_cache( $self->restore ); } # Callback defined here so it closes over the setup above. Zonemaster->logger->callback( sub { my ( $entry ) = @_; $self->print_spinner() unless $self->json_stream; $counter{ uc $entry->level } += 1; if ( $numeric{ uc $entry->level } >= $numeric{ uc $self->level } ) { $printed_something = 1; if ( $translator ) { if ( $self->time ) { printf "%7.2f ", $entry->timestamp; } if ( $self->show_level ) { printf "%-9s ", __( $entry->level ); } if ( $self->show_module ) { printf "%-12s ", $entry->module; } say $translator->translate_tag( $entry ); } elsif ( $self->json_stream ) { my %r; $r{timestamp} = $entry->timestamp; $r{module} = $entry->module; $r{tag} = $entry->tag; $r{level} = $entry->level; $r{args} = $entry->args if $entry->args; $r{message} = $json_translator->translate_tag( $entry ) if $json_translator; say $JSON->encode( \%r ); } elsif ( $self->json ) { # Don't do anything } elsif ( $self->show_module ) { printf "%7.2f %-9s %-12s %s\n", $entry->timestamp, $entry->level, $entry->module, $entry->string; } else { printf "%7.2f %-9s %s\n", $entry->timestamp, $entry->level, $entry->string; } } ## end if ( $numeric{ uc $entry...}) if ( $self->stop_level and $numeric{ uc $entry->level } >= $numeric{ uc $self->stop_level } ) { die( Zonemaster::Exception::NormalExit->new( { message => "Saw message at level " . $entry->level } ) ); } } ); if ( $self->config or $self->policy ) { print "\n"; # Cosmetic } my ( $domain ) = @{ $self->extra_argv }; if ( not $domain ) { die __( "Must give the name of a domain to test.\n" ); } if ( $translator ) { if ( $self->time ) { print __( 'Seconds ' ); } if ( $self->show_level ) { print __( 'Level ' ); } if ( $self->show_module ) { print __( 'Module ' ); } say __( 'Message' ); if ( $self->time ) { print __( '======= ' ); } if ( $self->show_level ) { print __( '========= ' ); } if ( $self->show_module ) { print __( '============ ' ); } say __( '=======' ); } ## end if ( $translator ) $domain = $self->to_idn( $domain ); if ( $self->ns and @{ $self->ns } > 0 ) { $self->add_fake_delegation( $domain ); } if ( $self->ds and @{ $self->ds } ) { $self->add_fake_ds( $domain ); } # Actually run tests! eval { if ( $self->test and @{ $self->test } > 0 ) { foreach my $t ( @{ $self->test } ) { my ( $module, $method ) = split( '/', $t, 2 ); if ( $method ) { Zonemaster->test_method( $module, $method, Zonemaster->zone( $domain ) ); } else { Zonemaster->test_module( $module, $domain ); } } } else { Zonemaster->test_zone( $domain ); } }; if ( $translator ) { if ( not $printed_something ) { say __( "Looks OK." ); } } if ( $@ ) { my $err = $@; if ( blessed $err and $err->isa( "Zonemaster::Exception::NormalExit" ) ) { say STDERR "Exited early: " . $err->message; } else { die $err; # Don't know what it is, rethrow } } if ( $self->count ) { say __( "\n\n Level\tNumber of log entries" ); say " =====\t====================="; foreach my $level ( sort { $numeric{$b} <=> $numeric{$a} } keys %counter ) { printf __( "%8s\t%5d entries.\n" ), __( $level ), $counter{$level}; } } if ( $self->nstimes ) { my $zone = Zonemaster->zone( $domain ); my $max = max map { length( "$_" ) } @{ $zone->ns }; print "\n"; printf "%${max}s %s\n", 'Server', ' Max (ms) Min Avg Stddev Median Total'; printf "%${max}s %s\n", '=' x $max, ' ======== ======== ======== ======== ======== ========='; foreach my $ns ( @{ $zone->ns } ) { printf "%${max}s ", $ns->string; printf "%9.2f ", 1000 * $ns->max_time; printf "%8.2f ", 1000 * $ns->min_time; printf "%8.2f ", 1000 * $ns->average_time; printf "%8.2f ", 1000 * $ns->stddev_time; printf "%8.2f ", 1000 * $ns->median_time; printf "%9.2f\n", 1000 * $ns->sum_time; } } if ($self->elapsed) { my $last = Zonemaster->logger->entries->[-1]; printf "Total test run time: %0.1f seconds.\n", $last->timestamp; } if ( $self->json ) { say Zonemaster->logger->json( $self->level ); } if ( $self->save ) { Zonemaster->save_cache( $self->save ); } return; } ## end sub run sub add_fake_delegation { my ( $self, $domain ) = @_; my %data; foreach my $pair ( @{ $self->ns } ) { my ( $name, $ip ) = split( '/', $pair, 2 ); if ( not $name ) { say STDERR "--ns must have be a name or a name/ip pair."; exit( 1 ); } if ($ip) { push @{ $data{ $self->to_idn( $name ) } }, $ip; } else { my $n = $self->to_idn( $name ); my @ips = Net::LDNS->new->name2addr($n); push @{ $data{$n} }, $_ for @ips; } } Zonemaster->add_fake_delegation( $domain => \%data ); return; } sub add_fake_ds { my ( $self, $domain ) = @_; my @data; foreach my $str ( @{ $self->ds } ) { my ( $tag, $algo, $type, $digest ) = split( /,/, $str ); push @data, { keytag => $tag, algorithm => $algo, type => $type, digest => $digest }; } Zonemaster->add_fake_ds( $domain => \@data ); return; } sub print_versions { say 'CLI version: ' . __PACKAGE__->VERSION; say 'Engine version: ' . $Zonemaster::VERSION; say "\nTest module versions:"; my %methods = Zonemaster->all_methods; foreach my $module ( sort keys %methods ) { my $mod = "Zonemaster::Test::$module"; say "\t$module: " . $mod->version; } return; } my @spinner_strings = ( ' | ', ' / ', ' - ', ' \\ ' ); sub print_spinner { my ( $self ) = @_; state $counter = 0; printf "%s\r", $spinner_strings[ $counter++ % 4 ] if $self->progress; return; } sub to_idn { my ( $self, $str ) = @_; if ( $str =~ m/^[[:ascii:]]+$/ ) { return $str; } if ( Net::LDNS::has_idn() ) { return Net::LDNS::to_idn( decode( $self->encoding, $str ) ); } else { say STDERR __( "Warning: Net::LDNS not compiled with libidn, cannot handle non-ASCII names correctly." ); return $str; } } sub print_test_list { my %methods = Zonemaster->all_methods; my $maxlen = max map { map { length( $_ ) } @$_ } values %methods; foreach my $module ( sort keys %methods ) { say $module; my $doc = pod_extract_for( $module ); foreach my $method ( sort @{ $methods{$module} } ) { printf " %${maxlen}s ", $method; if ( $doc and $doc->{$method} ) { print reflow_string( $doc->{$method}, optimum => 65, maximum => 75, indent1 => ' ', indent2 => ( ' ' x ( $maxlen + 6 ) ) ); } print "\n"; } print "\n"; } exit( 0 ); } ## end sub print_test_list sub do_dump_policy { my $json = JSON::XS->new->canonical->pretty; print $json->encode(Zonemaster->config->policy); exit; } sub do_dump_config { my $json = JSON::XS->new->canonical->pretty; print $json->encode(Zonemaster->config->get); exit; } 1; __END__ =pod =encoding UTF-8 =head1 NAME Zonemaster::CLI - run Zonemaster tests from the command line Zonemaster-CLI-v1.0.5/MANIFEST0000644000175000017500000000126113000173037014564 0ustar matsdmatsdChanges docs/installation.md inc/Module/Install.pm inc/Module/Install/Base.pm inc/Module/Install/Can.pm inc/Module/Install/Fetch.pm inc/Module/Install/Makefile.pm inc/Module/Install/Metadata.pm inc/Module/Install/Scripts.pm inc/Module/Install/Share.pm inc/Module/Install/Win32.pm inc/Module/Install/WriteAll.pm lib/Zonemaster/CLI.pm LICENSE Makefile.PL MANIFEST This list of files MANIFEST.SKIP META.yml pm_to_blib README README.md script/zonemaster-cli script/zonemaster-info share/en.po share/fr.po share/locale/en/LC_MESSAGES/Zonemaster-CLI.mo share/locale/fr/LC_MESSAGES/Zonemaster-CLI.mo share/locale/sv/LC_MESSAGES/Zonemaster-CLI.mo share/Makefile share/sv.po t/00-load.t USING.md Zonemaster-CLI-v1.0.5/LICENSE0000644000175000017500000000251013000170027014432 0ustar matsdmatsdCopyright (c) 2013, IIS (The Internet Infrastructure Foundation) Copyright (c) 2013, AFNIC All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.Zonemaster-CLI-v1.0.5/Changes0000644000175000017500000000165013000172777014742 0ustar matsdmatsdRelease history for Perl module Zonemaster::CLI 1.0.5 2016-10-14 - Correcting version in CLI.pm. Update missing in 1.0.4. 1.0.4 2016-10-14 - Updating README.md and USING.md - Better way to check ExtUtils::MakeMaker version - Introduced MANIFEST.SKIP 1.0.3 2015-12-22 - Added JSON streaming - Changed all instances from .SE to IIS 1.0.2 2015-06-25 - Allow lookup of nameservers for undelegated tests - Net::LDNS::to_idn() takes Perl characters, not octets with utf-8 data - Fixed display bug when using --nstimes with --no-ipv6 or --no-ipv4 1.0.1 2015-04-07 - State clearly that a given name is not a domain when it is not a domain - Send "Net::LDNS not compiled with libidn" to STDERR, not STDOUT 1.0.0 2014-12-11 Release version 1.000000 2014-12-11 Public beta release. 0.001002 2014-11-26 0.001001 2014-11-19 0.001000 2014-11-17 0.03 2014-10-30 0.01 2014-05-25 - initial CPAN release Zonemaster-CLI-v1.0.5/inc/0000755000175000017500000000000013000173045014203 5ustar matsdmatsdZonemaster-CLI-v1.0.5/inc/Module/0000755000175000017500000000000013000173045015430 5ustar matsdmatsdZonemaster-CLI-v1.0.5/inc/Module/Install/0000755000175000017500000000000013000173045017036 5ustar matsdmatsdZonemaster-CLI-v1.0.5/inc/Module/Install/Can.pm0000644000175000017500000000615713000173022020101 0ustar matsdmatsd#line 1 package Module::Install::Can; use strict; use Config (); use ExtUtils::MakeMaker (); use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # check if we can load some module ### Upgrade this to not have to load the module if possible sub can_use { my ($self, $mod, $ver) = @_; $mod =~ s{::|\\}{/}g; $mod .= '.pm' unless $mod =~ /\.pm$/i; my $pkg = $mod; $pkg =~ s{/}{::}g; $pkg =~ s{\.pm$}{}i; local $@; eval { require $mod; $pkg->VERSION($ver || 0); 1 }; } # Check if we can run some command sub can_run { my ($self, $cmd) = @_; my $_cmd = $cmd; return $_cmd if (-x $_cmd or $_cmd = MM->maybe_command($_cmd)); for my $dir ((split /$Config::Config{path_sep}/, $ENV{PATH}), '.') { next if $dir eq ''; require File::Spec; my $abs = File::Spec->catfile($dir, $cmd); return $abs if (-x $abs or $abs = MM->maybe_command($abs)); } return; } # Can our C compiler environment build XS files sub can_xs { my $self = shift; # Ensure we have the CBuilder module $self->configure_requires( 'ExtUtils::CBuilder' => 0.27 ); # Do we have the configure_requires checker? local $@; eval "require ExtUtils::CBuilder;"; if ( $@ ) { # They don't obey configure_requires, so it is # someone old and delicate. Try to avoid hurting # them by falling back to an older simpler test. return $self->can_cc(); } # Do we have a working C compiler my $builder = ExtUtils::CBuilder->new( quiet => 1, ); unless ( $builder->have_compiler ) { # No working C compiler return 0; } # Write a C file representative of what XS becomes require File::Temp; my ( $FH, $tmpfile ) = File::Temp::tempfile( "compilexs-XXXXX", SUFFIX => '.c', ); binmode $FH; print $FH <<'END_C'; #include "EXTERN.h" #include "perl.h" #include "XSUB.h" int main(int argc, char **argv) { return 0; } int boot_sanexs() { return 1; } END_C close $FH; # Can the C compiler access the same headers XS does my @libs = (); my $object = undef; eval { local $^W = 0; $object = $builder->compile( source => $tmpfile, ); @libs = $builder->link( objects => $object, module_name => 'sanexs', ); }; my $result = $@ ? 0 : 1; # Clean up all the build files foreach ( $tmpfile, $object, @libs ) { next unless defined $_; 1 while unlink; } return $result; } # Can we locate a (the) C compiler sub can_cc { my $self = shift; my @chunks = split(/ /, $Config::Config{cc}) or return; # $Config{cc} may contain args; try to find out the program part while (@chunks) { return $self->can_run("@chunks") || (pop(@chunks), next); } return; } # Fix Cygwin bug on maybe_command(); if ( $^O eq 'cygwin' ) { require ExtUtils::MM_Cygwin; require ExtUtils::MM_Win32; if ( ! defined(&ExtUtils::MM_Cygwin::maybe_command) ) { *ExtUtils::MM_Cygwin::maybe_command = sub { my ($self, $file) = @_; if ($file =~ m{^/cygdrive/}i and ExtUtils::MM_Win32->can('maybe_command')) { ExtUtils::MM_Win32->maybe_command($file); } else { ExtUtils::MM_Unix->maybe_command($file); } } } } 1; __END__ #line 236 Zonemaster-CLI-v1.0.5/inc/Module/Install/Metadata.pm0000644000175000017500000004327713000173022021124 0ustar matsdmatsd#line 1 package Module::Install::Metadata; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } my @boolean_keys = qw{ sign }; my @scalar_keys = qw{ name module_name abstract version distribution_type tests installdirs }; my @tuple_keys = qw{ configure_requires build_requires requires recommends bundles resources }; my @resource_keys = qw{ homepage bugtracker repository }; my @array_keys = qw{ keywords author }; *authors = \&author; sub Meta { shift } sub Meta_BooleanKeys { @boolean_keys } sub Meta_ScalarKeys { @scalar_keys } sub Meta_TupleKeys { @tuple_keys } sub Meta_ResourceKeys { @resource_keys } sub Meta_ArrayKeys { @array_keys } foreach my $key ( @boolean_keys ) { *$key = sub { my $self = shift; if ( defined wantarray and not @_ ) { return $self->{values}->{$key}; } $self->{values}->{$key} = ( @_ ? $_[0] : 1 ); return $self; }; } foreach my $key ( @scalar_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} = shift; return $self; }; } foreach my $key ( @array_keys ) { *$key = sub { my $self = shift; return $self->{values}->{$key} if defined wantarray and !@_; $self->{values}->{$key} ||= []; push @{$self->{values}->{$key}}, @_; return $self; }; } foreach my $key ( @resource_keys ) { *$key = sub { my $self = shift; unless ( @_ ) { return () unless $self->{values}->{resources}; return map { $_->[1] } grep { $_->[0] eq $key } @{ $self->{values}->{resources} }; } return $self->{values}->{resources}->{$key} unless @_; my $uri = shift or die( "Did not provide a value to $key()" ); $self->resources( $key => $uri ); return 1; }; } foreach my $key ( grep { $_ ne "resources" } @tuple_keys) { *$key = sub { my $self = shift; return $self->{values}->{$key} unless @_; my @added; while ( @_ ) { my $module = shift or last; my $version = shift || 0; push @added, [ $module, $version ]; } push @{ $self->{values}->{$key} }, @added; return map {@$_} @added; }; } # Resource handling my %lc_resource = map { $_ => 1 } qw{ homepage license bugtracker repository }; sub resources { my $self = shift; while ( @_ ) { my $name = shift or last; my $value = shift or next; if ( $name eq lc $name and ! $lc_resource{$name} ) { die("Unsupported reserved lowercase resource '$name'"); } $self->{values}->{resources} ||= []; push @{ $self->{values}->{resources} }, [ $name, $value ]; } $self->{values}->{resources}; } # Aliases for build_requires that will have alternative # meanings in some future version of META.yml. sub test_requires { shift->build_requires(@_) } sub install_requires { shift->build_requires(@_) } # Aliases for installdirs options sub install_as_core { $_[0]->installdirs('perl') } sub install_as_cpan { $_[0]->installdirs('site') } sub install_as_site { $_[0]->installdirs('site') } sub install_as_vendor { $_[0]->installdirs('vendor') } sub dynamic_config { my $self = shift; my $value = @_ ? shift : 1; if ( $self->{values}->{dynamic_config} ) { # Once dynamic we never change to static, for safety return 0; } $self->{values}->{dynamic_config} = $value ? 1 : 0; return 1; } # Convenience command sub static_config { shift->dynamic_config(0); } sub perl_version { my $self = shift; return $self->{values}->{perl_version} unless @_; my $version = shift or die( "Did not provide a value to perl_version()" ); # Normalize the version $version = $self->_perl_version($version); # We don't support the really old versions unless ( $version >= 5.005 ) { die "Module::Install only supports 5.005 or newer (use ExtUtils::MakeMaker)\n"; } $self->{values}->{perl_version} = $version; } sub all_from { my ( $self, $file ) = @_; unless ( defined($file) ) { my $name = $self->name or die( "all_from called with no args without setting name() first" ); $file = join('/', 'lib', split(/-/, $name)) . '.pm'; $file =~ s{.*/}{} unless -e $file; unless ( -e $file ) { die("all_from cannot find $file from $name"); } } unless ( -f $file ) { die("The path '$file' does not exist, or is not a file"); } $self->{values}{all_from} = $file; # Some methods pull from POD instead of code. # If there is a matching .pod, use that instead my $pod = $file; $pod =~ s/\.pm$/.pod/i; $pod = $file unless -e $pod; # Pull the different values $self->name_from($file) unless $self->name; $self->version_from($file) unless $self->version; $self->perl_version_from($file) unless $self->perl_version; $self->author_from($pod) unless @{$self->author || []}; $self->license_from($pod) unless $self->license; $self->abstract_from($pod) unless $self->abstract; return 1; } sub provides { my $self = shift; my $provides = ( $self->{values}->{provides} ||= {} ); %$provides = (%$provides, @_) if @_; return $provides; } sub auto_provides { my $self = shift; return $self unless $self->is_admin; unless (-e 'MANIFEST') { warn "Cannot deduce auto_provides without a MANIFEST, skipping\n"; return $self; } # Avoid spurious warnings as we are not checking manifest here. local $SIG{__WARN__} = sub {1}; require ExtUtils::Manifest; local *ExtUtils::Manifest::manicheck = sub { return }; require Module::Build; my $build = Module::Build->new( dist_name => $self->name, dist_version => $self->version, license => $self->license, ); $self->provides( %{ $build->find_dist_packages || {} } ); } sub feature { my $self = shift; my $name = shift; my $features = ( $self->{values}->{features} ||= [] ); my $mods; if ( @_ == 1 and ref( $_[0] ) ) { # The user used ->feature like ->features by passing in the second # argument as a reference. Accomodate for that. $mods = $_[0]; } else { $mods = \@_; } my $count = 0; push @$features, ( $name => [ map { ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_ } @$mods ] ); return @$features; } sub features { my $self = shift; while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) { $self->feature( $name, @$mods ); } return $self->{values}->{features} ? @{ $self->{values}->{features} } : (); } sub no_index { my $self = shift; my $type = shift; push @{ $self->{values}->{no_index}->{$type} }, @_ if $type; return $self->{values}->{no_index}; } sub read { my $self = shift; $self->include_deps( 'YAML::Tiny', 0 ); require YAML::Tiny; my $data = YAML::Tiny::LoadFile('META.yml'); # Call methods explicitly in case user has already set some values. while ( my ( $key, $value ) = each %$data ) { next unless $self->can($key); if ( ref $value eq 'HASH' ) { while ( my ( $module, $version ) = each %$value ) { $self->can($key)->($self, $module => $version ); } } else { $self->can($key)->($self, $value); } } return $self; } sub write { my $self = shift; return $self unless $self->is_admin; $self->admin->write_meta; return $self; } sub version_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->version( ExtUtils::MM_Unix->parse_version($file) ); # for version integrity check $self->makemaker_args( VERSION_FROM => $file ); } sub abstract_from { require ExtUtils::MM_Unix; my ( $self, $file ) = @_; $self->abstract( bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix' )->parse_abstract($file) ); } # Add both distribution and module name sub name_from { my ($self, $file) = @_; if ( Module::Install::_read($file) =~ m/ ^ \s* package \s* ([\w:]+) \s* ; /ixms ) { my ($name, $module_name) = ($1, $1); $name =~ s{::}{-}g; $self->name($name); unless ( $self->module_name ) { $self->module_name($module_name); } } else { die("Cannot determine name from $file\n"); } } sub _extract_perl_version { if ( $_[0] =~ m/ ^\s* (?:use|require) \s* v? ([\d_\.]+) \s* ; /ixms ) { my $perl_version = $1; $perl_version =~ s{_}{}g; return $perl_version; } else { return; } } sub perl_version_from { my $self = shift; my $perl_version=_extract_perl_version(Module::Install::_read($_[0])); if ($perl_version) { $self->perl_version($perl_version); } else { warn "Cannot determine perl version info from $_[0]\n"; return; } } sub author_from { my $self = shift; my $content = Module::Install::_read($_[0]); if ($content =~ m/ =head \d \s+ (?:authors?)\b \s* ([^\n]*) | =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s* .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s* ([^\n]*) /ixms) { my $author = $1 || $2; # XXX: ugly but should work anyway... if (eval "require Pod::Escapes; 1") { # Pod::Escapes has a mapping table. # It's in core of perl >= 5.9.3, and should be installed # as one of the Pod::Simple's prereqs, which is a prereq # of Pod::Text 3.x (see also below). $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $Pod::Escapes::Name2character_number{$1} ? chr($Pod::Escapes::Name2character_number{$1}) : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } elsif (eval "require Pod::Text; 1" && $Pod::Text::VERSION < 3) { # Pod::Text < 3.0 has yet another mapping table, # though the table name of 2.x and 1.x are different. # (1.x is in core of Perl < 5.6, 2.x is in core of # Perl < 5.9.3) my $mapping = ($Pod::Text::VERSION < 2) ? \%Pod::Text::HTML_Escapes : \%Pod::Text::ESCAPES; $author =~ s{ E<( (\d+) | ([A-Za-z]+) )> } { defined $2 ? chr($2) : defined $mapping->{$1} ? $mapping->{$1} : do { warn "Unknown escape: E<$1>"; "E<$1>"; }; }gex; } else { $author =~ s{E}{<}g; $author =~ s{E}{>}g; } $self->author($author); } else { warn "Cannot determine author info from $_[0]\n"; } } #Stolen from M::B my %license_urls = ( perl => 'http://dev.perl.org/licenses/', apache => 'http://apache.org/licenses/LICENSE-2.0', apache_1_1 => 'http://apache.org/licenses/LICENSE-1.1', artistic => 'http://opensource.org/licenses/artistic-license.php', artistic_2 => 'http://opensource.org/licenses/artistic-license-2.0.php', lgpl => 'http://opensource.org/licenses/lgpl-license.php', lgpl2 => 'http://opensource.org/licenses/lgpl-2.1.php', lgpl3 => 'http://opensource.org/licenses/lgpl-3.0.html', bsd => 'http://opensource.org/licenses/bsd-license.php', gpl => 'http://opensource.org/licenses/gpl-license.php', gpl2 => 'http://opensource.org/licenses/gpl-2.0.php', gpl3 => 'http://opensource.org/licenses/gpl-3.0.html', mit => 'http://opensource.org/licenses/mit-license.php', mozilla => 'http://opensource.org/licenses/mozilla1.1.php', open_source => undef, unrestricted => undef, restrictive => undef, unknown => undef, ); sub license { my $self = shift; return $self->{values}->{license} unless @_; my $license = shift or die( 'Did not provide a value to license()' ); $license = __extract_license($license) || lc $license; $self->{values}->{license} = $license; # Automatically fill in license URLs if ( $license_urls{$license} ) { $self->resources( license => $license_urls{$license} ); } return 1; } sub _extract_license { my $pod = shift; my $matched; return __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ L(?i:ICEN[CS]E|ICENSING)\b.*?) (=head \d.*|=cut.*|)\z /xms ) || __extract_license( ($matched) = $pod =~ m/ (=head \d \s+ (?:C(?i:OPYRIGHTS?)|L(?i:EGAL))\b.*?) (=head \d.*|=cut.*|)\z /xms ); } sub __extract_license { my $license_text = shift or return; my @phrases = ( '(?:under )?the same (?:terms|license) as (?:perl|the perl (?:\d )?programming language)' => 'perl', 1, '(?:under )?the terms of (?:perl|the perl programming language) itself' => 'perl', 1, 'Artistic and GPL' => 'perl', 1, 'GNU general public license' => 'gpl', 1, 'GNU public license' => 'gpl', 1, 'GNU lesser general public license' => 'lgpl', 1, 'GNU lesser public license' => 'lgpl', 1, 'GNU library general public license' => 'lgpl', 1, 'GNU library public license' => 'lgpl', 1, 'GNU Free Documentation license' => 'unrestricted', 1, 'GNU Affero General Public License' => 'open_source', 1, '(?:Free)?BSD license' => 'bsd', 1, 'Artistic license 2\.0' => 'artistic_2', 1, 'Artistic license' => 'artistic', 1, 'Apache (?:Software )?license' => 'apache', 1, 'GPL' => 'gpl', 1, 'LGPL' => 'lgpl', 1, 'BSD' => 'bsd', 1, 'Artistic' => 'artistic', 1, 'MIT' => 'mit', 1, 'Mozilla Public License' => 'mozilla', 1, 'Q Public License' => 'open_source', 1, 'OpenSSL License' => 'unrestricted', 1, 'SSLeay License' => 'unrestricted', 1, 'zlib License' => 'open_source', 1, 'proprietary' => 'proprietary', 0, ); while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) { $pattern =~ s#\s+#\\s+#gs; if ( $license_text =~ /\b$pattern\b/i ) { return $license; } } return ''; } sub license_from { my $self = shift; if (my $license=_extract_license(Module::Install::_read($_[0]))) { $self->license($license); } else { warn "Cannot determine license info from $_[0]\n"; return 'unknown'; } } sub _extract_bugtracker { my @links = $_[0] =~ m#L<( https?\Q://rt.cpan.org/\E[^>]+| https?\Q://github.com/\E[\w_]+/[\w_]+/issues| https?\Q://code.google.com/p/\E[\w_\-]+/issues/list )>#gx; my %links; @links{@links}=(); @links=keys %links; return @links; } sub bugtracker_from { my $self = shift; my $content = Module::Install::_read($_[0]); my @links = _extract_bugtracker($content); unless ( @links ) { warn "Cannot determine bugtracker info from $_[0]\n"; return 0; } if ( @links > 1 ) { warn "Found more than one bugtracker link in $_[0]\n"; return 0; } # Set the bugtracker bugtracker( $links[0] ); return 1; } sub requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+(v?[\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->requires( $module => $version ); } } sub test_requires_from { my $self = shift; my $content = Module::Install::_readperl($_[0]); my @requires = $content =~ m/^use\s+([^\W\d]\w*(?:::\w+)*)\s+([\d\.]+)/mg; while ( @requires ) { my $module = shift @requires; my $version = shift @requires; $self->test_requires( $module => $version ); } } # Convert triple-part versions (eg, 5.6.1 or 5.8.9) to # numbers (eg, 5.006001 or 5.008009). # Also, convert double-part versions (eg, 5.8) sub _perl_version { my $v = $_[-1]; $v =~ s/^([1-9])\.([1-9]\d?\d?)$/sprintf("%d.%03d",$1,$2)/e; $v =~ s/^([1-9])\.([1-9]\d?\d?)\.(0|[1-9]\d?\d?)$/sprintf("%d.%03d%03d",$1,$2,$3 || 0)/e; $v =~ s/(\.\d\d\d)000$/$1/; $v =~ s/_.+$//; if ( ref($v) ) { # Numify $v = $v + 0; } return $v; } sub add_metadata { my $self = shift; my %hash = @_; for my $key (keys %hash) { warn "add_metadata: $key is not prefixed with 'x_'.\n" . "Use appopriate function to add non-private metadata.\n" unless $key =~ /^x_/; $self->{values}->{$key} = $hash{$key}; } } ###################################################################### # MYMETA Support sub WriteMyMeta { die "WriteMyMeta has been deprecated"; } sub write_mymeta_yaml { my $self = shift; # We need YAML::Tiny to write the MYMETA.yml file unless ( eval { require YAML::Tiny; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.yml\n"; YAML::Tiny::DumpFile('MYMETA.yml', $meta); } sub write_mymeta_json { my $self = shift; # We need JSON to write the MYMETA.json file unless ( eval { require JSON; 1; } ) { return 1; } # Generate the data my $meta = $self->_write_mymeta_data or return 1; # Save as the MYMETA.yml file print "Writing MYMETA.json\n"; Module::Install::_write( 'MYMETA.json', JSON->new->pretty(1)->canonical->encode($meta), ); } sub _write_mymeta_data { my $self = shift; # If there's no existing META.yml there is nothing we can do return undef unless -f 'META.yml'; # We need Parse::CPAN::Meta to load the file unless ( eval { require Parse::CPAN::Meta; 1; } ) { return undef; } # Merge the perl version into the dependencies my $val = $self->Meta->{values}; my $perl = delete $val->{perl_version}; if ( $perl ) { $val->{requires} ||= []; my $requires = $val->{requires}; # Canonize to three-dot version after Perl 5.6 if ( $perl >= 5.006 ) { $perl =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2||0), int($3||0))}e } unshift @$requires, [ perl => $perl ]; } # Load the advisory META.yml file my @yaml = Parse::CPAN::Meta::LoadFile('META.yml'); my $meta = $yaml[0]; # Overwrite the non-configure dependency hashs delete $meta->{requires}; delete $meta->{build_requires}; delete $meta->{recommends}; if ( exists $val->{requires} ) { $meta->{requires} = { map { @$_ } @{ $val->{requires} } }; } if ( exists $val->{build_requires} ) { $meta->{build_requires} = { map { @$_ } @{ $val->{build_requires} } }; } return $meta; } 1; Zonemaster-CLI-v1.0.5/inc/Module/Install/Share.pm0000644000175000017500000000464313000173022020440 0ustar matsdmatsd#line 1 package Module::Install::Share; use strict; use Module::Install::Base (); use File::Find (); use ExtUtils::Manifest (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub install_share { my $self = shift; my $dir = @_ ? pop : 'share'; my $type = @_ ? shift : 'dist'; unless ( defined $type and $type eq 'module' or $type eq 'dist' ) { die "Illegal or invalid share dir type '$type'"; } unless ( defined $dir and -d $dir ) { require Carp; Carp::croak("Illegal or missing directory install_share param: '$dir'"); } # Split by type my $S = ($^O eq 'MSWin32') ? "\\" : "\/"; my $root; if ( $type eq 'dist' ) { die "Too many parameters to install_share" if @_; # Set up the install $root = "\$(INST_LIB)${S}auto${S}share${S}dist${S}\$(DISTNAME)"; } else { my $module = Module::Install::_CLASS($_[0]); unless ( defined $module ) { die "Missing or invalid module name '$_[0]'"; } $module =~ s/::/-/g; $root = "\$(INST_LIB)${S}auto${S}share${S}module${S}$module"; } my $manifest = -r 'MANIFEST' ? ExtUtils::Manifest::maniread() : undef; my $skip_checker = $ExtUtils::Manifest::VERSION >= 1.54 ? ExtUtils::Manifest::maniskip() : ExtUtils::Manifest::_maniskip(); my $postamble = ''; my $perm_dir = eval($ExtUtils::MakeMaker::VERSION) >= 6.52 ? '$(PERM_DIR)' : 755; File::Find::find({ no_chdir => 1, wanted => sub { my $path = File::Spec->abs2rel($_, $dir); if (-d $_) { return if $skip_checker->($File::Find::name); $postamble .=<<"END"; \t\$(NOECHO) \$(MKPATH) "$root${S}$path" \t\$(NOECHO) \$(CHMOD) $perm_dir "$root${S}$path" END } else { return if ref $manifest && !exists $manifest->{$File::Find::name}; return if $skip_checker->($File::Find::name); $postamble .=<<"END"; \t\$(NOECHO) \$(CP) "$dir${S}$path" "$root${S}$path" END } }, }, $dir); # Set up the install $self->postamble(<<"END_MAKEFILE"); config :: $postamble END_MAKEFILE # The above appears to behave incorrectly when used with old versions # of ExtUtils::Install (known-bad on RHEL 3, with 5.8.0) # So when we need to install a share directory, make sure we add a # dependency on a moderately new version of ExtUtils::MakeMaker. $self->build_requires( 'ExtUtils::MakeMaker' => '6.11' ); # 99% of the time we don't want to index a shared dir $self->no_index( directory => $dir ); } 1; __END__ #line 154 Zonemaster-CLI-v1.0.5/inc/Module/Install/Win32.pm0000644000175000017500000000340313000173022020271 0ustar matsdmatsd#line 1 package Module::Install::Win32; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } # determine if the user needs nmake, and download it if needed sub check_nmake { my $self = shift; $self->load('can_run'); $self->load('get_file'); require Config; return unless ( $^O eq 'MSWin32' and $Config::Config{make} and $Config::Config{make} =~ /^nmake\b/i and ! $self->can_run('nmake') ); print "The required 'nmake' executable not found, fetching it...\n"; require File::Basename; my $rv = $self->get_file( url => 'http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe', ftp_url => 'ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe', local_dir => File::Basename::dirname($^X), size => 51928, run => 'Nmake15.exe /o > nul', check_for => 'Nmake.exe', remove => 1, ); die <<'END_MESSAGE' unless $rv; ------------------------------------------------------------------------------- Since you are using Microsoft Windows, you will need the 'nmake' utility before installation. It's available at: http://download.microsoft.com/download/vc15/Patch/1.52/W95/EN-US/Nmake15.exe or ftp://ftp.microsoft.com/Softlib/MSLFILES/Nmake15.exe Please download the file manually, save it to a directory in %PATH% (e.g. C:\WINDOWS\COMMAND\), then launch the MS-DOS command line shell, "cd" to that directory, and run "Nmake15.exe" from there; that will create the 'nmake.exe' file needed by this module. You may then resume the installation process described in README. ------------------------------------------------------------------------------- END_MESSAGE } 1; Zonemaster-CLI-v1.0.5/inc/Module/Install/Scripts.pm0000644000175000017500000000101113000173022021007 0ustar matsdmatsd#line 1 package Module::Install::Scripts; use strict 'vars'; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub install_script { my $self = shift; my $args = $self->makemaker_args; my $exe = $args->{EXE_FILES} ||= []; foreach ( @_ ) { if ( -f $_ ) { push @$exe, $_; } elsif ( -d 'script' and -f "script/$_" ) { push @$exe, "script/$_"; } else { die("Cannot find script '$_'"); } } } 1; Zonemaster-CLI-v1.0.5/inc/Module/Install/Makefile.pm0000644000175000017500000002743713000173022021121 0ustar matsdmatsd#line 1 package Module::Install::Makefile; use strict 'vars'; use ExtUtils::MakeMaker (); use Module::Install::Base (); use Fcntl qw/:flock :seek/; use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub Makefile { $_[0] } my %seen = (); sub prompt { shift; # Infinite loop protection my @c = caller(); if ( ++$seen{"$c[1]|$c[2]|$_[0]"} > 3 ) { die "Caught an potential prompt infinite loop ($c[1]|$c[2]|$_[0])"; } # In automated testing or non-interactive session, always use defaults if ( ($ENV{AUTOMATED_TESTING} or -! -t STDIN) and ! $ENV{PERL_MM_USE_DEFAULT} ) { local $ENV{PERL_MM_USE_DEFAULT} = 1; goto &ExtUtils::MakeMaker::prompt; } else { goto &ExtUtils::MakeMaker::prompt; } } # Store a cleaned up version of the MakeMaker version, # since we need to behave differently in a variety of # ways based on the MM version. my $makemaker = eval $ExtUtils::MakeMaker::VERSION; # If we are passed a param, do a "newer than" comparison. # Otherwise, just return the MakeMaker version. sub makemaker { ( @_ < 2 or $makemaker >= eval($_[1]) ) ? $makemaker : 0 } # Ripped from ExtUtils::MakeMaker 6.56, and slightly modified # as we only need to know here whether the attribute is an array # or a hash or something else (which may or may not be appendable). my %makemaker_argtype = ( C => 'ARRAY', CONFIG => 'ARRAY', # CONFIGURE => 'CODE', # ignore DIR => 'ARRAY', DL_FUNCS => 'HASH', DL_VARS => 'ARRAY', EXCLUDE_EXT => 'ARRAY', EXE_FILES => 'ARRAY', FUNCLIST => 'ARRAY', H => 'ARRAY', IMPORTS => 'HASH', INCLUDE_EXT => 'ARRAY', LIBS => 'ARRAY', # ignore '' MAN1PODS => 'HASH', MAN3PODS => 'HASH', META_ADD => 'HASH', META_MERGE => 'HASH', PL_FILES => 'HASH', PM => 'HASH', PMLIBDIRS => 'ARRAY', PMLIBPARENTDIRS => 'ARRAY', PREREQ_PM => 'HASH', CONFIGURE_REQUIRES => 'HASH', SKIP => 'ARRAY', TYPEMAPS => 'ARRAY', XS => 'HASH', # VERSION => ['version',''], # ignore # _KEEP_AFTER_FLUSH => '', clean => 'HASH', depend => 'HASH', dist => 'HASH', dynamic_lib=> 'HASH', linkext => 'HASH', macro => 'HASH', postamble => 'HASH', realclean => 'HASH', test => 'HASH', tool_autosplit => 'HASH', # special cases where you can use makemaker_append CCFLAGS => 'APPENDABLE', DEFINE => 'APPENDABLE', INC => 'APPENDABLE', LDDLFLAGS => 'APPENDABLE', LDFROM => 'APPENDABLE', ); sub makemaker_args { my ($self, %new_args) = @_; my $args = ( $self->{makemaker_args} ||= {} ); foreach my $key (keys %new_args) { if ($makemaker_argtype{$key}) { if ($makemaker_argtype{$key} eq 'ARRAY') { $args->{$key} = [] unless defined $args->{$key}; unless (ref $args->{$key} eq 'ARRAY') { $args->{$key} = [$args->{$key}] } push @{$args->{$key}}, ref $new_args{$key} eq 'ARRAY' ? @{$new_args{$key}} : $new_args{$key}; } elsif ($makemaker_argtype{$key} eq 'HASH') { $args->{$key} = {} unless defined $args->{$key}; foreach my $skey (keys %{ $new_args{$key} }) { $args->{$key}{$skey} = $new_args{$key}{$skey}; } } elsif ($makemaker_argtype{$key} eq 'APPENDABLE') { $self->makemaker_append($key => $new_args{$key}); } } else { if (defined $args->{$key}) { warn qq{MakeMaker attribute "$key" is overriden; use "makemaker_append" to append values\n}; } $args->{$key} = $new_args{$key}; } } return $args; } # For mm args that take multiple space-seperated args, # append an argument to the current list. sub makemaker_append { my $self = shift; my $name = shift; my $args = $self->makemaker_args; $args->{$name} = defined $args->{$name} ? join( ' ', $args->{$name}, @_ ) : join( ' ', @_ ); } sub build_subdirs { my $self = shift; my $subdirs = $self->makemaker_args->{DIR} ||= []; for my $subdir (@_) { push @$subdirs, $subdir; } } sub clean_files { my $self = shift; my $clean = $self->makemaker_args->{clean} ||= {}; %$clean = ( %$clean, FILES => join ' ', grep { length $_ } ($clean->{FILES} || (), @_), ); } sub realclean_files { my $self = shift; my $realclean = $self->makemaker_args->{realclean} ||= {}; %$realclean = ( %$realclean, FILES => join ' ', grep { length $_ } ($realclean->{FILES} || (), @_), ); } sub libs { my $self = shift; my $libs = ref $_[0] ? shift : [ shift ]; $self->makemaker_args( LIBS => $libs ); } sub inc { my $self = shift; $self->makemaker_args( INC => shift ); } sub _wanted_t { } sub tests_recursive { my $self = shift; my $dir = shift || 't'; unless ( -d $dir ) { die "tests_recursive dir '$dir' does not exist"; } my %tests = map { $_ => 1 } split / /, ($self->tests || ''); require File::Find; File::Find::find( sub { /\.t$/ and -f $_ and $tests{"$File::Find::dir/*.t"} = 1 }, $dir ); $self->tests( join ' ', sort keys %tests ); } sub write { my $self = shift; die "&Makefile->write() takes no arguments\n" if @_; # Check the current Perl version my $perl_version = $self->perl_version; if ( $perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; } # Make sure we have a new enough MakeMaker require ExtUtils::MakeMaker; if ( $perl_version and $self->_cmp($perl_version, '5.006') >= 0 ) { # This previous attempted to inherit the version of # ExtUtils::MakeMaker in use by the module author, but this # was found to be untenable as some authors build releases # using future dev versions of EU:MM that nobody else has. # Instead, #toolchain suggests we use 6.59 which is the most # stable version on CPAN at time of writing and is, to quote # ribasushi, "not terminally fucked, > and tested enough". # TODO: We will now need to maintain this over time to push # the version up as new versions are released. $self->build_requires( 'ExtUtils::MakeMaker' => 6.59 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.59 ); } else { # Allow legacy-compatibility with 5.005 by depending on the # most recent EU:MM that supported 5.005. $self->build_requires( 'ExtUtils::MakeMaker' => 6.36 ); $self->configure_requires( 'ExtUtils::MakeMaker' => 6.36 ); } # Generate the MakeMaker params my $args = $self->makemaker_args; $args->{DISTNAME} = $self->name; $args->{NAME} = $self->module_name || $self->name; $args->{NAME} =~ s/-/::/g; $args->{VERSION} = $self->version or die <<'EOT'; ERROR: Can't determine distribution version. Please specify it explicitly via 'version' in Makefile.PL, or set a valid $VERSION in a module, and provide its file path via 'version_from' (or 'all_from' if you prefer) in Makefile.PL. EOT if ( $self->tests ) { my @tests = split ' ', $self->tests; my %seen; $args->{test} = { TESTS => (join ' ', grep {!$seen{$_}++} @tests), }; } elsif ( $Module::Install::ExtraTests::use_extratests ) { # Module::Install::ExtraTests doesn't set $self->tests and does its own tests via harness. # So, just ignore our xt tests here. } elsif ( -d 'xt' and ($Module::Install::AUTHOR or $ENV{RELEASE_TESTING}) ) { $args->{test} = { TESTS => join( ' ', map { "$_/*.t" } grep { -d $_ } qw{ t xt } ), }; } if ( $] >= 5.005 ) { $args->{ABSTRACT} = $self->abstract; $args->{AUTHOR} = join ', ', @{$self->author || []}; } if ( $self->makemaker(6.10) ) { $args->{NO_META} = 1; #$args->{NO_MYMETA} = 1; } if ( $self->makemaker(6.17) and $self->sign ) { $args->{SIGN} = 1; } unless ( $self->is_admin ) { delete $args->{SIGN}; } if ( $self->makemaker(6.31) and $self->license ) { $args->{LICENSE} = $self->license; } my $prereq = ($args->{PREREQ_PM} ||= {}); %$prereq = ( %$prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->requires) ); # Remove any reference to perl, PREREQ_PM doesn't support it delete $args->{PREREQ_PM}->{perl}; # Merge both kinds of requires into BUILD_REQUIRES my $build_prereq = ($args->{BUILD_REQUIRES} ||= {}); %$build_prereq = ( %$build_prereq, map { @$_ } # flatten [module => version] map { @$_ } grep $_, ($self->configure_requires, $self->build_requires) ); # Remove any reference to perl, BUILD_REQUIRES doesn't support it delete $args->{BUILD_REQUIRES}->{perl}; # Delete bundled dists from prereq_pm, add it to Makefile DIR my $subdirs = ($args->{DIR} || []); if ($self->bundles) { my %processed; foreach my $bundle (@{ $self->bundles }) { my ($mod_name, $dist_dir) = @$bundle; delete $prereq->{$mod_name}; $dist_dir = File::Basename::basename($dist_dir); # dir for building this module if (not exists $processed{$dist_dir}) { if (-d $dist_dir) { # List as sub-directory to be processed by make push @$subdirs, $dist_dir; } # Else do nothing: the module is already present on the system $processed{$dist_dir} = undef; } } } unless ( $self->makemaker('6.55_03') ) { %$prereq = (%$prereq,%$build_prereq); delete $args->{BUILD_REQUIRES}; } if ( my $perl_version = $self->perl_version ) { eval "use $perl_version; 1" or die "ERROR: perl: Version $] is installed, " . "but we need version >= $perl_version"; if ( $self->makemaker(6.48) ) { $args->{MIN_PERL_VERSION} = $perl_version; } } if ($self->installdirs) { warn qq{old INSTALLDIRS (probably set by makemaker_args) is overriden by installdirs\n} if $args->{INSTALLDIRS}; $args->{INSTALLDIRS} = $self->installdirs; } my %args = map { ( $_ => $args->{$_} ) } grep {defined($args->{$_} ) } keys %$args; my $user_preop = delete $args{dist}->{PREOP}; if ( my $preop = $self->admin->preop($user_preop) ) { foreach my $key ( keys %$preop ) { $args{dist}->{$key} = $preop->{$key}; } } my $mm = ExtUtils::MakeMaker::WriteMakefile(%args); $self->fix_up_makefile($mm->{FIRST_MAKEFILE} || 'Makefile'); } sub fix_up_makefile { my $self = shift; my $makefile_name = shift; my $top_class = ref($self->_top) || ''; my $top_version = $self->_top->VERSION || ''; my $preamble = $self->preamble ? "# Preamble by $top_class $top_version\n" . $self->preamble : ''; my $postamble = "# Postamble by $top_class $top_version\n" . ($self->postamble || ''); local *MAKEFILE; open MAKEFILE, "+< $makefile_name" or die "fix_up_makefile: Couldn't open $makefile_name: $!"; eval { flock MAKEFILE, LOCK_EX }; my $makefile = do { local $/; }; $makefile =~ s/\b(test_harness\(\$\(TEST_VERBOSE\), )/$1'inc', /; $makefile =~ s/( -I\$\(INST_ARCHLIB\))/ -Iinc$1/g; $makefile =~ s/( "-I\$\(INST_LIB\)")/ "-Iinc"$1/g; $makefile =~ s/^(FULLPERL = .*)/$1 "-Iinc"/m; $makefile =~ s/^(PERL = .*)/$1 "-Iinc"/m; # Module::Install will never be used to build the Core Perl # Sometimes PERL_LIB and PERL_ARCHLIB get written anyway, which breaks # PREFIX/PERL5LIB, and thus, install_share. Blank them if they exist $makefile =~ s/^PERL_LIB = .+/PERL_LIB =/m; #$makefile =~ s/^PERL_ARCHLIB = .+/PERL_ARCHLIB =/m; # Perl 5.005 mentions PERL_LIB explicitly, so we have to remove that as well. $makefile =~ s/(\"?)-I\$\(PERL_LIB\)\1//g; # XXX - This is currently unused; not sure if it breaks other MM-users # $makefile =~ s/^pm_to_blib\s+:\s+/pm_to_blib :: /mg; seek MAKEFILE, 0, SEEK_SET; truncate MAKEFILE, 0; print MAKEFILE "$preamble$makefile$postamble" or die $!; close MAKEFILE or die $!; 1; } sub preamble { my ($self, $text) = @_; $self->{preamble} = $text . $self->{preamble} if defined $text; $self->{preamble}; } sub postamble { my ($self, $text) = @_; $self->{postamble} ||= $self->admin->postamble; $self->{postamble} .= $text if defined $text; $self->{postamble} } 1; __END__ #line 544 Zonemaster-CLI-v1.0.5/inc/Module/Install/WriteAll.pm0000644000175000017500000000237613000173022021122 0ustar matsdmatsd#line 1 package Module::Install::WriteAll; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @ISA = qw{Module::Install::Base}; $ISCORE = 1; } sub WriteAll { my $self = shift; my %args = ( meta => 1, sign => 0, inline => 0, check_nmake => 1, @_, ); $self->sign(1) if $args{sign}; $self->admin->WriteAll(%args) if $self->is_admin; $self->check_nmake if $args{check_nmake}; unless ( $self->makemaker_args->{PL_FILES} ) { # XXX: This still may be a bit over-defensive... unless ($self->makemaker(6.25)) { $self->makemaker_args( PL_FILES => {} ) if -f 'Build.PL'; } } # Until ExtUtils::MakeMaker support MYMETA.yml, make sure # we clean it up properly ourself. $self->realclean_files('MYMETA.yml'); if ( $args{inline} ) { $self->Inline->write; } else { $self->Makefile->write; } # The Makefile write process adds a couple of dependencies, # so write the META.yml files after the Makefile. if ( $args{meta} ) { $self->Meta->write; } # Experimental support for MYMETA if ( $ENV{X_MYMETA} ) { if ( $ENV{X_MYMETA} eq 'JSON' ) { $self->Meta->write_mymeta_json; } else { $self->Meta->write_mymeta_yaml; } } return 1; } 1; Zonemaster-CLI-v1.0.5/inc/Module/Install/Fetch.pm0000644000175000017500000000462713000173022020431 0ustar matsdmatsd#line 1 package Module::Install::Fetch; use strict; use Module::Install::Base (); use vars qw{$VERSION @ISA $ISCORE}; BEGIN { $VERSION = '1.06'; @ISA = 'Module::Install::Base'; $ISCORE = 1; } sub get_file { my ($self, %args) = @_; my ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; if ( $scheme eq 'http' and ! eval { require LWP::Simple; 1 } ) { $args{url} = $args{ftp_url} or (warn("LWP support unavailable!\n"), return); ($scheme, $host, $path, $file) = $args{url} =~ m|^(\w+)://([^/]+)(.+)/(.+)| or return; } $|++; print "Fetching '$file' from $host... "; unless (eval { require Socket; Socket::inet_aton($host) }) { warn "'$host' resolve failed!\n"; return; } return unless $scheme eq 'ftp' or $scheme eq 'http'; require Cwd; my $dir = Cwd::getcwd(); chdir $args{local_dir} or return if exists $args{local_dir}; if (eval { require LWP::Simple; 1 }) { LWP::Simple::mirror($args{url}, $file); } elsif (eval { require Net::FTP; 1 }) { eval { # use Net::FTP to get past firewall my $ftp = Net::FTP->new($host, Passive => 1, Timeout => 600); $ftp->login("anonymous", 'anonymous@example.com'); $ftp->cwd($path); $ftp->binary; $ftp->get($file) or (warn("$!\n"), return); $ftp->quit; } } elsif (my $ftp = $self->can_run('ftp')) { eval { # no Net::FTP, fallback to ftp.exe require FileHandle; my $fh = FileHandle->new; local $SIG{CHLD} = 'IGNORE'; unless ($fh->open("|$ftp -n")) { warn "Couldn't open ftp: $!\n"; chdir $dir; return; } my @dialog = split(/\n/, <<"END_FTP"); open $host user anonymous anonymous\@example.com cd $path binary get $file $file quit END_FTP foreach (@dialog) { $fh->print("$_\n") } $fh->close; } } else { warn "No working 'ftp' program available!\n"; chdir $dir; return; } unless (-f $file) { warn "Fetching failed: $@\n"; chdir $dir; return; } return if exists $args{size} and -s $file != $args{size}; system($args{run}) if exists $args{run}; unlink($file) if $args{remove}; print(((!exists $args{check_for} or -e $args{check_for}) ? "done!" : "failed! ($!)"), "\n"); chdir $dir; return !$?; } 1; Zonemaster-CLI-v1.0.5/inc/Module/Install/Base.pm0000644000175000017500000000214713000173022020245 0ustar matsdmatsd#line 1 package Module::Install::Base; use strict 'vars'; use vars qw{$VERSION}; BEGIN { $VERSION = '1.06'; } # Suspend handler for "redefined" warnings BEGIN { my $w = $SIG{__WARN__}; $SIG{__WARN__} = sub { $w }; } #line 42 sub new { my $class = shift; unless ( defined &{"${class}::call"} ) { *{"${class}::call"} = sub { shift->_top->call(@_) }; } unless ( defined &{"${class}::load"} ) { *{"${class}::load"} = sub { shift->_top->load(@_) }; } bless { @_ }, $class; } #line 61 sub AUTOLOAD { local $@; my $func = eval { shift->_top->autoload } or return; goto &$func; } #line 75 sub _top { $_[0]->{_top}; } #line 90 sub admin { $_[0]->_top->{admin} or Module::Install::Base::FakeAdmin->new; } #line 106 sub is_admin { ! $_[0]->admin->isa('Module::Install::Base::FakeAdmin'); } sub DESTROY {} package Module::Install::Base::FakeAdmin; use vars qw{$VERSION}; BEGIN { $VERSION = $Module::Install::Base::VERSION; } my $fake; sub new { $fake ||= bless(\@_, $_[0]); } sub AUTOLOAD {} sub DESTROY {} # Restore warning handler BEGIN { $SIG{__WARN__} = $SIG{__WARN__}->(); } 1; #line 159 Zonemaster-CLI-v1.0.5/inc/Module/Install.pm0000644000175000017500000003013513000173022017371 0ustar matsdmatsd#line 1 package Module::Install; # For any maintainers: # The load order for Module::Install is a bit magic. # It goes something like this... # # IF ( host has Module::Install installed, creating author mode ) { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to installed version of inc::Module::Install # 3. The installed version of inc::Module::Install loads # 4. inc::Module::Install calls "require Module::Install" # 5. The ./inc/ version of Module::Install loads # } ELSE { # 1. Makefile.PL calls "use inc::Module::Install" # 2. $INC{inc/Module/Install.pm} set to ./inc/ version of Module::Install # 3. The ./inc/ version of Module::Install loads # } use 5.005; use strict 'vars'; use Cwd (); use File::Find (); use File::Path (); use vars qw{$VERSION $MAIN}; BEGIN { # All Module::Install core packages now require synchronised versions. # This will be used to ensure we don't accidentally load old or # different versions of modules. # This is not enforced yet, but will be some time in the next few # releases once we can make sure it won't clash with custom # Module::Install extensions. $VERSION = '1.06'; # Storage for the pseudo-singleton $MAIN = undef; *inc::Module::Install::VERSION = *VERSION; @inc::Module::Install::ISA = __PACKAGE__; } sub import { my $class = shift; my $self = $class->new(@_); my $who = $self->_caller; #------------------------------------------------------------- # all of the following checks should be included in import(), # to allow "eval 'require Module::Install; 1' to test # installation of Module::Install. (RT #51267) #------------------------------------------------------------- # Whether or not inc::Module::Install is actually loaded, the # $INC{inc/Module/Install.pm} is what will still get set as long as # the caller loaded module this in the documented manner. # If not set, the caller may NOT have loaded the bundled version, and thus # they may not have a MI version that works with the Makefile.PL. This would # result in false errors or unexpected behaviour. And we don't want that. my $file = join( '/', 'inc', split /::/, __PACKAGE__ ) . '.pm'; unless ( $INC{$file} ) { die <<"END_DIE" } Please invoke ${\__PACKAGE__} with: use inc::${\__PACKAGE__}; not: use ${\__PACKAGE__}; END_DIE # This reportedly fixes a rare Win32 UTC file time issue, but # as this is a non-cross-platform XS module not in the core, # we shouldn't really depend on it. See RT #24194 for detail. # (Also, this module only supports Perl 5.6 and above). eval "use Win32::UTCFileTime" if $^O eq 'MSWin32' && $] >= 5.006; # If the script that is loading Module::Install is from the future, # then make will detect this and cause it to re-run over and over # again. This is bad. Rather than taking action to touch it (which # is unreliable on some platforms and requires write permissions) # for now we should catch this and refuse to run. if ( -f $0 ) { my $s = (stat($0))[9]; # If the modification time is only slightly in the future, # sleep briefly to remove the problem. my $a = $s - time; if ( $a > 0 and $a < 5 ) { sleep 5 } # Too far in the future, throw an error. my $t = time; if ( $s > $t ) { die <<"END_DIE" } Your installer $0 has a modification time in the future ($s > $t). This is known to create infinite loops in make. Please correct this, then run $0 again. END_DIE } # Build.PL was formerly supported, but no longer is due to excessive # difficulty in implementing every single feature twice. if ( $0 =~ /Build.PL$/i ) { die <<"END_DIE" } Module::Install no longer supports Build.PL. It was impossible to maintain duel backends, and has been deprecated. Please remove all Build.PL files and only use the Makefile.PL installer. END_DIE #------------------------------------------------------------- # To save some more typing in Module::Install installers, every... # use inc::Module::Install # ...also acts as an implicit use strict. $^H |= strict::bits(qw(refs subs vars)); #------------------------------------------------------------- unless ( -f $self->{file} ) { foreach my $key (keys %INC) { delete $INC{$key} if $key =~ /Module\/Install/; } local $^W; require "$self->{path}/$self->{dispatch}.pm"; File::Path::mkpath("$self->{prefix}/$self->{author}"); $self->{admin} = "$self->{name}::$self->{dispatch}"->new( _top => $self ); $self->{admin}->init; @_ = ($class, _self => $self); goto &{"$self->{name}::import"}; } local $^W; *{"${who}::AUTOLOAD"} = $self->autoload; $self->preload; # Unregister loader and worker packages so subdirs can use them again delete $INC{'inc/Module/Install.pm'}; delete $INC{'Module/Install.pm'}; # Save to the singleton $MAIN = $self; return 1; } sub autoload { my $self = shift; my $who = $self->_caller; my $cwd = Cwd::cwd(); my $sym = "${who}::AUTOLOAD"; $sym->{$cwd} = sub { my $pwd = Cwd::cwd(); if ( my $code = $sym->{$pwd} ) { # Delegate back to parent dirs goto &$code unless $cwd eq $pwd; } unless ($$sym =~ s/([^:]+)$//) { # XXX: it looks like we can't retrieve the missing function # via $$sym (usually $main::AUTOLOAD) in this case. # I'm still wondering if we should slurp Makefile.PL to # get some context or not ... my ($package, $file, $line) = caller; die <<"EOT"; Unknown function is found at $file line $line. Execution of $file aborted due to runtime errors. If you're a contributor to a project, you may need to install some Module::Install extensions from CPAN (or other repository). If you're a user of a module, please contact the author. EOT } my $method = $1; if ( uc($method) eq $method ) { # Do nothing return; } elsif ( $method =~ /^_/ and $self->can($method) ) { # Dispatch to the root M:I class return $self->$method(@_); } # Dispatch to the appropriate plugin unshift @_, ( $self, $1 ); goto &{$self->can('call')}; }; } sub preload { my $self = shift; unless ( $self->{extensions} ) { $self->load_extensions( "$self->{prefix}/$self->{path}", $self ); } my @exts = @{$self->{extensions}}; unless ( @exts ) { @exts = $self->{admin}->load_all_extensions; } my %seen; foreach my $obj ( @exts ) { while (my ($method, $glob) = each %{ref($obj) . '::'}) { next unless $obj->can($method); next if $method =~ /^_/; next if $method eq uc($method); $seen{$method}++; } } my $who = $self->_caller; foreach my $name ( sort keys %seen ) { local $^W; *{"${who}::$name"} = sub { ${"${who}::AUTOLOAD"} = "${who}::$name"; goto &{"${who}::AUTOLOAD"}; }; } } sub new { my ($class, %args) = @_; delete $INC{'FindBin.pm'}; { # to suppress the redefine warning local $SIG{__WARN__} = sub {}; require FindBin; } # ignore the prefix on extension modules built from top level. my $base_path = Cwd::abs_path($FindBin::Bin); unless ( Cwd::abs_path(Cwd::cwd()) eq $base_path ) { delete $args{prefix}; } return $args{_self} if $args{_self}; $args{dispatch} ||= 'Admin'; $args{prefix} ||= 'inc'; $args{author} ||= ($^O eq 'VMS' ? '_author' : '.author'); $args{bundle} ||= 'inc/BUNDLES'; $args{base} ||= $base_path; $class =~ s/^\Q$args{prefix}\E:://; $args{name} ||= $class; $args{version} ||= $class->VERSION; unless ( $args{path} ) { $args{path} = $args{name}; $args{path} =~ s!::!/!g; } $args{file} ||= "$args{base}/$args{prefix}/$args{path}.pm"; $args{wrote} = 0; bless( \%args, $class ); } sub call { my ($self, $method) = @_; my $obj = $self->load($method) or return; splice(@_, 0, 2, $obj); goto &{$obj->can($method)}; } sub load { my ($self, $method) = @_; $self->load_extensions( "$self->{prefix}/$self->{path}", $self ) unless $self->{extensions}; foreach my $obj (@{$self->{extensions}}) { return $obj if $obj->can($method); } my $admin = $self->{admin} or die <<"END_DIE"; The '$method' method does not exist in the '$self->{prefix}' path! Please remove the '$self->{prefix}' directory and run $0 again to load it. END_DIE my $obj = $admin->load($method, 1); push @{$self->{extensions}}, $obj; $obj; } sub load_extensions { my ($self, $path, $top) = @_; my $should_reload = 0; unless ( grep { ! ref $_ and lc $_ eq lc $self->{prefix} } @INC ) { unshift @INC, $self->{prefix}; $should_reload = 1; } foreach my $rv ( $self->find_extensions($path) ) { my ($file, $pkg) = @{$rv}; next if $self->{pathnames}{$pkg}; local $@; my $new = eval { local $^W; require $file; $pkg->can('new') }; unless ( $new ) { warn $@ if $@; next; } $self->{pathnames}{$pkg} = $should_reload ? delete $INC{$file} : $INC{$file}; push @{$self->{extensions}}, &{$new}($pkg, _top => $top ); } $self->{extensions} ||= []; } sub find_extensions { my ($self, $path) = @_; my @found; File::Find::find( sub { my $file = $File::Find::name; return unless $file =~ m!^\Q$path\E/(.+)\.pm\Z!is; my $subpath = $1; return if lc($subpath) eq lc($self->{dispatch}); $file = "$self->{path}/$subpath.pm"; my $pkg = "$self->{name}::$subpath"; $pkg =~ s!/!::!g; # If we have a mixed-case package name, assume case has been preserved # correctly. Otherwise, root through the file to locate the case-preserved # version of the package name. if ( $subpath eq lc($subpath) || $subpath eq uc($subpath) ) { my $content = Module::Install::_read($subpath . '.pm'); my $in_pod = 0; foreach ( split //, $content ) { $in_pod = 1 if /^=\w/; $in_pod = 0 if /^=cut/; next if ($in_pod || /^=cut/); # skip pod text next if /^\s*#/; # and comments if ( m/^\s*package\s+($pkg)\s*;/i ) { $pkg = $1; last; } } } push @found, [ $file, $pkg ]; }, $path ) if -d $path; @found; } ##################################################################### # Common Utility Functions sub _caller { my $depth = 0; my $call = caller($depth); while ( $call eq __PACKAGE__ ) { $depth++; $call = caller($depth); } return $call; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _read { local *FH; open( FH, '<', $_[0] ) or die "open($_[0]): $!"; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_NEW sub _read { local *FH; open( FH, "< $_[0]" ) or die "open($_[0]): $!"; my $string = do { local $/; }; close FH or die "close($_[0]): $!"; return $string; } END_OLD sub _readperl { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; $string =~ s/(\n)\n*__(?:DATA|END)__\b.*\z/$1/s; $string =~ s/\n\n=\w+.+?\n\n=cut\b.+?\n+/\n\n/sg; return $string; } sub _readpod { my $string = Module::Install::_read($_[0]); $string =~ s/(?:\015{1,2}\012|\015|\012)/\n/sg; return $string if $_[0] =~ /\.pod\z/; $string =~ s/(^|\n=cut\b.+?\n+)[^=\s].+?\n(\n=\w+|\z)/$1$2/sg; $string =~ s/\n*=pod\b[^\n]*\n+/\n\n/sg; $string =~ s/\n*=cut\b[^\n]*\n+/\n\n/sg; $string =~ s/^\n+//s; return $string; } # Done in evals to avoid confusing Perl::MinimumVersion eval( $] >= 5.006 ? <<'END_NEW' : <<'END_OLD' ); die $@ if $@; sub _write { local *FH; open( FH, '>', $_[0] ) or die "open($_[0]): $!"; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_NEW sub _write { local *FH; open( FH, "> $_[0]" ) or die "open($_[0]): $!"; foreach ( 1 .. $#_ ) { print FH $_[$_] or die "print($_[0]): $!"; } close FH or die "close($_[0]): $!"; } END_OLD # _version is for processing module versions (eg, 1.03_05) not # Perl versions (eg, 5.8.1). sub _version ($) { my $s = shift || 0; my $d =()= $s =~ /(\.)/g; if ( $d >= 2 ) { # Normalise multipart versions $s =~ s/(\.)(\d{1,3})/sprintf("$1%03d",$2)/eg; } $s =~ s/^(\d+)\.?//; my $l = $1 || 0; my @v = map { $_ . '0' x (3 - length $_) } $s =~ /(\d{1,3})\D?/g; $l = $l . '.' . join '', @v if @v; return $l + 0; } sub _cmp ($$) { _version($_[1]) <=> _version($_[2]); } # Cloned from Params::Util::_CLASS sub _CLASS ($) { ( defined $_[0] and ! ref $_[0] and $_[0] =~ m/^[^\W\d]\w*(?:::\w+)*\z/s ) ? $_[0] : undef; } 1; # Copyright 2008 - 2012 Adam Kennedy. Zonemaster-CLI-v1.0.5/README.md0000644000175000017500000000343013000170027014706 0ustar matsdmatsdZonemaster CLI ============== [![Build Status](https://travis-ci.org/dotse/zonemaster-engine.svg?branch=master)](https://travis-ci.org/dotse/zonemaster-engine) [![CPAN version](https://badge.fury.io/pl/Zonemaster-CLI.svg)](https://metacpan.org/pod/Zonemaster::CLI) ### Purpose This Git repository is one of the components of the Zonemaster software and contains the source for the Zonemaster CLI utility. For an overview of the Zonemaster software, please see the [Zonemaster repository](https://github.com/dotse/zonemaster). ## Prerequisite Before you install the Zonemaster CLI utility, you need the Zonemaster Engine test framework installed. Please see the [Zonemaster Engine installation instructions](https://github.com/dotse/zonemaster-engine/blob/master/docs/installation.md). Installation ============ Installation instructions for the CLI [installation](docs/installation.md) document. ### Configuration This repository does not need any specific configuration. ### Documentation Other than the installation documentation, no specific documentation is needed. The [using](https://github.com/dotse/zonemaster-cli/blob/master/USING.md) document provides an overview on how to use the CLI. ### Participation The core development team are people from IIS and Afnic. However, you can submit code by forking this repository and create pull requests. You can follow the project in these two mailinglists: * [zonemaster-users](http://lists.iis.se/cgi-bin/mailman/listinfo/zonemaster-users) * [zonemaster-devel](http://lists.iis.se/cgi-bin/mailman/listinfo/zonemaster-devel) ### Contact or Bug reporting For any contacts or bug reporting, please send a mail to "contact@zonemaster.net". License ======= The software is released under the 2-clause BSD license. See separate LICENSE file. Zonemaster-CLI-v1.0.5/pm_to_blib0000644000175000017500000000000013000173031015444 0ustar matsdmatsdZonemaster-CLI-v1.0.5/t/0000755000175000017500000000000013000173045013675 5ustar matsdmatsdZonemaster-CLI-v1.0.5/t/00-load.t0000644000175000017500000000035013000170027015211 0ustar matsdmatsduse 5.014002; use strict; use warnings FATAL => 'all'; use Test::More; plan tests => 1; BEGIN { use_ok( 'Zonemaster::CLI' ) || print "Bail out!\n"; } diag( "Testing Zonemaster::CLI $Zonemaster::CLI::VERSION, Perl $], $^X" );