mirror of
https://github.com/speatzle/nfsense.git
synced 2025-05-10 18:38:22 +00:00
363 lines
No EOL
13 KiB
TypeScript
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'},
|
|
},
|
|
},
|
|
},
|
|
}; |