218 lines
4.8 KiB
Markdown
218 lines
4.8 KiB
Markdown
# luxtools-client
|
||
|
||
Small local HTTP helper that lets the Dokuwiki plugin `luxtools` open folders on the same machine.
|
||
|
||
This program runs on the user’s machine and listens on a loopback address only (defaults to `127.0.0.1:8765`). The plugin calls it to open a folder in the OS file manager.
|
||
|
||
## What it does
|
||
|
||
- Exposes `GET /health` for a simple health check.
|
||
- Exposes `GET /open?path=...` and `POST /open` to open a folder.
|
||
- Exposes `GET /control` (HTML) and `GET /logs` (text) to view recent logs.
|
||
- Normalizes and validates the requested path:
|
||
- Accepts absolute paths only.
|
||
- If a file path is provided, it opens the containing directory.
|
||
- Accepts `file://...` URLs (handy when the caller passes a file URL).
|
||
- Optionally restricts which folders can be opened via `-allow` prefixes.
|
||
|
||
## Build
|
||
|
||
Requires Go 1.22+.
|
||
|
||
```bash
|
||
make build
|
||
```
|
||
|
||
Output:
|
||
|
||
- `dist/luxtools-client` (or `dist/luxtools-client.exe` on Windows)
|
||
|
||
### Cross-compile
|
||
|
||
```bash
|
||
# Linux (amd64)
|
||
make build-linux
|
||
|
||
# Windows (amd64)
|
||
make build-windows
|
||
|
||
# Both
|
||
make build-all
|
||
```
|
||
|
||
## Run
|
||
|
||
```bash
|
||
./luxtools-client
|
||
```
|
||
|
||
### Flags
|
||
|
||
- `-listen` (default `127.0.0.1:8765`): listen address (`host:port`). Must be loopback.
|
||
- `-allow` (repeatable): allowed path prefix. If you specify one or more, the requested path must start with one of them.
|
||
|
||
Examples:
|
||
|
||
```bash
|
||
# Listen on a different local port
|
||
./luxtools-client -listen 127.0.0.1:9000
|
||
|
||
# Restrict opens to your home directory (repeat -allow as needed)
|
||
./luxtools-client -allow "$HOME"
|
||
```
|
||
|
||
## Install as a service
|
||
|
||
Use the built-in `install` / `uninstall` commands to install (or update) the client as a per-user service that starts automatically.
|
||
The `install` command copies the currently-running binary into the appropriate per-user install location.
|
||
|
||
### Linux (systemd)
|
||
|
||
Install / update:
|
||
|
||
```bash
|
||
./luxtools-client install
|
||
```
|
||
|
||
Optional flags:
|
||
|
||
```bash
|
||
# Change listen address (still must be loopback)
|
||
./luxtools-client install -listen 127.0.0.1:9000
|
||
|
||
# Restrict allowed folders (repeatable)
|
||
./luxtools-client install -allow "$HOME" -allow "/mnt/data"
|
||
|
||
# Validate only (no files written, no service changes)
|
||
./luxtools-client install -dry-run
|
||
```
|
||
|
||
Uninstall:
|
||
|
||
```bash
|
||
./luxtools-client uninstall
|
||
```
|
||
|
||
Keep config on uninstall:
|
||
|
||
```bash
|
||
./luxtools-client uninstall -keep-config
|
||
|
||
# Validate only (no files removed, no service changes)
|
||
./luxtools-client uninstall -dry-run
|
||
```
|
||
|
||
Notes:
|
||
|
||
- Installs to `~/.local/share/luxtools-client/luxtools-client`
|
||
- Creates a systemd *user* unit at `~/.config/systemd/user/luxtools-client.service`
|
||
- Enables the unit under `graphical-session.target` (so it starts with the GUI session)
|
||
- Stores config in `~/.config/luxtools-client/luxtools-client.env`
|
||
|
||
### Windows (Scheduled Task at logon)
|
||
|
||
Because this tool needs to open File Explorer (a GUI app) in the *current user session*, it should run as a per-user Scheduled Task triggered “At log on” (similar to a systemd *user* service).
|
||
|
||
Install / update:
|
||
|
||
```bat
|
||
luxtools-client.exe install
|
||
```
|
||
|
||
Optional flags:
|
||
|
||
```bat
|
||
luxtools-client.exe install -listen 127.0.0.1:9000
|
||
|
||
REM Restrict allowed folders (repeatable)
|
||
luxtools-client.exe install -allow "%USERPROFILE%" -allow "D:\Data"
|
||
|
||
REM Validate only (no files written, no task changes)
|
||
luxtools-client.exe install -dry-run
|
||
```
|
||
|
||
Uninstall:
|
||
|
||
```bat
|
||
luxtools-client.exe uninstall
|
||
```
|
||
|
||
Keep config on uninstall:
|
||
|
||
```bat
|
||
luxtools-client.exe uninstall -keep-config
|
||
|
||
REM Validate only (no files removed, no task changes)
|
||
luxtools-client.exe uninstall -dry-run
|
||
```
|
||
|
||
Notes:
|
||
|
||
- Installs to `%LOCALAPPDATA%\luxtools-client\luxtools-client.exe`
|
||
- Stores config in `%LOCALAPPDATA%\luxtools-client\config.json`
|
||
- Re-running `install` updates the EXE in place and refreshes the task.
|
||
- Windows builds use the GUI subsystem, so the app starts without a console window.
|
||
- Logs are written next to `config.json` and can be viewed at `http://127.0.0.1:8765/control` or `http://127.0.0.1:8765/logs`.
|
||
|
||
## API
|
||
|
||
### `GET /health`
|
||
|
||
Returns JSON:
|
||
|
||
```json
|
||
{"ok": true, "time": "2026-01-05T12:34:56Z"}
|
||
```
|
||
|
||
### `POST /open`
|
||
|
||
Request body:
|
||
|
||
```json
|
||
{"path": "/absolute/path"}
|
||
```
|
||
|
||
Response:
|
||
|
||
```json
|
||
{"ok": true, "message": "opened"}
|
||
```
|
||
|
||
Example:
|
||
|
||
```bash
|
||
curl -sS -X POST \
|
||
-H 'Content-Type: application/json' \
|
||
--data '{"path":"/tmp"}' \
|
||
http://127.0.0.1:8765/open
|
||
```
|
||
|
||
### `GET /open?path=...`
|
||
|
||
For GET callers, success returns `204 No Content` (to reduce console noise in certain callers).
|
||
|
||
Example:
|
||
|
||
```bash
|
||
curl -i \
|
||
'http://127.0.0.1:8765/open?path=/tmp'
|
||
```
|
||
|
||
### `GET /logs`
|
||
|
||
Returns recent log output as plain text.
|
||
|
||
### `GET /control`
|
||
|
||
Shows a simple HTML page with recent log output.
|
||
|
||
## OS support
|
||
|
||
- Linux: uses `xdg-open`.
|
||
- Windows: uses `explorer.exe`.
|
||
|
||
## Notes / security
|
||
|
||
- The server refuses to bind to non-loopback addresses.
|
||
- Use `-allow` to prevent opening arbitrary folders if other local processes can reach the port.
|