mirror of
https://github.com/outbackdingo/firezone.git
synced 2026-01-27 10:18:54 +00:00
6
.github/pre-commit-config.yaml
vendored
6
.github/pre-commit-config.yaml
vendored
@@ -7,9 +7,9 @@ repos:
|
||||
entry: codespell
|
||||
language: system
|
||||
pass_filenames: false
|
||||
- id: prettier-git-files
|
||||
name: Prettier (only git-tracked files)
|
||||
entry: bash -c 'git grep --cached -z -l '' | xargs -0 prettier --check --ignore-unknown'
|
||||
- id: prettier
|
||||
name: Prettier
|
||||
entry: prettier --check --ignore-unknown .
|
||||
language: system
|
||||
pass_filenames: false
|
||||
|
||||
|
||||
@@ -2,8 +2,9 @@ elixir/_build
|
||||
elixir/deps
|
||||
elixir/apps/web/assets
|
||||
rust/target
|
||||
kotlin/android/build
|
||||
kotlin/android/app/build
|
||||
website/node_modules
|
||||
website/.next
|
||||
**/*.sh
|
||||
**/*.ex
|
||||
**/*.rs
|
||||
|
||||
@@ -94,7 +94,11 @@ export default function App() {
|
||||
</NavLink>
|
||||
<NavLink to="/diagnostics">
|
||||
{({ isActive }) => (
|
||||
<SidebarItem active={isActive} icon={DocumentMagnifyingGlassIcon} as="div">
|
||||
<SidebarItem
|
||||
active={isActive}
|
||||
icon={DocumentMagnifyingGlassIcon}
|
||||
as="div"
|
||||
>
|
||||
Diagnostics
|
||||
</SidebarItem>
|
||||
)}
|
||||
|
||||
@@ -32,18 +32,12 @@ export default function Diagnostics({
|
||||
</div>
|
||||
|
||||
<div className="mt-8 flex justify-center gap-4">
|
||||
<Button
|
||||
onClick={exportLogs}
|
||||
color="alternative"
|
||||
>
|
||||
<Button onClick={exportLogs} color="alternative">
|
||||
<ShareIcon className="mr-2 h-5 w-5" />
|
||||
Export Logs
|
||||
</Button>
|
||||
|
||||
<Button
|
||||
onClick={clearLogs}
|
||||
color="alternative"
|
||||
>
|
||||
<Button onClick={clearLogs} color="alternative">
|
||||
<TrashIcon className="mr-2 h-5 w-5" />
|
||||
Clear Logs
|
||||
</Button>
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
import React, { useEffect, useState } from "react";
|
||||
import { Button, TextInput, Label, TextInputProps, Tooltip } from "flowbite-react";
|
||||
import {
|
||||
Button,
|
||||
TextInput,
|
||||
Label,
|
||||
TextInputProps,
|
||||
Tooltip,
|
||||
} from "flowbite-react";
|
||||
import { AdvancedSettingsViewModel as Settings } from "../generated/AdvancedSettingsViewModel";
|
||||
|
||||
interface SettingsPageProps {
|
||||
@@ -45,9 +51,9 @@ export default function SettingsPage({
|
||||
</div>
|
||||
|
||||
<p className="text-neutral-900 mb-6">
|
||||
<strong>WARNING</strong>: These settings are intended for internal
|
||||
debug purposes <strong>only</strong>. Changing these is not supported
|
||||
and will disrupt access to your resources.
|
||||
<strong>WARNING</strong>: These settings are intended for internal debug
|
||||
purposes <strong>only</strong>. Changing these is not supported and will
|
||||
disrupt access to your resources.
|
||||
</p>
|
||||
|
||||
<form
|
||||
@@ -58,7 +64,9 @@ export default function SettingsPage({
|
||||
className="max-w mx-auto flex flex-col gap-2"
|
||||
>
|
||||
<div>
|
||||
<Label className="text-neutral-600" htmlFor="auth-base-url-input">Auth Base URL</Label>
|
||||
<Label className="text-neutral-600" htmlFor="auth-base-url-input">
|
||||
Auth Base URL
|
||||
</Label>
|
||||
<ManagedTextInput
|
||||
name="auth_base_url"
|
||||
id="auth-base-url-input"
|
||||
@@ -75,7 +83,9 @@ export default function SettingsPage({
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Label className="text-neutral-600" htmlFor="api-url-input">API URL</Label>
|
||||
<Label className="text-neutral-600" htmlFor="api-url-input">
|
||||
API URL
|
||||
</Label>
|
||||
<ManagedTextInput
|
||||
name="api_url"
|
||||
id="api-url-input"
|
||||
@@ -92,7 +102,9 @@ export default function SettingsPage({
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<Label className="text-neutral-600" htmlFor="log-filter-input">Log Filter</Label>
|
||||
<Label className="text-neutral-600" htmlFor="log-filter-input">
|
||||
Log Filter
|
||||
</Label>
|
||||
<ManagedTextInput
|
||||
name="log_filter"
|
||||
id="log-filter-input"
|
||||
@@ -109,11 +121,7 @@ export default function SettingsPage({
|
||||
</div>
|
||||
|
||||
<div className="flex justify-end gap-4 mt-4">
|
||||
<Button
|
||||
type="reset"
|
||||
onClick={resetSettings}
|
||||
color="alternative"
|
||||
>
|
||||
<Button type="reset" onClick={resetSettings} color="alternative">
|
||||
Reset to Defaults
|
||||
</Button>
|
||||
<Button type="submit">Apply</Button>
|
||||
@@ -127,10 +135,15 @@ function ManagedTextInput(props: TextInputProps & { managed: boolean }) {
|
||||
let { managed, ...inputProps } = props;
|
||||
|
||||
if (managed) {
|
||||
return <Tooltip content="This setting is managed by your organisation." clearTheme={{target: true}}>
|
||||
<TextInput {...inputProps} disabled={true} />
|
||||
</Tooltip>
|
||||
return (
|
||||
<Tooltip
|
||||
content="This setting is managed by your organisation."
|
||||
clearTheme={{ target: true }}
|
||||
>
|
||||
<TextInput {...inputProps} disabled={true} />
|
||||
</Tooltip>
|
||||
);
|
||||
} else {
|
||||
return <TextInput {...inputProps} />
|
||||
return <TextInput {...inputProps} />;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
export interface AdvancedSettingsViewModel {
|
||||
auth_url: string;
|
||||
auth_url_is_managed: boolean;
|
||||
api_url: string;
|
||||
api_url_is_managed: boolean;
|
||||
log_filter: string;
|
||||
log_filter_is_managed: boolean;
|
||||
auth_url: string;
|
||||
auth_url_is_managed: boolean;
|
||||
api_url: string;
|
||||
api_url_is_managed: boolean;
|
||||
log_filter: string;
|
||||
log_filter_is_managed: boolean;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export interface FileCount {
|
||||
bytes: number;
|
||||
files: number;
|
||||
bytes: number;
|
||||
files: number;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
export interface Session {
|
||||
account_slug: string;
|
||||
actor_name: string;
|
||||
account_slug: string;
|
||||
actor_name: string;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import * as Sentry from "@sentry/react";
|
||||
import type { Client } from '@sentry/core';
|
||||
import type { Client } from "@sentry/core";
|
||||
|
||||
type Environment = "production" | "staging" | "on-prem" | "unknown";
|
||||
|
||||
@@ -22,14 +22,14 @@ export default function initSentry(apiUrl: string) {
|
||||
release: `gui-client@${__APP_VERSION__}`,
|
||||
};
|
||||
|
||||
console.log("Initialising Sentry", { options })
|
||||
console.log("Initialising Sentry", { options });
|
||||
|
||||
client = Sentry.init(options);
|
||||
}
|
||||
|
||||
function environment(url: URL | null): Environment {
|
||||
if (!url) {
|
||||
return "unknown"
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
switch (url.host) {
|
||||
|
||||
@@ -7,23 +7,24 @@ import * as Sentry from "@sentry/react";
|
||||
|
||||
const customTheme = createTheme({
|
||||
sidebar: {
|
||||
root: { inner: "rounded-none bg-white" }
|
||||
root: { inner: "rounded-none bg-white" },
|
||||
},
|
||||
button: {
|
||||
color: {
|
||||
default: "bg-accent-450 hover:bg-accent-700 text-white",
|
||||
alternative: "text-neutral-900 border border-neutral-200 hover:bg-neutral-300 hover:text-neutral-900",
|
||||
alternative:
|
||||
"text-neutral-900 border border-neutral-200 hover:bg-neutral-300 hover:text-neutral-900",
|
||||
},
|
||||
},
|
||||
textInput: {
|
||||
field: {
|
||||
input: {
|
||||
colors: {
|
||||
gray: "focus:ring-accent-500 focus:border-accent-500"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
gray: "focus:ring-accent-500 focus:border-accent-500",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
ReactDOM.createRoot(document.getElementById("root") as HTMLElement, {
|
||||
|
||||
@@ -2,12 +2,12 @@ import tailwindcss from "@tailwindcss/vite";
|
||||
import react from "@vitejs/plugin-react";
|
||||
import { defineConfig } from "vite";
|
||||
import flowbiteReact from "flowbite-react/plugin/vite";
|
||||
import typescript from 'vite-plugin-typescript';
|
||||
import typescript from "vite-plugin-typescript";
|
||||
import { execSync } from "child_process";
|
||||
|
||||
const host = process.env.TAURI_DEV_HOST;
|
||||
const gitVersion = process.env.GITHUB_SHA ?? execSync('git rev-parse --short HEAD')
|
||||
.toString();
|
||||
const gitVersion =
|
||||
process.env.GITHUB_SHA ?? execSync("git rev-parse --short HEAD").toString();
|
||||
|
||||
// https://vite.dev/config/
|
||||
export default defineConfig({
|
||||
@@ -15,8 +15,8 @@ export default defineConfig({
|
||||
|
||||
define: {
|
||||
// mark:next-gui-version
|
||||
'__APP_VERSION__': JSON.stringify("1.5.0"),
|
||||
'__GIT_VERSION__': JSON.stringify(gitVersion),
|
||||
__APP_VERSION__: JSON.stringify("1.5.0"),
|
||||
__GIT_VERSION__: JSON.stringify(gitVersion),
|
||||
},
|
||||
|
||||
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
|
||||
|
||||
@@ -265,10 +265,10 @@ Application certificates are **precious** and we only have a limited number of
|
||||
them. They also cannot be revoked. So do not generate them. Instead, obtain it
|
||||
from 1Password.
|
||||
|
||||
Also, the signing certificate for the package installer artifact specifically needs
|
||||
to be a `Developer ID Installer` certificate, not a `Developer ID Application` or
|
||||
`Apple Distribution` certificate. This is needed to sign the PKG files we distribute
|
||||
that are consumed by MDMs.
|
||||
Also, the signing certificate for the package installer artifact specifically
|
||||
needs to be a `Developer ID Installer` certificate, not a
|
||||
`Developer ID Application` or `Apple Distribution` certificate. This is needed
|
||||
to sign the PKG files we distribute that are consumed by MDMs.
|
||||
|
||||
Once you've done that, you can create the provisioning profiles and update the
|
||||
GitHub secrets using the same steps as above, only using the following secrets
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
# Windows policy templates
|
||||
|
||||
These policy templates can be imported into Intune here: https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesWindowsMenu/~/configuration
|
||||
These policy templates can be imported into Intune here:
|
||||
https://intune.microsoft.com/#view/Microsoft_Intune_DeviceSettings/DevicesWindowsMenu/~/configuration
|
||||
|
||||
Intune only allows a single policy template per namespace to be active at any one time.
|
||||
Therefore, in order to upload (and test) a new template, you need to delete the previous one.
|
||||
The menu for deleting an uploaded ADMX file is hidden behind the three dots at the end of the row.
|
||||
Intune only allows a single policy template per namespace to be active at any
|
||||
one time. Therefore, in order to upload (and test) a new template, you need to
|
||||
delete the previous one. The menu for deleting an uploaded ADMX file is hidden
|
||||
behind the three dots at the end of the row.
|
||||
|
||||
@@ -15,7 +15,7 @@ by advanced users and admins.
|
||||
| Component | Log directory |
|
||||
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| macOS Client | `~/Library/Group Containers/47R2M6779T.dev.firezone.firezone/Library/Caches/logs` for the GUI process, and `/private/var/root/Library/Group Containers/47R2M6779T.dev.firezone.firezone/Library/Caches/logs` for the tunnel process |
|
||||
| Windows GUI Client | `%LOCALAPPDATA%\dev.firezone.client\data\logs` for the GUI process, and `%PROGRAMDATA%\dev.firezone.client\data\logs` for the Tunnel service |
|
||||
| Windows GUI Client | `%LOCALAPPDATA%\dev.firezone.client\data\logs` for the GUI process, and `%PROGRAMDATA%\dev.firezone.client\data\logs` for the Tunnel service |
|
||||
| Linux GUI Client | `$HOME/.cache/dev.firezone.client/data/logs/` for the GUI process, and `/var/log/dev.firezone.client/` for the tunnel process |
|
||||
| Android/ChromeOS Client | `/data/data/dev.firezone.android/caches/logs` |
|
||||
| iOS Client | N/A |
|
||||
|
||||
@@ -48,22 +48,23 @@ To auto-start the Client when you log in, run
|
||||
|
||||
### Step 1: Install repositories
|
||||
|
||||
These are required for both GNOME extensions and the WebKit and other dependencies
|
||||
of the Firezone Client.
|
||||
These are required for both GNOME extensions and the WebKit and other
|
||||
dependencies of the Firezone Client.
|
||||
|
||||
1. `sudo dnf config-manager --set-enabled crb`
|
||||
1. `sudo dnf install epel-release`
|
||||
|
||||
### Step 2: Install system tray
|
||||
|
||||
GNOME Shell in CentOS does not have a system tray by default. Use these
|
||||
steps to install it. For other desktops like xfce4 or KDE, the system tray may
|
||||
already work properly.
|
||||
GNOME Shell in CentOS does not have a system tray by default. Use these steps to
|
||||
install it. For other desktops like xfce4 or KDE, the system tray may already
|
||||
work properly.
|
||||
|
||||
1. `sudo dnf install gnome-shell-extension-appindicator`
|
||||
1. Log out and back in to restart GNOME
|
||||
1. `gnome-extensions enable appindicatorsupport@rgcjonas.gmail.com`
|
||||
1. Optionally: To manage GNOME extensions via a GUI, install `gnome-extensions-app`
|
||||
1. Optionally: To manage GNOME extensions via a GUI, install
|
||||
`gnome-extensions-app`
|
||||
|
||||
### Step 3: Install Firezone
|
||||
|
||||
@@ -155,9 +156,9 @@ To export or clear your logs:
|
||||
1. Click `Diagnostic Logs`.
|
||||
1. Click `Export Logs` or `Clear Log Directory`.
|
||||
|
||||
The Tunnel service (`firezone-client-tunnel.service`) also logs to stdout which is
|
||||
captured by systemd and sent to journald. To view the logs of the Tunnel service,
|
||||
use:
|
||||
The Tunnel service (`firezone-client-tunnel.service`) also logs to stdout which
|
||||
is captured by systemd and sent to journald. To view the logs of the Tunnel
|
||||
service, use:
|
||||
|
||||
```bash
|
||||
journalctl --pager-end --follow --unit firezone-client-tunnel.service
|
||||
|
||||
@@ -205,8 +205,9 @@ Get-DnsClientNrptRule | where Comment -eq firezone-fd0020211111 | foreach { Remo
|
||||
The Firezone Client is split into 2 main processes: A Tunnel service which runs
|
||||
the tunnel, and a GUI which allows the user to control Firezone.
|
||||
|
||||
- Tunnel service logs are stored at `%PROGRAMDATA%\dev.firezone.client\data\logs\`,
|
||||
where `%PROGRAMDATA%` is almost always `C:\ProgramData`
|
||||
- Tunnel service logs are stored at
|
||||
`%PROGRAMDATA%\dev.firezone.client\data\logs\`, where `%PROGRAMDATA%` is
|
||||
almost always `C:\ProgramData`
|
||||
- GUI logs are stored at `%LOCALAPPDATA%\dev.firezone.client\data\logs`, where
|
||||
`%LOCALAPPDATA%` is, e.g. `C:\Users\username\AppData\Local`
|
||||
|
||||
|
||||
@@ -136,6 +136,7 @@ to 10 MB. However, the actual size of the receive buffer is limited by the
|
||||
`net.core.rmem_max` kernel parameter. For the increased buffer size to take
|
||||
effect, you may need to increase the `net.core.rmem_max` parameter on the
|
||||
Gateway's host system.
|
||||
|
||||
## Deploy a single Gateway
|
||||
|
||||
Deploying a single Gateway can be accomplished in the admin portal.
|
||||
|
||||
@@ -208,8 +208,8 @@ export default function Gateway() {
|
||||
</Entry>
|
||||
<Entry version="1.1.4" date={new Date("2024-08-08")}>
|
||||
<li className="pl-2">
|
||||
Removes <code>FIREZONE_ENABLE_MASQUERADE</code> env variable. Masquerading is now
|
||||
always enabled unconditionally.
|
||||
Removes <code>FIREZONE_ENABLE_MASQUERADE</code> env variable.
|
||||
Masquerading is now always enabled unconditionally.
|
||||
</li>
|
||||
</Entry>
|
||||
<Entry version="1.1.3" date={new Date("2024-08-02")}>
|
||||
|
||||
@@ -10,11 +10,12 @@ export default function HubspotForm({
|
||||
formId: string;
|
||||
title?: string;
|
||||
}) {
|
||||
const { isScriptLoaded, isScriptError, scriptError, isFormCreated } = useHubspotForm({
|
||||
portalId: portalId,
|
||||
formId: formId,
|
||||
target: "#hubspot-form",
|
||||
});
|
||||
const { isScriptLoaded, isScriptError, scriptError, isFormCreated } =
|
||||
useHubspotForm({
|
||||
portalId: portalId,
|
||||
formId: formId,
|
||||
target: "#hubspot-form",
|
||||
});
|
||||
|
||||
return (
|
||||
<div className="bg-white shadow-md border border-neutral-200 rounded p-4">
|
||||
|
||||
Reference in New Issue
Block a user