OpenWrt Based TalkTalk Sagemcom FAST 5364 Tinkering

@stragies you beat me to it :grinning: :grinning:

Ah, that's a shame.

I can only get the light to turn white if I change the connection type to DHCP and then connect the router to a laptop via Ethernet. Light turns white then, but obviously doesn't really work for what I need it for.

I take it there's no way to trick the router into thinking it has a connection even if it doesn't? If it thinks there's an Internet connection, that'll turn the LED white most likely.

i made this if someone can improve it update adminpassword and put it in a file in /usr/share/gui-core/www/gui/views/yourfile.html
access via http://routerip//0.1/gui/views/yourfile.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" class="no-js">

<head>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
    <meta charset="utf-8"/>
    <meta name="sagemcom" content="oui"/>
    <meta name="viewport"
          content="width=device-width,height=device-height,initial-scale=1.0,user-scalable=no,user-scalable=0"/>
    <meta http-equiv="content-language" content="en">
    <base href="/0.1/gui/" id="baseHref"/>
    <script>
        let initialRegex = /(.*)\/.*.html/i;
        let baseHref = initialRegex.exec(window.location.pathname);
        let usethis = window.location.pathname;
        if (baseHref) {
            usethis = baseHref[1] + '/';
        }
        document.getElementById("baseHref").href = usethis;
    </script>
    <style>
        meta.foundation-data-attribute-namespace {
            font-family: false;
        }
    </style>

    <link id="favicon" rel="shortcut icon" href="/0.1/gui/images/faviconNone.ico"/>

    <title></title>

    <script>
        window.onerror = function (msg, url, line, col, error) {
            if (typeof SboxInterface !== 'undefined') {
                SboxInterface.RemoveLoader();
                setTimeout(function () {
                    if (document.getElementById('main-ui-view').innerHTML.length === 0) {
                        SboxInterface.processHTML('retry');
                    }
                }, 1000);
            }
            return false;
        };
    </script>

    <script src="/0.1/gui/js/vendor.js?fb05139c9f71c81b"></script>

    <script>
        // fix for old code in gui-core relying on $.browser
        if (typeof (jQuery) != 'undefined') {
            jQuery.browser = {};
            jQuery.browser.msie = false;
            jQuery.browser.version = 0;
            if (navigator.userAgent.match(/MSIE ([0-9]+)\./)) {
                jQuery.browser.msie = true;
                jQuery.browser.version = RegExp.$1;
            } else if (!!navigator.userAgent.match(/Trident\/7\./)) {
                jQuery.browser.msie = true;
                jQuery.browser.version = 11;
            } else if (navigator.userAgent.match(/Edge/)) {
                jQuery.browser.edge = true;
            }
        } else {
            jQuery = {};
            jQuery.browser = {};
            jQuery.browser.msie = true;
            jQuery.browser.version = 8;
        }
        svg4everybody();
    </script>
    <script src="/0.1/gui/js/libs.js?2d29aa5aad1b5e79"></script>

    <script src="/0.1/gui/js/jquery-utils.js"></script>
    <script src="/0.1/gui/js/gui-core.js"></script>
    <script src="/0.1/gui/js/gui-api.js"></script>
    <script src="/0.1/gui/js/gui-widgets.js"></script>

    <script src="/0.1/gui/js/xmo.js?039452c4b2d758a9"></script>

    <script src="/0.1/gui/js/scripts.js?e8efde69a47f0d22"></script>

    <script src="/0.1/gui/js/config.js?ff367122648a76e2"></script>

    <link rel="stylesheet" href="/0.1/gui/styles/vendor.css">
    <!-- <link rel="stylesheet" href="/0.1/gui/styles/vendor-rtl.css"/> -->

    <link rel="stylesheet" href="/0.1/gui/styles/lib.css">


    <!--[if IE 8]>
    <link rel="stylesheet" href="/0.1/gui//0.1/gui/styles/foundation-ie8.css"/>
    <![endif]-->

    <link rel="stylesheet" href="/0.1/gui/styles/main.css">
    <link rel="stylesheet" id="main-theme" href="/0.1/gui/"/>
    <!-- <link rel="stylesheet" href="/0.1/gui/styles/main-rtl.css"/> -->


    <link rel="stylesheet" href="/0.1/gui/styles/dev.css">
    <!-- <link rel="stylesheet" href="/0.1/gui/styles/dev-rtl.css"/> -->
    <style>



        ul ul {
            //display: none;
            display: block;
        }


        ul ul:open {
            display: block;
        //display: inline-block;
        }
        ul.my-list {
            display: block;
        }
    ul li:hover ul
        {
            display: block;
                }
        /*
                ul > li:hover > ul {
                    display: block;
                }
                ul > li {
                    position: relative;
                }

                ul > li::before {
                    // Unicode character for right-pointing triangle
                    content: '\25B6';

                    display: inline-block;
                    margin-right: 5px;
                    //Rotate the triangle 90 degrees
                                         transform: rotate(90deg);
                    // Add a smooth animation effect
                    transition: transform 0.2s ease-in-out;
                }

                ul > li > ul {
                    display: none;
                }

                ul > li.active::before {
                    ///Rotate the triangle back to its original position
                    transform: rotate(-90deg);
                }

                ul > li.active > ul {
                    display: block;
                }
        */
        .parent > .caret {
        display: inline-block;
        transform: rotate(90deg);
        transition: transform 0.2s ease-out;
        }

        .parent.open > .caret {
        transform: rotate(0deg);
        }

        .parent.open > ul {
        display: block;
        }




    </style>

</head>

<body ng-app="sboxApp" ng-class="isMainTemplate ? '' : 'bg-gradient'" class="bg-gradient-force">
<div wait></div>
<div id="main-ui-view" class="zoomViewport" ui-view></div>
<script type="text/javascript">
    //IE 11- / EDGE HACK
    //PROBLEM: when we reopen the session in IE and EDGE they do not process all the javascript and css correctly and shows the GUI broken
    //SOLUTION: the malformed page always have the logout button but it is hidden, we check it and if we are in IE or EDGE and redirect the user to the main page and reload the page
    setTimeout(function () {
        if ((jQuery.browser.msie || jQuery.browser.edge) && $('#btn-logout').length && !$('#btn-logout').is(':visible') && $('#head-container').is(':visible') && window.location.hash.indexOf('login') === -1) {
            window.location = '';
        }
    }, 500);
</script>
<div id="xpaths-output"></div>
<div id="xmo-output">starting</div>
<div id="tree-container">...</div>
<script>
    $(document).ready(function () {
        $.xmo.login("admin", "adminpassword");
        $.xmo.setValuesTree(0, "Device.UserInterface.Httpd.SessionTimeout");
        $.xmo.sessionTimeOut = 0;
        //$.xmo.login("admin", "fcc4e6b8ee82e5b8bf089547b6894619");
        $.xmo.client.saveToCookie;

        function getxmo(val, ul, li, prop) {
            console.log("getxmo: " +val);
            if ((typeof val === "string" && val.startsWith("Device")) || (typeof prop === "string" && prop.startsWith("Device"))) {
                const deviceName = typeof val === "string" && val.startsWith("Device") ? val : prop;
                $.xmo.getValuesTree(deviceName, {
                    success: function (response) {
                        if (Array.isArray(response)) {
                            // Treat arrays of objects as simple objects
                            let inputList = document.createElement("ul");
                            response.forEach(function (item) {
                                if (typeof item === "object") {
                                    for (let prop in item) {

                                        if (Array.isArray(item[prop])) {
                                            let inputLi = document.createElement("li");
                                            let inputSpan = document.createElement("span");

                                            var caret = document.createElement('span');
                                            caret.textContent = '1▶ ';
                                            caret.classList.add('caret');
                                            inputSpan.textContent = val + "/" + prop + ": ";
                                            inputLi.appendChild(inputSpan);
                                            inputLi.appendChild(caret);
                                            let input = document.createElement("input");
                                            input.type = "text";
                                            input.value = JSON.stringify(item[prop]);


                                            console.log("inputSpan.textContent = " + inputSpan.textContent);
                                            var subli = document.createElement("li");
                                            var subul = buildTree(item[prop],inputSpan.textContent );
                                            /*
                                            var caret = document.createElement('span');
                                            caret.textContent = '1▶ ';
                                            caret.classList.add('caret');
                                            subli.appendChild(caret);
                                            subli.appendChild(subul);
                                            subli.classList.add("has-children");
                                            */
                                            console.log("here" + val);
                                            subli.appendChild(subul);
                                            inputLi.appendChild(subli);
                                            //li.classList.add("parent");
                                            //li.innerHTML = "<span class='caret'></span>" + li.innerHTML;
                                            //parent.appendChild(li);

                                            //inputList.appendChild(li);
                                            inputLi.appendChild(input);

                                            inputList.appendChild(inputLi);
                                            li.appendChild(inputList);
                                        }
                                        else
                                        {
                                            let inputLi = document.createElement("li");
                                            let inputSpan = document.createElement("span");
                                            inputSpan.textContent = val + "/" + prop + ": ";
                                            inputLi.appendChild(inputSpan);
                                            let input = document.createElement("input");
                                            input.type = "text";
                                            input.value = item[prop] ;
                                            //if (Array.isArray(item[prop])) input.value = item[prop].stringify + " 1";
                                            inputLi.appendChild(input);
                                            inputList.appendChild(inputLi);

                                            li.appendChild(inputList);
                                        }

                                    }
                                } else {
                                    let inputLi = document.createElement("li");
                                    let input = document.createElement("input");
                                    input.type = "text";
                                    input.value = item;
                                    inputLi.appendChild(input);
                                    inputList.appendChild(inputLi);
                                    li.appendChild(inputList);
                                }
                            });
                        } else if (typeof response === "object") {
                            var subli = document.createElement("li");
                            var subul = buildTree(response,prop);
                            subli.appendChild(subul);
                            subli.classList.add("has-children");
                            li.appendChild(subli);
                            li.classList.add("parent");
                            li.innerHTML = "<span class='caret'></span>" + li.innerHTML;
                            ul.appendChild(li);
                        } else {
                            var input = document.createElement("input");
                            input.type = "text";
                            input.value = response;
                            li.appendChild(input);
                        }
                    },
                    error: function (response) {
                        var subli = document.createElement("li");
                        subli.textContent = response;
                        ul.appendChild(li);
                        subli.classList.add("has-children");
                        li.appendChild(subli);
                        li.classList.add("parent");
                        li.innerHTML = "<span class='caret'></span>" + li.innerHTML;
                        var input = document.createElement("input");
                        input.type = "text";
                        input.value = response;
                        li.appendChild(input);
                    },
                });
                li.appendChild(document.createTextNode(deviceName));
            } else {
                li.appendChild(document.createTextNode(val));
            }
            return li;
        }





        function buildTree(data, path = '') {
            let ul = document.createElement('ul');

            if (data === null) {
                let li = document.createElement('li');
                li.textContent = 'null';
                ul.appendChild(li);
                return ul;
            }

            if (Array.isArray(data)) {
                data.forEach(item => {
                    let li = document.createElement('li');
                    if (typeof item === 'object') {
                        let subul = buildTree(item, path + ":");
                        //let caret = document.createElement('span');
                        //caret.textContent = '2▶ ';
                        //caret.classList.add('caret');
                        //li.appendChild(caret);
                        li.appendChild(subul);
                        li.classList.add('parent');
                    } else {
                        li.textContent = item;
                    }
                    ul.appendChild(li);
                });
            } else if (typeof data === 'object') {
                for (let prop in data) {
                    console.log(prop);
                    let li = document.createElement('li');
                    let propSpan = document.createElement('span');
                    propSpan.textContent = path ? path + ':' + prop : prop;
                    propSpan.textContent += ": ";
                    li.appendChild(propSpan);

                    let val = data[prop];
                    if (val === null) {
                        let valSpan = document.createElement('span');
                        valSpan.textContent = 'null';
                        li.appendChild(valSpan);
                        ul.appendChild(li);
                        continue;
                    }

                    if (typeof val === 'string' && val.startsWith('Device')) {
                        console.log("val: " + val );
                        li = getxmo(val, ul, li, path ? path + ':' + prop : prop );
                    } else if (typeof prop === 'string' && prop.startsWith('Device')) {
                        console.log("prop: " + prop);
                        li = getxmo(prop, ul, li, path ? path + ':' + prop : prop);
                    } else if (typeof val === 'object') {
                        let subul = buildTree(val, path ? path + ':' + prop : prop);
                        let caret = document.createElement('span');
                        caret.textContent = '3▶ ';
                        caret.classList.add('caret');
                        li.appendChild(caret);
                        li.appendChild(subul);
                        li.classList.add('parent');
                    } else {
                        let input = document.createElement('input');
                        input.type = 'text';
                        input.value = val;
                        li.appendChild(input);
                    }

                    ul.appendChild(li);

                    // add caret to all ul and li elements
                    /*
                    li.querySelectorAll('li, ul').forEach(el => {
                        let caret = document.createElement('span');
                        caret.textContent = '▶ 1';
                        caret.classList.add('caret');
                        el.insertBefore(caret, el.firstChild);
                        el.classList.add('parent');
                    });

                     */
                }
            } else {
                let li = document.createElement('li');
                li.textContent = data;
                li = getxmo(data, ul, li)
                ul.appendChild(li);

                // add caret to all ul and li elements
                li.querySelectorAll('li, ul').forEach(el => {
                    let caret = document.createElement('span');
                    caret.textContent = '▶ ';
                    caret.classList.add('caret');
                    el.insertBefore(caret, el.firstChild);
                    el.classList.add('parent');
                });
            }

            return ul;
        }











        const tree = $.xpaths; // define your tree object here
        const container = document.getElementById('tree-container'); // select the container element in the HTML document
        container.appendChild(buildTree(tree,'xpaths')); // append the generated unordered list to the container element


        // add event listener to all caret elements
        // Get all the caret elements
        var carets = document.querySelectorAll(".caret");

        $("li.caret").click(function(){
            $(this).children("ul").toggle();
        });

        document.querySelectorAll('.caret').forEach(caret => {
            caret.addEventListener('click', () => {
                caret.parentElement.classList.toggle('open');
            });
        });



        document.querySelectorAll('.parent .caret').forEach(caret => {
            caret.click(); // Simulate a click on each caret element
        });























    });
</script>
</body>

</html>

Running 1400t on this one I've just got my hands on and I had to ssh in with options for some reason

ssh -oKexAlgorithms=+diffie-hellman-group1-sha1 -oHostKeyAlgorithms=+ssh-rsa admin@192.168.1.1

Also running windows 10 and Git Bash, don't know if that makes a difference but if anyone else runs into issues when connecting this could fix it

Bit late, but I decided to try tinkering with the TalkTalk router again just to see if I could get it to stay on one solid colour since it just keeps flashing orange as it's only being used as an AP. I managed to get it to stay on the orange LED.

I fiddled with some values in the Device/DSL section. I changed some values to "UP" (the ones that said DORMANT and NOSIGNAL). I then changed the Upstream and Downstream current values. It then was cycling between white and orange rapidly. After some time, it seemed to settle on a static orange LED.

I haven't been able to make it switch to the static white LED yet. I'm guessing white only turns on when the router modem actually connects to the Internet. I can't see any values to change that would fool it into thinking there's a real connection.

I do have to repeat the commands if the router reboots/switches off though. Bit of a pointless thing to do, but the flashing orange was somewhat bothering me.

Anyone know if it's possible to change the router time? Since I'm using it as an AP, it doesn't access the Internet, so it doesn't get the correct time. I assume the time shown in the "Internet Time (NTP)" in the router GUI is the time the router is using.

The path for it is Device/Time/CurrentLocalTime. I tried changing the value to match the current time and the router does accept the command (no errors shown). However, the value doesn't change. It remains unaffected.

Is there something I'm missing, or is it maybe not possible to change the router time manually?