Skip to content

Commit

Permalink
Merge pull request #123 from ansibleguy/docs-config-attrs
Browse files Browse the repository at this point in the history
Document Config-Attributes
  • Loading branch information
ansibleguy authored Dec 8, 2024
2 parents 27efb52 + c20f2fd commit 5955386
Show file tree
Hide file tree
Showing 81 changed files with 376 additions and 177 deletions.
433 changes: 363 additions & 70 deletions docs/source/usage/4_develop.rst

Large diffs are not rendered by default.

2 changes: 2 additions & 0 deletions meta/runtime.yml
Original file line number Diff line number Diff line change
Expand Up @@ -195,3 +195,5 @@ plugin_routing:
redirect: ansibleguy.opnsense.dhcrelay_relay
dhcrelay_dst:
redirect: ansibleguy.opnsense.dhcrelay_destination
unbound_domain:
redirect: ansibleguy.opnsense.unbound_forward
9 changes: 8 additions & 1 deletion plugins/module_utils/base/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ class Base:
ATTR_FIELD_ALL = 'FIELDS_ALL'
ATTR_FIELD_CH = 'FIELDS_CHANGE'
ATTR_REL_CONT = 'API_CONT_REL'
ATTR_REL_CMD = 'API_CMD_REL'
ATTR_GET_CONT = 'API_CONT_GET'
ATTR_GET_MOD = 'API_MOD_GET'
ATTR_API_MOD = 'API_MOD'
Expand All @@ -41,6 +42,7 @@ class Base:
ATTR_TYPING = 'FIELDS_TYPING'
ATTR_FIELD_ID = 'FIELD_ID' # field we use for matching
ATTR_FIELD_PK = 'FIELD_PK' # field opnsense uses as primary key
ATTR_CMDS = 'CMDS'
PARAM_MATCH_FIELDS = 'match_fields'
QUERY_MAX_ENTRIES = 1000
VALUE_NO_LOG = 'VALUE_SPECIFIED_IN_NO_LOG_PARAMETER'
Expand All @@ -52,6 +54,7 @@ class Base:
ATTR_API_CONT,
ATTR_FIELD_ALL,
ATTR_FIELD_CH,
ATTR_CMDS,
]

def __init__(self, instance):
Expand Down Expand Up @@ -339,15 +342,19 @@ def delete(self) -> dict:
def reload(self) -> dict:
# reload the running config
cont_rel = self.i.API_CONT
cmd_rel = 'reconfigure'

if hasattr(self.i, self.ATTR_REL_CONT):
cont_rel = getattr(self.i, self.ATTR_REL_CONT)

if hasattr(self.i, self.ATTR_REL_CMD):
cmd_rel = getattr(self.i, self.ATTR_REL_CMD)

if not self.i.m.check_mode:
return self._api_post({
'module': self.i.API_MOD,
'controller': cont_rel,
'command': self.i.API_CMD_REL,
'command': cmd_rel,
'params': []
})

Expand Down
22 changes: 0 additions & 22 deletions plugins/module_utils/main/_tmpl.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
from ansible.module_utils.basic import AnsibleModule

from ansible_collections.ansibleguy.opnsense.plugins.module_utils.base.handler import \
ModuleSoftError
from ansible_collections.ansibleguy.opnsense.plugins.module_utils.base.api import \
Session
from ansible_collections.ansibleguy.opnsense.plugins.module_utils.helper.main import \
Expand All @@ -22,7 +20,6 @@ class TMPL(BaseModule):
API_MOD = 'API_Module'
API_CONT = 'API_Controller'
API_CONT_REL = 'API_Controller_reload' # if other
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = []
FIELDS_ALL = ['enabled']
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down Expand Up @@ -65,22 +62,3 @@ def check(self) -> None:
if not self.exists and self.p['state'] == 'present':
if is_unset(self.p['value']):
self.m.fail_json('You need to provide values to create stuff!')

def _error(self, msg: str) -> None:
# for special handling of errors
if self.fail:
self.m.fail_json(msg)

else:
self.m.warn(msg)
raise ModuleSoftError

# @staticmethod
# def _simplify_existing(stuff: dict) -> dict:
# return {
# 'enabled': is_true(stuff['enabled']),
# 'description': stuff['description'],
# 'uuid': stuff['uuid'],
# 'param1': stuff['param1'],
# 'param2': stuff['param2'],
# }
1 change: 0 additions & 1 deletion plugins/module_utils/main/alias.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ class Alias(BaseModule):
API_KEY_PATH = 'alias.aliases.alias'
API_MOD = 'firewall'
API_CONT = 'alias'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['content', 'description']
FIELDS_ALL = ['name', 'type', 'enabled']
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/bind_acl.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class Acl(BaseModule):
API_MOD = 'bind'
API_CONT = 'acl'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['networks']
FIELDS_ALL = ['enabled', FIELD_ID]
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/bind_blocklist.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ class Blocklist(GeneralModule):
API_MOD = 'bind'
API_CONT = 'dnsbl'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'safe_google', 'safe_duckduckgo', 'safe_youtube', 'safe_bing',
'exclude', 'block', 'enabled',
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/bind_domain.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class Domain(BaseModule):
API_MOD = 'bind'
API_CONT = 'domain'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'mode', 'primary', 'transfer_key_algo', 'transfer_key_name', 'transfer_key',
'allow_notify', 'transfer_acl', 'query_acl', 'ttl', 'refresh', 'retry',
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/bind_general.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ class General(GeneralModule):
API_MOD = 'bind'
API_CONT = 'general'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'ipv6', 'response_policy_zones', 'port', 'listen_ipv4', 'listen_ipv6',
'query_source_ipv4', 'query_source_ipv6', 'transfer_source_ipv4', 'transfer_source_ipv6',
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/bind_record.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class Record(BaseModule):
API_MOD = 'bind'
API_CONT = 'record'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['value']
FIELDS_ALL = ['domain', 'name', 'type', 'enabled']
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/cron.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class CronJob(BaseModule):
API_MOD = 'cron'
API_CONT = 'settings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'minutes', 'hours', 'days', 'months',
'weekdays', 'command', 'who', 'parameters'
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/dhcp_controlagent.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ class ControlAgent(GeneralModule):
API_MOD = 'kea'
API_CONT = 'ctrl_agent'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'enabled', 'http_host', 'http_port'
]
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/dhcp_reservation_v4.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class ReservationV4(BaseModule):
API_MOD = 'kea'
API_CONT = 'dhcpv4'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'mac', 'hostname', 'description', 'subnet'
]
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/dhcrelay_destination.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class DhcRelayDestination(BaseModule):
API_MOD = 'dhcrelay'
API_CONT = 'settings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['server']
FIELDS_ALL = [FIELD_ID]
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/dhcrelay_relay.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class DhcRelayRelay(BaseModule):
API_MOD = 'dhcrelay'
API_CONT = 'settings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['destination', 'agent_info']
FIELDS_ALL = [FIELD_ID, 'enabled']
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_bgp_as_path.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class AsPath(BaseModule):
API_MOD = 'quagga'
API_CONT = 'bgp'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['number', 'action', 'as_pattern']
FIELDS_ALL = [FIELD_ID, 'enabled']
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_bgp_community_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class Community(BaseModule):
API_MOD = 'quagga'
API_CONT = 'bgp'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['number', 'seq', 'action', 'community']
FIELDS_ALL = [FIELD_ID, 'enabled']
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_bgp_general.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ class General(GeneralModule):
API_MOD = 'quagga'
API_CONT = 'bgp'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'as_number', 'id', 'graceful', 'enabled', 'networks',
'redistribute',
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_bgp_neighbor.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ class Neighbor(BaseModule):
API_MOD = 'quagga'
API_CONT = 'bgp'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'ip', 'as_number', 'password', 'weight', 'local_ip', 'source_int',
'ipv6_link_local_int', 'next_hop_self', 'next_hop_self_all',
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_bgp_prefix_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ class Prefix(BaseModule):
API_MOD = 'quagga'
API_CONT = 'bgp'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['network', 'description', 'version', 'action']
FIELDS_MATCH = ['seq', 'name']
FIELDS_ALL = ['enabled']
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_bgp_route_map.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class RouteMap(BaseModule):
API_MOD = 'quagga'
API_CONT = 'bgp'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'action', 'description', 'id', 'as_path_list', 'prefix_list',
'community_list', 'set',
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_general.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ class General(GeneralModule):
API_MOD = 'quagga'
API_CONT = 'general'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'enabled', 'profile', 'carp', 'log', 'snmp_agentx', 'log_level',
]
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_ospf3_general.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ class General(GeneralModule):
API_MOD = 'quagga'
API_CONT = 'ospf6settings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'carp', 'id', 'enabled', 'redistribute',
]
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_ospf3_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ class Interface(BaseModule):
API_MOD = 'quagga'
API_CONT = 'ospf6settings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'interface', 'area', 'passive', 'cost', 'cost_demoted', 'carp_depend_on',
'hello_interval', 'dead_interval', 'retransmit_interval', 'transmit_delay',
Expand Down
2 changes: 0 additions & 2 deletions plugins/module_utils/main/frr_ospf_general.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ class General(GeneralModule):
API_MOD = 'quagga'
API_CONT = 'ospfsettings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'carp', 'id', 'cost', 'enabled', 'passive_ints', 'redistribute',
'redistribute_map', 'originate', 'originate_always', 'originate_metric',
Expand All @@ -35,7 +34,6 @@ class General(GeneralModule):
'select': ['redistribute_map'],
'int': ['originate_metric', 'cost'],
}
FIELDS_IGNORE = ['prefixlists', 'routemaps', 'networks', 'interfaces']
INT_VALIDATIONS = {
'cost': {'min': 1, 'max': 4294967},
'originate_metric': {'min': 0, 'max': 16777214},
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_ospf_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ class Interface(BaseModule):
API_MOD = 'quagga'
API_CONT = 'ospfsettings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'interface', 'area', 'auth_type', 'auth_key', 'auth_key_id', 'cost',
'hello_interval', 'dead_interval', 'retransmit_interval', 'transmit_delay',
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_ospf_network.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ class Network(BaseModule):
API_MOD = 'quagga'
API_CONT = 'ospfsettings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['ip', 'mask', 'area', 'area_range', 'prefix_list_in', 'prefix_list_out']
FIELDS_ALL = ['enabled']
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_ospf_prefix_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class Prefix(BaseModule):
API_MOD = 'quagga'
API_CONT = 'ospfsettings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['seq', 'action', 'network']
FIELDS_ALL = [FIELD_ID, 'enabled']
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_ospf_route_map.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ class RouteMap(BaseModule):
API_MOD = 'quagga'
API_CONT = 'ospfsettings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['action', 'id', 'prefix_list', 'set']
FIELDS_ALL = [FIELD_ID, 'enabled']
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/frr_rip.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ class Rip(GeneralModule):
API_MOD = 'quagga'
API_CONT = 'rip'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'version', 'metric', 'passive_ints', 'enabled', 'networks',
'redistribute',
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class Gw(BaseModule):
API_KEY_PATH = 'gateways.gateway_item'
API_MOD = 'routing'
API_CONT = 'settings'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'name', 'interface', 'gateway', 'default_gw', 'far_gw', 'monitor_disable', 'monitor_noroute', 'monitor',
'force_down', 'priority', 'weight', 'latency_low', 'latency_high', 'loss_low', 'loss_high', 'interval',
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/ids_general.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ class General(GeneralModule):
API_MOD = 'ids'
API_CONT = 'settings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'block', 'promiscuous', 'enabled', 'interfaces', 'pattern_matcher', 'local_networks', 'default_packet_size',
'syslog_alerts', 'syslog_output', 'log_level', 'log_rotate', 'log_retention', 'log_payload',
Expand Down
2 changes: 0 additions & 2 deletions plugins/module_utils/main/ids_policy.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,6 @@ class Policy(BaseModule):
API_MOD = 'ids'
API_CONT = 'settings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['priority', 'action', 'rulesets', 'new_action']
FIELDS_ALL = ['enabled', FIELD_ID]
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand All @@ -39,7 +38,6 @@ class Policy(BaseModule):
'list': ['rulesets', 'action'],
'int': ['priority'],
}
FIELDS_IGNORE = ['content']
EXIST_ATTR = 'policy'
QUERY_MAX_RULES = 5000

Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/ids_policy_rule.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ class Rule(BaseModule):
API_MOD = 'ids'
API_CONT = 'settings'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['action']
FIELDS_ALL = ['enabled', FIELD_ID]
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/interface_lagg.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ class Lagg(BaseModule):
API_KEY_PATH = 'lagg.lagg'
API_MOD = 'interfaces'
API_CONT = 'lagg_settings'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'members', 'primary_member', 'proto', 'lacp_fast_timeout', 'use_flowid',
'lagghash', 'lacp_strict', 'mtu', 'description'
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/interface_loopback.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@ class Loopback(BaseModule):
API_KEY_PATH = 'loopback.loopback'
API_MOD = 'interfaces'
API_CONT = 'loopback_settings'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = []
FIELDS_ALL = [FIELD_ID]
FIELDS_TYPING = {}
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/interface_vip.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ class Vip(BaseModule):
API_KEY_PATH = 'vip.vip'
API_MOD = 'interfaces'
API_CONT = 'vip_settings'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'address', 'mode', 'expand', 'bind', 'gateway', 'password', 'vhid',
'advertising_base', 'advertising_skew', 'description', 'interface',
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/interface_vlan.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ class Vlan(BaseModule):
API_KEY_PATH = 'vlan.vlan'
API_MOD = 'interfaces'
API_CONT = 'vlan_settings'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['interface', 'vlan', 'priority', 'device']
FIELDS_ALL = [FIELD_ID]
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/interface_vxlan.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ class Vxlan(BaseModule):
API_KEY_PATH = 'vxlan.vxlan'
API_MOD = 'interfaces'
API_CONT = 'vxlan_settings'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = ['interface', 'local', 'remote', 'group']
FIELDS_ALL = [FIELD_ID]
FIELDS_ALL.extend(FIELDS_CHANGE)
Expand Down
1 change: 0 additions & 1 deletion plugins/module_utils/main/ipsec_auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ class BaseAuth(BaseModule):
API_MOD = 'ipsec'
API_CONT = 'connections'
API_CONT_REL = 'service'
API_CMD_REL = 'reconfigure'
FIELDS_CHANGE = [
'connection', 'round', 'authentication', 'id', 'eap_id', 'certificates',
'public_keys',
Expand Down
Loading

0 comments on commit 5955386

Please sign in to comment.