76

(163 odpowiedzi, napisanych Inne)

Wpłaciłem 50 zł.

77

(599 odpowiedzi, napisanych Sprzęt / Hardware)

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ł.

78

(4 odpowiedzi, napisanych Sprzęt / Hardware)

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

79

(96 odpowiedzi, napisanych Oprogramowanie / Software)

@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.

80

(11 odpowiedzi, napisanych Oprogramowanie / Software)

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.

81

(932 odpowiedzi, napisanych Sprzęt / Hardware)

MiG25 napisał/a:

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,5Gbps smile Osią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.

82

(96 odpowiedzi, napisanych Oprogramowanie / Software)

@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.

83

(305 odpowiedzi, napisanych Oprogramowanie / Software)

wisipior napisał/a:

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.

84

(3,934 odpowiedzi, napisanych Sprzęt / Hardware)

@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 wan

powinno 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.wan

Przywróć 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=3g

Jaką wersję modemu w ogóle masz?

85

(3,934 odpowiedzi, napisanych Sprzęt / Hardware)

Pokaż
ubus list network.interface.*
uci show firewall.@zone[1].network

86

(3,934 odpowiedzi, napisanych Sprzęt / Hardware)

Może być reboot albo ifup wan.
Jak masz IPv4 to ma się zrobić automatycznie wirtualny interfejs wan_4.

87

(3,934 odpowiedzi, napisanych Sprzęt / Hardware)

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

88

(96 odpowiedzi, napisanych Oprogramowanie / Software)

IceG napisał/a:

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.

89

(96 odpowiedzi, napisanych Oprogramowanie / Software)

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);
}

90

(96 odpowiedzi, napisanych Oprogramowanie / Software)

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.

91

(96 odpowiedzi, napisanych Oprogramowanie / Software)

@IceG, czy jesteś w stanie w makeDraggable dodać touchstart, touchmove, touchend z jednoczesnym zablokowaniem funkcji zapisu obrazu przy dłuższym przytrzymaniu?

92

(96 odpowiedzi, napisanych Oprogramowanie / Software)

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.old

Nastę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" ]
      }
    }
  }
}
EOF

Nadajemy uprawnienia na wszelki wypadek

chmod 644 /usr/share/rpcd/acl.d/luci-ports.json

Instalujemy 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.js

Nadajemy uprawnienia na wszelki wypadek

chmod 644 /www/luci-static/resources/view/status/include/29_ports.js

Na koniec restart usług

service rpcd restart
lub
/etc/init.d/rpcd restart
/etc/init.d/uhttpd restart

Edit.
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.json

93

(96 odpowiedzi, napisanych Oprogramowanie / Software)

Zamiast 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" ]
      }
    }
  }
}

94

(96 odpowiedzi, napisanych Oprogramowanie / Software)

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ć.

95

(96 odpowiedzi, napisanych Oprogramowanie / Software)

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ć?

96

(96 odpowiedzi, napisanych Oprogramowanie / Software)

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.

97

(96 odpowiedzi, napisanych Oprogramowanie / Software)

roblad napisał/a:

i gdzie nowy jest?

U mnie smile

98

(96 odpowiedzi, napisanych Oprogramowanie / Software)

@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ć.

99

(599 odpowiedzi, napisanych Sprzęt / Hardware)

Cezary napisał/a:

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

100

(96 odpowiedzi, napisanych Oprogramowanie / Software)

@IceG Zrobiłem jak napisałeś i teraz bangla smile