Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def v_key():
key = stmt.search_one('key')
if stmt.i_config is True and key is None:
if hasattr(stmt, 'i_uses_pos'):
err_add(ctx.errors, stmt.i_uses_pos, 'NEED_KEY_USES',
(stmt.pos))
else:
err_add(ctx.errors, stmt.pos, 'NEED_KEY', ())
stmt.i_key = []
if key is not None and key.arg is not None:
found = []
for x in key.arg.split():
if x == '':
continue
prefix, name = util.split_identifier(x)
if prefix is not None and prefix != stmt.i_module.i_prefix:
err_add(ctx.errors, key.pos, 'BAD_KEY', x)
return
ptr = util.attrsearch(name, 'arg', stmt.i_children)
if x in found:
err_add(ctx.errors, key.pos, 'DUPLICATE_KEY', x)
return
elif ptr is None or ptr.keyword != 'leaf':
err_add(ctx.errors, key.pos, 'BAD_KEY', x)
return
chk_status(ctx, ptr.parent, ptr)
type_ = ptr.search_one('type')
if stmt.i_module.i_version == '1':
if type_ is not None:
t = has_type(type_, ['empty'])
if t is not None:
uniques = stmt.search('unique')
for u in uniques:
found = []
uconfig = None
for expr in u.arg.split():
if expr == '':
continue
ptr = stmt
for x in expr.split('/'):
if x == '':
continue
if ptr.keyword not in ['container', 'list',
'choice', 'case']:
err_add(ctx.errors, u.pos, 'BAD_UNIQUE_PART', x)
return
prefix, name = util.split_identifier(x)
if prefix is not None and prefix != stmt.i_module.i_prefix:
err_add(ctx.errors, u.pos, 'BAD_UNIQUE_PART', x)
return
ptr = util.attrsearch(name, 'arg', ptr.i_children)
if ptr is None:
err_add(ctx.errors, u.pos, 'BAD_UNIQUE_PART', x)
return
if ptr.keyword == 'list':
err_add(ctx.errors, u.pos, 'BAD_UNIQUE_PART_LIST', x)
if ptr is None or ptr.keyword != 'leaf':
err_add(ctx.errors, u.pos, 'BAD_UNIQUE', expr)
return
if ptr in found:
err_add(ctx.errors, u.pos, 'DUPLICATE_UNIQUE', expr)
if hasattr(ptr, 'i_config'):
if uconfig is None:
def get_typename(s, prefix_with_modname=False):
t = s.search_one('type')
if t is not None:
if t.arg == 'leafref':
p = t.search_one('path')
if p is not None:
# Try to make the path as compact as possible.
# Remove local prefixes, and only use prefix when
# there is a module change in the path.
target = []
curprefix = s.i_module.i_prefix
for name in p.arg.split('/'):
prefix, name = util.split_identifier(name)
if prefix is None or prefix == curprefix:
target.append(name)
else:
if prefix_with_modname:
if prefix in s.i_module.i_prefixes:
# Try to map the prefix to the module name
module_name, _ = s.i_module.i_prefixes[prefix]
else:
# If we can't then fall back to the prefix
module_name = prefix
target.append(module_name + ':' + name)
else:
target.append(prefix + ':' + name)
curprefix = prefix
return "-> %s" % "/".join(target)
else:
# No prefix specified. Leave as is
return t.arg
else:
# Prefix found. Replace it with the module name
if prefix in s.i_module.i_prefixes:
# Try to map the prefix to the module name
module_name, _ = s.i_module.i_prefixes[prefix]
else:
# If we can't then fall back to the prefix
module_name = prefix
return module_name + ':' + name
else:
return t.arg
else:
if prefix_with_modname:
prefix, name = util.split_identifier(t.arg)
if prefix is None:
# No prefix specified. Leave as is
return t.arg
else:
# Prefix found. Replace it with the module name
if prefix in s.i_module.i_prefixes:
# Try to map the prefix to the module name
module_name, _ = s.i_module.i_prefixes[prefix]
else:
# If we can't then fall back to the prefix
module_name = prefix
return module_name + ':' + name
else:
return t.arg
elif s.keyword == 'anydata':
return ''
# Try to map the prefix to the module name
module_name, _ = s.i_module.i_prefixes[prefix]
else:
# If we can't then fall back to the prefix
module_name = prefix
target.append(module_name + ':' + name)
else:
target.append(prefix + ':' + name)
curprefix = prefix
return "-> %s" % "/".join(target)
else:
# This should never be reached. Path MUST be present for
# leafref type. See RFC6020 section 9.9.2
# (https://tools.ietf.org/html/rfc6020#section-9.9.2)
if prefix_with_modname:
prefix, name = util.split_identifier(t.arg)
if prefix is None:
# No prefix specified. Leave as is
return t.arg
else:
# Prefix found. Replace it with the module name
if prefix in s.i_module.i_prefixes:
# Try to map the prefix to the module name
module_name, _ = s.i_module.i_prefixes[prefix]
else:
# If we can't then fall back to the prefix
module_name = prefix
return module_name + ':' + name
else:
return t.arg
else:
if prefix_with_modname:
def v_type_type(ctx, stmt):
if hasattr(stmt, 'i_is_validated'):
# already validated
return
# set statement-specific variables
stmt.i_is_validated = True
stmt.i_is_derived = False
stmt.i_type_spec = None
stmt.i_typedef = None
# Find the base type_spec
prefix, name = util.split_identifier(stmt.arg)
if prefix is None or stmt.i_module.i_prefix == prefix:
# check local typedefs
stmt.i_typedef = search_typedef(stmt, name)
if stmt.i_typedef is None:
# check built-in types
try:
stmt.i_type_spec = types.yang_type_specs[name]
except KeyError:
err_add(ctx.errors, stmt.pos,
'TYPE_NOT_FOUND', (name, stmt.i_module.arg))
return
else:
# ensure the typedef is validated
if stmt.i_typedef.is_grammatically_valid is True:
v_type_typedef(ctx, stmt.i_typedef)
def has_feature(name):
# raises Abort if the feature is not defined
# returns True if we compile with the feature
# returns False if we compile without the feature
found = None
prefix, name = util.split_identifier(name)
if prefix is None or stmt.i_module.i_prefix == prefix:
# check local features
pmodule = stmt.i_module
else:
# this is a prefixed name, check the imported modules
pmodule = util.prefix_to_module(
stmt.i_module, prefix, stmt.pos, ctx.errors)
if pmodule is None:
raise Abort
if name in pmodule.i_features:
f = pmodule.i_features[name]
if prefix is None and not is_submodule_included(stmt, f):
pass
else:
found = pmodule.i_features[name]
chk_status(ctx, stmt.parent, found)
def v_type_uses(ctx, stmt, no_error_report=False):
# Find the grouping
prefix, name = util.split_identifier(stmt.arg)
if hasattr(stmt, 'i_grouping'):
if stmt.i_grouping is None and no_error_report is False:
if prefix is None or stmt.i_module.i_prefix == prefix:
# check local groupings
pmodule = stmt.i_module
else:
pmodule = util.prefix_to_module(
stmt.i_module, prefix, stmt.pos, ctx.errors)
if pmodule is None:
return
err_add(ctx.errors, stmt.pos,
'GROUPING_NOT_FOUND', (name, pmodule.arg))
return
stmt.i_grouping = None