Reverting files to correct ones

This commit is contained in:
Federico Frigo 2022-04-10 20:09:23 +02:00
parent b386f5285a
commit 00fe51f005
12 changed files with 47 additions and 116 deletions

View file

@ -459,19 +459,6 @@ $(document).on("click", ".js-toggle-password", function(e) {
} }
}); });
$(document).on("input", ".js-validate-psk", function(e) {
var field = $(e.target);
var colors = field.data("colors").split(",");
var target = $(field.data("target"));
if (field.val().length < 8 || field.val().length > 63) {
field.css("backgroundColor", colors[0]);
target.attr("disabled", true);
} else {
field.css("backgroundColor", colors[1]);
target.attr("disabled", false);
}
});
$(function() { $(function() {
$('#theme-select').change(function() { $('#theme-select').change(function() {
var theme = themes[$( "#theme-select" ).val() ]; var theme = themes[$( "#theme-select" ).val() ];

View file

@ -4,4 +4,4 @@
* Licensed under MIT (https://github.com/raspap-webgui/raspap-webgui/blob/master/LICENSE) * Licensed under MIT (https://github.com/raspap-webgui/raspap-webgui/blob/master/LICENSE)
*/ */
function msgShow(t,a){if(0==t)var e="success";else if(2==t||1==t)e="danger";return'<div class="alert alert-'+e+' alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>'+a+"</div>"}function createNetmaskAddr(t){var a=[];for(i=0;i<4;i++){var e=Math.min(t,8);a.push(256-Math.pow(2,8-e)),t-=e}return a.join(".")}function loadSummary(a){$.post("/ajax/networking/get_ip_summary.php",{interface:a},function(t){jsonData=JSON.parse(t),console.log(jsonData),0==jsonData.return?$("#"+a+"-summary").html(jsonData.output.join("<br />")):2==jsonData.return&&$("#"+a+"-summary").append('<div class="alert alert-danger alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>'+jsonData.output.join("<br />")+"</div>")})}function getAllInterfaces(){$.get("/ajax/networking/get_all_interfaces.php",function(t){jsonData=JSON.parse(t),$.each(jsonData,function(t,a){loadSummary(a)})})}function setupTabs(){$('a[data-toggle="tab"]').on("shown.bs.tab",function(t){var a=$(t.target).attr("href");a.match("summary")||loadCurrentSettings(a.replace("#",""))})}function loadCurrentSettings(t){$.post("/ajax/networking/get_int_config.php",{interface:t},function(t){jsonData=JSON.parse(t),$.each(jsonData.output,function(t,a){var n=a.interface;$.each(a,function(t,a){switch(t){case"static":"true"==a?($("#"+n+"-static").click(),$("#"+n+"-nofailover").click()):$("#"+n+"-dhcp").click();break;case"failover":"true"===a?$("#"+n+"-failover").click():$("#"+n+"-nofailover").click();break;case"ip_address":var e=a.split("/");$("#"+n+"-ipaddress").val(e[0]),$("#"+n+"-netmask").val(createNetmaskAddr(e[1]));break;case"routers":$("#"+n+"-gateway").val(a);break;case"domain_name_server":svrsDNS=a.split(" "),$("#"+n+"-dnssvr").val(svrsDNS[0]),$("#"+n+"-dnssvralt").val(svrsDNS[1])}})})})}function saveNetworkSettings(t){var a=$("#frm-"+t).find(":input"),e={};$.each(a,function(t,a){"radio"==$(a).attr("type")?e[$(a).attr("id")]=$(a).prop("checked"):e[$(a).attr("id")]=$(a).val()}),e.interface=t,$.post("/ajax/networking/save_int_config.php",e,function(t){var a=JSON.parse(t);$("#msgNetworking").html(msgShow(a.return,a.output))})}function applyNetworkSettings(){$(this).data("int");arrFormData={generate:""},$.post("/ajax/networking/gen_int_config.php",arrFormData,function(t){console.log(t);var a=JSON.parse(t);$("#msgNetworking").html(msgShow(a.return,a.output))})}function setupBtns(){$("#btnSummaryRefresh").click(function(){getAllInterfaces()}),$(".intsave").click(function(){saveNetworkSettings($(this).data("int"))}),$(".intapply").click(function(){applyNetworkSettings()})}function setCSRFTokenHeader(t,a,e){var n=$("meta[name=csrf_token]").attr("content");/^(POST|PATCH|PUT|DELETE)$/i.test(e.type)&&a.setRequestHeader("X-CSRF-Token",n)}function contentLoaded(){switch(pageCurrent=window.location.href.split("?")[1].split("=")[1],pageCurrent=pageCurrent.replace("#",""),$("#side-menu").metisMenu(),pageCurrent){case"network_conf":getAllInterfaces(),setupTabs(),setupBtns()}}function loadWifiStations(a){return function(){var t=!0===a?"?refresh":"";$(".js-wifi-stations").addClass("loading-spinner").empty().load("/ajax/networking/wifi_stations.php"+t,function(){$(this).removeClass("loading-spinner")})}}$(document).on("click",".js-add-dhcp-static-lease",function(t){t.preventDefault();var a=$(".js-new-dhcp-static-lease"),e=$("input[name=mac]",a).val().trim(),n=$("input[name=ip]",a).val().trim();if(""!=e&&""!=n){var i=$("#js-dhcp-static-lease-row").html().replace("{{ mac }}",e).replace("{{ ip }}",n);$(".js-dhcp-static-lease-container").append(i),$("input[name=mac]",a).val(""),$("input[name=ip]",a).val("")}}),$(document).on("click",".js-remove-dhcp-static-lease",function(t){t.preventDefault(),$(this).parents(".js-dhcp-static-lease-row").remove()}),$(document).on("submit",".js-dhcp-settings-form",function(t){$(".js-add-dhcp-static-lease").trigger("click")}),$(".js-reload-wifi-stations").on("click",loadWifiStations(!0)),$(document).on("click",".js-toggle-password",function(t){var a=$(t.target),e=$(a.data("target"));e.is(":input")&&(t.preventDefault(),a.data("__toggle-with-initial")||a.data("__toggle-with-initial",a.text()),"password"===e.attr("type")?(a.text(a.data("toggle-with")),e.attr("type","text")):(a.text(a.data("__toggle-with-initial")),e.attr("type","password")))}),$(document).on("input",".js-validate-psk",function(t){var a=$(t.target),e=a.data("colors").split(","),n=$(a.data("target"));a.val().length<8||63<a.val().length?(a.css("backgroundColor",e[0]),n.attr("disabled",!0)):(a.css("backgroundColor",e[1]),n.attr("disabled",!1))}),$(document).ajaxSend(setCSRFTokenHeader).ready(contentLoaded).ready(loadWifiStations()); function msgShow(t,a){if(0==t)var e="success";else if(2==t||1==t)e="danger";return'<div class="alert alert-'+e+' alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>'+a+"</div>"}function createNetmaskAddr(t){var a=[];for(i=0;i<4;i++){var e=Math.min(t,8);a.push(256-Math.pow(2,8-e)),t-=e}return a.join(".")}function loadSummary(a){$.post("/ajax/networking/get_ip_summary.php",{interface:a},function(t){jsonData=JSON.parse(t),console.log(jsonData),0==jsonData.return?$("#"+a+"-summary").html(jsonData.output.join("<br />")):2==jsonData.return&&$("#"+a+"-summary").append('<div class="alert alert-danger alert-dismissible" role="alert"><button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">&times;</span></button>'+jsonData.output.join("<br />")+"</div>")})}function getAllInterfaces(){$.get("/ajax/networking/get_all_interfaces.php",function(t){jsonData=JSON.parse(t),$.each(jsonData,function(t,a){loadSummary(a)})})}function setupTabs(){$('a[data-toggle="tab"]').on("shown.bs.tab",function(t){var a=$(t.target).attr("href");a.match("summary")||loadCurrentSettings(a.replace("#",""))})}function loadCurrentSettings(t){$.post("/ajax/networking/get_int_config.php",{interface:t},function(t){jsonData=JSON.parse(t),$.each(jsonData.output,function(t,a){var n=a.interface;$.each(a,function(t,a){switch(t){case"static":"true"==a?($("#"+n+"-static").click(),$("#"+n+"-nofailover").click()):$("#"+n+"-dhcp").click();break;case"failover":"true"===a?$("#"+n+"-failover").click():$("#"+n+"-nofailover").click();break;case"ip_address":var e=a.split("/");$("#"+n+"-ipaddress").val(e[0]),$("#"+n+"-netmask").val(createNetmaskAddr(e[1]));break;case"routers":$("#"+n+"-gateway").val(a);break;case"domain_name_server":svrsDNS=a.split(" "),$("#"+n+"-dnssvr").val(svrsDNS[0]),$("#"+n+"-dnssvralt").val(svrsDNS[1])}})})})}function saveNetworkSettings(t){var a=$("#frm-"+t).find(":input"),e={};$.each(a,function(t,a){"radio"==$(a).attr("type")?e[$(a).attr("id")]=$(a).prop("checked"):e[$(a).attr("id")]=$(a).val()}),e.interface=t,$.post("/ajax/networking/save_int_config.php",e,function(t){var a=JSON.parse(t);$("#msgNetworking").html(msgShow(a.return,a.output))})}function applyNetworkSettings(){$(this).data("int");arrFormData={generate:""},$.post("/ajax/networking/gen_int_config.php",arrFormData,function(t){console.log(t);var a=JSON.parse(t);$("#msgNetworking").html(msgShow(a.return,a.output))})}function setupBtns(){$("#btnSummaryRefresh").click(function(){getAllInterfaces()}),$(".intsave").click(function(){saveNetworkSettings($(this).data("int"))}),$(".intapply").click(function(){applyNetworkSettings()})}function setCSRFTokenHeader(t,a,e){var n=$("meta[name=csrf_token]").attr("content");/^(POST|PATCH|PUT|DELETE)$/i.test(e.type)&&a.setRequestHeader("X-CSRF-Token",n)}function contentLoaded(){switch(pageCurrent=window.location.href.split("?")[1].split("=")[1],pageCurrent=pageCurrent.replace("#",""),$("#side-menu").metisMenu(),pageCurrent){case"network_conf":getAllInterfaces(),setupTabs(),setupBtns()}}function loadWifiStations(a){return function(){var t=!0===a?"?refresh":"";$(".js-wifi-stations").addClass("loading-spinner").empty().load("/ajax/networking/wifi_stations.php"+t,function(){$(this).removeClass("loading-spinner")})}}$(document).on("click",".js-add-dhcp-static-lease",function(t){t.preventDefault();var a=$(".js-new-dhcp-static-lease"),e=$("input[name=mac]",a).val().trim(),n=$("input[name=ip]",a).val().trim();if(""!=e&&""!=n){var i=$("#js-dhcp-static-lease-row").html().replace("{{ mac }}",e).replace("{{ ip }}",n);$(".js-dhcp-static-lease-container").append(i),$("input[name=mac]",a).val(""),$("input[name=ip]",a).val("")}}),$(document).on("click",".js-remove-dhcp-static-lease",function(t){t.preventDefault(),$(this).parents(".js-dhcp-static-lease-row").remove()}),$(document).on("submit",".js-dhcp-settings-form",function(t){$(".js-add-dhcp-static-lease").trigger("click")}),$(".js-reload-wifi-stations").on("click",loadWifiStations(!0)),$(document).on("click",".js-toggle-password",function(t){var a=$(t.target),e=$(a.data("target"));e.is(":input")&&(t.preventDefault(),a.data("__toggle-with-initial")||a.data("__toggle-with-initial",a.text()),"password"===e.attr("type")?(a.text(a.data("toggle-with")),e.attr("type","text")):(a.text(a.data("__toggle-with-initial")),e.attr("type","password")))}),$(document).on("keyup",".js-validate-psk",function(t){var a=$(t.target),e=a.data("colors").split(","),n=$(a.data("target"));a.val().length<8||63<a.val().length?(a.css("backgroundColor",e[0]),n.attr("disabled",!0)):(a.css("backgroundColor",e[1]),n.attr("disabled",!1))}),$(document).ajaxSend(setCSRFTokenHeader).ready(contentLoaded).ready(loadWifiStations());

View file

@ -2,7 +2,8 @@ server.modules += (
"mod_rewrite", "mod_rewrite",
) )
$HTTP["url"] =~ "^/(?!(dist|app|ajax|config)).*" { $HTTP["url"] =~ "^/REPLACE_ME/(?!(dist|app|ajax|config)).*" {
url.rewrite-once = ( "^/(.*?)(\?.+)?$"=>"/index.php/$1$2" ) url.rewrite-once = ( "^/REPLACE_ME/(.*?)(\?.+)?$"=>"/REPLACE_ME/index.php/$1$2" )
server.error-handler-404 = "/index.php" server.error-handler-404 = "/REPLACE_ME/index.php"
} }

View file

@ -1,6 +1,6 @@
<?php <?php
define('RASPI_BRAND_TEXT', 'Isobox'); define('RASPI_BRAND_TEXT', 'RaspAP');
define('RASPI_CONFIG', '/etc/raspap'); define('RASPI_CONFIG', '/etc/raspap');
define('RASPI_CONFIG_NETWORK', RASPI_CONFIG.'/networking/defaults.json'); define('RASPI_CONFIG_NETWORK', RASPI_CONFIG.'/networking/defaults.json');
define('RASPI_ADMIN_DETAILS', RASPI_CONFIG.'/raspap.auth'); define('RASPI_ADMIN_DETAILS', RASPI_CONFIG.'/raspap.auth');
@ -39,14 +39,14 @@ define('RASPI_HOTSPOT_ENABLED', true);
define('RASPI_NETWORK_ENABLED', true); define('RASPI_NETWORK_ENABLED', true);
define('RASPI_DHCP_ENABLED', true); define('RASPI_DHCP_ENABLED', true);
define('RASPI_ADBLOCK_ENABLED', false); define('RASPI_ADBLOCK_ENABLED', false);
define('RASPI_OPENVPN_ENABLED', true); define('RASPI_OPENVPN_ENABLED', false);
define('RASPI_WIREGUARD_ENABLED', false); define('RASPI_WIREGUARD_ENABLED', false);
define('RASPI_TORPROXY_ENABLED', false); define('RASPI_TORPROXY_ENABLED', false);
define('RASPI_CONFAUTH_ENABLED', true); define('RASPI_CONFAUTH_ENABLED', true);
define('RASPI_CHANGETHEME_ENABLED', true); define('RASPI_CHANGETHEME_ENABLED', true);
define('RASPI_VNSTAT_ENABLED', true); define('RASPI_VNSTAT_ENABLED', true);
define('RASPI_SYSTEM_ENABLED', true); define('RASPI_SYSTEM_ENABLED', true);
define('RASPI_MONITOR_ENABLED', true); define('RASPI_MONITOR_ENABLED', false);
// Locale settings // Locale settings
define('LOCALE_ROOT', 'locale'); define('LOCALE_ROOT', 'locale');

View file

@ -7,8 +7,8 @@
"subnetmask": [ "255.255.255.0" ] "subnetmask": [ "255.255.255.0" ]
}, },
"uap0": { "uap0": {
"static ip_address": [ "192.168.200.1/24" ], "static ip_address": [ "192.168.50.1/24" ],
"static routers": [ "192.168.200.1" ], "static routers": [ "192.168.50.1" ],
"static domain_name_server": [ "1.1.1.1 8.8.8.8" ], "static domain_name_server": [ "1.1.1.1 8.8.8.8" ],
"subnetmask": [ "255.255.255.0" ] "subnetmask": [ "255.255.255.0" ]
}, },
@ -31,7 +31,7 @@
"dhcp-range": [ "10.3.141.50,10.3.141.255,255.255.255.0,12h" ] "dhcp-range": [ "10.3.141.50,10.3.141.255,255.255.255.0,12h" ]
}, },
"uap0": { "uap0": {
"dhcp-range": [ "192.168.200.50,192.168.200.150,12h" ] "dhcp-range": [ "192.168.50.50,192.168.50.150,12h" ]
} }
}, },
"wireguard": { "wireguard": {

View file

@ -10,9 +10,9 @@ require dhcp_server_identifier
slaac private slaac private
nohook lookup-hostname nohook lookup-hostname
# RaspAP uap0 configuration # RaspAP wlan0 configuration
interface uap0 interface wlan0
static ip_address=192.168.200.1/24 static ip_address=10.3.141.1/24
static routers=192.168.200.1 static routers=10.3.141.1
static domain_name_server=9.9.9.9 1.1.1.1 static domain_name_server=9.9.9.9 1.1.1.1

View file

@ -4,15 +4,14 @@ ctrl_interface_group=0
beacon_int=100 beacon_int=100
auth_algs=1 auth_algs=1
wpa_key_mgmt=WPA-PSK wpa_key_mgmt=WPA-PSK
ssid=isobox ssid=raspi-webgui
channel=1 channel=1
hw_mode=g hw_mode=g
wpa_passphrase=isobox-password wpa_passphrase=ChangeMe
interface=uap0 interface=wlan0
wpa=2 wpa=2
wpa_pairwise=CCMP wpa_pairwise=CCMP
country_code=IT country_code=
ignore_broadcast_ssid=0
## Rapberry Pi 3 specific to on board WLAN/WiFi ## Rapberry Pi 3 specific to on board WLAN/WiFi
#ieee80211n=1 # 802.11n support (Raspberry Pi 3) #ieee80211n=1 # 802.11n support (Raspberry Pi 3)
#wmm_enabled=1 # QoS support (Raspberry Pi 3) #wmm_enabled=1 # QoS support (Raspberry Pi 3)

View file

@ -554,7 +554,7 @@ function _configure_networking() {
echo "Checking iptables rules" echo "Checking iptables rules"
rules=( rules=(
"-A POSTROUTING -j MASQUERADE" "-A POSTROUTING -j MASQUERADE"
"-A POSTROUTING -s 192.168.200.0/24 ! -d 192.168.200.0/24 -j MASQUERADE" "-A POSTROUTING -s 192.168.50.0/24 ! -d 192.168.50.0/24 -j MASQUERADE"
) )
for rule in "${rules[@]}"; do for rule in "${rules[@]}"; do
if grep -- "$rule" $rulesv4 > /dev/null; then if grep -- "$rule" $rulesv4 > /dev/null; then

View file

@ -12,7 +12,7 @@
[Unit] [Unit]
Description=RaspAP Service Daemon Description=RaspAP Service Daemon
DefaultDependencies=no DefaultDependencies=no
After=network.target After=multi-user.target
[Service] [Service]
Type=oneshot Type=oneshot

View file

@ -10,58 +10,30 @@ DAEMONPATH="/lib/systemd/system/raspapd.service"
OPENVPNENABLED=$(pidof openvpn | wc -l) OPENVPNENABLED=$(pidof openvpn | wc -l)
positional=() positional=()
while [[ $# -gt 0 ]]; do while [[ $# -gt 0 ]]
key="$1" do
key="$1"
case $key in case $key in
-i | --interface) -i|--interface)
interface="$2" interface="$2"
shift # past argument shift # past argument
shift # past value shift # past value
;; ;;
-s | --seconds) -s|--seconds)
seconds="$2" seconds="$2"
shift shift
shift shift
;; ;;
-a | --action) -a|--action)
action="$2" action="$2"
shift shift
shift shift
;; ;;
esac esac
done done
set -- "${positional[@]}" set -- "${positional[@]}"
HOSTAPD_CONF="/etc/hostapd/hostapd.conf"
new_country_code=$(curl -s -H "Authorization: Bearer 9da1eb466ed052" https://ipinfo.io/json | jq -r ".country // empty")
old_country_code=$(grep ^country_code $HOSTAPD_CONF | cut -d "=" -f 2)
if [[ ! -z "$new_country_code" ]] && [[ "$old_country_code" != "$new_country_code" ]]; then
sudo sed -i "s/country_code=$old_country_code/country_code=$new_country_code/" /etc/hostapd/hostapd.conf
echo "Updated country code: $new_country_code"
fi
old_ssid=$(grep ^ssid $HOSTAPD_CONF | cut -d "=" -f 2)
rpi_serial=$(cat /proc/cpuinfo | grep Serial | cut -d ' ' -f 2)
new_ssid="isobox-$rpi_serial"
if [[ "$old_ssid" != "$new_ssid" ]]; then
sed -i "s/ssid=$old_ssid/ssid=$new_ssid/" $HOSTAPD_CONF
echo "Updated ssid: $new_ssid"
fi
old_hostname=$(hostname)
new_hostname="isobox-$rpi_serial"
if [[ "$old_hostname" != "$new_hostname" ]]; then
echo $new_hostname >/etc/hostname
sed -i "s/$old_hostname/$new_hostname/" /etc/hosts
hostname $new_hostname
echo "Updated hostname: $new_hostname"
fi
echo "Stopping network services..." echo "Stopping network services..."
if [ $OPENVPNENABLED -eq 1 ]; then if [ $OPENVPNENABLED -eq 1 ]; then
systemctl stop openvpn-client@client systemctl stop openvpn-client@client
@ -85,7 +57,7 @@ if [ -r "$CONFIGFILE" ]; then
declare -A config declare -A config
while IFS=" = " read -r key value; do while IFS=" = " read -r key value; do
config["$key"]="$value" config["$key"]="$value"
done <"$CONFIGFILE" done < "$CONFIGFILE"
if [ "${config[BridgedEnable]}" = 1 ]; then if [ "${config[BridgedEnable]}" = 1 ]; then
if [ "${interface}" = "br0" ]; then if [ "${interface}" = "br0" ]; then
@ -107,7 +79,7 @@ if [ -r "$CONFIGFILE" ]; then
echo "Disabling systemd-networkd" echo "Disabling systemd-networkd"
systemctl disable systemd-networkd systemctl disable systemd-networkd
ip link ls up | grep -q 'br0' &>/dev/null ip link ls up | grep -q 'br0' &> /dev/null
if [ $? == 0 ]; then if [ $? == 0 ]; then
echo "Removing br0 interface..." echo "Removing br0 interface..."
ip link set down br0 ip link set down br0
@ -117,7 +89,7 @@ if [ -r "$CONFIGFILE" ]; then
if [ "${config[WifiAPEnable]}" = 1 ]; then if [ "${config[WifiAPEnable]}" = 1 ]; then
if [ "${interface}" = "uap0" ]; then if [ "${interface}" = "uap0" ]; then
ip link ls up | grep -q 'uap0' &>/dev/null ip link ls up | grep -q 'uap0' &> /dev/null
if [ $? == 0 ]; then if [ $? == 0 ]; then
echo "Removing uap0 interface..." echo "Removing uap0 interface..."
iw dev uap0 del iw dev uap0 del
@ -155,3 +127,4 @@ if [ "${config[WifiAPEnable]}" = 1 ]; then
fi fi
echo "RaspAP service start DONE" echo "RaspAP service start DONE"

View file

@ -158,7 +158,7 @@ function _restore_networking() {
echo "Checking iptables rules" echo "Checking iptables rules"
rules=( rules=(
"-A POSTROUTING -j MASQUERADE" "-A POSTROUTING -j MASQUERADE"
"-A POSTROUTING -s 192.168.200.0/24 ! -d 192.168.200.0/24 -j MASQUERADE" "-A POSTROUTING -s 192.168.50.0/24 ! -d 192.168.50.0/24 -j MASQUERADE"
) )
for rule in "${rules[@]}"; do for rule in "${rules[@]}"; do
if grep -- "$rule" $rulesv4 > /dev/null; then if grep -- "$rule" $rulesv4 > /dev/null; then

View file

@ -46,32 +46,3 @@
<?php endforeach ?> <?php endforeach ?>
</div> </div>
<?php endif ?> <?php endif ?>
<h4 class="h-underlined my-3"><?php echo _("Add Custom Network") ?></h4>
<div class="card-grid">
<div class="card">
<div class="card-body">
<input type="hidden" name="protocol<?php echo $index ?>" value="<?php echo htmlspecialchars($network ['protocol'], ENT_QUOTES); ?>" />
<div class="form-group">
<div class="info-item-wifi"><?php echo _("SSID"); ?></div>
<input type="text" class="form-control" name="ssid<?php echo $index ?>" data-colors="#ffd0d0,#d0ffd0"/>
<div class="info-item-wifi"><?php echo _("Passphrase"); ?></div>
<div class="input-group">
<input type="password" class="form-control js-validate-psk" aria-describedby="passphrase" name="passphrase<?php echo $index ?>" data-target="#update<?php echo $index ?>" data-colors="#ffd0d0,#d0ffd0">
<div class="input-group-append">
<button class="btn btn-outline-secondary js-toggle-password" type="button" data-target="[name=passphrase<?php echo $index ?>]" data-toggle-with="<?php echo _("Hide") ?>">Show</button>
</div>
</div>
</div>
<div class="btn-group btn-block ">
<input type="submit" class="col-xs-4 col-md-4 btn btn-info" value="<?php echo _("Add"); ?>" id="update<?php echo $index ?>" name="update<?php echo $index ?>" data-toggle="modal" data-target="#configureClientModal" />
</div><!-- /.btn-group -->
</div><!-- /.card-body -->
</div><!-- /.card -->
<?php $index++; ?>
</div>