Skip to content
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

Bridged AP Mode #523

Merged
merged 6 commits into from
Mar 16, 2020
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions config/dhcpcd.conf
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ require dhcp_server_identifier
slaac private
nohook lookup-hostname

#denyinterfaces eth0 wlan0 #BRIDGED

# RaspAP br0 configuration
interface br0

# RaspAP wlan0 configuration
interface wlan0
static ip_address=10.3.141.1/24
Expand Down
2 changes: 2 additions & 0 deletions config/hostapd.conf
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,5 @@ country_code=
## RaspAP wireless client AP mode
#interface=uap0

## RaspAP bridge AP mode (disabled by default)
#bridge=br0
5 changes: 5 additions & 0 deletions config/raspap-br0-member-eth0.network
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
[Match]
Name=eth0

[Network]
Bridge=br0
3 changes: 3 additions & 0 deletions config/raspap-bridge-br0.netdev
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
[NetDev]
Name=br0
Kind=bridge
46 changes: 36 additions & 10 deletions includes/hostapd.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,9 @@ function DisplayHostAPDConfig()
SaveHostAPDConfig($arrSecurity, $arrEncType, $arr80211Standard, $interfaces, $status);
} elseif (isset($_POST['StartHotspot']) || isset($_POST['RestartHotspot'])) {
$status->addMessage('Attempting to start hotspot', 'info');
if ($arrHostapdConf['WifiAPEnable'] == 1) {
if ($arrHostapdConf['BridgedEnable'] == 1) {
exec('sudo /etc/raspap/hostapd/servicestart.sh --interface br0 --seconds 3', $return);
} elseif ($arrHostapdConf['WifiAPEnable'] == 1) {
exec('sudo /etc/raspap/hostapd/servicestart.sh --interface uap0 --seconds 3', $return);
} else {
exec('sudo /etc/raspap/hostapd/servicestart.sh --seconds 3', $return);
Expand Down Expand Up @@ -108,15 +110,29 @@ function SaveHostAPDConfig($wpa_array, $enc_types, $modes, $interfaces, $status)

$good_input = true;

// Check for WiFi client AP mode checkbox
$wifiAPEnable = 0;
if ($arrHostapdConf['WifiAPEnable'] == 0) {
if (isset($_POST['wifiAPEnable'])) {
$wifiAPEnable = 1;
// Check for Bridged AP mode checkbox
$bridgedEnable = 0;
if ($arrHostapdConf['BridgedEnable'] == 0) {
if (isset($_POST['bridgedEnable'])) {
$bridgedEnable = 1;
}
} else {
if (isset($_POST['wifiAPEnable'])) {
$wifiAPEnable = 1;
if (isset($_POST['bridgedEnable'])) {
$bridgedEnable = 1;
}
}

// Check for WiFi client AP mode checkbox
$wifiAPEnable = 0;
if ($bridgedEnable == 0) { // enable client mode actions when not bridged
if ($arrHostapdConf['WifiAPEnable'] == 0) {
if (isset($_POST['wifiAPEnable'])) {
$wifiAPEnable = 1;
}
} else {
if (isset($_POST['wifiAPEnable'])) {
$wifiAPEnable = 1;
}
}
}

Expand All @@ -137,9 +153,13 @@ function SaveHostAPDConfig($wpa_array, $enc_types, $modes, $interfaces, $status)
exec('sudo /etc/raspap/hostapd/disablelog.sh');
}
}

$cfg = [];
$cfg['LogEnable'] = $logEnable;
$cfg['WifiAPEnable'] = $wifiAPEnable;
// Save previous Client mode status when Bridged
$cfg['WifiAPEnable'] = ($bridgedEnable == 1 ?
$arrHostapdConf['WifiAPEnable'] : $wifiAPEnable);
$cfg['BridgedEnable'] = $bridgedEnable;
$cfg['WifiManaged'] = RASPI_WIFI_CLIENT_INTERFACE;
write_php_ini($cfg, '/etc/raspap/hostapd.ini');

Expand Down Expand Up @@ -228,6 +248,9 @@ function SaveHostAPDConfig($wpa_array, $enc_types, $modes, $interfaces, $status)
$config.= 'interface=uap0'.PHP_EOL;
} else {
$config.= 'interface='.$_POST['interface'].PHP_EOL;
if ($bridgedEnable == 1) {
$config.= 'bridge=br0'.PHP_EOL;
}
}
$config.= 'wpa='.$_POST['wpa'].PHP_EOL;
$config.= 'wpa_pairwise='.$_POST['wpa_pairwise'].PHP_EOL;
Expand Down Expand Up @@ -288,7 +311,10 @@ function SaveHostAPDConfig($wpa_array, $enc_types, $modes, $interfaces, $status)
$config[] = 'slaac private';
$config[] = 'nohook lookup-hostname';

if ($wifiAPEnable == 1) {
if ($bridgedEnable == 1) {
$config[] = 'denyinterfaces eth0 wlan0';
$config[] = 'interface br0';
} elseif ($wifiAPEnable == 1) {
// Enable uap0 configuration in dhcpcd for Wifi client AP mode
$intConfig = parse_ini_file(RASPI_CONFIG_NETWORKING.'/uap0.ini', false, INI_SCANNER_RAW);
$ip_address = ($intConfig['ip_address'] == '') ? '192.168.50.1/24' : $intConfig['ip_address'];
Expand Down
9 changes: 7 additions & 2 deletions index.php
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@
$toggleState = "toggled";
}

// Get Bridged AP mode status
$arrHostapdConf = parse_ini_file('/etc/raspap/hostapd.ini');
// defaults to false
$bridgedEnabled = $arrHostapdConf['BridgedEnable'];

?><!DOCTYPE html>
<html lang="en">
<head>
Expand Down Expand Up @@ -124,7 +129,7 @@
<li class="nav-item">
<a class="nav-link" href="index.php?page=wlan0_info"><i class="fas fa-tachometer-alt fa-fw mr-2"></i><span class="nav-label"><?php echo _("Dashboard"); ?></span></a>
</li>
<?php if (RASPI_WIFICLIENT_ENABLED) : ?>
<?php if (RASPI_WIFICLIENT_ENABLED && !$bridgedEnabled) : ?>
<li class="nav-item">
<a class="nav-link" href="index.php?page=wpa_conf"><i class="fas fa-wifi fa-fw mr-2"></i><span class="nav-label"><?php echo _("WiFi client"); ?></span></a>
</li>
Expand All @@ -139,7 +144,7 @@
<a class="nav-link" href="index.php?page=network_conf"><i class="fas fa-network-wired fa-fw mr-2"></i><span class="nav-label"><?php echo _("Networking"); ?></a>
</li>
<?php endif; ?>
<?php if (RASPI_DHCP_ENABLED) : ?>
<?php if (RASPI_DHCP_ENABLED && !$bridgedEnabled) : ?>
<li class="nav-item">
<a class="nav-link" href="index.php?page=dhcpd_conf"><i class="fas fa-exchange-alt fa-fw mr-2"></i><span class="nav-label"><?php echo _("DHCP Server"); ?></a>
</li>
Expand Down
14 changes: 14 additions & 0 deletions installers/common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -178,6 +178,7 @@ function download_latest_files() {

install_log "Cloning latest files from github"
git clone --branch $branch --depth 1 $git_source_url /tmp/raspap-webgui || install_error "Unable to download files from github"

sudo mv /tmp/raspap-webgui $webroot_dir || install_error "Unable to move raspap-webgui to web root"
}

Expand Down Expand Up @@ -217,6 +218,14 @@ function check_for_old_configs() {
sudo cp /etc/rc.local "$raspap_dir/backups/rc.local.`date +%F-%R`"
sudo ln -sf "$raspap_dir/backups/rc.local.`date +%F-%R`" "$raspap_dir/backups/rc.local"
fi

for file in /etc/systemd/network/raspap-*.net*; do
if [-f "${file}" ]; then
filename = $(basename $file)
sudo cp "$file" "${raspap_dir}/backups/${filename}.`date +%F-%R`"
sudo ln -sf "${raspap_dir}/backups/${filename}.`date +%F-%R`" "${raspap_dir}/backups/${filename}"
fi
done
}

# Move configuration file to the correct location
Expand All @@ -243,6 +252,11 @@ function default_configuration() {

[ -d /etc/dnsmasq.d ] || sudo mkdir /etc/dnsmasq.d

sudo systemctl stop systemd-networkd
sudo systemctl disable systemd-networkd
sudo cp $webroot_dir/config/raspap-bridge-br0.netdev /etc/systemd/network/raspap-bridge-br0.netdev || install_error "Unable to move br0 netdev file"
sudo cp $webroot_dir/config/raspap-br0-member-eth0.network /etc/systemd/network/raspap-br0-member-eth0.network || install_error "Unable to move br0 member file"

if [ ! -f "$webroot_dir/includes/config.php" ]; then
sudo cp "$webroot_dir/config/config.php" "$webroot_dir/includes/config.php"
fi
Expand Down
44 changes: 35 additions & 9 deletions installers/servicestart.sh
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=raspap
DESC="Service control for RaspAP"
CONFIGFILE="/etc/raspap/hostapd.ini"
DAEMONPATH="/lib/systemd/system/raspap.service"

positional=()
while [[ $# -gt 0 ]]
Expand All @@ -28,25 +29,50 @@ done
set -- "${positional[@]}"

echo "Stopping network services..."
systemctl stop systemd-networkd
systemctl stop hostapd.service
systemctl stop dnsmasq.service
systemctl stop dhcpcd.service

if [ -f "$DAEMONPATH" ]; then
echo "Changing RaspAP Daemon --interface to $interface"
sed -i "s/\(--interface \)[[:alnum:]]*/\1$interface/" "$DAEMONPATH"
fi

if [ -r "$CONFIGFILE" ]; then
declare -A config
while IFS=" = " read -r key value; do
config["$key"]="$value"
done < "$CONFIGFILE"

if [ "${config[WifiAPEnable]}" = 1 ]; then
if [ "${interface}" = "uap0" ]; then
echo "Removing uap0 interface..."
iw dev uap0 del

echo "Adding uap0 interface to ${config[WifiManaged]}"
iw dev ${config[WifiManaged]} interface add uap0 type __ap
# Bring up uap0 interface
ifconfig uap0 up
if [ "${config[BridgedEnable]}" = 1 ]; then
if [ "${interface}" = "br0" ]; then
echo "Restarting eth0 interface..."
ip link set down eth0
ip link set up eth0

echo "Enabling systemd-networkd"
systemctl start systemd-networkd
systemctl enable systemd-networkd
fi
else
echo "Disabling systemd-networkd"
systemctl disable systemd-networkd

echo "Removing br0 interface..."
ip link set down br0
ip link del dev br0

if [ "${config[WifiAPEnable]}" = 1 ]; then
if [ "${interface}" = "uap0" ]; then
echo "Removing uap0 interface..."
iw dev uap0 del

echo "Adding uap0 interface to ${config[WifiManaged]}"
iw dev ${config[WifiManaged]} interface add uap0 type __ap
# Bring up uap0 interface
ifconfig uap0 up
fi
fi
fi
fi
Expand Down
41 changes: 41 additions & 0 deletions installers/toggle-bridged-routed.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#!/bin/bash

function do_routed_mode() {
sudo systemctl disable systemd-networkd

sudo sed -i "s/^.*#BRIDGED$/#&/" /etc/dhcpcd.conf
sudo sed -i "s/^bridge/#&/" /etc/hostapd/hostapd.conf

sudo ip link set down br0
sudo ip link del dev br0
}

function do_bridged_mode() {
sudo sed -i "s/^#\(.*#BRIDGED\)$/\1/" /etc/dhcpcd.conf
sudo sed -i "s/^#\(bridge\)/\1/" /etc/hostapd/hostapd.conf

sudo ip link set down eth0
sudo ip link set up eth0

sudo systemctl start systemd-networkd
sudo systemctl enable systemd-networkd
}

sudo systemctl stop systemd-networkd
sudo systemctl stop hostapd
sudo systemctl stop dhcpcd
sudo systemctl stop dnsmasq

if [ "$1" = "force-routed" ]
then do_routed_mode
elif [ "$1" = "force-bridged" ]
then do_bridged_mode
elif ip addr show br0 | grep 'inet ' > /dev/null
then do_routed_mode
elif ! ip addr show br0 | grep 'inet ' > /dev/null
then do_bridged_mode
fi

sudo systemctl start hostapd
sudo systemctl start dhcpcd
sudo systemctl start dnsmasq
3 changes: 3 additions & 0 deletions locale/en_US/LC_MESSAGES/messages.po
Original file line number Diff line number Diff line change
Expand Up @@ -429,6 +429,9 @@ msgstr "Logfile output"
msgid "WiFi client AP mode"
msgstr "WiFi client AP mode"

msgid "Bridged AP mode"
msgstr "Bridged AP mode"

msgid "Hide SSID in broadcast"
msgstr "Hide SSID in broadcast"

Expand Down
11 changes: 10 additions & 1 deletion templates/hostapd.php
Original file line number Diff line number Diff line change
Expand Up @@ -124,11 +124,20 @@
</div>
<div class="tab-pane fade" id="advanced">
<h4 class="mt-3"><?php echo _("Advanced settings"); ?></h4>
<div class="row">
<div class="col-md-6 mb-2">
<div class="custom-control custom-switch">
<?php $checked = $arrHostapdConf['BridgedEnable'] == 1 ? 'checked="checked"' : '' ?>
<input class="custom-control-input" id="chxbridgedenable" name="bridgedEnable" type="checkbox" value="1" <?php echo $checked ?> />
<label class="custom-control-label" for="chxbridgedenable"><?php echo _("Bridged AP mode"); ?></label>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6 mb-2">
<div class="custom-control custom-switch">
<?php $checked = $arrHostapdConf['WifiAPEnable'] == 1 ? 'checked="checked"' : '' ?>
<?php $disabled = $managedModeEnabled == false && $arrHostapdConf['WifiAPEnable'] != 1 ? 'disabled="disabled"' : '' ?>
<?php $disabled = $managedModeEnabled == false && $arrHostapdConf['WifiAPEnable'] != 1 || $arrHostapdConf['BridgedEnable'] == 1 ? 'disabled="disabled"' : '' ?>
<input class="custom-control-input" id="chxwificlientap" name="wifiAPEnable" type="checkbox" value="1" <?php echo $checked ?> <?php echo $disabled ?> />
<label class="custom-control-label" for="chxwificlientap"><?php echo _("WiFi client AP mode"); ?></label>
</div>
Expand Down
8 changes: 8 additions & 0 deletions templates/networking.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,18 @@
<div id="msgNetworking"></div>
<ul class="nav nav-tabs">
<li role="presentation" class="nav-item"><a class="nav-link active" href="#summary" aria-controls="summary" role="tab" data-toggle="tab"><?php echo _("Summary"); ?></a></li>
<?php
// Get Bridged AP mode status
billz marked this conversation as resolved.
Show resolved Hide resolved
$arrHostapdConf = parse_ini_file('/etc/raspap/hostapd.ini');
// defaults to false
$bridgedEnabled = $arrHostapdConf['BridgedEnable'];
?>
<?php if (!$bridgedEnabled): // no interface details when bridged ?>
<?php foreach ($interfaces as $if): ?>
<?php $if_quoted = htmlspecialchars($if, ENT_QUOTES) ?>
<li role="presentation" class="nav-item"><a class="nav-link" href="#<?php echo $if_quoted ?>" aria-controls="<?php echo $if_quoted ?>" role="tab" data-toggle="tab"><?php echo $if_quoted ?></a></li>
<?php endforeach ?>
<?php endif ?>
</ul>
<div class="tab-content">

Expand Down