From 5d7a59678cf41ce89b63cced41f9b8e903905eb9 Mon Sep 17 00:00:00 2001 From: Rob Austein Date: Wed, 20 Jun 2007 20:31:29 +0000 Subject: Fun with RelaxNG regexps! svn path=/scripts/up-down-protocol-samples/Makefile; revision=679 --- scripts/up-down-protocol-samples/Makefile | 11 +- scripts/up-down-tighter-schema.pl | 103 +++++++++++ scripts/up-down-tighter-schema.rnc | 72 ++++++++ scripts/up-down-tighter-schema.rng | 284 ++++++++++++++++++++++++++++++ 4 files changed, 467 insertions(+), 3 deletions(-) create mode 100644 scripts/up-down-tighter-schema.pl create mode 100644 scripts/up-down-tighter-schema.rnc create mode 100644 scripts/up-down-tighter-schema.rng (limited to 'scripts') diff --git a/scripts/up-down-protocol-samples/Makefile b/scripts/up-down-protocol-samples/Makefile index eedc1c03..2fbc209a 100644 --- a/scripts/up-down-protocol-samples/Makefile +++ b/scripts/up-down-protocol-samples/Makefile @@ -1,6 +1,11 @@ XMLLINT = xmllint --noout --relaxng JING = java -jar /usr/local/share/java/classes/jing.jar +SCHEMA = ../up-down-schema.rng -all: - ${JING} ../up-down-schema.rng *.xml - ${XMLLINT} ../up-down-schema.rng *.xml +all: jing xmllint + +jing: + ${JING} ${SCHEMA} *.xml + +xmllint: + ${XMLLINT} ${SCHEMA} *.xml diff --git a/scripts/up-down-tighter-schema.pl b/scripts/up-down-tighter-schema.pl new file mode 100644 index 00000000..a243b1f8 --- /dev/null +++ b/scripts/up-down-tighter-schema.pl @@ -0,0 +1,103 @@ +# $Id$ +# +# Trivial Perl script to generate a RelaxNG (Compact Syntax) Schema +# for RPKI up-down protocol. This is based on the schema in the APNIC +# Wiki, but has much tighter constraints on a number of fields. It's +# a Perl script to work around the lack of a mechanism for reusing +# restrictions in a RelaxNG schema. +# +# libxml2 (including xmllint) only groks the XML syntax of RelaxNG, so +# run the output of this script through a converter like trang to get +# XML syntax. + +# Note that the regexps here are RelaxNG, not Perl, slightly different. + +my $as_set = '[0-9]+(,[0-9]+)?'; + +my $ipv4 = '([0-9]+\.){3}[0-9]+'; +my $ipv4p = "${ipv4}/[0-9]+"; +my $ipv4r = "${ipv4}-${ipv4}"; +my $ipv4_set = "${ipv4p}|${ipv4r}"; + + +my $rnc = qq{# \$Id\$ +# Automatically generated from $0 + + default namespace = "http://www.apnic.net/specs/rescerts/up-down/" + + grammar { + start = element message { + attribute version { xsd:positiveInteger { maxInclusive="1" } }, + attribute sender { xsd:token { maxLength="1024" } }, + attribute recipient { xsd:token { maxLength="1024" } }, + attribute msg_ref { xsd:positiveInteger { maxInclusive="999999999999999" } }, + payload + } + + payload |= attribute type { "list" }, list_request + payload |= attribute type { "list_response"}, list_response + payload |= attribute type { "issue" }, issue_request + payload |= attribute type { "issue_response"}, issue_response + payload |= attribute type { "revoke" }, revoke_request + payload |= attribute type { "revoke_response"}, revoke_response + payload |= attribute type { "error_response"}, error_response + + list_request = empty + list_response = class* + + class = element class { + attribute class_name { xsd:token { maxLength="1024" } }, + attribute cert_url { xsd:anyURI { maxLength="1024" } }, + attribute cert_ski { xsd:token { maxLength="1024" } }, + attribute resource_set_as { xsd:string { maxLength="512000" pattern="${as_set}" } }, + attribute resource_set_ipv4 { xsd:string { maxLength="512000" pattern="${ipv4_set}" } }, + attribute resource_set_ipv6 { xsd:string { maxLength="512000" } }, + attribute suggested_sia_head { xsd:string { maxLength="1024" } }?, + element certificate { + attribute cert_url { xsd:anyURI { maxLength="1024" } }, + attribute cert_ski { xsd:token { maxLength="1024" } }, + attribute cert_aki { xsd:token { maxLength="1024" } }, + attribute cert_serial { xsd:positiveInteger }, + attribute resource_set_as { xsd:string { maxLength="512000" pattern="${as_set}" } }, + attribute resource_set_ipv4 { xsd:string { maxLength="512000" pattern="${ipv4_set}" } }, + attribute resource_set_ipv6 { xsd:string { maxLength="512000" } }, + attribute req_resource_set_as { xsd:string { maxLength="512000" pattern="${as_set}" } }?, + attribute req_resource_set_ipv4 { xsd:string { maxLength="512000" pattern="${ipv4_set}" } }?, + attribute req_resource_set_ipv6 { xsd:string { maxLength="512000" } }?, + attribute status { "undersize" | "match" | "oversize" }, + xsd:base64Binary { maxLength="512000" } + }*, + element issuer { xsd:base64Binary { maxLength="512000" } } + } + + issue_request = element request { + attribute class_name { xsd:token { maxLength="1024" } }, + attribute req_resource_set_as { xsd:string { maxLength="512000" pattern="${as_set}" } }?, + attribute req_resource_set_ipv4 { xsd:string { maxLength="512000" pattern="${ipv4_set}" } }?, + attribute req_resource_set_ipv6 { xsd:string { maxLength="512000" } }?, + xsd:base64Binary { maxLength="512000" } + } + issue_response = class + + revoke_request = revocation + revoke_response = revocation + + revocation = element key { + attribute class_name { xsd:token { maxLength="1024" } }, + attribute ski { xsd:token { maxLength="1024" } } + } + + error_response = + element status { xsd:positiveInteger { maxInclusive="999999999999999" } }, + element last_msg_processed { xsd:positiveInteger { maxInclusive="999999999999999" } }?, + element description { attribute xml:lang { xsd:language }, xsd:string { maxLength="1024" } }? + } +}; + +$_ = $0; +s/\.pl$//; + +open(F, ">", "$_.rnc") or die; +print(F $rnc) or die; +close(F) or die; +exec("trang", "$_.rnc", "$_.rng") or die; diff --git a/scripts/up-down-tighter-schema.rnc b/scripts/up-down-tighter-schema.rnc new file mode 100644 index 00000000..bffcc41a --- /dev/null +++ b/scripts/up-down-tighter-schema.rnc @@ -0,0 +1,72 @@ +# $Id$ +# Automatically generated from up-down-tighter-schema.pl + + default namespace = "http://www.apnic.net/specs/rescerts/up-down/" + + grammar { + start = element message { + attribute version { xsd:positiveInteger { maxInclusive="1" } }, + attribute sender { xsd:token { maxLength="1024" } }, + attribute recipient { xsd:token { maxLength="1024" } }, + attribute msg_ref { xsd:positiveInteger { maxInclusive="999999999999999" } }, + payload + } + + payload |= attribute type { "list" }, list_request + payload |= attribute type { "list_response"}, list_response + payload |= attribute type { "issue" }, issue_request + payload |= attribute type { "issue_response"}, issue_response + payload |= attribute type { "revoke" }, revoke_request + payload |= attribute type { "revoke_response"}, revoke_response + payload |= attribute type { "error_response"}, error_response + + list_request = empty + list_response = class* + + class = element class { + attribute class_name { xsd:token { maxLength="1024" } }, + attribute cert_url { xsd:anyURI { maxLength="1024" } }, + attribute cert_ski { xsd:token { maxLength="1024" } }, + attribute resource_set_as { xsd:string { maxLength="512000" pattern="[0-9]+(,[0-9]+)?" } }, + attribute resource_set_ipv4 { xsd:string { maxLength="512000" pattern="([0-9]+\.){3}[0-9]+/[0-9]+|([0-9]+\.){3}[0-9]+-([0-9]+\.){3}[0-9]+" } }, + attribute resource_set_ipv6 { xsd:string { maxLength="512000" } }, + attribute suggested_sia_head { xsd:string { maxLength="1024" } }?, + element certificate { + attribute cert_url { xsd:anyURI { maxLength="1024" } }, + attribute cert_ski { xsd:token { maxLength="1024" } }, + attribute cert_aki { xsd:token { maxLength="1024" } }, + attribute cert_serial { xsd:positiveInteger }, + attribute resource_set_as { xsd:string { maxLength="512000" pattern="[0-9]+(,[0-9]+)?" } }, + attribute resource_set_ipv4 { xsd:string { maxLength="512000" pattern="([0-9]+\.){3}[0-9]+/[0-9]+|([0-9]+\.){3}[0-9]+-([0-9]+\.){3}[0-9]+" } }, + attribute resource_set_ipv6 { xsd:string { maxLength="512000" } }, + attribute req_resource_set_as { xsd:string { maxLength="512000" pattern="[0-9]+(,[0-9]+)?" } }?, + attribute req_resource_set_ipv4 { xsd:string { maxLength="512000" pattern="([0-9]+\.){3}[0-9]+/[0-9]+|([0-9]+\.){3}[0-9]+-([0-9]+\.){3}[0-9]+" } }?, + attribute req_resource_set_ipv6 { xsd:string { maxLength="512000" } }?, + attribute status { "undersize" | "match" | "oversize" }, + xsd:base64Binary { maxLength="512000" } + }*, + element issuer { xsd:base64Binary { maxLength="512000" } } + } + + issue_request = element request { + attribute class_name { xsd:token { maxLength="1024" } }, + attribute req_resource_set_as { xsd:string { maxLength="512000" pattern="[0-9]+(,[0-9]+)?" } }?, + attribute req_resource_set_ipv4 { xsd:string { maxLength="512000" pattern="([0-9]+\.){3}[0-9]+/[0-9]+|([0-9]+\.){3}[0-9]+-([0-9]+\.){3}[0-9]+" } }?, + attribute req_resource_set_ipv6 { xsd:string { maxLength="512000" } }?, + xsd:base64Binary { maxLength="512000" } + } + issue_response = class + + revoke_request = revocation + revoke_response = revocation + + revocation = element key { + attribute class_name { xsd:token { maxLength="1024" } }, + attribute ski { xsd:token { maxLength="1024" } } + } + + error_response = + element status { xsd:positiveInteger { maxInclusive="999999999999999" } }, + element last_msg_processed { xsd:positiveInteger { maxInclusive="999999999999999" } }?, + element description { attribute xml:lang { xsd:language }, xsd:string { maxLength="1024" } }? + } diff --git a/scripts/up-down-tighter-schema.rng b/scripts/up-down-tighter-schema.rng new file mode 100644 index 00000000..50dbbe90 --- /dev/null +++ b/scripts/up-down-tighter-schema.rng @@ -0,0 +1,284 @@ + + + + + + + + 1 + + + + + 1024 + + + + + 1024 + + + + + 999999999999999 + + + + + + + + list + + + + + + list_response + + + + + + issue + + + + + + issue_response + + + + + + revoke + + + + + + revoke_response + + + + + + error_response + + + + + + + + + + + + + + + + 1024 + + + + + 1024 + + + + + 1024 + + + + + 512000 + [0-9]+(,[0-9]+)? + + + + + 512000 + ([0-9]+\.){3}[0-9]+/[0-9]+|([0-9]+\.){3}[0-9]+-([0-9]+\.){3}[0-9]+ + + + + + 512000 + + + + + + 1024 + + + + + + + + 1024 + + + + + 1024 + + + + + 1024 + + + + + + + + 512000 + [0-9]+(,[0-9]+)? + + + + + 512000 + ([0-9]+\.){3}[0-9]+/[0-9]+|([0-9]+\.){3}[0-9]+-([0-9]+\.){3}[0-9]+ + + + + + 512000 + + + + + + 512000 + [0-9]+(,[0-9]+)? + + + + + + + 512000 + ([0-9]+\.){3}[0-9]+/[0-9]+|([0-9]+\.){3}[0-9]+-([0-9]+\.){3}[0-9]+ + + + + + + + 512000 + + + + + + undersize + match + oversize + + + + 512000 + + + + + + 512000 + + + + + + + + + 1024 + + + + + + 512000 + [0-9]+(,[0-9]+)? + + + + + + + 512000 + ([0-9]+\.){3}[0-9]+/[0-9]+|([0-9]+\.){3}[0-9]+-([0-9]+\.){3}[0-9]+ + + + + + + + 512000 + + + + + 512000 + + + + + + + + + + + + + + + + + 1024 + + + + + 1024 + + + + + + + + 999999999999999 + + + + + + 999999999999999 + + + + + + + + + + 1024 + + + + + -- cgit v1.2.3