8000 Fixhancement: add an option to fritzbox widget to display IPv6 by astappiev · Pull Request #4778 · gethomepage/homepage · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
8000

Fixhancement: add an option to fritzbox widget to display IPv6 #4778

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Feb 17, 2025

Conversation

astappiev
Copy link
Contributor

Proposed change

This PR adds an ability to display external IPv6 address and/or IPv6-Prefix in the FritzBox widget.

Currently, the widget returns an empty IP address, because there is no IPv4 address assigned by my internet provider. Instead they provide me with an IPv6 subnet.

Unfortunately, the UPnP action is prefixed with X_AVM_DE_ which might seem like an unstable option. However, there are already values prefixed with NewX_AVM_DE_ used in the file (as per #1213) and it seems to be even older, yet still present in my router.

I added an option for both, address and prefix, however, IMHO prefix is sufficient, because ::1 has only the router itself and all the clients (NAS, Raspberry Pi, Home server, etc.) will have a different IP address with a common prefix.

Tested with FRITZ!Box 7590 AX router (FRITZ!OS: 8.02), I would say it's the most popular one in Germany.

Type of change

  • New service widget
  • Bug fix (non-breaking change which fixes an issue)
  • New feature or enhancement (non-breaking change which adds functionality)
  • Documentation only
  • Other (please explain)

Checklist:

  • If applicable, I have added corresponding documentation changes.
  • If applicable, I have reviewed the feature / enhancement and / or service widget guidelines.
  • I have checked that all code style checks pass using pre-commit hooks and linting checks.
  • If applicable, I have tested my code for new features & regressions on both mobile & desktop devices, using the latest version of major browsers.

@shamoon
Copy link
Collaborator
shamoon commented Feb 16, 2025

Thank you for the contribution however we’re not going to accept this at the moment. Please review the contributing guidelines, which really are designed to prevent maintenance burden for things only a small subset of users want for example in this case, apparently just yourself.

In this case specifically there’s really no way for us to test or verify if issues come up (and when it comes to networking stuff like this I think that seems very possible).

If you’d like to open a feature request as the guidelines require, and there is some general interest in this we would be happy to readdress.

thank you for your interest in contributing

@shamoon shamoon closed this Feb 16, 2025
@astappiev
Copy link
Contributor Author
astappiev commented Feb 16, 2025

I am just willing to improve an existing widget, with minor additions that don't bring any new dependencies or logic that have to be maintained. The only thing that has to be maintained is translations. I have invested many hours of my time not to just rise an issue, but also to investigate and solve it. Now willing to share it with the community.

I understand that you don't have a router, of course, I have tested it myself. If you need logs or screenshots, that would be a more reasonable request.

Also, it's hard to describe, is it a bugfix because I fixed the missing IP address? Probably not because I haven't fixed it.
I solved it by providing an alternative way. Is it a new feature? Not really, it's an extension of an existing one.
Following above mentioned, I should go a long way by first raising an issue, and asking for help and no one will do, because you don't have a router that I use. This is exactly why I started the investigation myself and wanted to share it back initially.

Saying that there is no interest, kills my interest in giving back :/
Ok, let's wait until others using FritzBox in Germany (IPv6 only and NAT for IPv4) stumble upon the same issue and try to search for it.

Poorly described discussed (no idea what extra I should write), just to be linked #4779.

@shamoon
Copy link
Collaborator
shamoon commented Feb 16, 2025

I do take issue with the assertion that there will be no extra maintenance, to be honest after doing this kinda thing for a while I’m convinced that there really is no such thing. Especially given the sort of confusing networking choices made by fritzbox I expect there will at least be questions.

But I see your point that this could be considered more of a bugfix for example your situation where there simply is no ipv4. So I’ll re-open this, thanks for your understanding.

Two things:

  1. Please remove the translation here, that should be handled via crowdin (which also updates the timestamps etc).
  2. Please provide a sample of the api output

@shamoon shamoon reopened this Feb 16, 2025
@shamoon shamoon changed the title feat(fritzbox): add an option to request and display IPv6 Fixhancement: add an option to request and display IPv6 Feb 16, 2025
@shamoon shamoon changed the title Fixhancement: add an option to request and display IPv6 Fixhancement: add an option to fritzbox widget to display IPv6 Feb 16, 2025
@astappiev
Copy link
Contributor Author

Thank you for your understanding too, I can understand your point as well.

I have removed translations from my commit.

Let me describe my changes step-by-step:

  1. Reproducing the request the widget is making to request external IP
curl -s -H 'Content-Type: text/xml; charset="utf-8"' \
  -H 'SOAPAction: urn:schemas-upnp-org:service:WANIPConnection:1#GetExternalIPAddress' \
  --data-binary '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:GetExternalIPAddress xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" /></s:Body></s:Envelope>' \
  http://fritz.box:49000/igdupnp/control/WANIPConn1

The response I receive:

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewExternalIPAddress></NewExternalIPAddress>
</u:GetExternalIPAddressResponse>
</s:Body>
</s:Envelope>

We can see NewExternalIPAddress which the widget is trying to read is present but empty.

  1. Read FritxBox specifications
    First, I tried to google, but with no success, I started reading other discussions and scripts to get data from FritzBox and found that specifications can be retrieved from the router itself.
    http://fritz.box:49000/igddesc.xml - shows a list of all possible services under igdupnp endpoint
    http://fritz.box:49000/igdconnSCPD.xml - shows available actions of WANIPConnection service
igddesc.xml

<root
	xmlns="urn:schemas-upnp-org:device-1-0">
	<specVersion>
		<major>1</major>
		<minor>0</minor>
	</specVersion>
	<device>
		<deviceType>urn:schemas-upnp-org:device:InternetGatewayDevice:1</deviceType>
		<friendlyName>FRITZ!Box 7590 AX</friendlyName>
		<manufacturer>AVM Berlin</manufacturer>
		<manufacturerURL>http://www.avm.de</manufacturerURL>
		<modelDescription>FRITZ!Box 7590 AX</modelDescription>
		<modelName>FRITZ!Box 7590 AX</modelName>
		<modelNumber>7590avm</modelNumber>
		<modelURL>http://www.avm.de</modelURL>
		<UDN>censored</UDN>
		<iconList>
			<icon>
				<mimetype>image/gif</mimetype>
				<width>118</width>
				<height>119</height>
				<depth>8</depth>
				<url>/ligd.gif</url>
			</icon>
		</iconList>
		<serviceList>
			<service>
				<serviceType>urn:schemas-any-com:service:Any:1</serviceType>
				<serviceId>urn:any-com:serviceId:any1</serviceId>
				<controlURL>/igdupnp/control/any</controlURL>
				<eventSubURL>/igdupnp/control/any</eventSubURL>
				<SCPDURL>/any.xml</SCPDURL>
			</service>
		</serviceList>
		<deviceList>
			<device>
				<deviceType>urn:schemas-upnp-org:device:WANDevice:1</deviceType>
				<friendlyName>WANDevice - FRITZ!Box 7590 AX</friendlyName>
				<manufacturer>AVM Berlin</manufacturer>
				<manufacturerURL>www.avm.de</manufacturerURL>
				<modelDescription>WANDevice - FRITZ!Box 7590 AX</modelDescription>
				<modelName>WANDevice - FRITZ!Box 7590 AX</modelName>
				<modelNumber>7590avm</modelNumber>
				<modelURL>www.avm.de</modelURL>
				<UDN>censored</UDN>
				<UPC>AVM IGD</UPC>
				<serviceList>
					<service>
						<serviceType>urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1</serviceType>
						<serviceId>urn:upnp-org:serviceId:WANCommonIFC1</serviceId>
						<controlURL>/igdupnp/control/WANCommonIFC1</controlURL>
						<eventSubURL>/igdupnp/control/WANCommonIFC1</eventSubURL>
						<SCPDURL>/igdicfgSCPD.xml</SCPDURL>
					</service>
				</serviceList>
				<deviceList>
					<device>
						<deviceType>urn:schemas-upnp-org:device:WANConnectionDevice:1</deviceType>
						<friendlyName>WANConnectionDevice - FRITZ!Box 7590 AX</friendlyName>
						<manufacturer>AVM Berlin</manufacturer>
						<manufacturerURL>www.avm.de</manufacturerURL>
						<modelDescription>WANConnectionDevice - FRITZ!Box 7590 AX</modelDescription>
						<modelName>WANConnectionDevice - FRITZ!Box 7590 AX</modelName>
						<modelNumber>7590avm</modelNumber>
						<modelURL>www.avm.de</modelURL>
						<UDN>censored</UDN>
						<UPC>AVM IGD</UPC>
						<serviceList>
							<service>
								<serviceType>urn:schemas-upnp-org:service:WANDSLLinkConfig:1</serviceType>
								<serviceId>urn:upnp-org:serviceId:WANDSLLinkC1</serviceId>
								<controlURL>/igdupnp/control/WANDSLLinkC1</controlURL>
								<eventSubURL>/igdupnp/control/WANDSLLinkC1</eventSubURL>
								<SCPDURL>/igddslSCPD.xml</SCPDURL>
							</service>
							<service>
								<serviceType>urn:schemas-upnp-org:service:WANIPConnection:1</serviceType>
								<serviceId>urn:upnp-org:serviceId:WANIPConn1</serviceId>
								<controlURL>/igdupnp/control/WANIPConn1</controlURL>
								<eventSubURL>/igdupnp/control/WANIPConn1</eventSubURL>
								<SCPDURL>/igdconnSCPD.xml</SCPDURL>
							</service>
							<service>
								<serviceType>urn:schemas-upnp-org:service:WANIPv6FirewallControl:1</serviceType>
								<serviceId>urn:upnp-org:serviceId:WANIPv6Firewall1</serviceId>
								<controlURL>/igd2upnp/control/WANIPv6Firewall1</controlURL>
								<eventSubURL>/igd2upnp/control/WANIPv6Firewall1</eventSubURL>
								<SCPDURL>/igd2ipv6fwcSCPD.xml</SCPDURL>
							</service>
						</serviceList>
					</device>
				</deviceList>
			</device>
		</deviceList>
		<presentationURL>http://[2a00:censored]</presentationURL>
	</device>
</root>

igdconnSCPD.xml

<scpd
	xmlns="urn:schemas-upnp-org:service-1-0">
	<specVersion>
		<major>1</major>
		<minor>0</minor>
	</specVersion>
	<actionList>
		<action>
			<name>SetConnectionType</name>
			<argumentList>
				<argument>
					<name>NewConnectionType</name>
					<direction>in</direction>
					<relatedStateVariable>ConnectionType</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetConnectionTypeInfo</name>
			<argumentList>
				<argument>
					<name>NewConnectionType</name>
					<direction>out</direction>
					<relatedStateVariable>ConnectionType</relatedStateVariable>
				</argument>
				<argument>
					<name>NewPossibleConnectionTypes</name>
					<direction>out</direction>
					<relatedStateVariable>PossibleConnectionTypes</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetAutoDisconnectTime</name>
			<argumentList>
				<argument>
					<name>NewAutoDisconnectTime</name>
					<direction>out</direction>
					<relatedStateVariable>AutoDisconnectTime</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetIdleDisconnectTime</name>
			<argumentList>
				<argument>
					<name>NewIdleDisconnectTime</name>
					<direction>out</direction>
					<relatedStateVariable>IdleDisconnectTime</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>RequestConnection</name>
		</action>
		<action>
			<name>RequestTermination</name>
		</action>
		<action>
			<name>ForceTermination</name>
		</action>
		<action>
			<name>GetStatusInfo</name>
			<argumentList>
				<argument>
					<name>NewConnectionStatus</name>
					<direction>out</direction>
					<relatedStateVariable>ConnectionStatus</relatedStateVariable>
				</argument>
				<argument>
					<name>NewLastConnectionError</name>
					<direction>out</direction>
					<relatedStateVariable>LastConnectionError</relatedStateVariable>
				</argument>
				<argument>
					<name>NewUptime</name>
					<direction>out</direction>
					<relatedStateVariable>Uptime</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetNATRSIPStatus</name>
			<argumentList>
				<argument>
					<name>NewRSIPAvailable</name>
					<direction>out</direction>
					<relatedStateVariable>RSIPAvailable</relatedStateVariable>
				</argument>
				<argument>
					<name>NewNATEnabled</name>
					<direction>out</direction>
					<relatedStateVariable>NATEnabled</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetGenericPortMappingEntry</name>
			<argumentList>
				<argument>
					<name>NewPortMappingIndex</name>
					<direction>in</direction>
					<relatedStateVariable>PortMappingNumberOfEntries</relatedStateVariable>
				</argument>
				<argument>
					<name>NewRemoteHost</name>
					<direction>out</direction>
					<relatedStateVariable>RemoteHost</relatedStateVariable>
				</argument>
				<argument>
					<name>NewExternalPort</name>
					<direction>out</direction>
					<relatedStateVariable>ExternalPort</relatedStateVariable>
				</argument>
				<argument>
					<name>NewProtocol</name>
					<direction>out</direction>
					<relatedStateVariable>PortMappingProtocol</relatedStateVariable>
				</argument>
				<argument>
					<name>NewInternalPort</name>
					<direction>out</direction>
					<relatedStateVariable>InternalPort</relatedStateVariable>
				</argument>
				<argument>
					<name>NewInternalClient</name>
					<direction>out</direction>
					<relatedStateVariable>InternalClient</relatedStateVariable>
				</argument>
				<argument>
					<name>NewEnabled</name>
					<direction>out</direction>
					<relatedStateVariable>PortMappingEnabled</relatedStateVariable>
				</argument>
				<argument>
					<name>NewPortMappingDescription</name>
					<direction>out</direction>
					<relatedStateVariable>PortMappingDescription</relatedStateVariable>
				</argument>
				<argument>
					<name>NewLeaseDuration</name>
					<direction>out</direction>
					<relatedStateVariable>PortMappingLeaseDuration</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetSpecificPortMappingEntry</name>
			<argumentList>
				<argument>
					<name>NewRemoteHost</name>
					<direction>in</direction>
					<relatedStateVariable>RemoteHost</relatedStateVariable>
				</argument>
				<argument>
					<name>NewExternalPort</name>
					<direction>in</direction>
					<relatedStateVariable>ExternalPort</relatedStateVariable>
				</argument>
				<argument>
					<name>NewProtocol</name>
					<direction>in</direction>
					<relatedStateVariable>PortMappingProtocol</relatedStateVariable>
				</argument>
				<argument>
					<name>NewInternalPort</name>
					<direction>out</direction>
					<relatedStateVariable>InternalPort</relatedStateVariable>
				</argument>
				<argument>
					<name>NewInternalClient</name>
					<direction>out</direction>
					<relatedStateVariable>InternalClient</relatedStateVariable>
				</argument>
				<argument>
					<name>NewEnabled</name>
					<direction>out</direction>
					<relatedStateVariable>PortMappingEnabled</relatedStateVariable>
				</argument>
				<argument>
					<name>NewPortMappingDescription</name>
					<direction>out</direction>
					<relatedStateVariable>PortMappingDescription</relatedStateVariable>
				</argument>
				<argument>
					<name>NewLeaseDuration</name>
					<direction>out</direction>
					<relatedStateVariable>PortMappingLeaseDuration</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>AddPortMapping</name>
			<argumentList>
				<argument>
					<name>NewRemoteHost</name>
					<direction>in</direction>
					<relatedStateVariable>RemoteHost</relatedStateVariable>
				</argument>
				<argument>
					<name>NewExternalPort</name>
					<direction>in</direction>
					<relatedStateVariable>ExternalPort</relatedStateVariable>
				</argument>
				<argument>
					<name>NewProtocol</name>
					<direction>in</direction>
					<relatedStateVariable>PortMappingProtocol</relatedStateVariable>
				</argument>
				<argument>
					<name>NewInternalPort</name>
					<direction>in</direction>
					<relatedStateVariable>InternalPort</relatedStateVariable>
				</argument>
				<argument>
					<name>NewInternalClient</name>
					<direction>in</direction>
					<relatedStateVariable>InternalClient</relatedStateVariable>
				</argument>
				<argument>
					<name>NewEnabled</name>
					<direction>in</direction>
					<relatedStateVariable>PortMappingEnabled</relatedStateVariable>
				</argument>
				<argument>
					<name>NewPortMappingDescription</name>
					<direction>in</direction>
					<relatedStateVariable>PortMappingDescription</relatedStateVariable>
				</argument>
				<argument>
					<name>NewLeaseDuration</name>
					<direction>in</direction>
					<relatedStateVariable>PortMappingLeaseDuration</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>DeletePortMapping</name>
			<argumentList>
				<argument>
					<name>NewRemoteHost</name>
					<direction>in</direction>
					<relatedStateVariable>RemoteHost</relatedStateVariable>
				</argument>
				<argument>
					<name>NewExternalPort</name>
					<direction>in</direction>
					<relatedStateVariable>ExternalPort</relatedStateVariable>
				</argument>
				<argument>
					<name>NewProtocol</name>
					<direction>in</direction>
					<relatedStateVariable>PortMappingProtocol</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>GetExternalIPAddress</name>
			<argumentList>
				<argument>
					<name>NewExternalIPAddress</name>
					<direction>out</direction>
					<relatedStateVariable>ExternalIPAddress</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>X_AVM_DE_GetExternalIPv6Address</name>
			<argumentList>
				<argument>
					<name>NewExternalIPv6Address</name>
					<direction>out</direction>
					<relatedStateVariable>ExternalIPv6Address</relatedStateVariable>
				</argument>
				<argument>
					<name>NewPrefixLength</name>
					<direction>out</direction>
					<relatedStateVariable>PrefixLength</relatedStateVariable>
				</argument>
				<argument>
					<name>NewValidLifetime</name>
					<direction>out</direction>
					<relatedStateVariable>ValidLifetime</relatedStateVariable>
				</argument>
				<argument>
					<name>NewPreferedLifetime</name>
					<direction>out</direction>
					<relatedStateVariable>PreferedLifetime</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>X_AVM_DE_GetIPv6Prefix</name>
			<argumentList>
				<argument>
					<name>NewIPv6Prefix</name>
					<direction>out</direction>
					<relatedStateVariable>IPv6Prefix</relatedStateVariable>
				</argument>
				<argument>
					<name>NewPrefixLength</name>
					<direction>out</direction>
					<relatedStateVariable>PrefixLength</relatedStateVariable>
				</argument>
				<argument>
					<name>NewValidLifetime</name>
					<direction>out</direction>
					<relatedStateVariable>ValidLifetime</relatedStateVariable>
				</argument>
				<argument>
					<name>NewPreferedLifetime</name>
					<direction>out</direction>
					<relatedStateVariable>PreferedLifetime</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>X_AVM_DE_GetDNSServer</name>
			<argumentList>
				<argument>
					<name>NewIPv4DNSServer1</name>
					<direction>out</direction>
					<relatedStateVariable>IPv4DNSServer1</relatedStateVariable>
				</argument>
				<argument>
					<name>NewIPv4DNSServer2</name>
					<direction>out</direction>
					<relatedStateVariable>IPv4DNSServer2</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
		<action>
			<name>X_AVM_DE_GetIPv6DNSServer</name>
			<argumentList>
				<argument>
					<name>NewIPv6DNSServer1</name>
					<direction>out</direction>
					<relatedStateVariable>IPv6DNSServer1</relatedStateVariable>
				</argument>
				<argument>
					<name>NewValidLifetime1</name>
					<direction>out</direction>
					<relatedStateVariable>ValidLifetime1</relatedStateVariable>
				</argument>
				<argument>
					<name>NewIPv6DNSServer2</name>
					<direction>out</direction>
					<relatedStateVariable>IPv6DNSServer2</relatedStateVariable>
				</argument>
				<argument>
					<name>NewValidLifetime</name>
					<direction>out</direction>
					<relatedStateVariable>ValidLifetime2</relatedStateVariable>
				</argument>
			</argumentList>
		</action>
	</actionList>
	<serviceStateTable>
		<stateVariable sendEvents="no">
			<name>ConnectionType</name>
			<dataType>string</dataType>
			<defaultValue>Unconfigured</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="yes">
			<name>PossibleConnectionTypes</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>Unconfigured</allowedValue>
				<allowedValue>IP_Routed</allowedValue>
				<allowedValue>IP_Bridged</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="yes">
			<name>ConnectionStatus</name>
			<dataType>string</dataType>
			<defaultValue>Unconfigured</defaultValue>
			<allowedValueList>
				<allowedValue>Unconfigured</allowedValue>
				<allowedValue>Connecting</allowedValue>
				<allowedValue>Authenticating</allowedValue>
				<allowedValue>Connected</allowedValue>
				<allowedValue>PendingDisconnect</allowedValue>
				<allowedValue>Disconnecting</allowedValue>
				<allowedValue>Disconnected</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>Uptime</name>
			<dataType>ui4</dataType>
			<defaultValue>0</defaultValue>
			<allowedValueRange>
				<minimum>0</minimum>
				<maximum>4294967295</maximum>
				<step>1</step>
			</allowedValueRange>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>RSIPAvailable</name>
			<dataType>boolean</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>NATEnabled</name>
			<dataType>boolean</dataType>
			<defaultValue>1</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>LastConnectionError</name>
			<dataType>string</dataType>
			<defaultValue>ERROR_NONE</defaultValue>
			<allowedValueList>
				<allowedValue>ERROR_NONE</allowedValue>
				<allowedValue>ERROR_ISP_TIME_OUT</allowedValue>
				<allowedValue>ERROR_COMMAND_ABORTED</allowedValue>
				<allowedValue>ERROR_NOT_ENABLED_FOR_INTERNET</allowedValue>
				<allowedValue>ERROR_BAD_PHONE_NUMBER</allowedValue>
				<allowedValue>ERROR_USER_DISCONNECT</allowedValue>
				<allowedValue>ERROR_ISP_DISCONNECT</allowedValue>
				<allowedValue>ERROR_IDLE_DISCONNECT</allowedValue>
				<allowedValue>ERROR_FORCED_DISCONNECT</allowedValue>
				<allowedValue>ERROR_SERVER_OUT_OF_RESOURCES</allowedValue>
				<allowedValue>ERROR_RESTRICTED_LOGON_HOURS</allowedValue>
				<allowedValue>ERROR_ACCOUNT_DISABLED</allowedValue>
				<allowedValue>ERROR_ACCOUNT_EXPIRED</allowedValue>
				<allowedValue>ERROR_PASSWORD_EXPIRED</allowedValue>
				<allowedValue>ERROR_AUTHENTICATION_FAILURE</allowedValue>
				<allowedValue>ERROR_NO_DIALTONE</allowedValue>
				<allowedValue>ERROR_NO_CARRIER</allowedValue>
				<allowedValue>ERROR_NO_ANSWER</allowedValue>
				<allowedValue>ERROR_LINE_BUSY</allowedValue>
				<allowedValue>ERROR_UNSUPPORTED_BITSPERSECOND</allowedValue>
				<allowedValue>ERROR_TOO_MANY_LINE_ERRORS</allowedValue>
				<allowedValue>ERROR_IP_CONFIGURATION</allowedValue>
				<allowedValue>ERROR_UNKNOWN</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>AutoDisconnectTime</name>
			<dataType>ui4</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>IdleDisconnectTime</name>
			<dataType>ui4</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="yes">
			<name>ExternalIPAddress</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="yes">
			<name>ExternalIPv6Address</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>ValidLifetime</name>
			<dataType>ui4</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>PreferedLifetime</name>
			<dataType>ui4</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>IPv6Prefix</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>PrefixLength</name>
			<dataType>ui1</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>IPv4DNSServer1</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>IPv4DNSServer2</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>IPv6DNSServer1</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>IPv6DNSServer2</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>ValidLifetime1</name>
			<dataType>ui4</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>ValidLifetime2</name>
			<dataType>ui4</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>RemoteHost</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>ExternalPort</name>
			<dataType>ui2</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>InternalPort</name>
			<dataType>ui2</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>PortMappingProtocol</name>
			<dataType>string</dataType>
			<allowedValueList>
				<allowedValue>TCP</allowedValue>
				<allowedValue>UDP</allowedValue>
			</allowedValueList>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>InternalClient</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>PortMappingDescription</name>
			<dataType>string</dataType>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>PortMappingEnabled</name>
			<dataType>boolean</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="no">
			<name>PortMappingLeaseDuration</name>
			<dataType>ui4</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
		<stateVariable sendEvents="yes">
			<name>PortMappingNumberOfEntries</name>
			<dataType>ui2</dataType>
			<defaultValue>0</defaultValue>
		</stateVariable>
	</serviceStateTable>
</scpd>

In the output above we can see GetExternalIPAddress as well as new methods to retrieve X_AVM_DE_GetExternalIPv6Address and X_AVM_DE_GetIPv6Prefix.

  1. Making requests using new actions:
    Using X_AVM_DE_GetExternalIPv6Address*
curl -s -H 'Content-Type: text/xml; charset="utf-8"' \
  -H 'SOAPAction: urn:schemas-upnp-org:service:WANIPConnection:1#X_AVM_DE_GetExternalIPv6Address' \
  --data-binary '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:X_AVM_DE_GetExternalIPv6Address xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" /></s:Body></s:Envelope>' \
  http://fritz.box:49000/igdupnp/control/WANIPConn1

Response (ipv6-address redacted)

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:X_AVM_DE_GetExternalIPv6AddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewExternalIPv6Address>2a00:X:X:X::1</NewExternalIPv6Address>
<NewPrefixLength>64</NewPrefixLength>
<NewValidLifetime>6015</NewValidLifetime>
<NewPreferedLifetime>2415</NewPreferedLifetime>
</u:X_AVM_DE_GetExternalIPv6AddressResponse>
</s:Body>
</s:Envelope>

Using X_AVM_DE_GetIPv6Prefix*

curl -s -H 'Content-Type: text/xml; charset="utf-8"' \
  -H 'SOAPAction: urn:schemas-upnp-org:service:WANIPConnection:1#X_AVM_DE_GetIPv6Prefix' \
  --data-binary '<?xml version="1.0" encoding="utf-8"?><s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><s:Body><u:X_AVM_DE_GetIPv6Prefix xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1" /></s:Body></s:Envelope>' \
  http://fritz.box:49000/igdupnp/control/WANIPConn1

Response (ipv6-address redacted)

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Body>
<u:X_AVM_DE_GetIPv6PrefixResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1">
<NewIPv6Prefix>2a00:X:X:X::</NewIPv6Prefix>
<NewPrefixLength>56</NewPrefixLength>
<NewValidLifetime>5989</NewValidLifetime>
<NewPreferedLifetime>2389</NewPreferedLifetime>
</u:X_AVM_DE_GetIPv6PrefixResponse>
</s:Body>
</s:Envelope>
Screenshot from FritzBox with my IPs (used to verify, also evidence that there is no IPv4)

image

@astappiev
Copy link
Contributor Author
astappiev commented Feb 16, 2025

Final test using docker container build from sources:

  - FritzBox:
      icon: sh-fritz.webp
      description: Internet Router
      widget:
        type: fritzbox
        url: http://fritz.box
        fields: ["connectionStatus", "externalIPv6Prefix", "externalIPv6Address"]
image

@shamoon shamoon enabled auto-merge (squash) February 17, 2025 01:08
Copy link
Collaborator
@shamoon shamoon left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for the flexibility and the detailed explanation. I added back the English translation file (thats the only one you need to push) and corrected lint.

@shamoon shamoon merged commit cf90312 into gethomepage:dev Feb 17, 2025
4 checks passed
8000
calvinbui added a commit to calvinbui/ansible-monorepo that referenced this pull request Mar 16, 2025
This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [ghcr.io/gethomepage/homepage](https://github.com/gethomepage/homepage) | major | `v0.10.9` -> `v1.0.3` |

---

### Release Notes

<details>
<summary>gethomepage/homepage (ghcr.io/gethomepage/homepage)</summary>

### [`v1.0.3`](https://github.com/gethomepage/homepage/releases/tag/v1.0.3)

[Compare Source](gethomepage/homepage@v1.0.2...v1.0.3)

#### What's Changed

-   Fix: wrapping in bookmarks by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4945
-   Fix: fix kavita API body with key by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4948
-   Fix: correct units for speedtest tracker API v2 by [@&#8203;brikim](https://github.com/brikim) in gethomepage/homepage#4950
-   Change: prefer IPv4 in docker image by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4954
-   Enhancement: allow disabling host checking by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4967
-   Fix: jellyfin handle empty episode numbers by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4970
-   Documentation: add HOMEPAGE_ALLOWED_HOSTS to k8s docs by [@&#8203;xalxnder](https://github.com/xalxnder) in gethomepage/homepage#4969

#### New Contributors

-   [@&#8203;xalxnder](https://github.com/xalxnder) made their first contribution in gethomepage/homepage#4969

**Full Changelog**: gethomepage/homepage@v1.0.2...v1.0.3

### [`v1.0.2`](https://github.com/gethomepage/homepage/releases/tag/v1.0.2)

[Compare Source](gethomepage/homepage@v1.0.0...v1.0.2)

This small bug fix fixes a couple of layout issues in v1.0.0 and reverts a change to networking that was in v1.0.1

Please also check out the [v1.0 release notes](https://github.com/gethomepage/homepage/releases/tag/v1.0.0)

-   Fix: fix plex total size with larger libraries by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4933
-   Fix: fix larger breakpoint by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4935

**Full Changelog**: gethomepage/homepage@v1.0.0...v1.0.2

### [`v1.0.0`](https://github.com/gethomepage/homepage/releases/tag/v1.0.0)

[Compare Source](gethomepage/homepage@v0.10.9...v1.0.0)

#### Homepage v1.0! 🎉

We're excited to announce the release of homepage v1.0! This release contains a bunch of new widgets, fixes and other improvements, but if you're curious why the major version bump, it's [because](https://semver.org) of the **breaking changes** included:

-   \[BREAKING] Enhancement: require host validation by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4744
    -   This change is for security reasons and the update is simple: users will need to set the `HOMEPAGE_ALLOWED_HOSTS` environment variable (how to do that varies by install type, see [the docs](https://gethomepage.dev/installation/))
-   \[BREAKING] Chore: update to next v15 by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4661
    -   homepage no longer runs on armv7 (RIP ✌️)
-   \[BREAKING] Chore: upgrade to tailwind v4 by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4863
    -   some users may need to update their custom css
-   \[BREAKING] Enhancement: support for Kubernetes gateway API by [@&#8203;djeinstine](https://github.com/djeinstine) in gethomepage/homepage#4643
    -   k8s users may need to update their configuration, see https://gethomepage.dev/configs/kubernetes/

Thank you to our community of contributors, discord chat helpers and **our users**! We are so proud of the collaboration that goes into keeping this project delightful.

#### What's Changed

-   Documentation: add note about clearing UniFi cache non-docker by [@&#8203;GTez](https://github.com/GTez) in gethomepage/homepage#4585
-   Enhancement: handle evcc breaking change by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4630
-   Development: pnpm lint on ci by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4646
-   Fix: fix overlap with glances charts in multi-widgets by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4653
-   \[BREAKING] Chore: update to next v15 by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4661
-   Feature: Firefly widget by [@&#8203;Amjad50](https://github.com/Amjad50) in gethomepage/homepage#4683
-   Fix: correct package version number by [@&#8203;Maarc](https://github.com/Maarc) in gethomepage/homepage#4691
-   Enhancement: support speedtest v1.2 API by [@&#8203;shamoon](https:
6DAF
//github.com/shamoon) in gethomepage/homepage#4695
-   Enhancement: filter prometheus API endpoint for active only by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4701
-   Fix: fix nesting with unsorted groups by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4711
-   Enhancement: use datasets for truenas pools by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4716
-   Chore: upgrade kubernetes/client-node by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4715
-   Fix: Timezone-aware Date comparison for Calendar integration by [@&#8203;Yeraze](https://github.com/Yeraze) in gethomepage/homepage#4742
-   \[BREAKING] Enhancement: support for Kubernetes gateway API by [@&#8203;djeinstine](https://github.com/djeinstine) in gethomepage/homepage#4643
-   \[BREAKING] Enhancement: require host validation by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4744
-   Enhancement: better tz parsing of ical recurring events by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4749
-   Fix: handle possible null reference in k8s gateway api by [@&#8203;dudo](https://github.com/dudo) in gethomepage/homepage#4752
-   Fixhancement: add an option to fritzbox widget to display IPv6 by [@&#8203;astappiev](https://github.com/astappiev) in gethomepage/homepage#4778
-   Enhancement: improve try to prune trailing slashes by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4783
-   Enhancement: support API key for Kavita by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4784
-   Chore(deps): Bump jsonpath-plus from 10.2.0 to 10.3.0 by [@&#8203;dependabot](https://github.com/dependabot) in gethomepage/homepage#4794
-   Chore: another big deps update by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4795
-   Documentation: add auth documentation to PeaNUT by [@&#8203;Brandawg93](https://github.com/Brandawg93) in gethomepage/homepage#4803
-   Enhancement: better handle recurring events poorly handled by ical library by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4807
-   Chore(deps): Bump docker/setup-qemu-action from 3.4.0 to 3.5.0 by [@&#8203;dependabot](https://github.com/dependabot) in gethomepage/homepage#4836
-   Fix: subtract inactive_file from glances container memory usage by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4844
-   Documentation: remove auth info from romm widget by [@&#8203;gantoine](https://github.com/gantoine) in gethomepage/homepage#4846
-   Chore(deps): Bump docker/setup-qemu-action from 3.5.0 to 3.6.0 by [@&#8203;dependabot](https://github.com/dependabot) in gethomepage/homepage#4848
-   Chore(deps-dev): Bump eslint-config-prettier from 9.1.0 to 10.0.2 by [@&#8203;dependabot](https://github.com/dependabot) in gethomepage/homepage#4856
-   Chore(deps-dev): Bump prettier from 3.5.1 to 3.5.2 by [@&#8203;dependabot](https://github.com/dependabot) in gethomepage/homepage#4859
-   Enhancement: support new unifi network api and api key by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4860
-   Chore(deps-dev): Bump eslint from 9.20.1 to 9.21.0 by [@&#8203;dependabot](https://github.com/dependabot) in gethomepage/homepage#4858
-   Chore(deps): Bump tough-cookie from 4.1.4 to 5.1.2 by [@&#8203;dependabot](https://github.com/dependabot) in gethomepage/homepage#4857
-   Feature: Add APC UPS widget by [@&#8203;nicupavel](https://github.com/nicupavel) in gethomepage/homepage#4840
-   \[BREAKING] Chore: upgrade to tailwind v4 by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4863
-   Fix: return all http routes of a namespace (k8s) by [@&#8203;arthur-leclerc](https://github.com/arthur-leclerc) in gethomepage/homepage#4865
-   Fix: correct omada widget connectedGateways by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4872
-   Enhancement: support komga API keys, breaking API changes by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4874
-   Fix: use 'real_usage' for synology diskstation memory stats by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4880
-   Fix: fix k8s get nodes error log by [@&#8203;jnodorp](https://github.com/jnodorp) in gethomepage/homepage#4887
-   Enhancement: support automatic service discovery services with layout-only nesting by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4900
-   Chore: add plex container size to requests by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4903
-   Chore: migrate to pnpm only by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4907
-   Feature: Hoarder service widget by [@&#8203;vhsdream](https://github.com/vhsdream) in gethomepage/homepage#4913
-   Enhancement: cache release data, allow disable release checking by [@&#8203;shamoon](https://github.com/shamoon) in gethomepage/homepage#4917
-   New Crowdin translations by GitHub Action by [@&#8203;github-actions](https://github.com/github-actions) in gethomepage/homepage#4599

#### New Contributors

-   [@&#8203;GTez](https://github.com/GTez) made their first contribution in gethomepage/homepage#4585
-   [@&#8203;Amjad50](https://github.com/Amjad50) made their first contribution in gethomepage/homepage#4683
-   [@&#8203;Maarc](https://github.com/Maarc) made their first contribution in gethomepage/homepage#4691
-   [@&#8203;Yeraze](https://github.com/Yeraze) made their first contribution in gethomepage/homepage#4742
-   [@&#8203;djeinstine](https://github.com/djeinstine) made their first contribution in gethomepage/homepage#4643
-   [@&#8203;dudo](https://github.com/dudo) made their first contribution in gethomepage/homepage#4752
-   [@&#8203;astappiev](https://github.com/astappiev) made their first contribution in gethomepage/homepage#4778
-   [@&#8203;nicupavel](https://github.com/nicupavel) made their first contribution in gethomepage/homepage#4840
-   [@&#8203;arthur-leclerc](https://github.com/arthur-leclerc) made their first contribution in gethomepage/homepage#4865
-   [@&#8203;jnodorp](https://github.com/jnodorp) made their first contribution in gethomepage/homepage#4887

**Full Changelog**: gethomepage/homepage@v0.10.9...v1.0.0

</details>

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzOS4yMDEuMCIsInVwZGF0ZWRJblZlciI6IjM5LjIwMi4wIiwidGFyZ2V0QnJhbmNoIjoibWFzdGVyIiwibGFiZWxzIjpbXX0=-->

Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: Calvin Bui <3604363+calvinbui@users.noreply.github.com>
Reviewed-on: https://gitea.bui.ng/calvinbui/ansible-monorepo/pulls/3525
Co-authored-by: renovate <renovate@noreply.gitea>
Co-committed-by: renovate <renovate@noreply.gitea>
Copy link
Contributor

This pull request has been automatically locked since there has not been any recent activity after it was closed. Please open a new discussion for related concerns. See our contributing guidelines for more details.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Mar 19, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants
0