nfsense/client/src/definitions.ts

363 lines
No EOL
13 KiB
TypeScript

import { SearchProvider, Options } from '~/components/input/DropdownInput.vue';
import { apiCall } from './api';
const GetHardwareInterfaces: SearchProvider = async (o) => {
let res = await apiCall('network.links.list', {});
if (res.Error === null) {
console.debug('links', res.Data);
return Object.fromEntries(res.Data.map((r: any) => [r.name, { display: r.name }]));
} else {
console.debug('error', res);
return {} as Options;
}
};
const GetInterfaces: SearchProvider = async (o) => {
let res = await apiCall('network.interfaces.list', {});
if (res.Error === null) {
console.debug('interfaces', res.Data);
return Object.fromEntries(res.Data.map(r => [r.name, { display: r.name }]));
} else {
console.debug('error', res);
return {} as Options;
}
};
const GetAddresses: SearchProvider = async (o) => {
let res = await apiCall('object.addresses.list', {});
if (res.Error === null) {
console.debug('addresses', res.Data);
return Object.fromEntries(res.Data.map(r => [r.name, { display: r.name }]));
} else {
console.debug('error', res);
return {} as Options;
}
};
const GetServices: SearchProvider = async (o) => {
let res = await apiCall('object.services.list', {});
if (res.Error === null) {
console.debug('services', res.Data);
return Object.fromEntries(res.Data.map(r => [r.name, { display: r.name }]));
} else {
console.debug('error', res);
return {} as Options;
}
};
const GetPeers: SearchProvider = async (o) => {
let res = await apiCall('vpn.wireguard.peers.list', {});
if (res.Error === null) {
console.debug('peers', res.Data);
return Object.fromEntries(res.Data.map(r => [r.name, { display: r.name }]));
} else {
console.debug('error', res);
return {} as Options;
}
};
const PortDefinition: Object = {
'any': { display: 'Any'},
'single': {
display: 'Single',
fields: {
port: { is: 'NumberBox', label: 'Port'},
},
},
'range': {
display: 'Range',
fields: {
start_port: { is: 'NumberBox', label: 'Start Port'},
end_port: { is: 'NumberBox', label: 'End Port'},
},
},
};
export const editTypes: { [key: string]: { [key: string]: any } } = {
'firewall': {
name: 'Firewall',
'forward_rules': {
name: 'Forward Rule',
idType: 'Number',
fields: {
name: { is: 'TextBox', label: 'Name'},
source_addresses: { is: 'MultiSelect', label: 'Source', props: { searchProvider: GetAddresses}},
destination_addresses: { is: 'MultiSelect', label: 'Destination', props: { searchProvider: GetAddresses}},
services: { is: 'MultiSelect', label: 'Services', props: { searchProvider: GetServices}},
verdict: { is: 'EnumInput', label: 'Verdict', props: { variants: {
'accept': { display: 'Accept'},
'drop': { display: 'Drop'},
'continue': { display: 'Continue'},
}}},
counter: { is: 'CheckBox', label: 'Counter'},
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
'destination_nat_rules': {
name: 'Destination NAT Rule',
idType: 'Number',
fields: {
name: { is: 'TextBox', label: 'Name'},
source_addresses: { is: 'MultiSelect', label: 'Source', props: { searchProvider: GetAddresses}},
destination_addresses: { is: 'MultiSelect', label: 'Destination', props: { searchProvider: GetAddresses}},
services: { is: 'MultiSelect', label: 'Services', props: { searchProvider: GetServices}},
dnat_heading: { is: 'Heading', props: { caption: 'DNAT' }},
dnat_address: { is: 'SingleSelect', label: 'Destination', props: { searchProvider: GetAddresses}},
dnat_service: { is: 'SingleSelect', label: 'Service', props: { searchProvider: GetServices}},
counter: { is: 'CheckBox', label: 'Counter'},
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
'source_nat_rules': {
name: 'Source NAT Rule',
idType: 'Number',
fields: {
name: { is: 'TextBox', label: 'Name'},
source_addresses: { is: 'MultiSelect', label: 'Source', props: { searchProvider: GetAddresses}},
destination_addresses: { is: 'MultiSelect', label: 'Destination', props: { searchProvider: GetAddresses}},
services: { is: 'MultiSelect', label: 'Services', props: { searchProvider: GetServices}},
snat_heading: { is: 'Heading', props: { caption: 'SNAT' }},
snat_type: { is: 'EnumInput', label: 'Type', props: { variants: {
'masquerade': { display: 'Masquerade' },
'snat': {
display: 'SNAT',
fields: {
address: { is: 'SingleSelect', label: 'Destination', props: { searchProvider: GetAddresses}},
service: { is: 'SingleSelect', label: 'Service', props: { searchProvider: GetServices}},
},
},
}}},
counter: { is: 'CheckBox', label: 'Counter'},
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
},
'network': {
name: 'Network',
'interfaces': {
name: 'Interface',
fields: {
name: { is: 'TextBox', label: 'Name'},
alias: { is: 'TextBox', label: 'Alias'},
interface_type: { is: 'EnumInput', label: 'Type', props: { variants: {
'hardware': {
display: 'Hardware',
fields: {
device: { is: 'SingleSelect', label: 'Device', props: { searchProvider: GetHardwareInterfaces }},
},
},
'vlan': {
display: 'VLAN',
fields: {
parent: { is: 'SingleSelect', label: 'VLAN Parent', props: { searchProvider: GetInterfaces}},
id: { is: 'NumberBox', label: 'VLAN ID', props: { min: 1, max: 4094 }},
},
},
'bond': {
display: 'Bond',
fields: {
members: { is: 'MultiSelect', label: 'Members', props: { searchProvider: GetInterfaces}},
},
},
'bridge': {
display: 'Bridge',
fields: {
members: { is: 'MultiSelect', label: 'Members', props: { searchProvider: GetInterfaces}},
},
},
}}},
addressing_mode: { is: 'EnumInput', label: 'Addressing Mode', props: { variants: {
'none': { display: 'None' },
'static': {
display: 'Static',
fields: {
address: { is: 'TextBox', label: 'Address'},
},
},
'dhcp': { display: 'DHCP' },
}}},
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
'static_routes': {
name: 'Static Route',
idType: 'Number',
fields: {
name: { is: 'TextBox', label: 'Name'},
interface: { is: 'SingleSelect', label: 'Interface', props: { searchProvider: GetInterfaces} },
gateway: { is: 'TextBox', label: 'Gateway'},
destination: { is: 'TextBox', label: 'Destination'},
metric: { is: 'NumberBox', label: 'Metric'},
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
},
'object': {
name: 'object',
'addresses': {
name: 'Address',
fields: {
name: { is: 'TextBox', label: 'Name'},
address_type: { is: 'EnumInput', label: 'Type', props: { variants: {
'host': {
display: 'Host',
fields: {
address: { is: 'TextBox', label: 'Address'},
},
},
'range': {
display: 'Range',
fields: {
range: { is: 'TextBox', label: 'Range'},
},
},
'network': {
display: 'Network',
fields: {
network: { is: 'TextBox', label: 'Network'},
},
},
'group': {
display: 'Group',
fields: {
members: { is: 'MultiSelect', label: 'Members', props: { searchProvider: GetAddresses}},
},
},
}}},
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
'services': {
name: 'Service',
fields: {
name: { is: 'TextBox', label: 'Name'},
service_type: { is: 'EnumInput', label: 'Type', props: { variants: {
'tcp': {
display: 'TCP',
fields: {
source: { is: 'EnumInput', label: 'Source', props: { variants: PortDefinition }},
destination: { is: 'EnumInput', label: 'Destination', props: { variants: PortDefinition }},
},
},
'udp': {
display: 'UDP',
fields: {
source: { is: 'EnumInput', label: 'Source', props: { variants: PortDefinition }},
destination: { is: 'EnumInput', label: 'Destination', props: { variants: PortDefinition }},
},
},
'icmp': {
display: 'ICMP',
fields: {
icmp_code: { is: 'NumberBox', label: 'ICMP Code'},
},
},
'group': {
display: 'Group',
fields: {
members: { is: 'MultiSelect', label: 'Members', props: { searchProvider: GetServices}},
},
},
}}},
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
},
'service': {
name: 'Service',
'dhcp_servers': {
name: 'DHCP Server',
idType: 'Number',
fields: {
interface: { is: 'SingleSelect', label: 'Interface', props: { searchProvider: GetInterfaces} },
pool: { is: 'MultiSelect', label: 'Pool', props: { searchProvider: GetAddresses} },
gateway_mode: { is: 'EnumInput', label: 'Gateway Mode', props: { variants: {
'none': { display: 'None' },
'interface': { display: 'Interface' },
'specify': {
display: 'Specify',
fields: {
gateway: { is: 'SingleSelect', label: 'Gateway', props: { searchProvider: GetAddresses} },
},
},
}}},
dns_server_mode: { is: 'EnumInput', label: 'DNS Server Mode', props: { variants: {
'none': { display: 'None' },
'interface': { display: 'Interface' },
'specify': {
display: 'Specify',
fields: {
servers: { is: 'MultiSelect', label: 'DNS Servers', props: { searchProvider: GetAddresses} },
},
},
}}},
ntp_server_mode: { is: 'EnumInput', label: 'NTP Server Mode', props: { variants: {
'none': { display: 'None' },
'interface': { display: 'Interface' },
'specify': {
display: 'Specify',
fields: {
servers: { is: 'MultiSelect', label: 'NTP Servers', props: { searchProvider: GetAddresses} },
},
},
}}},
default_lease_time: { is: 'NumberBox', label: 'Default Lease Time'},
max_lease_time: { is: 'NumberBox', label: 'Max Lease Time'},
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
'ntp_servers': {
name: 'NTP Server',
idType: 'Number',
fields: {
interface: { is: 'SingleSelect', label: 'Interface', props: { searchProvider: GetInterfaces} },
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
'dns_servers': {
name: 'DNS Server',
idType: 'Number',
fields: {
interface: { is: 'SingleSelect', label: 'Interface', props: { searchProvider: GetInterfaces} },
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
},
'vpn': {
name: 'VPN',
'wireguard.interfaces': {
name: 'Wireguard Interface',
fields: {
name: { is: 'TextBox', label: 'Name'},
public_key: { is: 'TextBox', label: 'Public Key'},
private_key: { is: 'TextBox', label: 'Private Key'},
listen_port: { is: 'NumberBox', label: 'Listen Port'},
peers: { is: 'MultiSelect', label: 'Peers', props: { searchProvider: GetPeers} },
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
'wireguard.peers': {
name: 'Wireguard Peer',
fields: {
name: { is: 'TextBox', label: 'Name'},
public_key: { is: 'TextBox', label: 'Public Key'},
preshared_key: { is: 'TextBox', label: 'Preshared Key'},
allowed_ips: { is: 'MultiSelect', label: 'Allowed IPs', props: { searchProvider: GetAddresses} },
endpoint: { is: 'TextBox', label: 'Endpoint'},
persistent_keepalive: { is: 'NumberBox', label: 'Persistent Keepalive'},
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
},
'system': {
name: 'System',
'users': {
name: 'User',
fields: {
name: { is: 'TextBox', label: 'Name'},
password: { is: 'TextBox', label: 'Password'},
comment: { is: 'MultilineTextBox', label: 'Comment'},
},
},
},
};