Wpłaciłem 50 zł.
Nie jesteś zalogowany. Proszę się zalogować lub zarejestrować.
eko.one.pl → Posty przez Focus
Wpłaciłem 50 zł.
Przecież LAN nie potrzebuje żadnych sterowników od USB.
Framework działał na starym komputerze to kupujesz używany z takim samym systemem co miałeś.
Używane kompletne komputery chodzą po 100 - 200 zł.
Otrzymałem router od @MiG25.
TR-069 próbuje pobrać firmware TA_MTK-5GCPE-0.02.07r_20231201_dfa793.bin
2025-12-03 22:19:44 user.notice tr69[9199]: TR069: Firmware TA_MTK-5GCPE-0.02.07r_20231201_dfa793.bin download fail.Są jeszcze dane takie jak
"Got agent software settings. Model: WE7202242-TA SWVersion: 3.00.07_01"
"Got agent software settings. Model: WE410443B-TA SWVersion: 2.02.67_01"Adres IP serwera ACS 58.162.32.33
2025-12-03 22:49:16 user.info tr69[10652]: TR069: Sending event 1 BOOT inform to ACS 58.162.32.33@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.
Te wszystkie aplikacje typu ReVanced są klonami lub pochodnymi YouTube Vanced, gdzie Google pozwało twórców tego drugiego i musieli zakończyć działanie aplikacji.
Wcześniej wystarczyło wyłączyć Play Protect, ale teraz Google chce poprzez aktualizację Play Services, czyli Play Integrity API zablokować tego typu aplikacje.
Skoro @mvincm nie chce tego sprzętu , to korzystając z okazji czekam na propozycję odnośnie tego Arcadyan Meteor...
Jak pisałem , jest na ok procku T750 więc 5G jest ok , ma port nawet jeden port 2,5GbpsOsiągane prędkości są na wysokim poziomie... Jedyny problem to ten nieszczęsny APN do ustawienia za każdym resetem... Leży od ponad roku i się kurzy , więc może ktoś ma dla niego zastosowanie.
Jeżeli jedynym problemem jest tylko APN to mogę go przygarnąć w cenie przesyłki skoro nie chce go @Cezary i @mvincm.
@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.
OK a czy ta komenda do wyłączania AT+CLCK="SC",0,"<pin>" jest uniwersalna ?
Teoretycznie komenda uniwersalna ale niektóre karty SIM mają zablokowaną opcję wyłączenia kodu PIN.
@rodgerq A kartę SIM masz w ogóle włożoną?
Wkleiłeś logread gdzie urywa się w najważniejszym momencie.
Zaraz za tym
Thu Sep 25 23:24:16 2025 daemon.notice netifd: wan (25477): Starting network wanpowinno być o wwan0 i wan_4.
W interfejsach masz lan i wan, a nie masz wan_4.
network.interface.lan
network.interface.loopback
network.interface.wanPrzywróć router do stanu początkowego i zrób interfejs z qmi raz jeszcze lub wgraj inną wersję OpenWrt.
Sprawdź też, czy na proto 3g ruszy
uci set network.wan.proto=3gJaką wersję modemu w ogóle masz?
Pokaż
ubus list network.interface.*
uci show firewall.@zone[1].network
Może być reboot albo ifup wan.
Jak masz IPv4 to ma się zrobić automatycznie wirtualny interfejs wan_4.
On nie ma "chat".
Przez "echo" niech ustawi APN.
echo -e -n 'AT+CGDCONT=1,"IP","internet","",0,0\r' > /dev/ttyUSB1
lub
echo -e 'AT+CGDCONT=1,"IP","internet"\r' > /dev/ttyUSB1
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.
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);
}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.
@IceG, czy jesteś w stanie w makeDraggable dodać touchstart, touchmove, touchend z jednoczesnym zablokowaniem funkcji zapisu obrazu przy dłuższym przytrzymaniu?
Można zrobić z tego pakiet ale trzeba dodatkowo zrobić backup oryginalnego 29_ports.js, bo przy odinstalowaniu pakietu 29_ports.js też zostanie usunięty.
Można też zrobić skrypt ale znowu trzeba zrobić backup.
Jak na tak mało istotną rzecz, na którą prawie nikt nie zwraca uwagi, a czasami nawet nie korzysta, bo ma swconfig to robienie pakietów i skryptów mija się z celem.
Idąc na skróty robimy wszystko w terminalu bez dodatkowych pakietów i skryptów.
Robimy kopię zapasową (backup) 29_ports.js
cp /www/luci-static/resources/view/status/include/29_ports.js \
/www/luci-static/resources/view/status/include/29_ports.js.oldNastępnie robimy luci-ports.json
cat > /usr/share/rpcd/acl.d/luci-ports.json << 'EOF'
{
"luci-ports": {
"description": "Access to custom ports",
"read": {
"uci": [ "*" ],
"ubus": {
"luci": [ "getBuiltinEthernetPorts" ],
"file": [ "read", "write" ]
},
"file": {
"/etc/user_defined_ports.json": [ "read" ],
"/www/luci-static/resources/view/status/include/29_ports.js": [ "read" ]
}
},
"write": {
"file": {
"/etc/user_defined_ports.json": [ "write" ]
},
"ubus": {
"file": [ "write" ],
"luci": [ "getBuiltinEthernetPorts" ]
}
}
}
}
EOFNadajemy uprawnienia na wszelki wypadek
chmod 644 /usr/share/rpcd/acl.d/luci-ports.jsonInstalujemy 29_ports.js od @IceG
rm -f /www/luci-static/resources/view/status/include/29_ports.js &&
wget -O /www/luci-static/resources/view/status/include/29_ports.js https://raw.githubusercontent.com/4IceG/Port_status/refs/heads/main/29_ports.jsNadajemy uprawnienia na wszelki wypadek
chmod 644 /www/luci-static/resources/view/status/include/29_ports.jsNa koniec restart usług
service rpcd restart
lub
/etc/init.d/rpcd restart/etc/init.d/uhttpd restartEdit.
Przywrócenie wszystkiego do stanu pierwotnego (trzeba mieć backup 29_ports.js.old)
rm /www/luci-static/resources/view/status/include/29_ports.js
cp /www/luci-static/resources/view/status/include/29_ports.js.old /www/luci-static/resources/view/status/include/29_ports.js
rm /www/luci-static/resources/view/status/include/29_ports.js.old
rm /usr/share/rpcd/acl.d/luci-ports.jsonZamiast zmieniać /usr/share/rpcd/acl.d/luci-mod-status-index.json
można dodać /usr/share/rpcd/acl.d/luci-ports.json z kodem
{
"luci-ports": {
"description": "Access to custom ports",
"read": {
"uci": [ "*" ],
"ubus": {
"luci": [ "getBuiltinEthernetPorts" ],
"file": [ "read", "write" ]
},
"file": {
"/etc/user_defined_ports.json": [ "read" ],
"/www/luci-static/resources/view/status/include/29_ports.js": [ "read" ]
}
},
"write": {
"file": {
"/etc/user_defined_ports.json": [ "write" ]
},
"ubus": {
"file": [ "write" ],
"luci": [ "getBuiltinEthernetPorts" ]
}
}
}
}No właśnie z tą autoryzacją jest problem.
Czy samo umieszczenie w uhttpd pozycji option auth_basic '1', będzie już jakimś zabezpieczeniem, czy lepiej isReadonlyView = !L.hasViewPermission?
Nie mam pojęcia jak to zabezpieczyć.
Przy pobieraniu zagrożenie raczej mniejsze, najwyżej ktoś pobierze to co było do pobrania, ale przy wysyłaniu to już może narobić problemu.
Edit.
@IceG dodał Save i Upload, zrobił to w json i spoko.
Trochę przeróbki i mogę pobrać konfig bez json.
Problem pojawia się jak chcę zrobić upload bez ingerencji w RPC - ACL.
Teoretycznie i praktycznie upload idzie zrobić przez /www/cgi-bin ale nie wiem jak to autoryzować.
Cezary, czy umieszczenie własnego skryptu w /www/cgi-bin/xxx względem bezpieczeństwa będzie dobrym pomysłem, czy raczej nic swojego tam nie dodawać?
OK. W kodzie @IceG w /www/luci-static/resources/view/status/include/29_ports.js usunąłem pozycję
var USER_PORTS_FILE = '/etc/user_defined_ports.json';
Szukamy pozycji function loadUserPorts i zamieniamy na to
function loadUserPorts() {
return uci.load('network').then(function() {
var ports = [];
var sections = uci.sections('network', 'interface');
sections.forEach(function(s) {
if (s.device) {
ports.push({
device: s.device,
label: s['.name'],
description: s.description || '',
role: s.role || '',
originalLabel: s.originalLabel || s['.name']
});
}
});
if (ports.length === 0) {
console.log('No ports found');
return null;
}
return ports;
}).catch(function(err) {
console.error('Failed to load ports:', err);
return null;
});
}Szukamy pozycji function saveUserPorts i zamieniamy na to
function saveUserPorts(ports) {
return uci.load('network').then(function () {
const sections = uci.sections('network', 'interface');
ports.forEach(function (port) {
let existingSection = null;
for (let i = 0; i < sections.length; i++) {
const s = sections[i];
if (s.device === port.device && s.originalLabel === port.originalLabel) {
existingSection = s;
break;
}
}
let sectionName;
if (existingSection) {
sectionName = existingSection['.name'];
if (sectionName !== port.label) {
uci.remove('network', sectionName);
sectionName = uci.add('network', 'interface', port.label);
}
} else {
sectionName = uci.add('network', 'interface', port.label);
}
uci.set('network', sectionName, 'device', port.device || '');
uci.set('network', sectionName, 'description', port.description || '');
uci.set('network', sectionName, 'role', port.role || '');
uci.set('network', sectionName, 'originalLabel', port.originalLabel || '');
uci.set('network', sectionName, 'label', port.label || '');
});
return uci.save('network')
.then(() => uci.apply('network'))
.then(() => {
console.log('Ports saved successfully');
return true;
});
}).catch(function (err) {
console.error('Failed to save ports:', err);
ui.addNotification(null, E('p', {}, [
_('Save Error: could not save network config'),
E('br'),
E('small', {}, _('Original error: %s').format(err.message))
]), 'error');
throw err;
});
}U mnie na ZTE MF286D działa.
i gdzie nowy jest?
U mnie ![]()
@IceG Poprawiłem 29_ports.js, nie trzeba nic zmieniać w luci-mod-status-index.json i nie trzeba korzystać z user_defined_ports.json.
Wszystko jest w /etc/config/network.
Konfig network wygląda jak niżej
config interface 'lan2'
option device 'lan2'
option role 'lan'
option originalLabel 'lan2'
option label 'lan2'
config interface 'lan3'
option device 'lan3'
option role 'lan'
option originalLabel 'lan3'
option label 'lan3'
config interface 'lan4'
option device 'lan4'
option role 'lan'
option originalLabel 'lan4'
option label 'lan4'
config interface 'wan'
option device 'wan'
option role 'wan'
option originalLabel 'wan'
option label 'wan'Tylko, że w LuCi jest widoczna lista tych dodatkowych interfejsów z informacją
"Unsupported protocol type. Install protocol extensions..."
Może to kogoś denerwować.
Kiedyś ktoś publikował jakiś framework który miał na stałe ustawiony admin, ale te linki juz wygasły.
Do mojego mega dorzuciłem jeszcze:
zte mf286d Nordic to Nordic_B11 192.168.32.1 pw admin
zte mf286d Nordic to Nordic_B12 192.168.32.1 pw admin
zte mf286d Nordic to Nordic_B14 192.168.32.1 pw admin
Nie wiem, czy to jest to. Kiedyś to pobrałem ale nigdy nie używałem.
PS. Postanowiłem, że przerzucę to do osobnego folderu, żeby nie mieszało się z tematem o frameworku i jest tutaj https://mega.nz/folder/djt1QAaS#F-C_M5xofDFy1Ac7yhICsw
@IceG Zrobiłem jak napisałeś i teraz bangla ![]()
eko.one.pl → Posty przez Focus
Forum oparte o PunBB, wspierane przez Informer Technologies, Inc