This CLI uses mreg_api for data models and API operations, with presentation logic handled by standalone output functions in mreg_cli.output.
mreg_cli/
├── output/ # Presentation logic
│ ├── __init__.py # Re-exports all output functions
│ ├── base.py # Shared utilities (timestamps, TTL)
│ ├── zone.py # Zone, delegation, nameserver output
│ ├── host.py # Host, IP, CNAME, TXT, MX, SRV, etc.
│ ├── network.py # Network, community, policy output
│ ├── policy.py # Role, atom, label, permission output
│ ├── group.py # HostGroup output
│ └── meta.py # UserInfo, ServerVersion, HealthInfo
│
├── commands/ # Command handlers (use mreg_api.models + mreg_cli.output)
│ └── ...
│
├── exceptions.py # CLI exception classes and handling functions
└── outputmanager.py # Low-level output formatting
Commands use mreg_api.models for data operations and mreg_cli.output for presentation:
# mreg_cli/commands/zone.py
from mreg_api.models import Zone
from mreg_cli.output import output_zone
def zone_info(args):
zone = Zone.get_zone_or_raise(args.name)
output_zone(zone) # Standalone functionOutput Function Reference
output_zone(zone, padding=20)- Single zoneoutput_zones(zones)- List of zonesoutput_nameservers(nameservers, padding=20)- Zone nameserversoutput_delegations(zone, padding=20)- Zone delegations
output_host(host, names=False, traverse_hostgroups=False)- Single hostoutput_hosts(hosts, names=False, traverse_hostgroups=False)- Multiple hostsoutput_hostlist(hostlist)- HostList resultoutput_ipaddresses(ips, padding=14, names=False)- IP addressesoutput_cnames(cnames, host=None, padding=14)- CNAME recordsoutput_mxs(mxs, padding=14)- MX recordsoutput_txts(txts, padding=14)- TXT recordsoutput_srvs(srvs, padding=14)- SRV recordsoutput_naptrs(naptrs, padding=14)- NAPTR recordsoutput_sshfps(sshfps, padding=14)- SSHFP recordsoutput_ptr_overrides(ptrs, padding=14)- PTR overridesoutput_hinfo(hinfo, padding=14)- HINFO recordoutput_location(loc, padding=14)- LOC recordoutput_bacnetids(bacnetids)- BACnet IDs
output_network(network, padding=25)- Single networkoutput_networks(networks, padding=25)- Multiple networksoutput_unused_addresses(network, padding=25)- Unused IPsoutput_used_addresses(network, padding=46)- Used IPs with hostsoutput_excluded_ranges(excluded_ranges, padding=32)- Excluded rangesoutput_community(community, padding=14, show_hosts=True)- Single communityoutput_communities(communities, padding=14, show_hosts=True, sort=NAME)- Multiple communitiesoutput_network_policy(policy)- Network policyoutput_network_policy_attributes(attributes, padding=20)- Policy attributes
output_role(role, padding=14)- Single roleoutput_roles(roles, padding=14)- Multiple roles (single line)output_roles_table(roles, padding=14)- Roles as tableoutput_role_hosts(role, padding=14, exclude_roles=None)- Role's hostsoutput_role_atoms(role, padding=14)- Role's atomsoutput_atom(atom, padding=14)- Single atomoutput_atoms(atoms, padding=14)- Multiple atoms (single line)output_atoms_lines(atoms, padding=20)- Atoms (one per line)output_label(label, padding=14)- Label with roles/permissionsoutput_permissions(permissions, indent=4)- Permissions table
output_hostgroup(hostgroup, padding=14)- Single hostgroupoutput_hostgroups(hostgroups, padding=14, multiline=False)- Multiple hostgroupsoutput_hostgroup_members(hostgroup, expand=False)- Group members
output_user_info(user, django=False)- User informationoutput_user_permissions(permissions)- User permissionsoutput_server_version(version)- Server versionoutput_server_libraries(libraries, indent=4)- Server librariesoutput_health_info(health)- Health information
output_timestamps(obj, padding=14)- Created/updated timestampsoutput_ttl(obj, label="TTL", field="ttl", padding=14)- TTL value
-
Circular imports: Some functions use local imports to avoid circular dependencies between output modules.
-
Type protocol mismatches:
RoleandAtomhavecreated_atas computed properties rather than direct fields, causing protocol mismatches withHasTimestamps.
Exception handling uses standalone functions in mreg_cli.exceptions.
This allows uniform handling of exceptions from both mreg_cli and mreg_api.
Exception classes in mreg_cli.exceptions are pure data containers with no output methods:
CliException (base)
├── CliError (non-recoverable errors, displayed in red)
│ ├── CreateError, PatchError, DeleteError, GetError
│ ├── InternalError, FileError, ValidationError, LoginFailedError
└── CliWarning (recoverable, displayed in italics)
├── APIError (has response attribute), UnexpectedDataError
├── EntityNotFound, EntityAlreadyExists, MultipleEntitiesFound
├── TooManyResults, NoHistoryFound, ForceMissing
└── IPNetworkWarning and subclasses
mreg_cli/cli.py- Main command parsing catches and handles exceptionsmreg_cli/main.py- Entry point handles login and REPL exceptionsmreg_cli/utilities/api.py- Authentication-related exception handling
The cache code was copied to mreg_api but has not been implemented in that module. Implementing caching should be the last priority once the final API design of both packages is clear.