223 lines
11 KiB
Django/Jinja
223 lines
11 KiB
Django/Jinja
settingsSubmitQoS() {
|
|
if (this.submitStatusQos) { return }
|
|
this.submitStatusQos = true
|
|
function _translateQosClass(trafficClass, qc) {
|
|
let res = {
|
|
cir: qc['cir'],
|
|
description: qc['description'],
|
|
filters: []
|
|
}
|
|
if (trafficClass === 'cd') {
|
|
res.pir = qc.pir
|
|
}
|
|
if (!qc.isEnabled) {
|
|
res.disabled = true
|
|
}
|
|
for (const fi in qc.filters) {
|
|
let filter = {}
|
|
if (qc['filters'][fi].vlan !== "") { filter['vlan'] = qc['filters'][fi].vlan }
|
|
if (qc['filters'][fi].proto.length > 0) {
|
|
let tmp = "";
|
|
for (let pid = 0; pid < qc['filters'][fi].proto.length; pid++) {
|
|
if (pid !== 0) { tmp += ',' }
|
|
tmp += qc['filters'][fi].proto[pid]
|
|
}
|
|
filter['proto'] = tmp
|
|
}
|
|
if (qc['filters'][fi].sport !== "") { filter['sport'] = qc['filters'][fi].sport }
|
|
if (qc['filters'][fi].dport !== "") { filter['dport'] = qc['filters'][fi].dport }
|
|
if (qc['filters'][fi].ip_src !== "") { filter['ip_src'] = qc['filters'][fi].ip_src }
|
|
if (qc['filters'][fi].ip_dest !== "") { filter['ip_dest'] = qc['filters'][fi].ip_dest }
|
|
if (qc['filters'][fi].dscp !== "") { filter['dscp'] = qc['filters'][fi].dscp }
|
|
|
|
if (Object.keys(filter).length === 0) { continue }
|
|
if (!qc.filters[fi].isEnabled) { filter['disabled'] = true }
|
|
|
|
res.filters.push(filter)
|
|
}
|
|
if (res.filters.length === 0) {
|
|
// автоматическое выключение класса, если правил нет
|
|
res.disabled = true
|
|
}
|
|
|
|
return res
|
|
}
|
|
let query = {
|
|
"en": this.paramQos.en,
|
|
"rt1": [],
|
|
"rt2": [],
|
|
"rt3": [],
|
|
"cd": []
|
|
}
|
|
for (let i = 0; i < this.paramQos.rt1.length; i++) { query.rt1.push(_translateQosClass('rt', this.paramQos.rt1[i])) }
|
|
for (let i = 0; i < this.paramQos.rt2.length; i++) { query.rt2.push(_translateQosClass('rt', this.paramQos.rt2[i])) }
|
|
for (let i = 0; i < this.paramQos.rt3.length; i++) { query.rt3.push(_translateQosClass('rt', this.paramQos.rt3[i])) }
|
|
for (let i = 0; i < this.paramQos.cd.length; i++) { query.cd.push(_translateQosClass('rt', this.paramQos.cd[i])) }
|
|
|
|
//console.log(query)
|
|
fetch('/api/set/qos', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json'
|
|
},
|
|
body: JSON.stringify(query), credentials: 'same-origin'
|
|
}).then(async (resp) => {
|
|
this.submitStatusQos = false
|
|
if (resp['error']) { throw new Error(resp['error']) }
|
|
this.updateQosSettings(await resp.json())
|
|
}).catch((reason) => {
|
|
this.submitStatusQos = false
|
|
alert(`Ошибка при применении настроек: ${reason}`)
|
|
})
|
|
},
|
|
|
|
updateQosSettings(vals) {
|
|
this.submitStatusQos = false
|
|
this.paramQos.en = vals["settings"]["qos.enabled"]
|
|
|
|
const qosProfile = vals["settings"]["qos.profile"]
|
|
if (qosProfile !== null && qosProfile !== undefined) {
|
|
this.paramQos.rt1 = [] // .splice(0, this.paramQos.rt1.length)
|
|
this.paramQos.rt2 = [] // .splice(0, this.paramQos.rt2.length)
|
|
this.paramQos.rt3 = [] // .splice(0, this.paramQos.rt3.length)
|
|
this.paramQos.cd = [] // .splice(0, this.paramQos.cd.length)
|
|
|
|
for (let trafficClass in qosProfile) {
|
|
if (['rt1', 'rt2', 'rt3', 'cd'].indexOf(trafficClass) < 0) {
|
|
continue
|
|
}
|
|
|
|
if (Array.isArray(qosProfile[trafficClass])) {
|
|
for (let i = 0; i < qosProfile[trafficClass].length; i++) {
|
|
const qc = qosProfile[trafficClass][i]
|
|
let result = {
|
|
isEnabled: !qc.hasOwnProperty('disabled'),
|
|
cir: qc['cir'],
|
|
pir: 0,
|
|
description: qc['description'],
|
|
filters: []
|
|
}
|
|
if (trafficClass === 'cd') {
|
|
if (qc['pir']) {
|
|
result.pir = qc['pir']
|
|
}
|
|
}
|
|
for (let fi = 0; fi < qc['filters'].length; fi++) {
|
|
result.filters.push({
|
|
isEnabled: !qc['filters'][fi].hasOwnProperty('disabled'),
|
|
vlan: qc['filters'][fi].hasOwnProperty('vlan') ? qc['filters'][fi]['vlan'] : '',
|
|
proto: qc['filters'][fi].hasOwnProperty('proto') ? qc['filters'][fi]['proto'].split(',') : [],
|
|
sport: qc['filters'][fi].hasOwnProperty('sport') ? qc['filters'][fi]['sport'] : '',
|
|
dport: qc['filters'][fi].hasOwnProperty('dport') ? qc['filters'][fi]['dport'] : '',
|
|
ip_src: qc['filters'][fi].hasOwnProperty('ip_src') ? qc['filters'][fi]['ip_src'] : '',
|
|
ip_dest: qc['filters'][fi].hasOwnProperty('ip_dest') ? qc['filters'][fi]['ip_dest'] : '',
|
|
dscp: qc['filters'][fi].hasOwnProperty('dscp') ? qc['filters'][fi]['dscp'] : ''
|
|
})
|
|
}
|
|
switch (trafficClass) {
|
|
case 'rt1': this.paramQos.rt1.push(result); break
|
|
case 'rt2': this.paramQos.rt2.push(result); break
|
|
case 'rt3': this.paramQos.rt3.push(result); break
|
|
case 'cd': this.paramQos.cd.push(result); break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
},
|
|
|
|
qosAddClass(name) {
|
|
let res = {
|
|
isEnabled: true,
|
|
cir: 0,
|
|
pir: 0,
|
|
description: "",
|
|
filters: []
|
|
}
|
|
switch (name) {
|
|
case 'rt1': this.paramQos.rt1.push(res); break
|
|
case 'rt2': this.paramQos.rt2.push(res); break
|
|
case 'rt3': this.paramQos.rt3.push(res); break
|
|
case 'cd': this.paramQos.cd.push(res); break
|
|
}
|
|
},
|
|
|
|
qosClassAddRule(name, index) {
|
|
let rule = {
|
|
isEnabled: true,
|
|
vlan: "",
|
|
proto: [],
|
|
sport: "",
|
|
dport: "",
|
|
ip_src: "",
|
|
ip_dest: "",
|
|
dscp: ""
|
|
}
|
|
switch (name) {
|
|
case 'rt1': this.paramQos.rt1[index].filters.push(rule); break
|
|
case 'rt2': this.paramQos.rt2[index].filters.push(rule); break
|
|
case 'rt3': this.paramQos.rt3[index].filters.push(rule); break
|
|
case 'cd': this.paramQos.cd[index].filters.push(rule); break
|
|
}
|
|
},
|
|
|
|
qosDelClass(name, index) {
|
|
switch (name) {
|
|
case 'rt1': this.paramQos.rt1.splice(index, 1); break
|
|
case 'rt2': this.paramQos.rt2.splice(index, 1); break
|
|
case 'rt3': this.paramQos.rt3.splice(index, 1); break
|
|
case 'cd': this.paramQos.cd.splice(index, 1); break
|
|
}
|
|
},
|
|
|
|
qosDelFilter(name, index, filterIndex) {
|
|
switch (name) {
|
|
case 'rt1': this.paramQos.rt1[index].filters.splice(filterIndex, 1); break
|
|
case 'rt2': this.paramQos.rt2[index].filters.splice(filterIndex, 1); break
|
|
case 'rt3': this.paramQos.rt3[index].filters.splice(filterIndex, 1); break
|
|
case 'cd': this.paramQos.cd[index].filters.splice(filterIndex, 1); break
|
|
}
|
|
},
|
|
|
|
qosGenerateRuleDescription(filter) {
|
|
// попытка 1: просто отобразить все фильтры
|
|
let result = ""
|
|
let isFirst = true;
|
|
for (const key in filter) {
|
|
if (key === "isEnabled" || !filter[key] || (key === "proto" && filter['proto'].length === 0)) {
|
|
continue
|
|
}
|
|
if (isFirst) {
|
|
isFirst = false;
|
|
} else {
|
|
result += '; '
|
|
}
|
|
result += `${key}: ${filter[key]}`
|
|
}
|
|
if (result === "") {
|
|
return "пустой"
|
|
}
|
|
|
|
const maxResultLen = 60
|
|
|
|
if (result.length > maxResultLen) {
|
|
// попытка 2, отобразить что вообще в этом фильтре использовалось
|
|
result = ""
|
|
isFirst = true;
|
|
for (const key in filter) {
|
|
if (key === "isEnabled" || !filter[key] || (key === "proto" && filter['proto'].length === 0)) {
|
|
continue
|
|
}
|
|
if (isFirst) {
|
|
isFirst = false;
|
|
} else {
|
|
result += ', '
|
|
}
|
|
result += `${key}`
|
|
}
|
|
}
|
|
|
|
return result
|
|
},
|
|
|