WebThingsIO / gateway

WebThings Gateway - a self-hosted web application for monitoring and controlling a building over the web
http://webthings.io/gateway
Mozilla Public License 2.0
2.62k stars 339 forks source link

static Ethernet settings not shown #3079

Open adioanca-rpma opened 1 year ago

adioanca-rpma commented 1 year ago

https://github.com/WebThingsIO/gateway/blob/4dadba9a11ec2cadd30353eb9b227bccd5b2b655/static/js/views/settings.js#L876

Issues:

  1. ipdaddr instead of ipaddr
  2. .options is missing. should be body.options.[ipaddr | netmask | gateway]
  3. default values for ipaddr| netmask| gateway should be '' and this.elements.network.client.ethernet.netmask.value = '255.255.255.0'; line be removed IMO.

also the elements are hidden so my ugly workaround was to add:

    this.ethernetEls = ethernetEls;

in setupNetworkElements and

      if (body.mode === 'static') {
        this.ethernetEls.forEach((el) => el.classList.remove('hidden'));
      }

in showEthernetSettings which now looks like this:

  showEthernetSettings: function () {
    this.backButton.href = '/settings/network';
    this.view.classList.add('dark');
    this.hideNetworkElements();
    this.elements.network.main.classList.remove('hidden');

    this.elements.network.client.ethernet.main.classList.remove('hidden');

    API.getLanSettings().then((body) => {
      body = {mode: body.mode, ...body.options}; // <--- ugly but small change
      if (body.mode === 'static') {
        this.ethernetEls.forEach((el) => el.classList.remove('hidden'));
      }
      this.elements.network.client.ethernet.mode.value = body.mode || 'dhcp';
      this.elements.network.client.ethernet.ip.value = body.ipaddr || '';
      this.elements.network.client.ethernet.netmask.value = body.netmask || '';
      this.elements.network.client.ethernet.gateway.value = body.gateway || '';
      this.titlebar.setAttribute("data-l10n-id", "ethernet");
    }).catch((e) => {
      console.error(`Failed to get ethernet config: ${e}`);
    }).then(() => {
      this.validateEthernet();
    });
  },
benfrancis commented 1 year ago

@adioanca-rpma Thanks very much for taking the time to look into this. Would you be willing to put together a pull request with your proposed patch?

Thanks

adioanca-rpma commented 1 year ago

Done.

@benfrancis @tim-hellhake could you please help with NodeJS 16 build tools docker image? alongside these: webthingsio/toolchain-linux-[ARCH]-node-[8|10|12|14]

Thank you

adioanca-rpma commented 1 year ago

Another thing that I observed was that if one presses Done in /settings/network/ethernet screen and dhcp is the selected option, if there is no Ethernet cable plugged in (or no dhcp server on LAN) it will take 1 minute to get back to /settings/network screen.

My solution was to add this to image/stage3/02-systemd-units/00-run.sh:

on_chroot << EOF
# ...

# Faster DHCP for eth0 if there is no link or DHCP server
echo -e "timeout 5;\nretry 1;\npre-up ethtool eth0 | grep -q 'Link detected: yes' || { exit 0; };" >> /etc/dhcp/dhclient.conf

#...

If you want this fix or have a better solution, please let me know.

Thanks

benfrancis commented 1 year ago

If you want this fix or have a better solution, please let me know.

@adioanca-rpma I don't have another suggestion, no, but please feel free to file a separate issue for that.

I've just noticed that I can't reproduce the bug about static Ethernet settings not being shown in WebThings Gateway 1.1 on a Raspberry Pi, where it seems to work fine. I don't have the current master branch installed on a platform which supports network settings so I can't test that.

Can you confirm which platform you're running on when you experience this bug so that I can try to reproduce it? Is it Raspberry Pi?

I find it odd if this is a regression between 1.1 and master because as far as I'm aware this code hasn't been touched.

Thanks

adioanca commented 1 year ago

yes, RPi.

I can reproduce it. branch/commit:

commit 4dadba9a11ec2cadd30353eb9b227bccd5b2b655 (HEAD -> master, origin/master, origin/HEAD)
Author: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Date:   Wed Mar 15 05:56:04 2023 +0000

I've just retested now.

To reproduce, try realoading the browser page while in Network (and/or Ethernet page). If you have a static configuration you won't see any of the 3 fields.

Note that once you've changed from dhcp to static, you'll be redirected to network page, and if you go into Ethernet page again - the fields will be visible. And if you change to dhcp, the static fields will remain visible - although they shouldn't.

Try playing static<->dhcp, Network<->Ethernet screens, back and forth and you'll see the issues. Remember to also play with browser page reload.

...

also search the master branch for ipdaddr and ipaddr and you'll see that https://github.com/WebThingsIO/gateway/blob/627c7c401a843c0d2c8418b6d5a40bce98a1e86e/static/js/views/settings.js#L876 has the extra d typo and it's the only place in the project where it appears - which means a static IP is never shown. I don't understand how it works for you... are you seeing the static IP that you have configured? what about after browser page reload or GW restart?