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) }).then(async (resp) => { this.submitStatusQos = false 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 },