Skip to content

Instantly share code, notes, and snippets.

@derhuerst
Last active April 22, 2023 12:42
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save derhuerst/7ac3a5edb9e32a8eb066a4a79da63833 to your computer and use it in GitHub Desktop.
Save derhuerst/7ac3a5edb9e32a8eb066a4a79da63833 to your computer and use it in GitHub Desktop.
VIAS RE 19 to Düsseldorf, unwired.at captive portal requests
POST /api/graphql HTTP/1.1
Host: wasabi-splashpage.wifi.unwired.at
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0
Accept: */*
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://wasabi-splashpage.wifi.unwired.at/internet
content-type: application/json
Origin: https://wasabi-splashpage.wifi.unwired.at
Content-Length: 484
DNT: 1
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Pragma: no-cache
Cache-Control: no-cache
{
"operationName": "online_status",
"variables": {
"user_session_id": "b6cc0660-f7af-11ec-a82e-5afd9165e965",
"language": "en"
},
"query": "query online_status($user_session_id: ID!, $language: String!) {\n online_status: splashpage(\n user_session_id: $user_session_id\n language: $language\n ) {\n error {\n ...Error\n __typename\n }\n online\n user_session_id\n __typename\n }\n}\n\nfragment Error on Error {\n error_code\n error_message\n __typename\n}"
}
HTTP/2 200 OK
access-control-allow-origin: *
content-type: application/json; charset=utf-8
date: Wed, 29 Jun 2022 14:05:34 GMT
etag: W/"93-HPVVc/ETWAzzrjBd5xWEICXScVs"
vary: Accept-Encoding, Accept-Encoding
x-powered-by: Express
content-length: 147
X-Firefox-Spdy: h2
{
"data": {
"online_status": {
"error": null,
"online": true,
"user_session_id": "b6cc0660-f7af-11ec-a82e-5afd9165e965",
"__typename": "SplashpageResponse"
}
}
}
POST /api/graphql HTTP/1.1
Host: wasabi-splashpage.wifi.unwired.at
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:101.0) Gecko/20100101 Firefox/101.0
Accept: */*
Accept-Language: en-GB,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://wasabi-splashpage.wifi.unwired.at/internet
content-type: application/json
Origin: https://wasabi-splashpage.wifi.unwired.at
Content-Length: 1332
DNT: 1
Connection: keep-alive
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Pragma: no-cache
Cache-Control: no-cache
{
"operationName": "session_info",
"variables": {
"user_session_id": "b6cc0660-f7af-11ec-a82e-5afd9165e965",
"language": "en"
},
"query": "query session_info($user_session_id: ID!, $language: String!) {\n session_info: splashpage(user_session_id: $user_session_id, language: $language) {\n error {\n ...Error\n __typename\n }\n connected\n online\n policy_violation {\n ...PolicyViolationError\n __typename\n }\n user_session_info {\n ...UserSessionInfo\n __typename\n }\n __typename\n }\n}\n\nfragment Error on Error {\n error_code\n error_message\n __typename\n}\n\nfragment UserSessionInfo on UserSessionInfo {\n client_mac\n ap_mac\n ap_name\n user_session_id\n sync_user_session_id\n time_start\n state\n network_user_policy {\n network_user_policy_id\n max_mbytes_down\n max_mbytes_up\n daily_max_mbytes_down\n daily_max_mbytes_up\n max_bandwidth_down\n max_bandwidth_up\n max_pause_time\n accounting_interval\n timeout_session\n daily_max_session_time\n timeout_idle\n __typename\n }\n mbytes_down\n mbytes_up\n session_time\n __typename\n}\n\nfragment PolicyViolationError on Error {\n error_code\n error_message\n current_value_bytes\n max_value_bytes\n current_value_seconds\n max_value_seconds\n __typename\n}"
}
HTTP/2 200 OK
access-control-allow-origin: *
content-type: application/json; charset=utf-8
date: Wed, 29 Jun 2022 14:05:34 GMT
etag: W/"327-1WHMiOJ86UMUZ341AigYBoZdb5o"
vary: Accept-Encoding, Accept-Encoding
x-powered-by: Express
content-length: 807
X-Firefox-Spdy: h2
{
"data": {
"session_info": {
"error": null,
"connected": true,
"online": true,
"policy_violation": null,
"user_session_info": {
"client_mac": "0003FF0E2A5E",
"ap_mac": "00112B02C196",
"ap_name": "2302 R2",
"user_session_id": "b6cc0660-f7af-11ec-a82e-5afd9165e965",
"sync_user_session_id": null,
"time_start": "2022-06-29T13:30:59.980Z",
"state": "internet",
"network_user_policy": {
"network_user_policy_id": "Abellio",
"max_mbytes_down": 0,
"max_mbytes_up": 0,
"daily_max_mbytes_down": 500,
"daily_max_mbytes_up": 500,
"max_bandwidth_down": 5242,
"max_bandwidth_up": 3145,
"max_pause_time": 14400,
"accounting_interval": 480,
"timeout_session": 14400,
"daily_max_session_time": 0,
"timeout_idle": 600,
"__typename": "NetworkUserPolicy"
},
"mbytes_down": 34.7,
"mbytes_up": 5.3,
"session_time": 1971,
"__typename": "UserSessionInfo"
},
"__typename": "SplashpageResponse"
}
}
}
type ActivateUserSessionResponse implements Response {
ap_mac: String
error: Error
policy: Policy
state: String
time_start: DateTime
user_session_id: ID
}
input AdminLogInput {
data: String
error_code: String
level: LogLevel!
message: String!
}
type Anchor {
id: ID
label: String
label_lang: [Translatable]
slug: String
}
input AnchorInput {
id: ID
label: [TranslatableInput]
slug: String
}
enum AuthType {
BASIC
NONE
}
enum AuthzPermission {
authz_admin_create
authz_apikey_edit
authz_customer_edit
authz_customer_view
authz_group_edit
authz_user_authoritive
authz_user_edit
authz_user_list
}
type Authz_AdminUser {
email: String!
firstname: String!
lastname: String!
user_id: ID!
}
scalar Authz_AdminUserID
input Authz_AdminUserSearchParams_Input {
email: String
firstname: String
lastname: String
}
type Authz_AdminUsersResponse {
admin_users: [Authz_AdminUser!]!
count: Int!
}
type Authz_Apikey {
apikey_id: ID!
date_created: DateTime!
key_data: String
name: String!
}
scalar Authz_ApikeyID
input Authz_CreateAdminUser_Input {
email: String!
firstname: String!
lastname: String!
}
type Authz_Customer {
customer_id: ID!
name: String!
}
scalar Authz_CustomerID
type Authz_CustomerPermissions {
customer_id: ID
permissions: [String!]!
}
input Authz_CustomerSearchParams_Input {
customer_id: ID
name: String
}
input Authz_Customer_Input {
name: String!
}
input Authz_EditAdminUser_Input {
email: String!
firstname: String!
lastname: String!
}
# a list of Authz API error codes
enum Authz_ErrorCodes {
BAD_INPUT_ERROR
EMAIL_NOT_VERIFIED
ERROR_GENERIC
INTERNAL_SERVER_ERROR
NOT_AUTHORIZED
NOT_AUTHORIZED_NO_CUSTOMER_RELATION
}
enum Authz_ID_Type {
apikey_id
customer_id
group_id
invite_id
}
type Authz_IdStatus {
id: ID!
status: Boolean!
}
type Authz_Invite {
customer_id: Authz_CustomerID!
email: String!
invite_id: Authz_InviteID!
roles: [Authz_RoleName!]!
token_expiration: DateTime!
}
scalar Authz_InviteID
type Authz_LoggedInUserData {
email: String!
firstname: String!
lastname: String!
ui_settings: SimpleJSON!
user_id: ID!
verify_email_until: DateTime
}
type Authz_LoginResponse {
token: String!
}
type Authz_PolicyApikey {
apikey_id: Authz_ApikeyID!
customer_id: Authz_CustomerID
role: Authz_RoleName!
}
type Authz_PolicyUser {
customer_id: Authz_CustomerID
role: Authz_RoleName!
user_id: Authz_AdminUserID!
}
scalar Authz_RoleName
# The `BigInt` scalar type represents non-fractional signed whole numeric values. BigInt can represent values between -(2^53) + 1 and 2^53 - 1.
scalar BigInt
# represents 52-bit long signed integers.
scalar Bigint
type CampaignWidget implements Widget {
date_created: DateTime!
date_updated: DateTime!
page_id: ID!
position: Int!
widget_id: ID!
}
input CampaignWidgetInput {
page_id: ID!
}
type ClientInfoResponse implements Response {
connected: Boolean
error: Error
policy: Policy
user_session_id: ID
}
input ConnectInput {
cause: String!
email: String!
first_name: String
last_name: String
source: String!
}
input ConnectMetaDataInput {
confirmation: Boolean
data_retention_seconds: Int
delay: Int
email_cid: String
require_sms_auth: Boolean
snippet_keys: ConnectSnippetsInput
variant: String
}
type ConnectSnippets {
button_text: String
connected_text: String
store_terms: String
terms_of_service: String
}
input ConnectSnippetsInput {
button_text: String
connected_text: String
store_terms: String
terms_of_service: String
}
type ConnectWidget implements Widget {
anchor: Anchor
button_text: String
confirmation: Boolean
connected_text: String
date_created: DateTime!
date_updated: DateTime!
delay: Int
email_mandatory: Boolean
enable_anchor: Boolean
meta_data: ConnectWidgetMetaData
page_id: ID!
position: Int!
require_sms_auth: Boolean
store_terms: String
store_terms_lang: [Translatable]
terms_of_service: String
variant: String
widget_id: ID!
}
input ConnectWidgetInput {
anchor: AnchorInput
confirmation: Boolean
delay: Int
email_mandatory: Boolean
enable_anchor: Boolean
meta_data: ConnectMetaDataInput
page_id: ID
require_sms_auth: Boolean
store_terms: [TranslatableInput]
variant: String
}
type ConnectWidgetMetaData {
confirmation: Boolean
data_retention_seconds: Int
delay: Int
email_cid: String
require_sms_auth: Boolean
snippet_keys: ConnectSnippets
variant: String
}
scalar ConstraintNumber
scalar ConstraintString
type CopiedResourceIds {
new_resource_id: String
orig_resource_id: String!
}
type CopyResourcesResponse implements Response {
copied_resource_ids: [CopiedResourceIds]
error: Error
}
type CustomOption {
email: String
id: ID
option_key: String
text: String
text_lang: [Translatable]
}
input CustomOptionInput {
email: String
id: ID
option_key: String
text: [TranslatableInput]
}
type Customer {
customer_id: ID!
groups: [Group]
name: String!
}
enum DMPermission {
dm_appliance_viewInternal
dm_auditlog_list
dm_auditlog_view
dm_customer_view
dm_devAccess
dm_devicepassword_view
dm_firmwareversion_edit
dm_firmwareversion_view
dm_group_edit
dm_group_view
dm_mtsg_view
dm_node_edit
dm_node_list
dm_node_view
dm_nodeservice_edit
dm_nodeservice_list
dm_nodeservice_view
dm_nodeserviceinstance_edit
dm_nodeserviceinstance_list
dm_nodeserviceinstance_view
dm_nodetype_edit
dm_nodetype_view
dm_rollout_edit
}
# appliance (= stargate)
#
# NOTES:
# - this is only used for UI visualization
# - all other properties are left out by design, because they are not relevant to the UI
type DM_Appliance {
active: Boolean!
appliance_id: ID!
mac: DM_Mac!
name: String!
}
# represents an ID which identifies a traffic exit point, aka appliance.
scalar DM_ApplianceID
type DM_AuditLogEvent implements DM_LogEvent {
audit_log_type: DM_AuditLogType!
event_name: String!
identity_name: String!
log_id: ID!
timestamp: DateTime!
}
type DM_AuditLogEventDetails implements DM_LogEvent {
event_data: String
log_id: ID!
timestamp: DateTime!
}
enum DM_AuditLogType {
group
node
}
# allows to specify which parts of an object to copy
#
# NOTE:
# - fields that are not null and true will result in data being copied
input DM_CopyConfigurationSelector_Input {
# copy hardware settings like power and channel per interface, only applies to devices
copy_hardware_radio_settings: Boolean
copy_node_accesses: Boolean
copy_node_location: Boolean
copy_node_networks: Boolean
copy_node_profile: Boolean
}
scalar DM_CountryCode
# represents an ID which identifies a customer of Unwired GmbH
scalar DM_CustomerID
# this is a device, it is a DM_Node
type DM_Device implements DM_Node {
accesses: [DM_NodeAccess!]!
ap_type: String
config_changed: DateTime!
created_at: DateTime!
deleted: Boolean!
firmware_version: String
gpio_configs: [DM_GPIOPortConfig!]!
group: DM_Group!
group_id: ID!
hardware: [DM_NodeHardware!]!
# timestamp of last heartbeat
last_heartbeat: DateTime
# timestamp of last config update
last_update: DateTime
# load string from linux
load: String
# local ipv4 gateway address
local_ipv4_gateway_address: DM_IPv4Address
# local ipv4 ip address
local_ipv4_ip_address: DM_IPv4Address
location: DM_NodeLocation
# unique identifier for enabled devices, and only for devices
# The mac syntax is always 12 all-uppercase hex digits.
mac: DM_Mac
name: String!
networks: [DM_NodeNetwork!]!
node_id: ID!
node_service_instances: [DM_NodeServiceInstance!]!
node_type: DM_NodeType!
node_type_id: ID!
online_status: DM_NodeOnlineStatus!
online_status_changed: DateTime!
profile: DM_NodeProfile!
rollout_end: DM_Time
rollout_start: DM_Time
rollout_state: DM_RolloutState!
rollout_timestamp_deploy: DateTime
rollout_timestamp_result: DateTime
rollout_version_last_good: String
status: DM_NodeStatus!
update_config: Boolean!
uplinks: [DM_NodeUplink!]!
# uptime in seconds
uptime: Int
use_default: Boolean!
# version_target_selector: tag or branch of the firmware to follow examples: "branch:19.07", "version:19.07-80", "tag:stable" defaults to node_type.version_target_selector
version_target_selector: String
}
type DM_DeviceCredentials {
password: String!
password_changed: DateTime!
}
# event types related to devices
enum DM_DeviceEventType {
device_offline
device_online
}
# describes the source of the heartbeat event
enum DM_DeviceHeartbeatSource {
device_3rdparty
firmware
openvpn
}
type DM_DeviceMgmtTunnelResponse {
changed: DateTime!
node_id: DM_NodeID!
openvpn: String!
}
# this is the device rollout work item to process a firmware update
type DM_DeviceRolloutWorkItem {
firmware_version: String!
mac: DM_Mac!
node_id: DM_NodeID!
online_status: DM_NodeOnlineStatus!
rollout_state: DM_RolloutState!
rollout_timestamp_deploy: DateTime
rollout_timestamp_result: DateTime
rollout_version_lastGood: String
selected_target_version: String!
version_target_selector: String!
}
input DM_Device_BaseConfig_Input {
gpio_configs: [DM_GPIOPortConfig_Input!]
location: DM_NodeLocation_Input!
mac: DM_Mac!
name: String!
node_id: DM_NodeID!
# this field is ignored internally and optional for merely for compatibility reasons. soon to be removed.
node_type_id: DM_NodeTypeID
profile: DM_NodeProfile!
radio_settings: [DM_NodeHardwareRadioSettings_Input!]
status: DM_NodeStatus!
use_default: Boolean!
}
input DM_Device_Input {
# location information for nodes defines the physical position of the node and a comment
#
# NOTE:
# - for this input type a location input with its required properties must be provided
location: DM_NodeLocation_Input!
# mac may be null when status is set to 'planning'
mac: DM_Mac
name: String!
node_type_id: ID!
parent_group_id: ID!
status: DM_NodeStatus!
use_default: Boolean!
}
input DM_Devices_Input {
devices: [DM_Device_Input!]!
}
# represents the elapsed time between two instants, e.g. 72h3m0.5s.
# The format is defined by the `ParseDuration` function of the go `time.Duration` datatype.
#
# See the go documentation of the [time.Duration](https://pkg.go.dev/time#ParseDuration) data type for further information.
scalar DM_Duration
# the main error type
#
# NOTE:
# - the error_message is meant for technical log output
# - the error_code should be used by consumer code to show UIs or make decisions based on specific
# error scenarios
type DM_Error {
error_code: DM_ErrorCodes
error_message: String
}
# a list of DM API error codes
enum DM_ErrorCodes {
BAD_INPUT_ERROR
DEVICE_REGENERATION_FAILED
ERROR_GENERIC
INTERNAL_SERVER_ERROR
NOT_AUTHORIZED
NOT_FOUND_AP_MAC
}
# this is a Firmware version identified by a branch name and a build number
type DM_FirmwareVersion {
branch: String!
build: Int!
tag: String
}
# Configuration for the digital input and outputs for a device. The name marks a specific port and must match a given port from the device type.
# Missing configs are equally treated as a port config with mode disabled.
type DM_GPIOPortConfig {
mode: DM_GPIOPortMode!
name: String!
}
# Configuration for the digital input and outputs for a device. The name marks a specific port and must match a given port from the device type.
# Missing configs are equally treated as a port config with mode disabled.
input DM_GPIOPortConfig_Input {
mode: DM_GPIOPortMode!
name: String!
}
enum DM_GPIOPortMode {
disabled
running
selftest
}
# a group, can have a parent
type DM_Group {
default_config: ID!
deleted: Boolean!
group_id: ID!
name: String!
parent_id: ID
}
# this is the group config object, it is a DM_Node
type DM_GroupConfig implements DM_Node {
accesses: [DM_NodeAccess!]!
config_changed: DateTime!
created_at: DateTime!
group: DM_Group!
group_id: ID!
group_service_instances: [DM_GroupServiceInstance!]!
hardware: [DM_NodeHardware!]!
location: DM_NodeLocation
name: String!
networks: [DM_NodeNetwork!]!
node_id: ID!
node_type: DM_NodeType!
node_type_id: ID!
profile: DM_NodeProfile!
rollout_end: DM_Time
rollout_start: DM_Time
update_config: Boolean!
uplinks: [DM_NodeUplink!]!
use_default: Boolean!
}
input DM_GroupConfig_BaseConfig_Input {
location: DM_NodeLocation_Input!
name: String!
node_id: DM_NodeID!
profile: DM_NodeProfile!
use_default: Boolean!
}
# represents an ID which identifies a group containing other groups or devices
scalar DM_GroupID
type DM_GroupServiceInstance {
access_id_provided: DM_NodeAccessID
access_id_used: DM_NodeAccessID!
container_image: String!
group_service_instance_id: DM_GroupServiceInstanceID!
node_id: DM_NodeID!
}
# internal data type
scalar DM_GroupServiceInstanceID
input DM_Group_Input {
# location information for groups is mostly used to set the comment field
#
# NOTE:
# - for this input type a location input with its required properties must be provided
location: DM_NodeLocation_Input!
name: String!
parent_group_id: ID
use_default: Boolean!
}
type DM_HeartbeatEvent implements DM_LogEvent {
delta: Int!
heartbeat_type: DM_HeartbeatType!
log_id: ID!
timestamp: DateTime!
}
enum DM_HeartbeatType {
ap_offline
ap_online
}
enum DM_ID_Type {
group_id
}
# represents an IPv4Address, e. g. 192.168.0.1
scalar DM_IPv4Address
# represents an IP and the subnet it is in, in CIDR notation, e.g. 192.168.0.0/24
scalar DM_IPv4Subnet
interface DM_LogEvent {
log_id: ID!
timestamp: DateTime!
}
type DM_LogEventsForNodeResponse {
count: Int!
logs: [DM_LogEvent!]!
}
# represents a physical address as used by Unwired to identify devices.
# The format of DM_Mac addresses does not contain dashes or colons and is all caps.
scalar DM_Mac
# network encryption types
enum DM_Network_Encryption {
none
wep
wpa2ccmp
wpa2psk
wpa2psktkip
wpa2psktkipaes
}
interface DM_Node {
accesses: [DM_NodeAccess!]!
config_changed: DateTime!
created_at: DateTime!
group: DM_Group!
# for devices: parent/owner group ID (from the group object)
# for group configurations: its own group ID (from the group object)
group_id: ID!
hardware: [DM_NodeHardware!]!
# location and location-related information of the node
#
# NOTE:
# - the location information is considered to be optional for reading
location: DM_NodeLocation
# name of the node (either device or group name)
name: String!
networks: [DM_NodeNetwork!]!
node_id: ID!
node_type: DM_NodeType!
# type_id is the identifier of the node type
# - "DEFAULT" for groups
# - not "DEFAULT" for the rest
node_type_id: ID!
# specifies the wifi profile for the node
profile: DM_NodeProfile!
# rollout_end: end of time range in which firmware upgrades and container are executed
rollout_end: DM_Time
# rollout_start: start of time range in which firmware and container upgrades are executed
rollout_start: DM_Time
update_config: Boolean!
uplinks: [DM_NodeUplink!]!
# specifies if this config inherits its properties
use_default: Boolean!
}
# describes how a device accesses networks and services
interface DM_NodeAccess {
access_id: DM_NodeAccessID!
name: String!
node_id: DM_NodeID!
type: DM_NodeAccess_Type!
}
# Bridge settings
type DM_NodeAccessBridge implements DM_NodeAccess {
access_id: DM_NodeAccessID!
name: String!
node_id: DM_NodeID!
type: DM_NodeAccess_Type!
}
# CloudNAT settings
type DM_NodeAccessCloudNAT implements DM_NodeAccess {
access_id: DM_NodeAccessID!
appliance: DM_Appliance!
name: String!
node_id: DM_NodeID!
# optional subnet, null means auto-assigned
subnet: DM_IPv4Subnet
type: DM_NodeAccess_Type!
uplink_id: DM_NodeUplinkID!
}
# DirectConnection settings
type DM_NodeAccessDirectConnection implements DM_NodeAccess {
access_id: DM_NodeAccessID!
loc_acct: Boolean!
name: String!
node_id: DM_NodeID!
type: DM_NodeAccess_Type!
uplink_id: DM_NodeUplinkID!
}
# represents an ID which identifies a node access, e.g. a VPN uplink.
scalar DM_NodeAccessID
# Multi-uplink settings
type DM_NodeAccessMultiUplink implements DM_NodeAccess {
access_id: DM_NodeAccessID!
appliance: DM_Appliance!
name: String!
node_id: DM_NodeID!
subnet: DM_IPv4Subnet
type: DM_NodeAccess_Type!
uplink_id: DM_NodeUplinkID!
}
# NAT settings
type DM_NodeAccessNAT implements DM_NodeAccess {
access_id: DM_NodeAccessID!
name: String!
node_id: DM_NodeID!
# optional subnet, null means auto-assigned
subnet: DM_IPv4Subnet
type: DM_NodeAccess_Type!
uplink_id: DM_NodeUplinkID!
}
# PortForward settings
type DM_NodeAccessPortForward implements DM_NodeAccess {
access_id: DM_NodeAccessID!
appliance: DM_Appliance!
name: String!
node_id: DM_NodeID!
type: DM_NodeAccess_Type!
uplink_id: DM_NodeUplinkID!
}
# Service settings
type DM_NodeAccessService implements DM_NodeAccess {
access_id: DM_NodeAccessID!
name: String!
node_id: DM_NodeID!
# subnet of the service, the subnet is autogenerated for a L3 service, and set to null for a L2 service
subnet: DM_IPv4Subnet
type: DM_NodeAccess_Type!
}
# VLAN settings
type DM_NodeAccessVLAN implements DM_NodeAccess {
access_id: DM_NodeAccessID!
loc_acct: Boolean!
name: String!
node_id: DM_NodeID!
# if loc_acct == true, appliance must be set
optional_appliance: DM_Appliance
type: DM_NodeAccess_Type!
uplink_id: DM_NodeUplinkID!
# optional vlan_id, null means untagged
vlan_id: Int
}
# VPN related settings
type DM_NodeAccessVPN implements DM_NodeAccess {
access_id: DM_NodeAccessID!
appliance: DM_Appliance!
filtered: Boolean!
name: String!
node_id: DM_NodeID!
type: DM_NodeAccess_Type!
uplink_id: DM_NodeUplinkID!
}
# An input describing a node access as part of the network config.
#
# Depending on the access_type, a different set of the optional fields is considered.
# See the enum docs for details.
input DM_NodeAccess_Input {
access_id: DM_NodeAccessID!
access_type: DM_NodeAccess_Type!
appliance_id: DM_ApplianceID
loc_acct: Boolean
# null means autoassigned
subnet: DM_IPv4Subnet
uplink_id: DM_NodeUplinkID
# 0 means untagged. value is checked against the allowed ranges on the node type.
vlan_id: Int
}
# Possible types for a node access.
#
# See the comments for which of the optional schema fields are considered optional or required on the input.
enum DM_NodeAccess_Type {
# no parameters
bridge
# the fields 'appliance_id' and 'uplink_id' are mandatory and the field 'subnet' is optional
cloud_nat
# the field 'uplink_id' is mandatory
direct_connection
# the fields 'appliance_id' and 'uplink_id' are mandatory and the field 'subnet' is optional
multi_uplink
# the field 'uplink_id' is mandatory and the field 'subnet' is optional
nat
# the fields 'appliance_id' and 'uplink_id' are mandatory
port_forward
# the field 'subnet' is optional
service
# the fields 'loc_acct' and 'uplink_id' are mandatory and the field 'vlan_id' is optional
# if 'loc_acct' is true, the field 'appliance_id' is mandatory'
vlan
# the fields 'appliance_id' and 'uplink_id' are mandatory
vpn
# the fields 'appliance_id' and 'uplink_id' are mandatory
vpn_filtered
}
interface DM_NodeHardware {
hardware_id: String!
hardware_type: DM_NodeHardwareType!
name: String!
node_id: ID!
}
type DM_NodeHardwareEthernet implements DM_NodeHardware {
hardware_id: String!
hardware_type: DM_NodeHardwareType!
name: String!
node_id: ID!
}
# represents an ID which identifies a node's hardware, e.g. eth0.
scalar DM_NodeHardwareID
type DM_NodeHardwareRadio implements DM_NodeHardware {
# either "auto" or an appropriate wifi channel (1-13 for 2.4GHz or 36-64 in increments of 4 for 5GHz)
channel: String!
hardware_id: String!
hardware_type: DM_NodeHardwareType!
name: String!
node_id: ID!
# numeric transmit power value. NULL or between 0 and 19.
power: Int
}
# The settings for a radio hardware.
input DM_NodeHardwareRadioSettings_Input {
# must be either "auto" or an appropriate channel (1-13 for 2.4GHz or 36-64 in increments of 4 for 5GHz)
channel: String!
hardware_id: DM_NodeHardwareID!
power: Int
}
enum DM_NodeHardwareType {
ethernet
radio24ghz
radio50ghz
wan
}
# represents an ID which identifies a node which in turn can be a device or a group.
scalar DM_NodeID
type DM_NodeLocation {
address: String
city: String
# comment about the node, can be used for anything
comment: String
# country is an ISO 3166-1 alpha-2 country code, i.e. exactly two capital letters
country: String!
floorplan_x: Int
floorplan_y: Int
info_url: String
latitude: Float
longitude: Float
node_id: ID!
zip: String
}
input DM_NodeLocation_Input {
address: String
city: String
# comment about the node, can be used for anything
#
# NOTE:
# - the comment needs to be empty by default
comment: String
# country is an ISO 3166-1 alpha-2 country code, i.e. exactly two capital letters
country: String!
floorplan_x: Int
floorplan_y: Int
info_url: String
latitude: Float
longitude: Float
zip: String
}
type DM_NodeNetwork {
access_id: DM_NodeAccessID!
active: Boolean!
active_from: DM_Time
active_to: DM_Time
client_separation: Boolean!
encryption: DM_Network_Encryption!
hardware_ids: [DM_NodeHardwareID!]!
loc_acct: Boolean!
max_clients: Int!
network_id: ID!
node_id: ID!
psk: String
ssid: String!
ssid_broadcast: Boolean!
vlan: Int
# Entries are only relevant if encryption is wpa2ccmp/802.1X
wpa2e_radacc: [DM_WPA2EConfig!]!
# Entries are only relevant if encryption is wpa2ccmp/802.1X
wpa2e_radauth: [DM_WPA2EConfig!]!
}
# represents an ID which identifies a node network which in turn could be e.g. a wireless network provided by the associated node/device.
scalar DM_NodeNetworkID
# An input describing a node network as part of the network config.
#
# 'active_from','active_to', 'client_separation', 'ssid_broadcast' and 'max_clients' are ignored on non-wifi networks.
# 'ssid' is mandatory as it is still used as the name for a non-wifi network.
# If 'encryption' is not 'none' and not 'wpa2ccmp', 'psk' is mandatory.
# If the network is a wifi network, the 'loc_acct' input value is ignored and always set to 'true'.
input DM_NodeNetwork_Input {
access_id: DM_NodeAccessID!
active: Boolean!
active_from: DM_Time
active_to: DM_Time
client_separation: Boolean
encryption: DM_Network_Encryption!
hardware_ids: [DM_NodeHardwareID!]!
loc_acct: Boolean
max_clients: Int
network_id: DM_NodeNetworkID!
psk: String
ssid: String!
ssid_broadcast: Boolean
vlan: Int
# Entries are only relevant if encryption is wpa2ccmp/802.1X
# Only the first entry in this list is currently supported, others will be ignored.
wpa2e_radacc: [DM_WPA2EConfigInput!]
# Entries are only relevant if encryption is wpa2ccmp/802.1X
# Only the first entry in this list is currently supported, others will be ignored.
wpa2e_radauth: [DM_WPA2EConfigInput!]
}
enum DM_NodeOnlineStatus {
applying_configuration
network_issues
offline
online
}
# the base wireless profile of a node
enum DM_NodeProfile {
high_density
standard
}
# DM_NodeService defines a (lxc) image which is used for creating service instances (containers) on a device.
type DM_NodeService {
access_gpsd_enabled: Boolean!
access_provided_subnet: String
container_image: String!
container_image_url: String!
container_version: String!
dhcp_lease_time_seconds: Int
dhcp_range: String
dhcp_range_template: String
environment_variables: String!
name: String!
node_service_id: DM_NodeServiceID!
provides_access: Boolean!
service_type: DM_NodeServiceType!
wipe_on_update: Boolean!
}
# represents an ID which identifies a node service which typically refers to a container image that can be executed on Unwired Cloud OS.
scalar DM_NodeServiceID
type DM_NodeServiceInstance {
access_id_provided: DM_NodeAccessID
access_id_used: DM_NodeAccessID!
config_mounts: [DM_NodeServiceInstanceConfigMount!]!
dhcp_range: String
group_service_instance_id: DM_GroupServiceInstanceID
node_id: DM_NodeID!
node_service: DM_NodeService!
node_service_instance_id: DM_NodeServiceInstanceID!
rollout_node_service_last_good: DM_NodeService!
rollout_state: DM_RolloutState!
rollout_timestamp_deploy: DateTime
rollout_timestamp_result: DateTime
}
type DM_NodeServiceInstanceConfigMount {
mode: Int!
mount_path: String!
node_service_instance_id: DM_NodeServiceInstanceID!
value_base64: String!
}
input DM_NodeServiceInstanceConfigMount_Input {
mode: Int!
mount_path: String!
value_base64: String!
}
# represents an ID which identifies a node service instance which refers to a container which is executed on Unwired Cloud OS.
scalar DM_NodeServiceInstanceID
# An input describing a node service instance as part of the network config.
#
# If a node_service_instance_id is set, the access IDs on that instance are updated. The node service ID is ignored.
# Otherwise (i.e. when the node_service_instance_id is missing), a new instance is created. In this case, the node service ID is required.
input DM_NodeServiceInstance_Input {
access_id_provided: DM_NodeAccessID
access_id_used: DM_NodeAccessID!
node_service_id: DM_NodeServiceID
node_service_instance_id: DM_NodeServiceInstanceID
}
enum DM_NodeServiceType {
container
}
input DM_NodeService_Input {
access_gpsd_enabled: Boolean!
access_provided_subnet: String
# if the instances created for this node service need an apikey, specify the roles it needs here.
apikey_roles: [DM_RoleName!]
container_image: String!
container_image_url: String!
container_version: String!
dhcp_lease_time_seconds: Int
dhcp_range: String
dhcp_range_template: String
environment_variables: String!
name: String!
provides_access: Boolean!
service_type: DM_NodeServiceType!
wipe_on_update: Boolean!
}
# node_settings as queried by the mtsg-cli
type DM_NodeSettingsResponse {
# the configured client network uplinks which are relevant for this MTSG device
accesses: [NodeAccess]
# timestamp of the last configuration change
changed: DateTime
# error of the operation, if any
error: DM_Error
# the ID of the node referenced by the given MAC address
node_id: ID
# WAN interface parameters
uplink: NodeUplink
}
# the deployment status of a node
enum DM_NodeStatus {
disabled
enabled
planning
waiting
}
# a nodes type configuration (network interfaces)
type DM_NodeType {
default_version_target_selector: String
ethernet: [DM_NodeHardwareID!]!
gpio_ports: [String!]!
name: String!
node_type_id: DM_NodeTypeID!
radio24ghz: [DM_NodeHardwareID!]!
radio50ghz: [DM_NodeHardwareID!]!
supports_services: Boolean!
vlan_ranges: DM_VLANRanges!
wan: DM_NodeHardwareID
}
# represents an ID which identifies the type of a given node, e.g. a Cloud GateWay (CGW)
scalar DM_NodeTypeID
input DM_NodeType_Input {
default_rollout_end: DM_Time
default_rollout_start: DM_Time
default_version_target_selector: String
ethernet: [DM_NodeHardwareID!]
gpio_ports: [String!]
name: String!
radio24ghz: [DM_NodeHardwareID!]
radio50ghz: [DM_NodeHardwareID!]
supports_services: Boolean!
vlan_ranges: DM_VLANRanges!
wan: DM_NodeHardwareID
}
interface DM_NodeUplink {
hardware_id: String
name: String!
node_id: ID!
uplink_id: ID!
wantype: DM_NodeUplinkWanType!
}
type DM_NodeUplinkDHCPClient implements DM_NodeUplink {
hardware_id: String
name: String!
node_id: ID!
uplink_id: ID!
wantype: DM_NodeUplinkWanType!
}
# represents an ID which identifies a node uplink which in turn could be an uplink with IP settings provided by a DHCP server.
scalar DM_NodeUplinkID
type DM_NodeUplinkStaticIPv4 implements DM_NodeUplink {
hardware_id: String
name: String!
node_id: ID!
uplink_id: ID!
wan_dns_servers: [DM_IPv4Address]
wan_gateway: DM_IPv4Address
wan_ipv4_network: DM_IPv4Subnet
wantype: DM_NodeUplinkWanType!
}
# hardware interface types
enum DM_NodeUplinkWanType {
WAN_dhcp_client
WAN_static_ipv4
}
# An input describing a node uplink as part of the network config.
#
# If the wantype is WAN_dhcp_client, the fields wan_ipv4_network, wan_gateway, and wan_dns_servers are ignored.
# Otherwise (i.e. type WAN_static_ipv4), they are required.
input DM_NodeUplink_Input {
uplink_id: DM_NodeUplinkID!
wan_dns_servers: [DM_IPv4Address!]
wan_gateway: DM_IPv4Address
wan_ipv4_network: DM_IPv4Subnet
wantype: DM_NodeUplinkWanType!
}
# An input describing a node's network config.
input DM_Node_NetworkConfig_Input {
accesses: [DM_NodeAccess_Input!]
networks: [DM_NodeNetwork_Input!]
node_id: DM_NodeID!
node_service_instances: [DM_NodeServiceInstance_Input!]
# currently, a valid node network config needs EXACTLY ONE uplink.
# the field is a list for future extensibility. when it is longer than one, behaviour is UNDEFINED.
uplinks: [DM_NodeUplink_Input!]!
}
# A list of DM_Node_NetworkConfig_Input.
# This type only exists because directives on top-level input objects are not yet supported by gqlgen.
input DM_Node_NetworkConfig_Inputs {
inputs: [DM_Node_NetworkConfig_Input!]
}
# this is the base interface for all device events
interface DM_ReportingDeviceEvent {
datetime: DateTime!
type: DM_DeviceEventType!
}
# this event type describes the online/offline status of a device, not its uplink, it has no other properties
type DM_ReportingDeviceEventDeviceOnline implements DM_ReportingDeviceEvent {
datetime: DateTime!
type: DM_DeviceEventType!
}
# this is a list of events per device
type DM_ReportingDeviceEvents {
events: [DM_ReportingDeviceEvent!]!
mac: DM_Mac!
}
# this is a response status for a device (e.g. unknown device)
type DM_ReportingDeviceResponseStatus {
mac: DM_Mac!
status: DM_ReportingDeviceResponseStatusCode!
}
# this is a response status code (e.g. unknown device)
enum DM_ReportingDeviceResponseStatusCode {
device_unknown
}
# response for online heartbeat results, compatible to online heartbeat results
#
# NOTE:
# - devices is null on error
# - error is null on success
type DM_ReportingHeartbeatOfflineResponse {
device_errors: [DM_ReportingDeviceResponseStatus!]
devices: [DM_ReportingDeviceEvents!]
}
# response for online heartbeat results
#
# NOTE:
# - devices is null on error
# - error is null on success
type DM_ReportingHeartbeatOnlineResponse {
device_errors: [DM_ReportingDeviceResponseStatus!]
devices: [DM_ReportingDeviceEvents!]
}
scalar DM_RoleName
enum DM_RolloutState {
failed
in_progress
ok
rollback_failed
rollback_in_progress
rollback_ok
}
# represents an instant in time in the format hh:dd:ss, e.g. 23:15:10.
scalar DM_Time
# time_span are defined with a start and an end
input DM_TimeSpan {
end: DM_Time!
start: DM_Time!
}
# ranges of valid vlan IDs on accesses of type VLAN.
# valid values are single IDs (e.g. "3"), the start and end of a range divided by a "-" (e.g. "3-12"),
# or a comma-separated combination of those (e.g. 3,5-10).
# "0" denotes "untagged".
scalar DM_VLANRanges
# Represents a (radius) config used for WPA2-Enterprise encryption
type DM_WPA2EConfig {
ip: DM_IPv4Address!
key: String!
port: Int!
}
input DM_WPA2EConfigInput {
ip: DM_IPv4Address!
key: String!
port: Int!
}
scalar DateTime
# Contains all available Email CIDs (Campain IDs) for a given customer.
type EmailCIDsResponse implements Response {
email_cids: [String]
error: Error
}
type EmergencyRequestReason {
reason: String
reason_lang: [Translatable]
}
input EmergencyRequestReasonInput {
reason: [TranslatableInput]
}
enum EmergencyRequestStatus {
confirmed
delivered
requested
}
type EmergencyRequestWidget implements Widget {
anchor: Anchor
date_created: DateTime!
date_updated: DateTime!
disclaimer: String
disclaimer_lang: [Translatable]
enable_anchor: Boolean
meta_data: EmergencyRequestWidgetMetaData
page_id: ID!
position: Int!
reasons: [EmergencyRequestReason!]
status: EmergencyRequestStatus
widget_id: ID!
}
input EmergencyRequestWidgetInput {
anchor: AnchorInput
disclaimer: [TranslatableInput]
enable_anchor: Boolean
meta_data: EmergencyRequestWidgetMetaDataInput
page_id: ID!
reasons: [EmergencyRequestReasonInput]
}
type EmergencyRequestWidgetMetaData {
target_topic: String
}
input EmergencyRequestWidgetMetaDataInput {
target_topic: String
}
type EmptyResponse implements Response {
error: Error
}
type Error {
current_value_bytes: BigInt
current_value_seconds: BigInt
error_code: ErrorCodes
error_message: String
max_value_bytes: BigInt
max_value_seconds: BigInt
}
enum ErrorCodes {
BAD_INPUT
DAILY_DOWNLOAD_LIMIT_REACHED
DAILY_SESSION_TIME_EXCEEDED
DAILY_UPLOAD_LIMIT_REACHED
INTERNAL_SERVER_ERROR
INVALID
INVALID_CUSTOMER
INVALID_GROUP_ALREADY_IN_USE
INVALID_USER_SESSION_ID
INVALID_WIDGET_ID
NOT_AUTHORIZED
NOT_AUTHORIZED_CODE
NOT_FOUND
NOT_FOUND_AP_MAC
NOT_FOUND_CODE
RATE_LIMIT_REACHED
RESOURCES_STILL_REFERENCED
SEND_SMS_FAILED
SPLASHPAGE_REFERENCED_BY_GROUPS
}
# EthernetSettings referenced by a NodeNetwork
type EthernetSettings {
# an optional VLAN ID if VLAN tagging should be used (range: 0 to 4095)
vlan: Int
}
# A email address (lead) collected from the (lead-collection) connect widget with additional meta data information.
type ExportEmail {
ap_mac: String
country: String
date_created: DateTime
email: String!
email_cid: String
language: String
usages: [ExportEmailUsage]
}
type ExportEmailUsage {
collection_id: String
collection_terms: String
}
type ExportEmailsResponse implements Response {
emails: [ExportEmail]
error: Error
}
# This type reports user sessions that failed in the sync back to
# the sync client
type FailedUserSessionSync {
client_mac: String!
error_code: UserSessionSyncErrorCode!
}
type FeedConfig {
auth_type: AuthType!
last_feed_log: String
last_process_id: String
password: String
update_interval: Int
url: String!
username: String
}
# Can be updated per attribute.
input FeedConfigInput {
auth_type: AuthType
last_feed_log: String
last_process_id: String
# If sending within a feed config array, the operation defines the operation applied to the element.
operation: FeedConfigInputOperation
password: String
update_interval: Int
url: String
username: String
}
enum FeedConfigInputOperation {
delete
insert
log
upsert
}
type FeedOverviewResponse implements Response {
error: Error
feed_overview_widgets: [FeedOverviewWidget]
}
type FeedOverviewWidget {
customer: Customer
feed_config: FeedConfig
page: Page
splashpage: SplashpageShort
widget: Widget
}
type FeedWidget {
applicable_ap_macs: [String]!
customer_id: ID!
feed_config: FeedConfig!
splashpage_default_lang: String!
splashpage_id: ID!
splashpage_supported_lang: [String]!
widget: Widget!
}
type FeedWidgetResponse implements Response {
error: Error
user_session_id: ID
widget: Widget
}
type FeedWidgetsResponse implements Response {
error: Error
widgets: [FeedWidget]
}
type File {
autoclean: Boolean!
byte_file_size: String!
customer_id: ID!
date_created: String!
etag: String
filename: String!
height: Int
mimetype: String!
original: Boolean!
original_url: String
previews: [Preview]
resource_id: ID!
title: String
url: String!
width: Int
}
type GeoFeedPoint {
icon_url: String
icon_width: Int
lat: Float!
long: Float!
text: String
text_lang: [Translatable]
}
input GeoFeedPointInput {
icon_url: String
icon_width: Int
lat: Float!
long: Float!
text: [TranslatableInput]
}
type Group {
assigned_splashpage_title: String
group_id: Int!
name: String!
parent_id: Int
}
enum GroupReportType {
advanced
basic
}
type GroupsResponse implements Response {
error: Error
groups: [Group]
}
# Interfaces referenced by a NodeNetwork
type Interfaces {
# if "eth1" specifies that this client network is supposed to be available on the secondary
ethernet_secondary: String
# if "radio0" specifies that this client network is supposed to be available on the 2.4GHz wifi radio
radio24ghz: String
# if "radio1" specifies that this client network is supposed to be available on the 5GHz wifi radio
radio50ghz: String
}
type IsActiveUserSessionResponse implements Response {
error: Error
is_active_user_session: Boolean
}
type IsValidUserSessionResponse implements Response {
error: Error
valid: Boolean
}
input JourneyInfoByApsResponseInput {
aps: [String]!
journey: String!
}
input JourneyInfoJsonFromFeedInput {
by_aps_responses: [JourneyInfoByApsResponseInput]
}
input JourneyInfoMetaDataInput {
feed_config: FeedConfigInput
target_topic: String
variant: String
}
type JourneyInfoWidget implements Widget {
anchor: Anchor
date_created: DateTime!
date_updated: DateTime!
enable_anchor: Boolean
hold_text: String
hold_text_lang: [Translatable]
is_ready: Boolean
json: String
meta_data: JourneyInfoWidgetMetaData
page_id: ID!
position: Int!
update_interval: Int
variant: String
widget_id: ID!
}
input JourneyInfoWidgetInput {
anchor: AnchorInput
enable_anchor: Boolean
hold_text: [TranslatableInput]
json_from_feed: JourneyInfoJsonFromFeedInput
meta_data: JourneyInfoMetaDataInput
page_id: ID
update_interval: Int
variant: String
}
type JourneyInfoWidgetMetaData {
feed_config: FeedConfig
target_topic: String
variant: String
}
enum LogLevel {
error
warn
}
type LoginMethodPolicy {
login_method: String!
network_user_policy_id: String!
}
input LoginMethodPolicyInput {
login_method: String!
network_user_policy_id: String!
}
type LoginMethodPolicyResponse implements Response {
error: Error
login_method_policies: [LoginMethodPolicy]
}
input MovingMapMetaDataInput {
feed_config: FeedConfigInput
geo_feed_configs: [FeedConfigInput!]
}
type MovingMapWidget implements Widget {
anchor: Anchor
date_created: DateTime!
date_updated: DateTime!
enable_anchor: Boolean
geo_points: [GeoFeedPoint!]
icon: String
is_ready: Boolean
json: String
meta_data: MovingMapWidgetMetaData
page_id: ID!
position: Int!
update_interval: Int
widget_id: ID!
}
input MovingMapWidgetInput {
anchor: AnchorInput
enable_anchor: Boolean
geo_points: [GeoFeedPointInput]
icon: String
json_from_feed: JourneyInfoJsonFromFeedInput
meta_data: MovingMapMetaDataInput
page_id: ID
}
type MovingMapWidgetMetaData {
feed_config: FeedConfig
geo_feed_configs: [FeedConfig!]
}
type Mutation {
# adds an admin user to a customer
# Through this, an admin user gains access to the customer related actions and entities
#
# NOTES:
# - returns false on error
Authz_add_admin_user_to_customer(
customer_id: ID!
roles: [Authz_RoleName!]!
user_id: ID!
): Boolean!
# Adds a group to a customer.
Authz_add_group_to_customer(customer_id: ID!, group_id: ID!): Boolean!
# Log into Unwired Edge Cloud Console.
Authz_admin_login(email: String!, password: String!): Authz_LoginResponse
# invalidate login cookie
Authz_admin_logout: Boolean!
Authz_admin_token_login(token: String!): Authz_LoginResponse
# Changes password for your own account.
Authz_change_password(
new_password: String!
new_password_verified: String!
old_password: String!
): Boolean!
# Changes password with a challenge token.
Authz_change_password_by_challenge(
challenge: String!
new_password: String!
new_password_verified: String!
): Boolean!
# Change password for another user which is only allowed if you have authoritive access for the given user.
Authz_change_password_for_user(email: String!, password: String!): Boolean!
# Creates a user with a given input.
Authz_create_admin_user(input: Authz_CreateAdminUser_Input!): Authz_AdminUser
# Creates a user with a given input and password. The mutation is only allowed if the request has authoritive ownership of users (e.g. authentication provider).
# You should not provide a password if it is a social login, otherwise it is mandatory.
Authz_create_admin_user_with_defaults(
input: Authz_CreateAdminUser_Input!
password: String
social: Boolean!
): Authz_AdminUser
# Creates an apikey with the given parameters, and returns it.
# Note that after this creation call the returned key data is not accessible any longer, as it is not saved in plain text.
Authz_create_apikey(
customer_id: ID!
# this parameter only exists for compatibility with older API versions.
# it is ignored, as it is not possible to create internal apikeys.
internal: Boolean
name: String!
roles: [Authz_RoleName!]
): Authz_Apikey
Authz_create_customer(input: Authz_Customer_Input!): Authz_Customer
# Creates an invite and send it to the given email address. If the email address exists in our system, invitation flow will be skipped
# and Authz_create_policy_user will be used instead.
Authz_create_invite(
customer_id: Authz_CustomerID!
email: String!
roles: [Authz_RoleName!]!
): Authz_Invite
# Deletes the user with the given ID.
# Only users with the privilege 'all customers' can delete users other than themselves.
Authz_delete_admin_user(user_id: Authz_AdminUserID!): Boolean!
# removes an admin user from a customer
# Through this, an admin user loses access to the customer related actions and entities
#
# NOTES:
# - returns false on error
Authz_delete_admin_user_from_customer(
customer_id: ID!
user_id: ID!
): Boolean!
Authz_delete_customer(customer_id: ID!): Boolean!
# Removes a group from a customer.
Authz_delete_group_from_customer(customer_id: ID!, group_id: ID!): Boolean!
# Updates the user specified by the given ID from the given input.
# Only users with the privilege 'all customers' can edit users other than themselves
Authz_edit_admin_user(
input: Authz_EditAdminUser_Input!
user_id: Authz_AdminUserID!
): Authz_AdminUser
# Redeems the invite with the logged in user. Creates a user policy from the invite and revokes the invite afterwards.
Authz_redeem_invite(token: String!): Boolean!
# Requests a new password challenge token to a given email address.
Authz_request_password_challenge(email: String!): Boolean!
# Resends the email verification notification.
Authz_resend_email_verfication: Boolean!
# Revoke an apikey.
Authz_revoke_apikey(apikey_id: ID!): Boolean!
# Revokes an invite, so the link with the token won't be valid anymore.
Authz_revoke_invite(invite_id: Authz_InviteID!): Boolean!
# Sets the roles on the apikey for the customer it belongs to, overwriting the previous assignments.
#
# The calling identity cannot hand out a role it does not have.
Authz_set_apikey_roles(
apikey_id: Authz_ApikeyID!
roles: [Authz_RoleName!]!
): Boolean!
# Sets the roles on the user for the customer, overwriting the previous assignments.
#
# The calling identity cannot hand out a role it does not have.
Authz_set_user_roles(
customer_id: Authz_CustomerID!
roles: [Authz_RoleName!]!
user_id: Authz_AdminUserID!
): Boolean!
Authz_update_customer(
customer_id: ID!
input: Authz_Customer_Input!
): Authz_Customer
# Updates the user ui settings
Authz_update_ui_settings(ui_settings: SimpleJSON!): Boolean!
# Marks a given user email address as verified.
Authz_verify_email_for_user(email: String!): Boolean
# Create a node service from the input, and return the created node service.
DM_add_node_service(input: DM_NodeService_Input!): DM_NodeService!
# Create a node service instance from the input, and return the created node service.
DM_add_node_service_instance(
access_id_used: DM_NodeAccessID!
config_mounts: [DM_NodeServiceInstanceConfigMount_Input!]
node_id: DM_NodeID!
node_service_id: DM_NodeServiceID!
): DM_NodeServiceInstance!
# batch heartbeat API
#
# NOTE:
# - source defines where the heartbeat came from
# - macs is a list of MAC addresses, that are proven to be alive at the time this function is executed
# - this operation is all or nothing at all, returns true on success
DM_batch_device_heartbeat(
macs: [DM_Mac!]!
source: DM_DeviceHeartbeatSource!
): Boolean!
# for each node given by node_ids, sets the appliance of all accesses of a type given in types to appliance_id.
# additionally, it changes the type of all touched accesses to the type given by the new appliance (i.e. filtered or non-filtered).
#
# if an access is configured with an mts appliance and the new appliance is non-mts (or vice versa), the access is not changed.
#
# returns whether anything was changed, which can be false if the nodes do not have an access of any of the given types,
# or none of them match the new appliance on the mts property.
DM_change_nodes_appliance(
appliance_id: DM_ApplianceID!
node_ids: [DM_NodeID!]!
types: [DM_NodeAccess_Type!]!
): Boolean!
# Converts a group to a root group of a given customer (by customer_id).
# This means the parent group is removed and the group will not derive config
# anymore, or technically use_default will be set to 0 automatically.
# Can also be used to move a group to another customer.
DM_convert_to_root_group(
customer_id: DM_CustomerID!
group_id: DM_GroupID!
): Boolean!
# copy over specific parts of a configuration from one node to another
#
# NOTE:
# - this mutation will skip any node that is inheriting settings (use_default = true)
# - source_node_id can be a device node_id or the default_config node_id of a group
# - returns null on error
DM_copy_node_configuration(
source_node_id: DM_NodeID!
target_macs: [DM_Mac!]
target_node_ids: [DM_NodeID!]
what: DM_CopyConfigurationSelector_Input!
): [DM_Node!]
# creates new devices
#
# NOTES:
# - returns null on error
# - BadInputError can have validation errors set in the error extensions: { validations: { duplicated_macs: [] } }
DM_create_devices(devices_input: DM_Devices_Input!): [DM_Device!]
# Creates a new firmware version
DM_create_firmware_version(
branch: String!
build: Int!
tag: String
): DM_FirmwareVersion!
# create new groups for a specific customer
#
# NOTES:
# - all newly created groups need to be assigned to a customer
# - this operation is all or nothing at all, returns null on error
DM_create_groups(
customer_id: DM_CustomerID!
groups_input: [DM_Group_Input!]!
): [DM_Group!]
# Create a node_type.
# "input" argument must be complete, missing values will be set to null.
DM_create_node_type(
input: DM_NodeType_Input!
node_type_id: DM_NodeTypeID!
): DM_NodeType!
# Delete a node service. True on success, false on failure.
DM_del_node_service(id: DM_NodeServiceID!): Boolean!
# Delete a node service instance. True on success, false on failure.
DM_del_node_service_instance(id: DM_NodeServiceInstanceID!): Boolean!
# Soft deletes the nodes with the given IDs and all its dependent types.
DM_delete_nodes(node_ids: [DM_NodeID!]): Boolean!
# Move devices to a given group. Devices can be selected both by their node_id as well as their MAC address (union).
#
# PARAMS:
# - target_group_id: the group ID of the target group
# - node_ids: nodes to move (ID)
# - macs: nodes to move (MAC)
#
# RETURNS:
# - moved devices (null on error)
#
# NOTES:
# - This will move the devices, regenerate the node configuration and refresh inheritance
DM_move_devices(
macs: [DM_Mac!]
node_ids: [DM_NodeID!]
target_group_id: DM_GroupID!
): [DM_Device!]
# move a group tree to another parent
#
# This will regenerate the device configuration of all devices affected and refresh inheritance for all groups and devices in the sub-tree.
# It will return the updated source group
#
# NOTES:
# - returns null on error
DM_move_group(
source_group_id: DM_GroupID!
target_group_id: DM_GroupID!
): DM_Group
# regenerate the device configuration of a list of node_ids (device or group_config) or macs (device).
# node_id of group_config regenerates all the children of the group tree
#
# NOTE:
# - this function is not fast and should be called only when necessary from UI interactions (and with a progress indicator)
# - returns null on error
DM_regenerate_node_configurations(
macs: [DM_Mac!]
node_ids: [DM_NodeID!]
): [DM_Node!]
# Resets the rollout_state of given device
# node_id or mac must be set, mac will be ignored if node_id is set
DM_reset_device_rollout_state(mac: DM_Mac, node_id: DM_NodeID): Boolean!
# Sets the given tag to a specific firmware version
# if the given tag is already set it will be deleted first then the new tag will be set to the given branch/build
DM_set_firmware_version_tag(
branch: String!
build: Int!
tag: String!
): DM_FirmwareVersion!
# Set the node service instance's node service to the given ID, triggering an upgrade or rollback.
# Making sure the change is compatible and that it's just a different version of the same node service (container name) is up to the client.
DM_set_node_service_instance_target_version(
clear_persistent_storage: Boolean!
id: DM_NodeServiceInstanceID!
target_version: DM_NodeServiceID!
): DM_NodeServiceInstance!
# saves the given devices' base configs, regenerates the device configuration and returns the updated view.
DM_update_device_base_configs(
inputs: [DM_Device_BaseConfig_Input!]!
): [DM_Device!]
# Sets the rollout state for a device.
DM_update_device_rollout_state(
id: DM_NodeID!
state: DM_RolloutState!
timestamp_deploy: DateTime
timestamp_result: DateTime
version_last_good: String!
): Boolean!
# saves the given group configs' base configs, regenerates the device configuration of all inheriting devices and returns the updated view.
DM_update_group_config_base_configs(
inputs: [DM_GroupConfig_BaseConfig_Input!]!
): [DM_GroupConfig!]
# update a group's name
DM_update_group_name(group_id: DM_GroupID!, name: String!): DM_Group
# saves the given nodes' network configs, regenerates the device configs and returns the updated view.
# if a node is a group config, the network configuration is also copied to inheriting devices and their configs also regenerated.
#
# this mutation wipes the existing network config and completely recreates it from the input, except for node service instances.
# see the input type docs for details.
DM_update_node_network_configs(
input: DM_Node_NetworkConfig_Inputs!
): [DM_Node!]
# Update the rollout config for nodes.
# If the node is a device and does not inherit the config. Allowed updates: version_target_selector and time span.
# If the node is a device and does inherit the config. Allowed updates: version_target_selector.
# If the node is a group config and does not inherit the config. Allowed updates: time_span.
# If the node is a group config and does inherit the config. Allowed updates: nothing.
# If One of the given node_ids/macs or group_ids violate the above rules an BadInputError is returned and nothing is updated.
#
# PARAMS:
# - node_ids: unique identifier of the given devices
# - macs: mac of given devices
# - group_ids: unique identifier of the given groups
# - version_target_selector: tag or branch of the firmware to follow examples: "branch:19.07", "version:19.07-80", "tag:stable", "disabled"
# - time_span: with start and end time
#
# RETURNS:
# - success indicator
DM_update_node_rollout_config(
group_ids: [DM_GroupID!]
macs: [DM_Mac!]
node_ids: [DM_NodeID!]
time_span: TimeSpanOptional
version_target_selector: StringOptional
): Boolean!
# Sets the config mounts for a node service instance.
DM_update_node_service_instance_config_mounts(
config_mounts: [DM_NodeServiceInstanceConfigMount_Input!]!
id: DM_NodeServiceInstanceID!
): Boolean!
# Sets the rollout state for a node service instance.
DM_update_node_service_instance_rollout_state(
id: DM_NodeServiceInstanceID!
state: DM_RolloutState!
timestamp_deploy: DateTime
timestamp_result: DateTime
version_last_good: DM_NodeServiceID!
): Boolean!
# Update node_type rollout configuration.
#
# PARAMS:
# - node_type_id: unique identifier of the given node_type
# - version_target_selector: tag or branch of the firmware to follow examples: "branch:19.07", "version:19.07-80", "tag:stable", "disabled"
# - time_span: with start and end time
#
# RETURNS:
# - success indicator
DM_update_node_type_rollout_config(
node_type_id: DM_NodeTypeID!
time_span: TimeSpanOptional
version_target_selector: StringOptional
): Boolean!
# Generates a report for a given group id, year, month and report type.
# This will send a email including the report to the authenticated user when the generation is finished.
Reporting_generate_reports(
group_id: ID!
month: Int!
type: GroupReportType!
year: Int!
): Reporting_GenerateReportsResponse
# Assigns a splashpage to group. All descendant groups without an assigned splashpage will be affected.
add_group_to_splashpage(group_id: Int!, splashpage_id: String!): EmptyResponse
add_splashpage_sharing(customer_id: ID!, splashpage_id: ID!): Boolean
# Logs an frontend error to the API.
admin_log(input: AdminLogInput!): EmptyResponse
auth_challenge_sms(
phone_number: String!
user_session_id: ID!
widget_id: ID!
): EmptyResponse
client_connect(
code: String
input: ConnectInput
login_method: String
user_agent_country: String
user_agent_lang: String
user_session_id: ID!
widget_id: ID
): UserSessionIdResponse
client_logout(user_session_id: ID!): UserSessionIdResponse
copy_resources_to_customer(
customer_id: String!
resource_ids: [String!]
): CopyResourcesResponse
copy_splashpage(
customer_id_destination: ID
splashpage_id: ID!
): SplashpageResponse
copy_widget(
language: String
page_id_destination: ID!
widget_id_source: ID!
): WidgetResponse
# Create a new Network User Policy.
create_network_user_policy(
input: NetworkUserPolicyInput!
): NetworkUserPolicyResponse
create_page(
input: PageInput!
language: String
splashpage_id: ID!
): PageResponse
create_snippet(input: SnippetInput!): SnippetResponse
create_splashpage(
customer_id: ID!
input: SplashpageInput!
language: String
): SplashpageResponse
create_widget(
campaign_input: CampaignWidgetInput
connect_input: ConnectWidgetInput
emergency_request_input: EmergencyRequestWidgetInput
journey_info_input: JourneyInfoWidgetInput
language: String
moving_map_input: MovingMapWidgetInput
simple_text_input: SimpleTextWidgetInput
structured_text_input: StructuredTextWidgetInput
support_form_input: SupportFormWidgetInput
support_info_input: SupportInfoWidgetInput
wifi4EU_input: Wifi4EUWidgetInput
): WidgetResponse
# Unassign a group from a splashpage.
delete_group_from_splashpage(group_id: Int!): EmptyResponse
# Delete a given Network User Policy.
delete_network_user_policy(network_user_policy_id: ID!): EmptyResponse
delete_page(page_id: ID!): EmptyResponse
delete_resource(resource_id: ID!): EmptyResponse
delete_snippet(snippet_id: ID!): EmptyResponse
delete_splashpage(splashpage_id: ID!): EmptyResponse
delete_widget(widget_id: ID!): EmptyResponse
generate_preview(height: Int, resource_id: ID!, width: Int): ResourceResponse
health_mutation_remote_api: Boolean
health_mutation_resource_api: Boolean
move_page(from: Int!, id: ID!, language: String, to: Int!): PagesResponse
move_widget(from: Int!, id: ID!, language: String, to: Int!): WidgetsResponse
remove_splashpage_sharing(customer_id: ID!, splashpage_id: ID!): Boolean
request_emergency(
phone_number: String
user_session_id: ID!
widget_id: ID!
): EmptyResponse
request_hold(
hold: RequestHoldInput!
user_session_id: ID!
widget_id: ID!
): EmptyResponse
session_sync(
ap_mac: String!
input: UserSessionsSyncInput!
server_mac: String!
): UserSessionsSyncResponse
splashpage_log(input: SplashpageLogInput!, user_session_id: ID): EmptyResponse
store_resource(
autoclean: Boolean!
customer_id: ID!
etag: String
file: Upload!
original_url: String
title: String
): ResourceResponse
support_form_submit(
input: SupportFormSubmitInput!
user_session_id: ID!
widget_id: ID!
): EmptyResponse
# Update a given Network User Policy.
update_network_user_policy(
input: NetworkUserPolicyUpdateInput!
network_user_policy_id: ID!
): NetworkUserPolicyResponse
update_page(input: PageInput!, language: String, page_id: ID!): PageResponse
update_snippet(input: SnippetInput!, snippet_id: ID!): SnippetResponse
update_splashpage(
customer_id: ID
input: SplashpageInput!
language: String
splashpage_id: ID!
): SplashpageResponse
update_widget(
campaign_input: CampaignWidgetInput
connect_input: ConnectWidgetInput
emergency_request_input: EmergencyRequestWidgetInput
journey_info_input: JourneyInfoWidgetInput
language: String
moving_map_input: MovingMapWidgetInput
simple_text_input: SimpleTextWidgetInput
structured_text_input: StructuredTextWidgetInput
support_form_input: SupportFormWidgetInput
support_info_input: SupportInfoWidgetInput
widget_id: ID!
wifi4EU_input: Wifi4EUWidgetInput
): WidgetResponse
user_session_accounting(
input: UserSessionAccountingBatchInput!
): EmptyResponse
}
type NetworkUserPoliciesResponse implements Response {
error: Error
network_user_policies: [NetworkUserPolicy]
}
type NetworkUserPolicy {
accounting_interval: Int!
daily_max_mbytes_down: Int
daily_max_mbytes_up: Int
daily_max_session_time: Int
max_bandwidth_down: Int!
max_bandwidth_up: Int!
max_mbytes_down: Int
max_mbytes_up: Int
max_pause_time: Int!
network_user_policy_id: ID!
timeout_idle: Int!
timeout_session: Int!
}
input NetworkUserPolicyInput {
accounting_interval: Int!
daily_max_mbytes_down: Int
daily_max_mbytes_up: Int
daily_max_session_time: Int
max_bandwidth_down: Int!
max_bandwidth_up: Int!
max_mbytes_down: Int
max_mbytes_up: Int
max_pause_time: Int!
network_user_policy_id: ID!
timeout_idle: Int!
timeout_session: Int!
}
type NetworkUserPolicyResponse implements Response {
error: Error
network_user_policy: NetworkUserPolicy
}
input NetworkUserPolicyUpdateInput {
accounting_interval: Int
daily_max_mbytes_down: Int
daily_max_mbytes_up: Int
daily_max_session_time: Int
max_bandwidth_down: Int
max_bandwidth_up: Int
max_mbytes_down: Int
max_mbytes_up: Int
max_pause_time: Int
network_user_policy_id: ID
timeout_idle: Int
timeout_session: Int
}
# NodeAccess describes common parts of client network uplinks
interface NodeAccess {
# the ID of this access referenced by the given node
access_id: ID!
# the name of this access reference by the node referenced by the given MAC address
name: String!
# the ID of the node referenced by the given MAC address
node_id: ID!
# an array of multiple client networks (i.e. NodeNetwork) associated with a specific internet access
node_networks: [NodeNetwork!]!
# the type of the internet access configuration, can be OpenVPN or NAT or VLAN
type: NodeAccessType!
}
# NodeAccessNAT describes a NAT client network uplink
type NodeAccessNAT implements NodeAccess {
# the ID of this access referenced by the given node
access_id: ID!
# the name of this access reference by the node referenced by the given MAC address
name: String!
# the ID of the node referenced by the given MAC address
node_id: ID!
# an array of multiple client networks (i.e. NodeNetwork) associated with a specific internet access
node_networks: [NodeNetwork!]!
# the subnet of the client network should be set to this
subnet: String!
# the type of the internet access configuration, can be OpenVPN or NAT or VLAN
type: NodeAccessType!
}
# NodeAccessOpenVPN describes an OpenVPN client network uplink (filtered or unfiltered)
type NodeAccessOpenVPN implements NodeAccess {
# the ID of this access referenced by the given node
access_id: ID!
# the OpenVPN configuration
config: String!
# the name of this access reference by the node referenced by the given MAC address
name: String!
# the ID of the node referenced by the given MAC address
node_id: ID!
# an array of multiple client networks (i.e. NodeNetwork) associated with a specific internet access
node_networks: [NodeNetwork!]!
# the type of the internet access configuration, can be OpenVPN or NAT or VLAN
type: NodeAccessType!
}
# NodeAccessType identifies the access type usable by MTSG nodes.
enum NodeAccessType {
NAT
OpenVPN
VLAN
}
type NodeAccessVLAN implements NodeAccess {
# the ID of this access referenced by the given node
access_id: ID!
# the name of this access reference by the node referenced by the given MAC address
name: String!
# the ID of the node referenced by the given MAC address
node_id: ID!
# an array of multiple client networks (i.e. NodeNetwork) associated with a specific internet access
node_networks: [NodeNetwork!]!
# the type of the internet access configuration, can be OpenVPN or NAT or VLAN
type: NodeAccessType!
# VLAN ID (range: 0 to 4095)
vlan: Int!
}
# NodeNetwork referenced by a NodeAccess
type NodeNetwork {
# the access ID referencing this network
access_id: ID!
# a set of properties describing an ethernet client network
ethernet_settings: EthernetSettings!
# associates radio and ethernet interfaces with functionality of the client network
interfaces: Interfaces!
# the ID of this network referenced by the given access ID
network_id: ID!
# the ID of the node referenced by the given MAC address
node_id: ID!
# a set of properties describing the wifi settings
wifi_settings: WifiSettings!
}
# NodeUplink describes the WAN side of the given node
interface NodeUplink {
# the ID of the network interface used by this uplink
hardware_id: String!
# the name of this uplink
name: String!
# the ID of the node referenced by the given MAC address
node_id: ID!
# the ID of the uplink referenced by the node with the given MAC address
uplink_id: ID!
}
# NodeUplinkDHCPv4 describes parameters relevant when DHCPv4 client mode is active on the given node's WAN interface.
type NodeUplinkDHCPv4 implements NodeUplink {
# the ID of the network interface used by this uplink
hardware_id: String!
# the name of this uplink
name: String!
# the ID of the node referenced by the given MAC address
node_id: ID!
# the ID of the uplink referenced by the node with the given MAC address
uplink_id: ID!
}
# NodeUplinkDHCPv4 describes parameters relevant when addresses are assigned statically for the given node's WAN interface.
type NodeUplinkStaticv4 implements NodeUplink {
# the ID of the network interface used by this uplink
hardware_id: String!
# the name of this uplink
name: String!
# the ID of the node referenced by the given MAC address
node_id: ID!
# the ID of the uplink referenced by the node with the given MAC address
uplink_id: ID!
# the DNS servers used by this WAN interface
wandnsservers: String!
# the IP address of the gateway for this WAN interface
wangateway: String!
# the IP address of this WAN interface
wanipaddress: String!
# the netmask of this WAN interface
wannetmask: String!
}
type Page {
label: String
label_lang: [Translatable]
page_id: ID!
position: Int!
route: String!
splashpage_id: ID
widgets: [Widget]
}
input PageInput {
label: [TranslatableInput]
route: String
}
type PageResponse implements Response {
error: Error
page: Page
}
type PagesResponse implements Response {
error: Error
pages: [Page]
}
type PoiMatch {
stop: PoiMatchStop
}
input PoiMatchInput {
stop: PoiMatchStopInput
}
type PoiMatchStop {
ds100: String
ibnr: String
id: String
name: String
}
input PoiMatchStopInput {
ds100: String
ibnr: String
id: String
name: String
}
type PoiMatchTranslatable {
lang: String
value: [PoiMatch]
}
type Policy {
accounting_interval: Int!
bandwidth_down_kbps: Int!
bandwidth_up_kbps: Int!
network_user_policy_id: String!
}
input PolicyInput {
accounting_interval: Int!
bandwidth_down_kbps: Int!
bandwidth_up_kbps: Int!
network_user_policy_id: String!
}
type Preview {
filename: String!
height: Int!
url: String!
width: Int!
}
type Query {
Authz_admin_users(
search_params: Authz_AdminUserSearchParams_Input
skip: Int
take: Int
): Authz_AdminUsersResponse
# Finds multiple users with their identifier.
Authz_admin_users_by_ids(user_ids: [Authz_AdminUserID!]!): [Authz_AdminUser!]!
# Returns all apikeys for a given customer_id.
# If customer_id is ommitted, all apikeys accessible for the credentials are returned.
Authz_apikeys(customer_id: ID!): [Authz_Apikey!]
# retrieves the customer_id for a given group_id if in the access scope of the current credentials.
Authz_customer_id_for_group_id(group_id: ID!): Authz_CustomerID
# retrieves the customer_id for a given node_id if in the access scope of the current credentials.
Authz_customer_ids_for_node(node_id: ID!): [ID!]!
Authz_customers(
search_params: Authz_CustomerSearchParams_Input
skip: Int
take: Int
): [Authz_Customer!]
# Finds the user identified by the given ID.
# DEPRECATED
Authz_find_admin_user(user_id: Authz_AdminUserID!): Authz_AdminUser!
# lists all invites on a customer within access scope of currently used credentials
Authz_get_invites(customer_id: Authz_CustomerID!): [Authz_Invite!]!
# Returns the permissions of the currently used credentials.
Authz_get_permissions: [Authz_CustomerPermissions!]!
# gets all the current policies for the given apikey_id
Authz_get_policies_apikey(apikey_id: Authz_ApikeyID!): [Authz_PolicyApikey]
# gets all the current policies for the given user_id
Authz_get_policies_user(user_id: Authz_AdminUserID!): [Authz_PolicyUser]
# returns all permission roles visible to the current credentials on a given customer.
Authz_get_roles(customer_id: Authz_CustomerID): [Authz_RoleName!]
# gets all user policies for a customer
Authz_get_user_policies_for_customer(
customer_id: Authz_CustomerID
): [Authz_PolicyUser!]
# Checks the requested group IDs for access and returns a sorted list with a true/false value for each one.
# If recursive is set to true, it also returns the children of the requested IDs.
# Groups are organized in a tree structure. The credential has access to the group and its subgroups.
Authz_group_ids(recursive: Boolean!, requested_ids: [ID!]!): [Authz_IdStatus!]
# Returns all the group IDs the credential has access to filtered by given customer_ids
# Groups are organized in a tree structure. The credential has access to the group and its subgroups.
Authz_group_ids_by_customer_ids(
customer_ids: [ID!]!
recursive: Boolean!
): [ID!]
Authz_has_access_to_customer_ids(customer_ids: [ID!]): Boolean!
Authz_has_access_to_group_ids(group_ids: [ID!]): Boolean!
Authz_has_access_to_macs(macs: [DM_Mac!]): Boolean!
Authz_has_access_to_node_ids(node_ids: [ID!]): Boolean!
# Returns the currently logged in user.
Authz_logged_in_user: Authz_LoggedInUserData!
# Checks the requested node IDs for access and returns a sorted list with a true/false value for each one.
Authz_node_ids(requested_ids: [ID!]!): [Authz_IdStatus!]
# Query the client-side configuration settings of the management tunnel for a given MTSG device.
#
# PARAMS:
# - mac: device to get the settings of (MAC)
# - minimum_ttl: minimum TTL of certificates for the requested configuration
#
# NOTES:
# - If the optional minimum_ttl is omitted, certificates will have a minimum TTL of 6 weeks.
#
# RETURNS:
# - management tunnel client-side configuration settings
DM_DeviceMgmtTunnel(
mac: DM_Mac!
minimum_ttl: DM_Duration
): DM_DeviceMgmtTunnelResponse
# Find all stargates the user has access to.
DM_appliances: [DM_Appliance!]
# Find log event by log id.
DM_find_log_by_id(log_id: ID!): DM_AuditLogEventDetails
# Find devices that need firmware upgrade
#
# Result is ordered by rollout_state (inprogress is returned first).
DM_firmware_get_work(limit: Int!): [DM_DeviceRolloutWorkItem!]
# Get credentials for a device
DM_get_device_credentials(mac: DM_Mac!): DM_DeviceCredentials
# gets a recursive list of nodes inside the transitive hull of all specified group_ids configurations up to n levels of recursiveness
#
# NOTES:
# - this returns all nodes, device configurations and group configuration nodes that inherit the given configurations
# - if a specified group_id is not allowed to be accessed, the whole query fails
# - if group_ids is an empty array, the query fails
# - recursive defines the level of recursiveness (0 .. roots only, 1 .. first level, 2 .. first two levels, -1 means all nodes (full recursion))
# - returns null on error
DM_get_inherited_nodes_by_group_ids(
group_ids: [DM_GroupID!]!
recursive: Int!
): [DM_Node!]
# Finds the highest container_version for each container_image so that the rollout service can check if any instances need to be upgraded.
# It includes either public node services or node services related to the given customer.
# The customer_id is required for all requests without privilege all_customers.
DM_get_newest_node_services(customer_id: DM_CustomerID): [DM_NodeService!]!
# Gets the node service instances with the given IDs.
DM_get_node_service_instances(
ids: [DM_NodeServiceInstanceID!]!
): [DM_NodeServiceInstance!]
# Find node service instances with the given rollout states.
#
# Result is ordered by node_id asc, node_service_instance_id asc.
DM_get_node_service_instances_by_rollout_state(
limit: Int
skip: Int
state_selectors: [DM_RolloutState!]!
): [DM_NodeServiceInstance!]
# gets a list of all available node types
#
# NOTES:
# - returns null on error
DM_get_node_types: [DM_NodeType!]
# gets a recursive list of nodes of all specified group_ids up to n levels of recursiveness
#
# NOTES:
# - this returns all nodes, device configurations and group configuration nodes
# - if a specified group_id is not allowed to be accessed, the whole query fails
# - if group_ids is an empty array, the query fails
# - recursive defines the level of recursiveness (0 .. roots only, 1 .. first level, 2 .. first two levels, -1 means all nodes (full recursion))
# - returns null on error
DM_get_nodes_by_group_ids(
group_ids: [DM_GroupID!]!
recursive: Int!
): [DM_Node!]
# Find node service instances running versions of the container lower than the provided version.
# "running" implies an active device - not deleted, enabled, and online.
# Meant to be used by the rollout service to determine which instances to upgrade.
# Which also means, it will only return instances which are within the node's rollout or (node type's default) time span,
# see node_status.rollout_start, node_status.rollout_end, node_type.default_rollout_start and node_type.default_rollout_end.
#
# Result is ordered by node_id asc, node_service_instance_id asc.
DM_get_old_node_service_instances(
container_image: String!
container_version_lower_than: String!
limit: Int
skip: Int
): [DM_NodeServiceInstance!]
# Find all log events for a given node.
DM_log_events_for_node(
limit: Int!
node_id: DM_NodeID!
skip: Int!
): DM_LogEventsForNodeResponse!
# query a list of nodes
# queries the unique union of node_ids and macs
#
# NOTE:
# - a node_id can be a device node_id or the default_config node_id of a group
# - a mac address can only be a device mac address
# - a group_id can be a group_id of a group config and queries only the group config
# - returns null on error
# - returns all DM_Node the customer has access to (ignores all others)
# - if node_ids and macs and group_ids is empty the query fails
DM_nodes(
group_ids: [DM_GroupID!]
macs: [DM_Mac!]
node_ids: [DM_NodeID!]
): [DM_Node!]
# query offline heartbeat data (offline means independent of internet uplink)
#
# NOTES:
# - macs should contain values of active devices, if not they will be included in device_errors
# - event_selectors must contain at least one entry
# - returns null on error
DM_reporting_heartbeat_offline(
after_or_at: DateTime!
before: DateTime!
event_selectors: [DM_DeviceEventType!]!
macs: [DM_Mac!]!
): DM_ReportingHeartbeatOfflineResponse
# query online heartbeat data (online means internet uplink online status dependent)
#
# NOTES:
# - macs should contain values of active devices, if not they will be included in device_errors
# - event_selectors must contain at least one entry
# - returns null on error
DM_reporting_heartbeat_online(
after_or_at: DateTime!
before: DateTime!
event_selectors: [DM_DeviceEventType!]!
macs: [DM_Mac!]!
): DM_ReportingHeartbeatOnlineResponse
# retrieves nodes by a search string (which wildcard matches against the name of group configs and against name and mac of devices, but also exactly matches against node_id and group_id)
# Note:
# - only nodes in the own access scope will be retrieved, means within assigned groups on your customers.
# - mac search needs at least 4 chars, otherwise nodes are only searched by name, where only 3 chars are needed.
# - if the node_id or the group_id (on group_configs) exactly matches, it also will be found.
DM_search_nodes(search: String!): [DM_Node!]
activate_user_session(
client_mac: String!
fallback_ap_mac: String!
server_mac: String!
): ActivateUserSessionResponse
customer_shares_for_splashpage(splashpage_id: ID!): [Customer!]
# Retrive all available Email CIDs (Campain IDs) for a given customer.
email_cids(customer_id: String): EmailCIDsResponse
# Exports all email addresses collected by a lead collection connect widget.
# Omit email_cid if you want to export leads for all campaigns. Optionally use time_start and time_end to filter the date range.
export_emails(
customer_id: String
email_cid: String
time_end: DateTime
time_start: DateTime
): ExportEmailsResponse
# Request an overview of all configured feeds for a given customer.
feed_overview(customer_id: ID): FeedOverviewResponse
feed_widget(
ap_mac: String
language: String
user_session_id: ID
widget_id: ID!
): FeedWidgetResponse
# Get all accesible feed widgets.
feed_widgets: FeedWidgetsResponse
# fetch or issue a new tinc keypair for a device with a tinc-enabled appliance or
# fetch or issue a new tinc keypair for an appliance
#
# this query will create a keypair if it doesn't exist for the mac, or return
# the existing keypair
#
# this query will notify the appliance about the newly created keypair
fetch_or_issue_tinc_keypair(mac: String!): TincKeyResponse
# generates a new tinc keypair for a device with a tinc-enabled appliance or
# generates a new tinc keypair for an appliance
#
# this query will always result in a new keypair and overwrite and invalidate
# the old one
#
# this query will notify the appliance about the newly created keypair
generate_tinc_keypair(mac: String!): TincKeyResponse
get_internet_user_sessions(server_mac: String!): UserSessionsResponse
# Fetch all groups for a given customer (Deprecated).
groups(customer_id: String): GroupsResponse
health_remote_api: Boolean
health_resource_api: Boolean
health_wasabi_auth: Boolean!
health_wasabi_dm: Boolean!
health_wasabi_reporting: Boolean!
is_active_user_session(user_session_id: ID!): IsActiveUserSessionResponse
is_valid_user_session(user_session_id: ID!): IsValidUserSessionResponse
login_method_policy(
customer_id: ID
splashpage_id: ID!
): LoginMethodPolicyResponse
# Fetch all accessible network user policies.
network_user_policies: NetworkUserPoliciesResponse
# Fetch a Network User Policy by their id.
network_user_policy(network_user_policy_id: String): NetworkUserPolicyResponse
# Query the node settings for the given MTSG device identified by its MAC address.
#
# PARAMS:
# - mac: MTSG device to get the settings of (MAC)
# - minimum_ttl: minimum TTL of certificates for the requested configuration
#
# NOTES:
# - If the optional minimum_ttl is omitted, certificates will have a minimum TTL of 6 weeks.
#
# RETURNS:
# - node_settings (uplink, accesses, networks, and configuration meta data)
node_settings(mac: String!, minimum_ttl: DM_Duration): DM_NodeSettingsResponse
resource_by_origin_info(
customer_id: ID!
etag: String
original_url: String!
): ResourceResponse
resources(
customer_id: String!
filename: String
mimetype: String
resource_id: ID
skip: Int
take: Int
): ResourcesResponse
session_info(user_session_id: ID!): UserSessionInfoResponse
shared_splashpages_for_customer(customer_id: ID!): [SplashpageShort!]
snippets(key: String, language: String): SnippetsResponse
snippets_only: SnippetsOnlyResponse
splashpage(
initial: Boolean
language: String!
user_session_id: ID!
): SplashpageResponse
splashpage_editor(language: String, splashpage_id: ID): SplashpageResponse
splashpage_local_api(
ap_mac: String!
expected_splashpage_id: String
since: DateTime
): SplashpageLocalApiResponse
splashpage_preview(
ap_mac: String!
client_mac: String
initial: Boolean
language: String!
): SplashpageResponse
# Fetch all splashpages for a given customer.
splashpages(customer_id: String!): SplashpagesResponse
}
enum ReportingPermission {
reporting_group_emailreport
}
enum Reporting_ErrorCodes {
BAD_INPUT_ERROR
ERROR_GENERIC
INTERNAL_SERVER_ERROR
NOT_AUTHORIZED
}
# This type includes information about a successfull report generation.
# Like the email address the generated report is sent to.
type Reporting_GenerateReportsResponse {
email: String!
}
enum Reporting_ID_Type {
group_id
}
input RequestHoldInput {
ds100: ID
ibnr: ID
transport_id: ID!
tributary_id: ID
}
type ResourceResponse implements Response {
error: Error
resource: File
}
type ResourcesResponse implements Response {
count: Int
error: Error
resources: [File]
}
interface Response {
error: Error
}
enum ResultCode {
MODIFIED
NOT_MODIFIED
}
enum SessionEvent {
garden_start
internet_interim
internet_pause
internet_resume
internet_start
internet_stop
support_form_submit
}
input SessionEventInput {
bytes_down_delta: BigInt
bytes_up_delta: BigInt
event_type: SessionEvent!
message_id: ID!
method: String
time_start: DateTime!
}
enum SessionState {
garden
internet
pause
stop
}
scalar SimpleJSON
input SimpleTextMetaDataInput {
feed_config: FeedConfigInput
snippet_keys: SimpleTextSnippetsInput
}
type SimpleTextSnippets {
content: String
}
input SimpleTextSnippetsInput {
content: String
}
type SimpleTextWidget implements Widget {
anchor: Anchor
content: String
content_lang: [Translatable]
date_created: DateTime!
date_updated: DateTime!
enable_anchor: Boolean
is_ready: Boolean
meta_data: SimpleTextWidgetMetaData
page_id: ID!
position: Int!
update_interval: Int
widget_id: ID!
}
input SimpleTextWidgetInput {
anchor: AnchorInput
content: [TranslatableInput]
enable_anchor: Boolean
meta_data: SimpleTextMetaDataInput
page_id: ID
update_interval: Int
}
type SimpleTextWidgetMetaData {
feed_config: FeedConfig
snippet_keys: SimpleTextSnippets
}
type Snippet {
column: String!
key: String!
lang: String!
position: Int!
snippet_id: String!
value: String!
widget_type: String!
}
input SnippetInput {
column: String
key: String
lang: String
value: String
widget_type: String
}
type SnippetOnly {
key: String!
widget_type: String!
}
type SnippetResponse implements Response {
error: Error
snippet: Snippet
}
type SnippetsOnlyResponse implements Response {
error: Error
snippets_only: [SnippetOnly]
}
type SnippetsResponse implements Response {
error: Error
snippets: [Snippet]
}
type Splashpage {
background_image: String
color_primary: String!
color_secondary: String!
customer_id: ID!
default_lang: String
destination_url: String
logo_image: String
matomo_tracking_id: String
pages: [Page]!
splashpage_id: ID!
supported_lang: [String]
title: String!
}
input SplashpageInput {
background_image: String
color_primary: String
color_secondary: String
customer_id: ID
default_lang: String
destination_url: String
login_method_policy: [LoginMethodPolicyInput]
logo_image: String
supported_lang: [String]
title: String
}
type SplashpageLocalApiResponse implements Response {
error: Error
login_method_policies: [LoginMethodPolicy!]
network_user_policies: [NetworkUserPolicy!]
resources: [File]
result_code: ResultCode
splashpage_lang: [SplashpageTranslatable!]
tls_certificate: TLSCertificate
}
input SplashpageLogInput {
data: String
error_code: String
level: LogLevel!
message: String!
}
type SplashpageResponse implements Response {
connected: Boolean
error: Error
online: Boolean
policy_violation: Error
preview_ap_macs: [String]
splashpage: Splashpage
user_session_id: ID
user_session_info: UserSessionInfo
}
type SplashpageShort {
customer_id: ID!
customer_name: String!
default_lang: String
group_splashpage: [Group]
groups: [Group]
matomo_tracking_id: String
preview_ap_macs: [String]
splashpage_id: ID!
supported_lang: [String]
title: String!
}
type SplashpageTranslatable {
lang: String!
splashpage: Splashpage!
}
type SplashpagesResponse implements Response {
error: Error
splashpages: [SplashpageShort]
}
input StringOptional {
value: String
}
type StructuredTextCategory {
anchor: Anchor
enable_anchor: Boolean
entries: [StructuredTextEntry]
id: ID
label: String
label_lang: [Translatable]
}
input StructuredTextCategoryInput {
anchor: AnchorInput
enable_anchor: Boolean
entries: [StructuredTextEntryInput]!
id: ID
label: [TranslatableInput]
}
type StructuredTextEntry {
POI_match: [PoiMatch]
POI_match_lang: [PoiMatchTranslatable]
content: String
content_lang: [Translatable]
id: ID
title: String
title_lang: [Translatable]
}
input StructuredTextEntryInput {
POI_match: [TranslatablePoiMatchInput]
content: [TranslatableInput]!
id: ID
title: [TranslatableInput]!
}
input StructuredTextMetaDataInput {
feed_config: FeedConfigInput
}
type StructuredTextWidget implements Widget {
categories: [StructuredTextCategory]
date_created: DateTime!
date_updated: DateTime!
is_ready: Boolean
meta_data: StructuredTextWidgetMetaData
page_id: ID!
position: Int!
update_interval: Int
widget_id: ID!
}
input StructuredTextWidgetInput {
anchor: AnchorInput
categories: [StructuredTextCategoryInput]
enable_anchor: Boolean
meta_data: StructuredTextMetaDataInput
page_id: ID
update_interval: Int
}
type StructuredTextWidgetMetaData {
feed_config: FeedConfig
}
input SupportFormSubmitInput {
email: String
firstname: String
lastname: String
option_key: String
phone_number: String
user_text: String
}
input SupportFormSubmitSyncInput {
input: SupportFormSubmitInput!
user_session_info: UserSessionInfoInput!
widget_id: ID!
}
type SupportFormWidget implements Widget {
custom_options: [CustomOption]
date_created: DateTime!
date_updated: DateTime!
page_id: ID!
position: Int!
widget_id: ID!
}
input SupportFormWidgetInput {
custom_options: [CustomOptionInput]
page_id: ID!
}
type SupportInfoWidget implements Widget {
date_created: DateTime!
date_updated: DateTime!
page_id: ID!
position: Int!
widget_id: ID!
}
input SupportInfoWidgetInput {
page_id: ID!
}
type TLSCertificate {
cert: String!
private_key: String!
}
input TimeSpanOptional {
value: DM_TimeSpan
}
type TincKey {
pem_private: String!
pem_public: String!
}
type TincKeyResponse implements Response {
error: Error
hosts: [TincPublicKey!]
tinc: TincKey
}
type TincPublicKey {
mac: String!
pem_public: String!
}
type Translatable {
lang: String!
value: String!
}
input TranslatableInput {
lang: String!
value: String!
}
input TranslatablePoiMatchInput {
lang: String!
value: [PoiMatchInput]
}
# The `Upload` scalar type represents a file upload.
scalar Upload
type Usage {
mbytes_down: Float!
mbytes_up: Float!
session_time: Int!
}
type UserSession {
ap_mac: String
client_mac: String
policy: Policy
state: String
time_start: DateTime
user_session_id: String
}
input UserSessionAccountingBatchInput {
accounting_batch: [UserSessionAccountingInput]
server_mac: String!
}
input UserSessionAccountingInput {
bytes_down_delta: BigInt
bytes_up_delta: BigInt
message_id: ID
user_session_id: String!
}
type UserSessionIdResponse implements Response {
error: Error
state: String
time_start: DateTime
user_session_id: ID
}
type UserSessionInfo {
ap_mac: String
ap_name: String
client_mac: String
daily_max_mbytes_down: Int
@deprecated(reason: "use network_user_policy.daily_max_mbytes_down")
daily_max_mbytes_up: Int
@deprecated(reason: "use network_user_policy.daily_max_mbytes_up")
daily_max_session_time: Int
@deprecated(reason: "use network_user_policy.daily_max_session_time")
max_mbytes_down: Int
@deprecated(reason: "use network_user_policy.max_mbytes_down")
max_mbytes_up: Int
@deprecated(reason: "use network_user_policy.max_mbytes_up")
mbytes_down: Float
mbytes_up: Float
network_user_policy: NetworkUserPolicy
policy: Policy @deprecated(reason: "Use network_user_policy")
session_time: Int
state: String
sync_user_session_id: String
time_start: DateTime
time_start_internet: DateTime
timeout_session: Int
@deprecated(reason: "use network_user_policy.timeout_session")
user_session_id: String
}
input UserSessionInfoInput {
ap_mac: String
client_mac: String
mbytes_down: Float
mbytes_up: Float
network_user_policy: NetworkUserPolicyInput
policy: PolicyInput
session_time: Int
state: String
time_start: DateTime
time_start_internet: DateTime
user_session_id: String
}
type UserSessionInfoResponse implements Response {
error: Error
user_session: UserSessionInfo
}
type UserSessionSync {
assigned_policy: NetworkUserPolicy!
client_mac: String!
current_usage: Usage!
daily_usage: Usage!
state: SessionState!
time_end: DateTime
time_start: DateTime!
time_start_internet: DateTime
user_session_id: ID!
}
enum UserSessionSyncErrorCode {
# input data was invalid
INVALID_INPUT_DATA
# sync output data was invalid
INVALID_OUTPUT_DATA
}
input UserSessionSyncInput {
client_mac: String!
lead: ConnectInput
session_events: [SessionEventInput]
state: SessionState
support_form_submits: [SupportFormSubmitSyncInput]
time_end: DateTime
time_start: DateTime!
time_start_internet: DateTime
user_agent_country: String
user_agent_lang: String
user_session_id: ID
}
type UserSessionsResponse implements Response {
error: Error
user_sessions: [UserSession]
}
input UserSessionsSyncInput {
user_sessions: [UserSessionSyncInput]
}
type UserSessionsSyncResponse implements Response {
error: Error
failed_user_sessions: [FailedUserSessionSync]
user_sessions: [UserSessionSync]
}
interface Widget {
date_created: DateTime!
date_updated: DateTime!
page_id: ID!
position: Int!
widget_id: ID!
}
type WidgetResponse implements Response {
error: Error
widget: Widget
}
type WidgetsResponse implements Response {
error: Error
widgets: [Widget]
}
type Wifi4EUWidget implements Widget {
date_created: DateTime!
date_updated: DateTime!
network_identifier: String!
page_id: ID!
position: Int!
self_test: Boolean
widget_id: ID!
}
input Wifi4EUWidgetInput {
network_identifier: String!
page_id: ID!
self_test: Boolean
}
# WifiSettings referenced by a NodeNetwork
type WifiSettings {
# true if the SSID of the wifi network should be broadcasted
broadcast: Boolean!
# true if clients are prevented from interacting with each other
client_separation: Boolean!
# encryption: can be none, wpa2psk, wpa2ccmp, wpa2psktkip, wpa2psktkipaes
encryption: DM_Network_Encryption!
# the maximum allowed number of associated clients
max_clients: Int!
# is the pre-shared key used by this configuration (for wpa2 with psk)
psk: String!
# the SSID of the wifi network
ssid: String!
}
type _AuthzServiceEntityPlaceholder {
id: ID!
}
type _DMServiceEntityPlaceholder {
id: ID!
}
type _ReportingServiceEntityPlaceholder {
id: ID!
}
{
"__validationErrors": [],
"_queryType": "Query",
"_mutationType": "Mutation",
"_subscriptionType": null,
"_directives": [
"@include",
"@skip",
"@deprecated",
"@specifiedBy"
],
"_typeMap": {
"ActivateUserSessionResponse": "ActivateUserSessionResponse",
"String": "String",
"ID": "ID",
"AdminLogInput": "AdminLogInput",
"Anchor": "Anchor",
"AnchorInput": "AnchorInput",
"AuthType": "AuthType",
"AuthzPermission": "AuthzPermission",
"Authz_AdminUser": "Authz_AdminUser",
"Authz_AdminUserID": "Authz_AdminUserID",
"Authz_AdminUserSearchParams_Input": "Authz_AdminUserSearchParams_Input",
"Authz_AdminUsersResponse": "Authz_AdminUsersResponse",
"Int": "Int",
"Authz_Apikey": "Authz_Apikey",
"Authz_ApikeyID": "Authz_ApikeyID",
"Authz_CreateAdminUser_Input": "Authz_CreateAdminUser_Input",
"Authz_Customer": "Authz_Customer",
"Authz_CustomerID": "Authz_CustomerID",
"Authz_CustomerPermissions": "Authz_CustomerPermissions",
"Authz_CustomerSearchParams_Input": "Authz_CustomerSearchParams_Input",
"Authz_Customer_Input": "Authz_Customer_Input",
"Authz_EditAdminUser_Input": "Authz_EditAdminUser_Input",
"Authz_ErrorCodes": "Authz_ErrorCodes",
"Authz_ID_Type": "Authz_ID_Type",
"Authz_IdStatus": "Authz_IdStatus",
"Boolean": "Boolean",
"Authz_Invite": "Authz_Invite",
"Authz_InviteID": "Authz_InviteID",
"Authz_LoggedInUserData": "Authz_LoggedInUserData",
"Authz_LoginResponse": "Authz_LoginResponse",
"Authz_PolicyApikey": "Authz_PolicyApikey",
"Authz_PolicyUser": "Authz_PolicyUser",
"Authz_RoleName": "Authz_RoleName",
"BigInt": "BigInt",
"Bigint": "Bigint",
"CampaignWidget": "CampaignWidget",
"CampaignWidgetInput": "CampaignWidgetInput",
"ClientInfoResponse": "ClientInfoResponse",
"ConnectInput": "ConnectInput",
"ConnectMetaDataInput": "ConnectMetaDataInput",
"ConnectSnippets": "ConnectSnippets",
"ConnectSnippetsInput": "ConnectSnippetsInput",
"ConnectWidget": "ConnectWidget",
"ConnectWidgetInput": "ConnectWidgetInput",
"ConnectWidgetMetaData": "ConnectWidgetMetaData",
"ConstraintNumber": "ConstraintNumber",
"ConstraintString": "ConstraintString",
"CopiedResourceIds": "CopiedResourceIds",
"CopyResourcesResponse": "CopyResourcesResponse",
"CustomOption": "CustomOption",
"CustomOptionInput": "CustomOptionInput",
"Customer": "Customer",
"DMPermission": "DMPermission",
"DM_Appliance": "DM_Appliance",
"DM_ApplianceID": "DM_ApplianceID",
"DM_AuditLogEvent": "DM_AuditLogEvent",
"DM_AuditLogEventDetails": "DM_AuditLogEventDetails",
"DM_AuditLogType": "DM_AuditLogType",
"DM_CopyConfigurationSelector_Input": "DM_CopyConfigurationSelector_Input",
"DM_CountryCode": "DM_CountryCode",
"DM_CustomerID": "DM_CustomerID",
"DM_Device": "DM_Device",
"DM_DeviceCredentials": "DM_DeviceCredentials",
"DM_DeviceEventType": "DM_DeviceEventType",
"DM_DeviceHeartbeatSource": "DM_DeviceHeartbeatSource",
"DM_DeviceMgmtTunnelResponse": "DM_DeviceMgmtTunnelResponse",
"DM_DeviceRolloutWorkItem": "DM_DeviceRolloutWorkItem",
"DM_Device_BaseConfig_Input": "DM_Device_BaseConfig_Input",
"DM_Device_Input": "DM_Device_Input",
"DM_Devices_Input": "DM_Devices_Input",
"DM_Duration": "DM_Duration",
"DM_Error": "DM_Error",
"DM_ErrorCodes": "DM_ErrorCodes",
"DM_FirmwareVersion": "DM_FirmwareVersion",
"DM_GPIOPortConfig": "DM_GPIOPortConfig",
"DM_GPIOPortConfig_Input": "DM_GPIOPortConfig_Input",
"DM_GPIOPortMode": "DM_GPIOPortMode",
"DM_Group": "DM_Group",
"DM_GroupConfig": "DM_GroupConfig",
"DM_GroupConfig_BaseConfig_Input": "DM_GroupConfig_BaseConfig_Input",
"DM_GroupID": "DM_GroupID",
"DM_GroupServiceInstance": "DM_GroupServiceInstance",
"DM_GroupServiceInstanceID": "DM_GroupServiceInstanceID",
"DM_Group_Input": "DM_Group_Input",
"DM_HeartbeatEvent": "DM_HeartbeatEvent",
"DM_HeartbeatType": "DM_HeartbeatType",
"DM_ID_Type": "DM_ID_Type",
"DM_IPv4Address": "DM_IPv4Address",
"DM_IPv4Subnet": "DM_IPv4Subnet",
"DM_LogEvent": "DM_LogEvent",
"DM_LogEventsForNodeResponse": "DM_LogEventsForNodeResponse",
"DM_Mac": "DM_Mac",
"DM_Network_Encryption": "DM_Network_Encryption",
"DM_Node": "DM_Node",
"DM_NodeAccess": "DM_NodeAccess",
"DM_NodeAccessBridge": "DM_NodeAccessBridge",
"DM_NodeAccessCloudNAT": "DM_NodeAccessCloudNAT",
"DM_NodeAccessDirectConnection": "DM_NodeAccessDirectConnection",
"DM_NodeAccessID": "DM_NodeAccessID",
"DM_NodeAccessMultiUplink": "DM_NodeAccessMultiUplink",
"DM_NodeAccessNAT": "DM_NodeAccessNAT",
"DM_NodeAccessPortForward": "DM_NodeAccessPortForward",
"DM_NodeAccessService": "DM_NodeAccessService",
"DM_NodeAccessVLAN": "DM_NodeAccessVLAN",
"DM_NodeAccessVPN": "DM_NodeAccessVPN",
"DM_NodeAccess_Input": "DM_NodeAccess_Input",
"DM_NodeAccess_Type": "DM_NodeAccess_Type",
"DM_NodeHardware": "DM_NodeHardware",
"DM_NodeHardwareEthernet": "DM_NodeHardwareEthernet",
"DM_NodeHardwareID": "DM_NodeHardwareID",
"DM_NodeHardwareRadio": "DM_NodeHardwareRadio",
"DM_NodeHardwareRadioSettings_Input": "DM_NodeHardwareRadioSettings_Input",
"DM_NodeHardwareType": "DM_NodeHardwareType",
"DM_NodeID": "DM_NodeID",
"DM_NodeLocation": "DM_NodeLocation",
"Float": "Float",
"DM_NodeLocation_Input": "DM_NodeLocation_Input",
"DM_NodeNetwork": "DM_NodeNetwork",
"DM_NodeNetworkID": "DM_NodeNetworkID",
"DM_NodeNetwork_Input": "DM_NodeNetwork_Input",
"DM_NodeOnlineStatus": "DM_NodeOnlineStatus",
"DM_NodeProfile": "DM_NodeProfile",
"DM_NodeService": "DM_NodeService",
"DM_NodeServiceID": "DM_NodeServiceID",
"DM_NodeServiceInstance": "DM_NodeServiceInstance",
"DM_NodeServiceInstanceConfigMount": "DM_NodeServiceInstanceConfigMount",
"DM_NodeServiceInstanceConfigMount_Input": "DM_NodeServiceInstanceConfigMount_Input",
"DM_NodeServiceInstanceID": "DM_NodeServiceInstanceID",
"DM_NodeServiceInstance_Input": "DM_NodeServiceInstance_Input",
"DM_NodeServiceType": "DM_NodeServiceType",
"DM_NodeService_Input": "DM_NodeService_Input",
"DM_NodeSettingsResponse": "DM_NodeSettingsResponse",
"DM_NodeStatus": "DM_NodeStatus",
"DM_NodeType": "DM_NodeType",
"DM_NodeTypeID": "DM_NodeTypeID",
"DM_NodeType_Input": "DM_NodeType_Input",
"DM_NodeUplink": "DM_NodeUplink",
"DM_NodeUplinkDHCPClient": "DM_NodeUplinkDHCPClient",
"DM_NodeUplinkID": "DM_NodeUplinkID",
"DM_NodeUplinkStaticIPv4": "DM_NodeUplinkStaticIPv4",
"DM_NodeUplinkWanType": "DM_NodeUplinkWanType",
"DM_NodeUplink_Input": "DM_NodeUplink_Input",
"DM_Node_NetworkConfig_Input": "DM_Node_NetworkConfig_Input",
"DM_Node_NetworkConfig_Inputs": "DM_Node_NetworkConfig_Inputs",
"DM_ReportingDeviceEvent": "DM_ReportingDeviceEvent",
"DM_ReportingDeviceEventDeviceOnline": "DM_ReportingDeviceEventDeviceOnline",
"DM_ReportingDeviceEvents": "DM_ReportingDeviceEvents",
"DM_ReportingDeviceResponseStatus": "DM_ReportingDeviceResponseStatus",
"DM_ReportingDeviceResponseStatusCode": "DM_ReportingDeviceResponseStatusCode",
"DM_ReportingHeartbeatOfflineResponse": "DM_ReportingHeartbeatOfflineResponse",
"DM_ReportingHeartbeatOnlineResponse": "DM_ReportingHeartbeatOnlineResponse",
"DM_RoleName": "DM_RoleName",
"DM_RolloutState": "DM_RolloutState",
"DM_Time": "DM_Time",
"DM_TimeSpan": "DM_TimeSpan",
"DM_VLANRanges": "DM_VLANRanges",
"DM_WPA2EConfig": "DM_WPA2EConfig",
"DM_WPA2EConfigInput": "DM_WPA2EConfigInput",
"DateTime": "DateTime",
"EmailCIDsResponse": "EmailCIDsResponse",
"EmergencyRequestReason": "EmergencyRequestReason",
"EmergencyRequestReasonInput": "EmergencyRequestReasonInput",
"EmergencyRequestStatus": "EmergencyRequestStatus",
"EmergencyRequestWidget": "EmergencyRequestWidget",
"EmergencyRequestWidgetInput": "EmergencyRequestWidgetInput",
"EmergencyRequestWidgetMetaData": "EmergencyRequestWidgetMetaData",
"EmergencyRequestWidgetMetaDataInput": "EmergencyRequestWidgetMetaDataInput",
"EmptyResponse": "EmptyResponse",
"Error": "Error",
"ErrorCodes": "ErrorCodes",
"EthernetSettings": "EthernetSettings",
"ExportEmail": "ExportEmail",
"ExportEmailUsage": "ExportEmailUsage",
"ExportEmailsResponse": "ExportEmailsResponse",
"FailedUserSessionSync": "FailedUserSessionSync",
"FeedConfig": "FeedConfig",
"FeedConfigInput": "FeedConfigInput",
"FeedConfigInputOperation": "FeedConfigInputOperation",
"FeedOverviewResponse": "FeedOverviewResponse",
"FeedOverviewWidget": "FeedOverviewWidget",
"FeedWidget": "FeedWidget",
"FeedWidgetResponse": "FeedWidgetResponse",
"FeedWidgetsResponse": "FeedWidgetsResponse",
"File": "File",
"GeoFeedPoint": "GeoFeedPoint",
"GeoFeedPointInput": "GeoFeedPointInput",
"Group": "Group",
"GroupReportType": "GroupReportType",
"GroupsResponse": "GroupsResponse",
"Interfaces": "Interfaces",
"IsActiveUserSessionResponse": "IsActiveUserSessionResponse",
"IsValidUserSessionResponse": "IsValidUserSessionResponse",
"JourneyInfoByApsResponseInput": "JourneyInfoByApsResponseInput",
"JourneyInfoJsonFromFeedInput": "JourneyInfoJsonFromFeedInput",
"JourneyInfoMetaDataInput": "JourneyInfoMetaDataInput",
"JourneyInfoWidget": "JourneyInfoWidget",
"JourneyInfoWidgetInput": "JourneyInfoWidgetInput",
"JourneyInfoWidgetMetaData": "JourneyInfoWidgetMetaData",
"LogLevel": "LogLevel",
"LoginMethodPolicy": "LoginMethodPolicy",
"LoginMethodPolicyInput": "LoginMethodPolicyInput",
"LoginMethodPolicyResponse": "LoginMethodPolicyResponse",
"MovingMapMetaDataInput": "MovingMapMetaDataInput",
"MovingMapWidget": "MovingMapWidget",
"MovingMapWidgetInput": "MovingMapWidgetInput",
"MovingMapWidgetMetaData": "MovingMapWidgetMetaData",
"Mutation": "Mutation",
"NetworkUserPoliciesResponse": "NetworkUserPoliciesResponse",
"NetworkUserPolicy": "NetworkUserPolicy",
"NetworkUserPolicyInput": "NetworkUserPolicyInput",
"NetworkUserPolicyResponse": "NetworkUserPolicyResponse",
"NetworkUserPolicyUpdateInput": "NetworkUserPolicyUpdateInput",
"NodeAccess": "NodeAccess",
"NodeAccessNAT": "NodeAccessNAT",
"NodeAccessOpenVPN": "NodeAccessOpenVPN",
"NodeAccessType": "NodeAccessType",
"NodeAccessVLAN": "NodeAccessVLAN",
"NodeNetwork": "NodeNetwork",
"NodeUplink": "NodeUplink",
"NodeUplinkDHCPv4": "NodeUplinkDHCPv4",
"NodeUplinkStaticv4": "NodeUplinkStaticv4",
"Page": "Page",
"PageInput": "PageInput",
"PageResponse": "PageResponse",
"PagesResponse": "PagesResponse",
"PoiMatch": "PoiMatch",
"PoiMatchInput": "PoiMatchInput",
"PoiMatchStop": "PoiMatchStop",
"PoiMatchStopInput": "PoiMatchStopInput",
"PoiMatchTranslatable": "PoiMatchTranslatable",
"Policy": "Policy",
"PolicyInput": "PolicyInput",
"Preview": "Preview",
"Query": "Query",
"ReportingPermission": "ReportingPermission",
"Reporting_ErrorCodes": "Reporting_ErrorCodes",
"Reporting_GenerateReportsResponse": "Reporting_GenerateReportsResponse",
"Reporting_ID_Type": "Reporting_ID_Type",
"RequestHoldInput": "RequestHoldInput",
"ResourceResponse": "ResourceResponse",
"ResourcesResponse": "ResourcesResponse",
"Response": "Response",
"ResultCode": "ResultCode",
"SessionEvent": "SessionEvent",
"SessionEventInput": "SessionEventInput",
"SessionState": "SessionState",
"SimpleJSON": "SimpleJSON",
"SimpleTextMetaDataInput": "SimpleTextMetaDataInput",
"SimpleTextSnippets": "SimpleTextSnippets",
"SimpleTextSnippetsInput": "SimpleTextSnippetsInput",
"SimpleTextWidget": "SimpleTextWidget",
"SimpleTextWidgetInput": "SimpleTextWidgetInput",
"SimpleTextWidgetMetaData": "SimpleTextWidgetMetaData",
"Snippet": "Snippet",
"SnippetInput": "SnippetInput",
"SnippetOnly": "SnippetOnly",
"SnippetResponse": "SnippetResponse",
"SnippetsOnlyResponse": "SnippetsOnlyResponse",
"SnippetsResponse": "SnippetsResponse",
"Splashpage": "Splashpage",
"SplashpageInput": "SplashpageInput",
"SplashpageLocalApiResponse": "SplashpageLocalApiResponse",
"SplashpageLogInput": "SplashpageLogInput",
"SplashpageResponse": "SplashpageResponse",
"SplashpageShort": "SplashpageShort",
"SplashpageTranslatable": "SplashpageTranslatable",
"SplashpagesResponse": "SplashpagesResponse",
"StringOptional": "StringOptional",
"StructuredTextCategory": "StructuredTextCategory",
"StructuredTextCategoryInput": "StructuredTextCategoryInput",
"StructuredTextEntry": "StructuredTextEntry",
"StructuredTextEntryInput": "StructuredTextEntryInput",
"StructuredTextMetaDataInput": "StructuredTextMetaDataInput",
"StructuredTextWidget": "StructuredTextWidget",
"StructuredTextWidgetInput": "StructuredTextWidgetInput",
"StructuredTextWidgetMetaData": "StructuredTextWidgetMetaData",
"SupportFormSubmitInput": "SupportFormSubmitInput",
"SupportFormSubmitSyncInput": "SupportFormSubmitSyncInput",
"SupportFormWidget": "SupportFormWidget",
"SupportFormWidgetInput": "SupportFormWidgetInput",
"SupportInfoWidget": "SupportInfoWidget",
"SupportInfoWidgetInput": "SupportInfoWidgetInput",
"TLSCertificate": "TLSCertificate",
"TimeSpanOptional": "TimeSpanOptional",
"TincKey": "TincKey",
"TincKeyResponse": "TincKeyResponse",
"TincPublicKey": "TincPublicKey",
"Translatable": "Translatable",
"TranslatableInput": "TranslatableInput",
"TranslatablePoiMatchInput": "TranslatablePoiMatchInput",
"Upload": "Upload",
"Usage": "Usage",
"UserSession": "UserSession",
"UserSessionAccountingBatchInput": "UserSessionAccountingBatchInput",
"UserSessionAccountingInput": "UserSessionAccountingInput",
"UserSessionIdResponse": "UserSessionIdResponse",
"UserSessionInfo": "UserSessionInfo",
"UserSessionInfoInput": "UserSessionInfoInput",
"UserSessionInfoResponse": "UserSessionInfoResponse",
"UserSessionSync": "UserSessionSync",
"UserSessionSyncErrorCode": "UserSessionSyncErrorCode",
"UserSessionSyncInput": "UserSessionSyncInput",
"UserSessionsResponse": "UserSessionsResponse",
"UserSessionsSyncInput": "UserSessionsSyncInput",
"UserSessionsSyncResponse": "UserSessionsSyncResponse",
"Widget": "Widget",
"WidgetResponse": "WidgetResponse",
"WidgetsResponse": "WidgetsResponse",
"Wifi4EUWidget": "Wifi4EUWidget",
"Wifi4EUWidgetInput": "Wifi4EUWidgetInput",
"WifiSettings": "WifiSettings",
"_AuthzServiceEntityPlaceholder": "_AuthzServiceEntityPlaceholder",
"_DMServiceEntityPlaceholder": "_DMServiceEntityPlaceholder",
"_ReportingServiceEntityPlaceholder": "_ReportingServiceEntityPlaceholder",
"__Schema": "__Schema",
"__Type": "__Type",
"__TypeKind": "__TypeKind",
"__Field": "__Field",
"__InputValue": "__InputValue",
"__EnumValue": "__EnumValue",
"__Directive": "__Directive",
"__DirectiveLocation": "__DirectiveLocation"
},
"_subTypeMap": {},
"_implementationsMap": {
"Response": {
"objects": [
"ActivateUserSessionResponse",
"ClientInfoResponse",
"CopyResourcesResponse",
"EmailCIDsResponse",
"EmptyResponse",
"ExportEmailsResponse",
"FeedOverviewResponse",
"FeedWidgetResponse",
"FeedWidgetsResponse",
"GroupsResponse",
"IsActiveUserSessionResponse",
"IsValidUserSessionResponse",
"LoginMethodPolicyResponse",
"NetworkUserPoliciesResponse",
"NetworkUserPolicyResponse",
"PageResponse",
"PagesResponse",
"ResourceResponse",
"ResourcesResponse",
"SnippetResponse",
"SnippetsOnlyResponse",
"SnippetsResponse",
"SplashpageLocalApiResponse",
"SplashpageResponse",
"SplashpagesResponse",
"TincKeyResponse",
"UserSessionIdResponse",
"UserSessionInfoResponse",
"UserSessionsResponse",
"UserSessionsSyncResponse",
"WidgetResponse",
"WidgetsResponse"
],
"interfaces": []
},
"Widget": {
"objects": [
"CampaignWidget",
"ConnectWidget",
"EmergencyRequestWidget",
"JourneyInfoWidget",
"MovingMapWidget",
"SimpleTextWidget",
"StructuredTextWidget",
"SupportFormWidget",
"SupportInfoWidget",
"Wifi4EUWidget"
],
"interfaces": []
},
"DM_LogEvent": {
"objects": [
"DM_AuditLogEvent",
"DM_AuditLogEventDetails",
"DM_HeartbeatEvent"
],
"interfaces": []
},
"DM_Node": {
"objects": [
"DM_Device",
"DM_GroupConfig"
],
"interfaces": []
},
"DM_NodeAccess": {
"objects": [
"DM_NodeAccessBridge",
"DM_NodeAccessCloudNAT",
"DM_NodeAccessDirectConnection",
"DM_NodeAccessMultiUplink",
"DM_NodeAccessNAT",
"DM_NodeAccessPortForward",
"DM_NodeAccessService",
"DM_NodeAccessVLAN",
"DM_NodeAccessVPN"
],
"interfaces": []
},
"DM_NodeHardware": {
"objects": [
"DM_NodeHardwareEthernet",
"DM_NodeHardwareRadio"
],
"interfaces": []
},
"DM_NodeUplink": {
"objects": [
"DM_NodeUplinkDHCPClient",
"DM_NodeUplinkStaticIPv4"
],
"interfaces": []
},
"DM_ReportingDeviceEvent": {
"objects": [
"DM_ReportingDeviceEventDeviceOnline"
],
"interfaces": []
},
"NodeAccess": {
"objects": [
"NodeAccessNAT",
"NodeAccessOpenVPN",
"NodeAccessVLAN"
],
"interfaces": []
},
"NodeUplink": {
"objects": [
"NodeUplinkDHCPv4",
"NodeUplinkStaticv4"
],
"interfaces": []
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment