08-04-2022 11:47 AM
This has to do with ncsc compile errors characters in “pattern” statements in the YANG modules. I am encountering this issue under NSO 5.7.1.1. Here is an example error message:
Warning: yang/coriant-common@2021-01-20.yang:237:29: warning: illegal character after \
This is related to the pattern statement `pattern "[A-Za-z0-9_\-/,\.]*";` which passes YANG regex and W3G validation in the following tool https://yangcatalog.org/yangre.
grouping "user-defined-alias" {
leaf "alias-name" {
type "string" {
length "0..256";
pattern "[A-Za-z0-9_\-/,\.]*";
}
description
"User defined alias for this entity. Must be an alphanumeric string with dash or underscore";
}
}
pattern "(((80|[1-7][0-9]|[1-9])(\.\.(80|[1-7][0-9]|[1-9]))?)(,((80|[1-7][0-9]|[1-9])(\.\.(80|[1-7][0-9]|[1-9]))?))*)?”;
pattern "((([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.)*([a-zA-Z0-9_]([a-zA-Z0-9\-_]){0,61})?[a-zA-Z0-9]\.?)|\.";
pattern "((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])));
pattern "((:|[0-9a-fA-F]{0,4}):)([0-9a-fA-F]{0,4}:){0,5}((([0-9a-fA-F]{0,4}:)?(:|[0-9a-fA-F]{0,4}))|(((25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9]?[0-9])))(%[\p{N}\p{L}]+)?";
pattern "(([0-1](\.[1-3]?[0-9]))|(2\.(0|([1-9]\d*))))(\.(0|([1-9]\d*)))*";
pattern "(([0-9]+(\.\.[0-9]+)?)(,([0-9]+(\.\.[0-9]+)?))*)?";
pattern "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])
pattern "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])";
pattern "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(%[\p{N}\p{L}]+)?";
pattern "(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]):(6[0-5][0-5][0-3][0-5]|[1-5][0-9]{4}|[1-9][0-9]{1,4}|[0-9])";
pattern "(([A-Za-z0-9_\-][A-Za-z0-9_\-\+]*)|(\+loc:([A-Za-z0-9]{1,})\+rmt:([A-Za-z0-9]{1,})))?";
pattern "(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(
pattern "(([^:]+:){6}(([^:]+:[^:]+)|(.*\..*)))|((([^:]+:)*[^:]+)?::(([^:]+:)*[^:]+)?)(%.+)?";
pattern "((ftp|sftp|ftps|scp|http):
pattern "(\d{2}
pattern "(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[\+\-]\d{2}:\d{2}))?";
pattern "(\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[\+\-]\d{2}:\d{2}))|(all)";
pattern ".|..|[^xX].*|.[^mM].*|..[^lL].*";
pattern "[!-~\s]*";
pattern "[0-9\.]*";
pattern "[0-9a-fA-F:\.]*";
pattern "[A-Za-z0-9][a-zA-Z0-9\-_
pattern "[A-Za-z0-9][a-zA-Z0-9\-_:\.
pattern "[A-Za-z0-9][a-zA-Z0-9\-_:\.]*";
pattern "[A-Za-z0-9_\-
pattern "[A-Za-z0-9_\-\.]*";
pattern "[^\*].*";
pattern "[a-zA-Z_][a-zA-Z0-9\-_.]*";
pattern "[a-z_.][a-z0-9_\-.]*[$]?";
pattern "\*";
pattern "\d*(\.\d*){1,127}";
pattern "\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d+)?(Z|[\+\-]\d{2}:\d{2})";
pattern "route\-origin:(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]):(6[0-5][0-5][0-3][0-5]|[1-5][0-9]{4}|[1-9][0-9]{1,4}|[0-9])";
pattern "route\-origin:(6[0-5][0-5][0-3][0-5]|[1-5][0-9]{4}|[1-9][0-9]{1,4}|[0-9]):(4[0-2][0-9][0-4][0-9][0-6][0-7][0-2][0-9][0-6]|[1-3][0-9]{9}|[1-9]([0-9]{1,7})?[0-9]|[1-9])";
pattern "route\-target:(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]):(6[0-5][0-5][0-3][0-5]|[1-5][0-9]{4}|[1-9][0-9]{1,4}|[0-9])";
pattern "route\-target:(6[0-5][0-5][0-3][0-5]|[1-5][0-9]{4}|[1-9][0-9]{1,4}|[0-9]):(4[0-2][0-9][0-4][0-9][0-6][0-7][0-2][0-9][0-6]|[1-3][0-9]{9}|[1-9]([0-9]{1,7})?[0-9]|[1-9])";
Can anyone explain why these pass YANG regex validation but fail ncsc compile?
Thank you.
08-05-2022 05:59 PM - edited 08-06-2022 01:33 AM
TLDR: You should use single quoted strings if you want to use escaping characters.
ex:
leaf alias-name {
type string {
length '0..256';
pattern '[A-Za-z0-9_\-/,\.]*';
}
}
Explanation:
On RFC6020 under the quoting section you can read:
A single-quoted string (enclosed within ' ') preserves each character within the quotes. A single quote character cannot occur in a single-quoted string, even when preceded by a backslash. Within a double-quoted string (enclosed within " "), a backslash character introduces a special character, which depends on the character that immediately follows the backslash: \n new line \t a tab character \" a double quote \\ a single backslash
So since you're using double quotes and adding a backslash, yang thinks that you're introducing a special character, but you're not, your backslash is actually an escaping character for the regex.
So, to avoid this kind of issues I would recommend you to use single quoted strings on your patterns, such as the ietf draft rfc6087bis recommends:
A single quoted string SHOULD be used to specify the pattern, since a double-quoted string can modify the content.
Hope it's clear.
César Alves
08-08-2022 02:00 PM
Thank you. That fixed my issue.
Discover and save your favorite ideas. Come back to expert answers, step-by-step guides, recent topics, and more.
New here? Get started with these tips. How to use Community New member guide