Compare commits

...

6 Commits

Author SHA1 Message Date
shamoon
1a46baae69 Bump version to 1.3.2 2025-06-01 11:58:58 -07:00
shamoon
0fa3d7e57b Fix: fix gluetun port_forwarded detection (#5362) 2025-06-01 11:58:44 -07:00
shamoon
be7e1115cc Allow ci for all changes to allow requiring checks to pass 2025-06-01 10:33:22 -07:00
shamoon
dc0fede4d2 Bump version to 1.3.1
Some checks failed
Docker CI / Linting Checks (push) Has been cancelled
Docs / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Docs / Test Build (push) Has been cancelled
Docs / Build & Deploy (push) Has been cancelled
2025-06-01 09:48:02 -07:00
shamoon
7850fe4651 Fix: make gluetun port_forwarded opt-in (#5345) 2025-06-01 09:10:18 -07:00
shamoon
524cb7695c Enhancement: support breaking changes in wg-easy v15 (#5343)
Some checks failed
Docker CI / Linting Checks (push) Has been cancelled
Docker CI / Docker Build & Push (push) Has been cancelled
Crowdin Action / Crowdin Sync (push) Has been cancelled
2025-05-31 22:08:49 -07:00
10 changed files with 39 additions and 24 deletions

View File

@@ -9,14 +9,8 @@ on:
- feature/**
- dev
tags: [ 'v*.*.*' ]
paths-ignore:
- 'docs/**'
- 'mkdocs.yml'
pull_request:
branches: [ "dev" ]
paths-ignore:
- 'docs/**'
- 'mkdocs.yml'
merge_group:
env:

View File

@@ -4,13 +4,7 @@ on:
push:
tags: ["v*.*.*"]
branches: ["main"]
paths:
- "docs/**"
- "mkdocs.yml"
pull_request:
paths:
- "docs/**"
- "mkdocs.yml"
merge_group:
workflow_dispatch:
@@ -32,7 +26,7 @@ jobs:
uses: pre-commit/action@v3.0.1
test:
name: Test Build
name: Test Build Docs
if: github.repository == 'gethomepage/homepage' && github.event_name == 'pull_request'
runs-on: ubuntu-latest
needs:
@@ -54,7 +48,7 @@ jobs:
- name: Test Docs Build
run: MKINSIDERS=false mkdocs build
deploy:
name: Build & Deploy
name: Build & Deploy Docs
if: github.repository == 'gethomepage/homepage' && github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
needs:

View File

@@ -10,8 +10,9 @@ Learn more about [Gluetun](https://github.com/qdm12/gluetun).
Requires [HTTP control server options](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md) to be enabled. By default this runs on port `8000`.
Allowed fields: `["public_ip", "region", "country", "port_forwarded"]`.
Default fields: `["public_ip", "region", "country"]`.
To setup authentication, follow [the official Gluetun documentation](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication). Note that to use the api key method, you must add the route `GET /v1/publicip/ip` to the `routes` array in your Gluetun config.toml.
To setup authentication, follow [the official Gluetun documentation](https://github.com/qdm12/gluetun-wiki/blob/main/setup/advanced/control-server.md#authentication). Note that to use the api key method, you must add the route `GET /v1/publicip/ip` to the `routes` array in your Gluetun config.toml. Similarly, if you want to include the `port_forwarded` field, you must add the route `GET /v1/openvpn/portforwarded` to your Gluetun config.toml.
```yaml
widget:

View File

@@ -11,10 +11,17 @@ Note: by default `["connected", "enabled", "total"]` are displayed.
To detect if a device is connected the time since the last handshake is queried. `threshold` is the time to wait in minutes since the last handshake to consider a device connected. Default is 2 minutes.
| Wg-Easy API Version | Homepage Widget Version |
| ------------------- | ----------------------- |
| < v15 | 1 (default) |
| >= v15 | 2 |
```yaml
widget:
type: wgeasy
url: http://wg.easy.or.ip
version: 2 # optional, default is 1
username: yourwgusername # required for v15 and above
password: yourwgeasypassword
threshold: 2 # optional
```

View File

@@ -1,6 +1,6 @@
{
"name": "homepage",
"version": "1.3.0",
"version": "1.3.2",
"private": true,
"scripts": {
"preinstall": "npx only-allow pnpm",

View File

@@ -497,7 +497,9 @@ export function cleanServiceGroups(groups) {
if (snapshotHost) widget.snapshotHost = snapshotHost;
if (snapshotPath) widget.snapshotPath = snapshotPath;
}
if (["beszel", "glances", "immich", "komga", "mealie", "pfsense", "pihole", "speedtest"].includes(type)) {
if (
["beszel", "glances", "immich", "komga", "mealie", "pfsense", "pihole", "speedtest", "wgeasy"].includes(type)
) {
if (version) widget.version = parseInt(version, 10);
}
if (type === "glances") {

View File

@@ -101,7 +101,11 @@ export default async function credentialedProxyHandler(req, res, map) {
headers.Cookie = `authenticated=${widget.key}`;
}
} else if (widget.type === "wgeasy") {
headers.Authorization = widget.password;
if (widget.username && widget.password) {
headers.Authorization = `Basic ${Buffer.from(`${widget.username}:${widget.password}`).toString("base64")}`;
} else {
headers.Authorization = widget.password;
}
} else if (widget.type === "gitlab") {
headers["PRIVATE-TOKEN"] = widget.key;
} else if (widget.type === "speedtest") {

View File

@@ -6,14 +6,22 @@ import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { widget } = service;
const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip");
const { data: portForwardedData, error: portForwardedError } = useWidgetAPI(widget, "port_forwarded");
if (!widget.fields) {
widget.fields = ["public_ip", "region", "country"];
}
if (gluetunError || portForwardedError) {
const { data: gluetunData, error: gluetunError } = useWidgetAPI(widget, "ip");
const includePF = widget.fields.includes("port_forwarded");
const { data: portForwardedData, error: portForwardedError } = useWidgetAPI(
widget,
includePF ? "port_forwarded" : "",
);
if (gluetunError || (includePF && portForwardedError)) {
return <Container service={service} error={gluetunError || portForwardedError} />;
}
if (!gluetunData || !portForwardedData) {
if (!gluetunData || (includePF && !portForwardedData)) {
return (
<Container service={service}>
<Block label="gluetun.public_ip" />
@@ -29,7 +37,7 @@ export default function Component({ service }) {
<Block label="gluetun.public_ip" value={gluetunData.public_ip} />
<Block label="gluetun.region" value={gluetunData.region} />
<Block label="gluetun.country" value={gluetunData.country} />
<Block label="gluetun.port_forwarded" value={portForwardedData.port} />
<Block label="gluetun.port_forwarded" value={portForwardedData?.port} />
</Container>
);
}

View File

@@ -6,7 +6,9 @@ import useWidgetAPI from "utils/proxy/use-widget-api";
export default function Component({ service }) {
const { widget } = service;
const { data: infoData, error: infoError } = useWidgetAPI(widget, "client");
const endpoint = widget.version === 2 ? "clientv2" : "client";
const { data: infoData, error: infoError } = useWidgetAPI(widget, endpoint);
if (!widget.fields) {
widget.fields = ["connected", "enabled", "total"];

View File

@@ -8,6 +8,9 @@ const widget = {
client: {
endpoint: "wireguard/client",
},
clientv2: {
endpoint: "client",
},
},
};