diff --git a/.github/ISSUE_TEMPLATE/issue_form.yml b/.github/ISSUE_TEMPLATE/issue_form.yml
index ddef19e0..1967bf55 100644
--- a/.github/ISSUE_TEMPLATE/issue_form.yml
+++ b/.github/ISSUE_TEMPLATE/issue_form.yml
@@ -42,7 +42,7 @@ body:
required: true
- label: I am using an [external wireless adapter](https://docs.raspap.com/issues/#external-hardware).
required: true
- - label: I have generated a [RaspAP debug log](https://docs.raspap.com/ap-basics/#debug-log) and performed a [self-diagnosis](https://docs.raspap.com/ap-basics/#diagnosing-problems).
+ - label: I have generated a [RaspAP debug log](https://docs.raspap.com/troubleshooting/#debug-log) and performed a [self-diagnosis](https://docs.raspap.com/troubleshooting/#diagnosing-problems).
required: true
- type: dropdown
@@ -56,15 +56,15 @@ body:
- Raspberry Pi OS (64-bit) Lite Bullseye
- Raspberry Pi OS (32-bit) Lite Bullseye
- Armbian 23.05 (Suni)
- - Debian Bookworm
- - Ubuntu Server 23.04 (Lunar)
+ - Debian Bookworm
validations:
required: true
- type: dropdown
id: install
attributes:
- label: Quick install or Manual setup?
+ label: Installation method
options:
+ - Pre-built image
- Quick install
- Manual setup
validations:
@@ -99,8 +99,8 @@ body:
attributes:
label: RaspAP version
options:
- - 3.2.5 (Latest)
- - Other
+ - Latest
+ - Other (specify below)
validations:
required: true
- type: dropdown
@@ -113,7 +113,6 @@ body:
- Not sure
validations:
required: true
-
- type: input
id: contact
attributes:
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 4eac8c5c..95cacb8f 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -29,7 +29,23 @@ jobs:
cat > stage-raspap/package-raspap/00-run-chroot.sh <<-EOF
#!/bin/bash
apt-get update -y && apt-get install -y curl dhcpcd5 iptables procps
- curl -sL https://install.raspap.com | bash -s -- --yes --openvpn 1 --restapi 1 --adblock 1 --wireguard 1 --tcp-bbr 1
+ curl -sL https://install.raspap.com | bash -s -- --yes --openvpn 1 --restapi 1 --adblock 1 --wireguard 1 --tcp-bbr 1 --check 0
+
+ # Set Wi-Fi country to prevent RF kill
+ raspi-config nonint do_wifi_country "US"
+
+ # Fetch RaspAP version and set MOTD
+ RASPAP_VERSION=\$(curl -sL https://install.raspap.com | bash -s -- --version)
+ echo "\$RASPAP_VERSION" | tee /etc/motd
+ EOF
+ } &&
+ chmod +x stage-raspap/package-raspap/00-run-chroot.sh &&
+ {
+ cat > stage-raspap/prerun.sh <<-EOF
+ #!/bin/bash -e
+ if [ ! -d "\${ROOTFS_DIR}" ]; then
+ copy_previous
+ fi
EOF
} &&
chmod +x stage-raspap/package-raspap/00-run-chroot.sh &&
@@ -47,7 +63,7 @@ jobs:
id: build
uses: usimd/pi-gen-action@v1
with:
- image-name: "raspap-${{ github.ref_name }}-${{ matrix.arch }}"
+ image-name: "raspap-bookworm-${{ matrix.arch == '32-bit' && 'armhf' || 'arm64' }}-lite-${{ github.event.inputs.tag || github.ref_name }}"
enable-ssh: 1
stage-list: stage0 stage1 stage2 ./stage-raspap
verbose-output: true
@@ -57,8 +73,8 @@ jobs:
- name: Upload Artifact
uses: svenstaro/upload-release-action@v2
with:
- asset_name: raspap-image-${{ github.ref_name }}-${{ matrix.arch }}.zip
+ asset_name: "raspap-bookworm-${{ matrix.arch == '32-bit' && 'armhf' || 'arm64' }}-lite-${{ github.event.inputs.tag || github.ref_name }}.img.zip"
file: ${{ steps.build.outputs.image-path }}
repo_token: ${{ secrets.GITHUB_TOKEN }}
- tag: ${{ github.ref }}
+ tag: ${{ github.event.inputs.tag || github.ref }}
overwrite: true
diff --git a/.gitignore b/.gitignore
index 12888e08..a0642d6e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,7 @@ node_modules
yarn-error.log
*.swp
includes/config.php
-plugins/
rootCA.pem
vendor
.env
+locale/**/*.mo
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 00000000..9497573c
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,4 @@
+[submodule "plugins"]
+ path = plugins
+ url = https://github.com/RaspAP/plugins
+ branch = master
diff --git a/BACKERS.md b/BACKERS.md
index fe17e3d7..d47cc5af 100644
--- a/BACKERS.md
+++ b/BACKERS.md
@@ -1,4 +1,4 @@
-
+
Development of RaspAP is made possible thanks to a sponsorware release model. This means that new features are first exclusively released to sponsors as part of **Insiders**. Read on to learn how sponsorship works, and how easy it is to get access to Insiders.
diff --git a/README.md b/README.md
index d6bff4c3..668a5bb7 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,9 @@
-
-[](https://github.com/raspap/raspap-webgui/releases) [](https://github.com/thibmaek/awesome-raspberry-pi) [](https://github.com/sponsors/RaspAP) [](https://app.travis-ci.com/RaspAP/raspap-webgui) [](https://crowdin.com/project/raspap) [](https://twitter.com/rasp_ap) [](https://reddit.com/r/RaspAP) [](https://discord.gg/KVAsaAR)
+
+[](https://github.com/raspap/raspap-webgui/releases) [](https://github.com/thibmaek/awesome-raspberry-pi) [](https://github.com/sponsors/RaspAP) [](https://app.travis-ci.com/RaspAP/raspap-webgui) [](https://crowdin.com/project/raspap) [](https://twitter.com/rasp_ap) [](https://reddit.com/r/RaspAP) [](https://discord.gg/KVAsaAR)
+RaspAP is feature-rich wireless router software that _just works_ on many popular [Debian-based devices](#supported-operating-systems), including the Raspberry Pi. Our [custom OS images](#pre-built-image), [Quick installer](#quick-installer) and [Docker container](#docker-support) create a known-good default configuration for all current Raspberry Pis with onboard wireless. A fully responsive, mobile-ready interface gives you control over the relevant services and networking options. Advanced DHCP settings, WireGuard and OpenVPN support, [SSL certificates](https://docs.raspap.com/ssl/), [ad blocking](#ad-blocking), security audits, [captive portal integration](https://docs.raspap.com/captive/), themes and [multilingual options](https://docs.raspap.com/translations/) are included.
-RaspAP is feature-rich wireless router software that _just works_ on many popular [Debian-based devices](#supported-operating-systems), including the Raspberry Pi. Our popular [Quick installer](#quick-installer) and [Docker container](#docker-support) create a known-good default configuration for all current Raspberry Pis with onboard wireless. A fully responsive, mobile-ready interface gives you control over the relevant services and networking options. Advanced DHCP settings, WireGuard and OpenVPN support, [SSL certificates](https://docs.raspap.com/ssl/), security audits, [captive portal integration](https://docs.raspap.com/captive/), themes and [multilingual options](https://docs.raspap.com/translations/) are included.
-
-RaspAP has been featured on sites such as [Instructables](http://www.instructables.com/id/Raspberry-Pi-As-Completely-Wireless-Router/), [Adafruit](https://blog.adafruit.com/2016/06/24/raspap-wifi-configuration-portal-piday-raspberrypi-raspberry_pi/), [Raspberry Pi Weekly](https://www.raspberrypi.org/weekly/commander/) and [Awesome Raspberry Pi](https://project-awesome.org/thibmaek/awesome-raspberry-pi) and implemented in countless projects.
+RaspAP has been featured by [PC World](https://www.pcwelt.de/article/1789512/raspberry-pi-als-wlan-router.html), [Adafruit](https://blog.adafruit.com/2016/06/24/raspap-wifi-configuration-portal-piday-raspberrypi-raspberry_pi/), [Raspberry Pi Weekly](https://www.raspberrypi.org/weekly/commander/), and [Awesome Raspberry Pi](https://project-awesome.org/thibmaek/awesome-raspberry-pi) and implemented in [countless projects](https://github.com/RaspAP/raspap-awesome#projects).
We hope you enjoy using RaspAP as much as we do creating it. Tell us how you use this with [your own projects](https://github.com/raspap/raspap-awesome).
@@ -18,15 +17,13 @@ We hope you enjoy using RaspAP as much as we do creating it. Tell us how you use
## Contents
- - [Prerequisites](#prerequisites)
- - [Quick installer](#quick-installer)
+ - [Quick start](#quick-start)
- [Join Insiders](#join-insiders)
- [WireGuard support](#wireguard-support)
- [OpenVPN support](#openvpn-support)
- [VPN Provider support](#vpn-provider-support)
- [Ad Blocking](#ad-blocking)
- [Bridged AP](#bridged-ap)
- - [Simultaneous AP and Wifi client](#simultaneous-ap-and-wifi-client)
- [Manual installation](#manual-installation)
- [802.11ac 5GHz support](#80211ac-5ghz-support)
- [Supported operating systems](#supported-operating-systems)
@@ -38,30 +35,43 @@ We hope you enjoy using RaspAP as much as we do creating it. Tell us how you use
- [Reporting issues](#reporting-issues)
- [License](#license)
-## Prerequisites
-Start with a clean install of the [latest release of Raspberry Pi OS Lite](https://www.raspberrypi.com/software/operating-systems/). Both the 32- and 64-bit Lite versions are supported. The Raspberry Pi OS desktop distro is [unsupported](https://docs.raspap.com/faq/#distros).
+## Quick start
+RaspAP gives you two different ways to get up and running quickly. The simplest and recommended approach is to use a custom Raspberry Pi OS image with RaspAP preinstalled. This option eliminates guesswork and gives you a base upon which to build. Alternatively, you may execute the Quick installer on an existing [compatible OS](https://docs.raspap.com/#compatible-operating-systems).
+
+### Pre-built image
+Custom Raspberry Pi OS Lite images with the latest RaspAP are available for [direct download](https://github.com/RaspAP/raspap-webgui/releases/latest). This includes both 32- and 64-bit builds for ARM architectures.
+
+| Operating system | Debian version | Kernel version | RaspAP version | Size |
+| ---------------------| ---------------|-----------------|----------------|-------|
+| Raspberry Pi OS (64-bit) Lite | 12 (bookworm) | 6.6 | Latest | 777 MB|
+| Raspberry Pi OS (32-bit) Lite | 12 (bookworm) | 6.6 | Latest | 805 MB|
+
+These images are automatically generated with each release of RaspAP. You may choose between an `arm64` or `armhf` (32-bit) based build. Refer to [this resource](https://www.raspberrypi.com/software/operating-systems/) to ensure compatibility with your hardware.
+
+After downloading your desired image from the [latest release page](https://github.com/RaspAP/raspap-webgui/releases/latest), use a utility such as the Raspberry Pi Imager or [balenaEtcher](https://www.balena.io/etcher) to flash the OS image onto a microSD card. Insert the card into your device and boot it up. The latest RaspAP release version with the most popular optional components will be active and ready for you to configure.
+
+### Quick installer
+Alternatively, start with a clean install of a [latest release of Raspberry Pi OS](https://www.raspberrypi.org/software/operating-systems/). Both the 32- and 64-bit release versions are supported, as well as the latest 64-bit Desktop distribution.
+
+Update RPi OS to its latest version, including the kernel and firmware, followed by a reboot:
-1. Update Raspbian, including the kernel and firmware, followed by a reboot:
```
sudo apt-get update
sudo apt-get full-upgrade
sudo reboot
```
-2. Set the "WLAN country" option in `raspi-config`'s **Localisation Options**: `sudo raspi-config`
+Set the WiFi country in raspi-config's **Localisation Options**: `sudo raspi-config`.
-3. If you have a device without an onboard wireless chipset, the [**Edimax Wireless 802.11b/g/n nano USB adapter**](https://www.edimax.com/edimax/merchandise/merchandise_detail/data/edimax/global/wireless_adapters_n150/ew-7811un) is an excellent option – it's small, cheap and has good driver support.
-
-With the prerequisites done, you can proceed with either the Quick installer or Manual installation steps below.
-
-## Quick installer
Install RaspAP from your device's shell prompt:
```sh
curl -sL https://install.raspap.com | bash
```
-The [installer](https://docs.raspap.com/quick/) will complete the steps in the manual installation (below) for you.
-After the reboot at the end of the installation the wireless network will be
-configured as an access point as follows:
+The Quick installer will respond to several [command line arguments](https://docs.raspap.com/quick/), or switches, to customize your installation in a variety of ways, or install one of RaspAP's optional helper tools.
+
+### Initial settings
+After completing either of these setup options, the wireless AP network will be configured as follows:
+
* IP address: 10.3.141.1
* Username: admin
* Password: secret
@@ -69,7 +79,7 @@ configured as an access point as follows:
* SSID: `raspi-webgui`
* Password: ChangeMe
-**Note:** As the name suggests, the Quick Installer is a great way to quickly setup a new AP. However, it does not automagically detect the unique configuration of your system. Best results are obtained by connecting to ethernet (`eth0`) or as a WiFi client, also known as managed mode, with `wlan0`. For the latter, refer to [this FAQ](https://docs.raspap.com/faq/#headless). Special instructions for the Pi Zero W are [available here](https://docs.raspap.com/ap-sta/).
+It's _strongly recommended_ that your first post-install action is to change the default admin [authentication](https://docs.raspap.com/authentication/) settings. Thereafter, your AP's [basic settings](https://docs.raspap.com/ap-basics/) and many [advanced options](https://docs.raspap.com/ap-basics#advanced-options) are now ready to be modified by RaspAP.
Please [read this](https://docs.raspap.com/issues/) before reporting an issue.
@@ -118,11 +128,6 @@ By default RaspAP configures a routed AP for your clients to connect to. A bridg
More information on Bridged AP mode is provided [in our documentation](https://docs.raspap.com/bridged/).
-## Simultaneous AP and Wifi client
-RaspAP lets you create an AP with a Wifi client configuration, often called [AP-STA mode](https://docs.raspap.com/ap-sta/). With your system configured in managed mode, enable the AP from the **Advanced** tab of **Configure hotspot** by sliding the **Wifi client AP mode** toggle. Save settings and start the hotspot. The managed mode AP is functional without restart.
-
-**Note:** This option is disabled until you configure your system as a wireless client. For a device operating in [managed mode](https://docs.raspap.com/faq/#headless) without an `eth0` connection, this configuration must be enabled [_before_ a reboot](https://docs.raspap.com/ap-sta/).
-
## Manual installation
Detailed manual setup instructions are provided [on our documentation site](https://docs.raspap.com/manual/).
@@ -139,11 +144,10 @@ RaspAP was originally made for Raspbian, but now also installs on the following
| Raspberry Pi OS | (64-bit) Desktop Bookworm | ARM | Official |
| Raspberry Pi OS | (64-bit) Lite Bullseye | ARM | Official |
| Raspberry Pi OS | (32-bit) Lite Bullseye | ARM | Official |
-| Armbian | 23.11 (Jammy) | [ARM](https://docs.armbian.com/#supported-socs) | Official |
+| Armbian | 23.11 (Jammy) | [ARM](https://docs.armbian.com/#supported-socs) | Beta |
| Debian | Bookworm | ARM / x86_64 | Beta |
-| Ubuntu | Server 23.04 (Lunar) | ARM / x86_64 | Beta |
-
+
You are also encouraged to use RaspAP's community-led [Docker container](#docker-support). Please note that "supported" is not a guarantee. If you are able to improve support for your preferred distro, we encourage you to [actively contribute](#how-to-contribute) to the project.
diff --git a/ajax/plugins/do_plugin_install.php b/ajax/plugins/do_plugin_install.php
new file mode 100755
index 00000000..1ec5f93a
--- /dev/null
+++ b/ajax/plugins/do_plugin_install.php
@@ -0,0 +1,28 @@
+installPlugin($plugin_uri, $plugin_version, $install_path);
+ echo json_encode($return);
+ } catch (Exception $e) {
+ http_response_code(422); // unprocessable content
+ echo json_encode(['error' => $e->getMessage()]);
+ }
+} else {
+ http_response_code(400); // Bad Request
+ echo json_encode(['error' => 'Plugin URI, version, and install path are required']);
+ exit;
+}
+
diff --git a/app/css/all.css b/app/css/all.css
index 957f9795..5a7d24fb 100644
--- a/app/css/all.css
+++ b/app/css/all.css
@@ -378,6 +378,18 @@ button > i.fas {
border: 1px solid #ced4da;
}
+textarea.plugin-log {
+ width: 100%;
+ height: 150px;
+ resize: none;
+ border: 1px solid #dee2e6;
+ border-radius: 0.25rem;
+ padding: 0.5rem;
+ background-color: #f8f9fa;
+ font-family: monospace;
+ font-size: 0.9rem;
+}
+
.card-wrapper {
margin: 1rem;
}
@@ -627,5 +639,3 @@ button > i.fas {
.device-illustration {
min-width: 220px;
}
-
-
diff --git a/app/js/custom.js b/app/js/custom.js
index a3380e15..22f5a1dc 100644
--- a/app/js/custom.js
+++ b/app/js/custom.js
@@ -468,6 +468,138 @@ $('#js-sys-reboot, #js-sys-shutdown').on('click', function (e) {
});
});
+$('#install-user-plugin').on('shown.bs.modal', function (e) {
+ var button = $(e.relatedTarget);
+ $(this).data('button', button);
+ var manifestData = button.data('plugin-manifest');
+ var installed = button.data('plugin-installed') || false;
+ var repoPublic = button.data('repo-public') || false;
+ var installPath = manifestData.install_path;
+
+ if (!installed && repoPublic && installPath === 'plugins-available') {
+ insidersHTML = 'Available with Insiders';
+ $('#plugin-additional').html(insidersHTML);
+ } else {
+ $('#plugin-additional').empty();
+ }
+ if (manifestData) {
+ $('#plugin-docs').html(manifestData.plugin_docs
+ ? `${manifestData.plugin_docs}`
+ : 'Unknown');
+ $('#plugin-icon').attr('class', `${manifestData.icon || 'fas fa-plug'} link-secondary h5 me-2`);
+ $('#plugin-name').text(manifestData.name || 'Unknown');
+ $('#plugin-version').text(manifestData.version || 'Unknown');
+ $('#plugin-description').text(manifestData.description || 'No description provided');
+ $('#plugin-author').html(manifestData.author
+ ? manifestData.author + (manifestData.author_uri
+ ? ` (profile)` : '') : 'Unknown');
+ $('#plugin-license').text(manifestData.license || 'Unknown');
+ $('#plugin-locale').text(manifestData.default_locale || 'Unknown');
+ $('#plugin-configuration').html(formatProperty(manifestData.configuration || 'None'));
+ $('#plugin-dependencies').html(formatProperty(manifestData.dependencies || 'None'));
+ $('#plugin-javascript').html(formatProperty(manifestData.javascript || 'None'));
+ $('#plugin-sudoers').html(formatProperty(manifestData.sudoers || 'None'));
+ $('#plugin-user-name').html((manifestData.user_nonprivileged && manifestData.user_nonprivileged.name) || 'None');
+ }
+ if (installed) {
+ $('#js-install-plugin-confirm').html('OK');
+ } else if (!installed && repoPublic && installPath == 'plugins-available') {
+ $('#js-install-plugin-confirm').html('Get Insiders');
+ } else {
+ $('#js-install-plugin-confirm').html('Install now');
+ }
+});
+
+$('#js-install-plugin-confirm').on('click', function (e) {
+ var button = $('#install-user-plugin').data('button');
+ var manifestData = button.data('plugin-manifest');
+ var installPath = manifestData.install_path;
+ var pluginUri = manifestData.plugin_uri;
+ var pluginVersion = manifestData.version;
+ var pluginConfirm = $('#js-install-plugin-confirm').text();
+ var progressText = $('#js-install-plugin-confirm').attr('data-message');
+ var successHtml = $('#plugin-install-message').attr('data-message');
+ var successText = $('