Odp: Status portów - do testów
Nie planowalem robic zadnych dodatkowych zmian, cos nie tak dziala, co chcesz/potrzebujesz uzyskac?
Przydałoby się jeszcze dodać obsługę ekranu dotykowego w draggable, bo masz tylko obsługę myszy.
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
eko.one.pl → Oprogramowanie / Software → Status portów - do testów
Strony Poprzednia 1 2 3 4 Następna
Zaloguj się lub zarejestruj by napisać odpowiedź
Nie planowalem robic zadnych dodatkowych zmian, cos nie tak dziala, co chcesz/potrzebujesz uzyskac?
Przydałoby się jeszcze dodać obsługę ekranu dotykowego w draggable, bo masz tylko obsługę myszy.
Użyłem "sztucznej inteligencji" żeby dodać obsługę ekranu dotykowego dla przeciągania.
Zaczynamy od "function makeDraggable" i kończymy tuż przed "return baseclass.extend".
function makeDraggable(element, port, container, ports) {
var dragHandle = E('div', {
'class': 'drag-handle',
'style': 'position: absolute; top: 0; left: 0; right: 0; bottom: 0; cursor: move; z-index: 1; pointer-events: none;',
'title': _('Hold to drag and reorder')
});
element.style.position = 'relative';
element.appendChild(dragHandle);
var clickTimer = null;
var clickStart = null;
var hasMoved = false;
// Funkcja dla obsługi przeciągania
function startDrag(ev) {
isDragging = true;
draggedElement = element;
poll.stop();
element.style.opacity = '0.5';
element.style.zIndex = '1000';
dragHandle.style.cursor = 'move';
dragHandle.style.pointerEvents = 'auto';
document.body.style.cursor = 'move';
var boxes = Array.from(container.children);
var placeholder = E('div', {
'class': 'ifacebox drag-placeholder',
'style': element.style.cssText + 'opacity: 0.3; border: 3px dashed var(--border-color-medium); background: var(--border-color-low);'
});
element.style.boxShadow = '0 5px 15px var(--border-color-strong)';
// Przeciąganie - detekcja ruchu
function onMouseMove(e) {
var afterElement = getDragAfterElement(container, e.clientX || e.touches[0].clientX);
if (afterElement == null) {
container.appendChild(placeholder);
} else {
container.insertBefore(placeholder, afterElement);
}
}
// Przeciąganie - detekcja zakończenia
function onMouseUp(e) {
document.removeEventListener('mousemove', onMouseMove);
document.removeEventListener('mouseup', onMouseUp);
document.removeEventListener('touchmove', onMouseMove);
document.removeEventListener('touchend', onMouseUp);
var afterElement = getDragAfterElement(container, e.clientX || e.changedTouches[0].clientX);
if (afterElement == null) {
container.appendChild(element);
} else {
container.insertBefore(element, afterElement);
}
if (placeholder.parentNode)
placeholder.parentNode.removeChild(placeholder);
element.style.opacity = '1';
element.style.zIndex = '';
element.style.boxShadow = '';
dragHandle.style.cursor = 'move';
dragHandle.style.pointerEvents = 'none';
document.body.style.cursor = '';
/* Refresh ports array order */
var newOrder = Array.from(container.children).map(function(el) {
return el.__port__;
}).filter(function(p) { return p; });
ports.length = 0;
newOrder.forEach(function(p) { ports.push(p); });
saveUserPorts(ports).then(function() {
isDragging = false;
draggedElement = null;
popTimeout(null, E('p', _('Port order saved')), 5000, 'info');
poll.start();
}).catch(function(err) {
isDragging = false;
draggedElement = null;
poll.start();
});
}
document.addEventListener('mousemove', onMouseMove);
document.addEventListener('mouseup', onMouseUp);
document.addEventListener('touchmove', onMouseMove);
document.addEventListener('touchend', onMouseUp);
}
// Funkcja dla detekcji elementu, nad którym odbywa się przeciąganie
function getDragAfterElement(container, x) {
var draggableElements = Array.from(container.children).filter(function(child) {
return child !== draggedElement && child.classList.contains('ifacebox');
});
return draggableElements.reduce(function(closest, child) {
var box = child.getBoundingClientRect();
var offset = x - box.left - box.width / 2;
if (offset < 0 && offset > closest.offset) {
return { offset: offset, element: child };
} else {
return closest;
}
}, { offset: Number.NEGATIVE_INFINITY }).element;
}
// Obsługa dla zdarzeń "mousedown" oraz "touchstart"
function onPointerDown(ev) {
// Ignorowanie kliknięć na elementach portów
if (ev.target.classList.contains('port-label') || ev.target.closest('.port-label')) {
return;
}
// Tylko lewy przycisk myszy lub dotyk
if ((ev.button !== undefined && ev.button !== 0) && ev.type !== 'touchstart') {
return;
}
clickStart = { x: ev.clientX || ev.touches[0].clientX, y: ev.clientY || ev.touches[0].clientY };
hasMoved = false;
// Ustawienie czasu opóźnienia (dotyczy tylko myszy)
clickTimer = setTimeout(function() {
if (!hasMoved) {
startDrag(ev);
}
}, 300);
ev.preventDefault();
}
// Resetowanie stanu po zwolnieniu przycisku myszy lub zakończeniu dotyku
function onPointerUp(ev) {
if (clickTimer) {
clearTimeout(clickTimer);
clickTimer = null;
}
}
// Śledzenie ruchu w celu wykrycia przeciągania
function onPointerMove(ev) {
if (clickTimer && clickStart) {
var distance = Math.sqrt(
Math.pow((ev.clientX || ev.touches[0].clientX) - clickStart.x, 2) +
Math.pow((ev.clientY || ev.touches[0].clientY) - clickStart.y, 2)
);
if (distance > 5) {
hasMoved = true;
clearTimeout(clickTimer);
clickTimer = null;
}
}
}
// Nasłuchiwanie na zdarzenia dla myszy i dotyku
element.addEventListener('mousedown', onPointerDown);
element.addEventListener('touchstart', onPointerDown);
document.addEventListener('mouseup', onPointerUp);
document.addEventListener('touchend', onPointerUp);
document.addEventListener('mousemove', onPointerMove);
document.addEventListener('touchmove', onPointerMove);
}IceG napisał/a:Nie planowalem robic zadnych dodatkowych zmian, cos nie tak dziala, co chcesz/potrzebujesz uzyskac?
Przydałoby się jeszcze dodać obsługę ekranu dotykowego w draggable, bo masz tylko obsługę myszy.
Co, kto lubi.
To sie raczej ustawia raz na rok i zapomina. Nawet bym o tym nie pomyslal, ale ok moge to dokleic do kodu jak juz "lecimy w full opcje".
Co, kto lubi.
To sie raczej ustawia raz na rok i zapomina. Nawet bym o tym nie pomyslal, ale ok moge to dokleic do kodu jak juz "lecimy w full opcje".
W ciemno niczego nie zmieniaj i nie doklejaj, bo to nie jest dzieło człowieka.
Trzeba przetestować i wychwycić ewentualne błędy.
Więc możliwe, że kod jest jeszcze do poprawki.
- Oto kod który realizuje to co chciałeś....
- Ty, ale nie istnieje funkcja xxx, nie działa.
- Nie powinieneś używać funkcji xxx bo ona nie istnieje. Zamiast tego powinieneś...
- Ale to ty napisałeś.
- Oto prawidłowy kod. Daj znać czy w czymś mogę jeszcze pomóc.
- To też nie działa....
Ile razy już to było.
W ciemno niczego nie zmieniaj i nie doklejaj, bo to nie jest dzieło człowieka.
Trzeba przetestować i wychwycić ewentualne błędy.
Więc możliwe, że kod jest jeszcze do poprawki.
Spokojnie, nie pali sie
, na github bez testowania nie wrzucam.
@IceG Widzę na GitHub zmiany i teraz działa tu i tu.
Jakbyś jeszcze ogarnął temat, żeby nie trzeba było modyfikować oryginalnego pliku
luci-mod-status-index-port.
Wystarczy dodać własny rpcd #48.
Przydałaby się jeszcze informacja na gicie i tu w temacie, że zmiana dotyczy DSA, a nie swconfig.
@IceG Widzę na GitHub zmiany i teraz działa tu i tu.
Jakbyś jeszcze ogarnął temat, żeby nie trzeba było modyfikować oryginalnego pliku
luci-mod-status-index-port.
Wystarczy dodać własny rpcd #48.
Przydałaby się jeszcze informacja na gicie i tu w temacie, że zmiana dotyczy DSA, a nie swconfig.
Zerknę na to w wolnej chwili.
@IceG Czy tylko mi, raz na jakiś czas (w sensie dni) resetuje wprowadzone zmiany i w user_defined_ports.json mam tylko znaki []?
Nie zdarza się to często ale nie wiem w którym momencie to się dzieje.
Wcześniej przed zmianami w Draggable też to było ale nic nie pisałem.
Czy możesz zrobić jakąś wersję dla mnie z logowaniem do /tmp?
Router podłączony jest do zasilania awaryjnego.
@IceG Czy tylko mi, raz na jakiś czas (w sensie dni) resetuje wprowadzone zmiany i w user_defined_ports.json mam tylko znaki []?
Nie zdarza się to często ale nie wiem w którym momencie to się dzieje.
Wcześniej przed zmianami w Draggable też to było ale nic nie pisałem.Czy możesz zrobić jakąś wersję dla mnie z logowaniem do /tmp?
Router podłączony jest do zasilania awaryjnego.
Pierwsze slysze, aby sama znikala konfiguracja, zerkne na to na tygodniu.
@IceG Czy jesteś w stanie dorobić funkcję ON/OFF danego portu?
W DSA z poziomu terminala:
ip link set lanX down wyłącza port
ip link set lanX up włącza port
X to numer portu.
PS: To nie jest na cito.
@IceG Czy jesteś w stanie dorobić funkcję ON/OFF danego portu?
W DSA z poziomu terminala:
ip link set lanX down wyłącza port
ip link set lanX up włącza portX to numer portu.
PS: To nie jest na cito.
To co jest obecnie, pakiet.. jest juz chyba przerostem formy nad trescia, czy sie myle? nie planowalem tam nic (za predko) dodawac (poza np tlumaczeniami na inne jezyki). Siedze na ten moment w luci-app-sms-tool-js, aby tam pojawily sie nowe funkcjonalnosci.
@Focus widziales gdzies cos podobnego? Masz koncepcje jak to ma wygladac aby bylo czytelnie/prosto/funkcjonalnie, co by sie uzytkownik nie zgubil, bo latwo przesadzic a tego bym nie chcial.
To nie musi być w tym co masz. Może być ale nie musi.
W include można dodać wyżej, niżej albo można zrobić też osobną pozycję w menu.
Dowolność.
Nie widziałem nigdzie czegoś podobnego.
Mój pomysł zrodził się z racji tego, że jeden z portów idzie kablem do AP gdzie czasami muszę go wyłączyć i zamiast wyłączać AP to jednym poleceniem w konsoli wyłączam tylko ten port który idzie do AP.
Roboczo w include mam klona 29 z minimum, gdzie pokazuje status portów
Port Status
lan2 DOWN
lan3 UP
lan4 UP
wan UP
Do tego chciałbym dodać ON/OFF danego portu.
W konsoli to jest proste, a tutaj nie mam pojęcia.
Pomysle jak to dodac do aktualnego Statusu Portow aby wszystko bylo w jednym miejscu do podgladu i prostego wyklikania.
Roboczo w include mam klona 29 z minimum, gdzie pokazuje status portów
Port Status
lan2 DOWN
lan3 UP
lan4 UP
wan UPDo tego chciałbym dodać ON/OFF danego portu.
W konsoli to jest proste, a tutaj nie mam pojęcia.
@Focus możesz mi ten "klon" gdzieś wystawić, chciałbym sobie potestować.
Inna sprawa jak ten status portów zapisać ładnie w naszym pięknym języku. Tutaj mamy UP/DOWN i polecenia
ip link set lanX down
ip link set lanX up
czy one tak dosłownie odpowiadają włączeniu/wyłączeniu portów..
@Focus możesz mi ten "klon" gdzieś wystawić, chciałbym sobie potestować.
Inna sprawa jak ten status portów zapisać ładnie w naszym pięknym języku. Tutaj mamy UP/DOWN i polecenia
ip link set lanX down
ip link set lanX up
czy one tak dosłownie odpowiadają włączeniu/wyłączeniu portów..
Port status w include ma numerek 29, więc robisz np. 28_ports.js.
Wersja 1
Wersja 2
Kod to tylko odczyt danych (read-only), więc nie wprowadza żadnych zmian.
W konsoli działa np:
ip link set lan3 down (lub up)lub
ubus call network.interface remove_device '{"interface":"lan", "name":"lan3"}' && ip link set lan3 down
----
ubus call network.interface add_device '{"interface":"lan", "name":"lan3"}' && ip link set lan3 uplub
ifconfig lan3 down (lub up)I tu pojawia się problem, bo to działa w konsoli, a nie w LuCi.
ip link set lan3 down jest poleceniem systemowym, więc uprawnienia ACL nic nie dadzą.
AI pisze mi, że w/w polecenia można wywołać przez "exec" lub własny backend ubus.
Niżej kody do obu wersji:
Wersja 1
'use strict';
'require view';
'require rpc';
const REFRESH_MS = 2000;
const callGetBuiltinEthernetPorts = rpc.declare({
object: 'luci',
method: 'getBuiltinEthernetPorts',
expect: { result: [] }
});
const callDeviceStatus = rpc.declare({
object: 'network.device',
method: 'status',
params: ['name']
});
let prevStats = {};
function calcRate(dev, stats) {
const now = Date.now();
const prev = prevStats[dev];
prevStats[dev] = {
rx: stats.rx_bytes || 0,
tx: stats.tx_bytes || 0,
t: now
};
if (!prev)
return { rx: 0, tx: 0 };
const dt = (now - prev.t) / 1000;
if (dt <= 0)
return { rx: 0, tx: 0 };
return {
rx: (stats.rx_bytes - prev.rx) / dt,
tx: (stats.tx_bytes - prev.tx) / dt
};
}
function getPortStatus(port) {
if (!port.device || port.device === 'br-lan')
return Promise.resolve(null);
return callDeviceStatus(port.device)
.catch(() => null)
.then(res => {
if (!res || !res.carrier)
return { activity: 'down' };
const stats = res.statistics || {};
const rate = calcRate(port.device, stats);
if (rate.rx > 0 || rate.tx > 0)
return { activity: 'up' };
return { activity: 'idle' };
});
}
function renderRow(port, idx) {
if (!port.device)
return null;
const rowStyle = (idx % 2) ? 'cbi-rowstyle-2' : 'cbi-rowstyle-1';
const tdStyle = 'border-right:1px solid #ccc; border-bottom:1px solid #ccc; padding:4px 6px;';
return E('tr', { 'class': rowStyle }, [
E('td', { style: tdStyle }, port.device),
E('td', { style: tdStyle }, port.activity.toUpperCase())
]);
}
return view.extend({
title: 'Ports Monitor',
load: function () {
return callGetBuiltinEthernetPorts().then(ports =>
Promise.all(ports.map(p =>
getPortStatus(p).then(st => Object.assign(p, st || {}))
))
);
},
render: function (ports) {
const table = E('table', { style: 'border-collapse:collapse; width:100%;' });
const thStyle = 'border-right:1px solid #ccc; border-bottom:1px solid #ccc; padding:4px 6px; font-weight:bold;';
const thead = E('thead', {}, [
E('tr', {}, [
E('th', { style: thStyle }, 'Port'),
E('th', { style: thStyle }, 'Status')
])
]);
const tbody = E('tbody');
table.appendChild(thead);
table.appendChild(tbody);
ports.forEach((p, i) => {
const row = renderRow(p, i);
if (row)
tbody.appendChild(row);
});
return E('div', { 'class': 'cbi-section' }, [
E('div', { 'class': 'cbi-section-node' }, [ table ])
]);
},
onAfterRender: function () {
const self = this;
setInterval(() => {
self.load().then(data => {
const tbody = document.querySelector('.cbi-section-node tbody');
if (!tbody)
return;
tbody.innerHTML = '';
data.forEach((p, i) => {
const row = renderRow(p, i);
if (row)
tbody.appendChild(row);
});
});
}, REFRESH_MS);
},
handleSave: null,
handleSaveApply: null,
handleReset: null
});Wersja 2
'use strict';
'require view';
'require rpc';
const REFRESH_MS = 2000;
const callGetBuiltinEthernetPorts = rpc.declare({
object: 'luci',
method: 'getBuiltinEthernetPorts',
expect: { result: [] }
});
const callDeviceStatus = rpc.declare({
object: 'network.device',
method: 'status',
params: ['name']
});
let prevStats = {};
let totalTransfer = {};
function parseSpeedDuplex(speed) {
if (!speed || typeof speed !== 'string')
return { speed: '-', duplex: '-' };
const m = speed.match(/^(\d+)([FH])$/);
if (!m) return { speed: speed, duplex: '-' };
return {
speed: parseInt(m[1], 10) + ' Mbps',
duplex: m[2] === 'F' ? 'full' : 'half'
};
}
function formatMbps(val) {
if (!isFinite(val)) return '0.0';
return (val * 8 / 1e6).toFixed(1);
}
function formatGB(val) {
if (!isFinite(val)) return '0.00';
return (val / 1e9).toFixed(2);
}
function formatErrors(val) {
if (!isFinite(val) || val === 0) return '0';
return val > 10000 ? formatGB(val) : val.toLocaleString();
}
function calcRate(dev, stats) {
const now = Date.now();
const prev = prevStats[dev];
prevStats[dev] = { rx: stats.rx_bytes, tx: stats.tx_bytes, t: now };
if (!prev) return { rx: 0, tx: 0 };
const dt = (now - prev.t) / 1000;
if (dt <= 0) return { rx: 0, tx: 0 };
return {
rx: (stats.rx_bytes - prev.rx) / dt,
tx: (stats.tx_bytes - prev.tx) / dt
};
}
function updateTotal(dev, stats) {
if (!totalTransfer[dev]) totalTransfer[dev] = { rx: 0, tx: 0 };
totalTransfer[dev].rx = stats.rx_bytes;
totalTransfer[dev].tx = stats.tx_bytes;
return totalTransfer[dev];
}
function getPortStatus(port) {
if (!port.device || port.device === 'br-lan')
return Promise.resolve(null);
return callDeviceStatus(port.device)
.catch(() => null)
.then(res => {
if (res?.operstate === 'unknown' && res?.carrier)
res.operstate = 'up';
if (!res || !res.carrier) {
return {
speed: '-',
duplex: '-',
rx: '0.0',
tx: '0.0',
totalGB: '0.00',
activity: 'down',
mtu: '-',
errors: '0',
rx_rate: 0,
tx_rate: 0
};
}
const parsed = parseSpeedDuplex(res.speed);
const stats = res.statistics || {};
const rate = calcRate(port.device, stats);
const total = updateTotal(port.device, stats);
const activity = (rate.rx > 0 || rate.tx > 0) ? 'active' : 'idle';
const errors = (stats.rx_errors || 0) + (stats.tx_errors || 0);
return {
speed: parsed.speed,
duplex: parsed.duplex,
rx: formatMbps(rate.rx),
tx: formatMbps(rate.tx),
totalGB: formatGB(total.rx + total.tx),
activity: activity,
rx_rate: rate.rx,
tx_rate: rate.tx,
mtu: res.mtu || '-',
errors: formatErrors(errors)
};
});
}
// animacja migania diody
const styleEl = document.createElement('style');
styleEl.textContent = `
@keyframes blink {
0%, 50%, 100% { opacity: 1; }
25%, 75% { opacity: 0.2; }
}`;
document.head.appendChild(styleEl);
// funkcja generująca diodę aktywności
function renderActivityLight(rate, portStatus) {
if (!portStatus || portStatus === 'down') {
// PORT DOWN › szara
return E('span', { style: `
display:inline-block;
width:10px; height:10px;
border-radius:50%; margin-right:4px;
background-color:#888;
`});
}
if (portStatus === 'idle') {
// IDLE › pomarańczowa, stała
return E('span', { style: `
display:inline-block;
width:10px; height:10px;
border-radius:50%; margin-right:4px;
background-color:#fa0;
`});
}
if (rate > 0 && rate < 12500) {
// Minimalny transfer › zielona, stała
return E('span', { style: `
display:inline-block;
width:10px; height:10px;
border-radius:50%; margin-right:4px;
background-color:#0c0;
`});
}
// Transfer powyżej 0.1 Mbps › zielona, miganie
// cztery poziomy
let duration = 1.5; // domyślnie wolne miganie
if (rate < 1e6) { // 0.1–1 Mbps › poziom 1
duration = 1.5;
} else if (rate < 10e6) { // 1–10 Mbps › poziom 2
duration = 1.0;
} else if (rate < 100e6) { // 10–100 Mbps › poziom 3
duration = 0.5;
} else { // 100 Mbps–1 Gb/s › poziom 4
duration = 0.2;
}
return E('span', { style: `
display:inline-block;
width:10px; height:10px;
border-radius:50%; margin-right:4px;
background-color:#0c0;
animation: blink ${duration}s infinite;
`});
}
// każda komórka z border-bottom i border-right
function renderRow(port, idx) {
if (!port.device) return null;
const rowStyle = (idx % 2) ? 'cbi-rowstyle-2' : 'cbi-rowstyle-1';
const tdStyle = 'border-right:1px solid #ccc; border-bottom:1px solid #ccc; padding:2px 6px;';
return E('tr', { 'class': rowStyle }, [
E('td', { style: tdStyle }, port.device),
E('td', { style: tdStyle }, port.speed),
E('td', { style: tdStyle }, port.duplex),
E('td', { style: tdStyle }, port.rx),
E('td', { style: tdStyle }, port.tx),
E('td', { style: tdStyle }, port.totalGB),
E('td', { style: tdStyle }, port.mtu),
E('td', { style: tdStyle }, port.errors),
E('td', { style: tdStyle }, [
renderActivityLight(port.rx_rate + port.tx_rate, port.activity),
port.activity
])
]);
}
return view.extend({
title: 'Ports Monitor',
load: function () {
return callGetBuiltinEthernetPorts().then(ports =>
Promise.all(ports.map(p =>
getPortStatus(p).then(st => Object.assign(p, st || {}))
))
);
},
render: function (ports) {
const table = E('table', { style: 'border-collapse:collapse; width:100%;' });
const tdHeaderStyle = 'border-right:1px solid #ccc; border-bottom:1px solid #ccc; padding:4px 6px; font-weight:bold;';
const thead = E('thead', {}, [
E('tr', {}, [
E('th', { style: tdHeaderStyle }, 'Port'),
E('th', { style: tdHeaderStyle }, 'Speed'),
E('th', { style: tdHeaderStyle }, 'Duplex'),
E('th', { style: tdHeaderStyle }, 'Upload Mbps'),
E('th', { style: tdHeaderStyle }, 'Download Mbps'),
E('th', { style: tdHeaderStyle }, 'Total GB'),
E('th', { style: tdHeaderStyle }, 'MTU'),
E('th', { style: tdHeaderStyle }, 'Errors'),
E('th', { style: tdHeaderStyle }, 'Activity')
])
]);
const tbody = E('tbody');
table.appendChild(thead);
table.appendChild(tbody);
ports.forEach((p, i) => {
const row = renderRow(p, i);
if (row) tbody.appendChild(row);
});
return E('div', { 'class': 'cbi-section' }, [
E('div', { 'class': 'cbi-section-node' }, [ table ])
]);
},
onAfterRender: function () {
const self = this;
setInterval(() => {
self.load().then(data => {
const tbody = document.querySelector('.cbi-section-node tbody');
if (!tbody) return;
tbody.innerHTML = '';
data.forEach((p, i) => {
const row = renderRow(p, i);
if (row) tbody.appendChild(row);
});
});
}, REFRESH_MS);
},
handleSave: null,
handleSaveApply: null,
handleReset: null
});@IceG Mogłeś zostawić na gicie poprzednią wersję, a nową dać jako beta.
@IceG Mogłeś zostawić na gicie poprzednią wersję, a nową dać jako beta.
Czlowiek siedzi, kombinuje jak to sensownie dodać, jak to logicznie pokazać aby bylo ze smakiem, aby nie przesadzic i zachować poprzednia funkcjonalnosc.. a na koncu co.. ze nie tak wrzucilem ![]()
@Focus moglem tak zrobic, moglem tez wystawic to tylko Tobie i dac linka. Trudno, nie zrobilem tak, dobrze ze pakiet jest niszowy i niewiele osob bedzie sie meczylo, rzucalo kapciami w monitor przez nowa funkcjonalnosc.
Przecież działa
Chodziło mi bardziej o to, że teraz masz wszystko (.apk), a wcześniej miałeś też (.ipk).
Ale to żaden problem.
Super, że Ci się w ogóle chciało to robić.
Przecież działa
![]()
Chodziło mi bardziej o to, że teraz masz wszystko (.apk), a wcześniej miałeś też (.ipk).
Ale to żaden problem.
Super, że Ci się w ogóle chciało to robić.
Akurat popsula mi sie kompilacja dla starszych obrazow, wiec nie dodalem ipk, jak uda mi się to przywrocic do zycia to dodam, wszak mam tez inne pakiety. Takie sa uroki stania w rozkroku miedzy ipk a apk.
Chyba ze ktos ma pliki ipk po swojej kompilacji i wystawi gdzieś to od biedy dodam.
@IceG
https://megawrzuta.pl/1yqnnxol sprawdź.
pozdrawiam
@IceG
https://megawrzuta.pl/1yqnnxol sprawdź.
pozdrawiam
Dzięki za wrzutkę, ale tu chyba chodziło o brak ipk dla aktualnej / ostatniej wersji pakietu. ![]()
@IceG, skompilowało mi wersję 1.0.3 dla ipk:
https://megawrzuta.pl/d92ixvgf
@IceG, skompilowało mi wersję 1.0.3 dla ipk:
https://megawrzuta.pl/d92ixvgf
Ok, dzięki. Dorzuciłem już pakiet.
Właśnie wrzuciłem ten "nowy" pakiet u siebie. Bardzo fajnie się to prezentuje. Rafał, kawał dobrej roboty.
Status Active/Idle - przydatna sprawa.
To jeszcze tak z czystej ciekawości, bo w sumie pytanie dotyczy akurat Port status.
Mając vlan-y na routerze, "rozbija" port wg stref, czyli powiedzmy, mamy trzy lany i pasek jest podzielony na trzy kolory, tak jak koloruje strefy w firewall.
Teraz mając np. Dumb AP i port z trzema vlanami. pokazuje tylko kolor zielony. Jest jakiś myk, żeby to zmienić? Wiadomo, że firewall jest wyłączony, więc nie ma teoretycznie stref, zatem nie zaciąga pozostałych kolorów, jak ma to miejsce na routerze.
Na załączonym png z lewej mamy router, a z prawej akurat c200p jako switch. Guest i HomeIoT są jako Unmanaged.
Strony Poprzednia 1 2 3 4 Następna
Zaloguj się lub zarejestruj by napisać odpowiedź
eko.one.pl → Oprogramowanie / Software → Status portów - do testów
Forum oparte o PunBB, wspierane przez Informer Technologies, Inc