Skip to content

Instantly share code, notes, and snippets.

@gylns
Created February 6, 2017 10:52
Show Gist options
  • Save gylns/e10edcad6b1b09e79db64fe0fb6efb10 to your computer and use it in GitHub Desktop.
Save gylns/e10edcad6b1b09e79db64fe0fb6efb10 to your computer and use it in GitHub Desktop.
#!/bin/bash
sudo apt-get install isc-dhcp-server -y
set interfaces
set addresses
set ip
# Find network interfaces
function find_interfaces()
{
local ip_result=$(ip link | awk '{print $2}')
ip_result=($ip_result)
local counter=0
while [ $counter -lt "${#ip_result[@]}" ]
do
interface="${ip_result[$counter]}"
if [ "$interface" == "lo:" ]; then counter=$[$counter +2]; continue; fi
interface=${interface::-1}
interfaces+=($interface)
counter=$[$counter +1]
mac="${ip_result[$counter]}"
addresses+=($mac)
counter=$[$counter +1]
done
}
# Find network interfaces
function display_interfaces()
{
counter=0
while [ $counter -lt "${#interfaces[@]}" ]
do
echo "To use ${interfaces[$counter]} enter $counter"
counter=$[$counter +1]
done
}
# Test an IP address for validity
function valid_ip()
{
ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS='.'
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 252 && ${ip[3]} -ge 1 ]]
stat=$?
fi
return $stat
}
set -e
echo "Looking for network interfaces..."
find_interfaces
if [ "${#interfaces[@]}" == "0" ]
then
echo "No network interfaces found, please check your system"
exit
fi
echo "Found ${#interfaces[@]} interfaces $interfaces"
echo "Choose the network interface to be used"
display_interfaces
iface=-1
while [[ "$iface" -ge "${#interfaces[@]}" || "$iface" -le "-1" ]]; do
read -p "Ethernet interface " iface
done
ip_state="bad"
while [ "$ip_state" == "bad" ]; do
read -p "IP address " subnet
if valid_ip $subnet; then ip_state="good"; break; else echo "Please provide a valid IP address in [X.X.X.1 X.X.X.252]"; fi
done
# Create /etc/network/interfaces
if [ -e /etc/network/interfaces ]
then
sudo mv /etc/network/interfaces /etc/network/interfaces.bak
sudo touch /etc/network/interfaces
fi
echo "# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
allow-hotplug ${interfaces[$iface]}
iface ${interfaces[$iface]} inet static
address $subnet
netmask 255.255.255.0
post-up service isc-dhcp-server restart" > /etc/network/interfaces
sudo chown root:root /etc/network/interfaces
sudo chmod 644 /etc/network/interfaces
if [ -e /etc/default/isc-dhcp-server ]
then
sudo mv /etc/default/isc-dhcp-server /etc/default/isc-dhcp-server.bak
sudo touch /etc/default/isc-dhcp-server
fi
echo "INTERFACES=\"${interfaces[$iface]}\"" > /etc/default/isc-dhcp-server
sudo chown root:root /etc/default/isc-dhcp-server
sudo chmod 644 /etc/default/isc-dhcp-server
# Create /etc/dhcp/dhcpd.conf
if [ -e /etc/dhcp/dhcpd.conf ]
then
sudo mv /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.bak
sudo touch /etc/dhcp/dhcpd.conf
fi
echo "#
# Simple configuration file for ISC dhcpd for Debian
#
ddns-update-style none;
option domain-name \"example.org\";
option domain-name-servers ns1.example.org, ns2.example.org;
log-facility local7;
subnet ${ip[0]}.${ip[1]}.${ip[2]}.0 netmask 255.255.255.0 {
range ${ip[0]}.${ip[1]}.${ip[2]}.$[${ip[3]} +1] ${ip[0]}.${ip[1]}.${ip[2]}.254;
option routers $subnet;
default-lease-time 345600;
max-lease-time 31557600;
}" > /etc/dhcp/dhcpd.conf
sudo chown root:root /etc/dhcp/dhcpd.conf
sudo chmod 644 /etc/dhcp/dhcpd.conf
# Make the chosen interface unmanaged
if [ -e /etc/NetworkManager/NetworkManager.conf ]
then
sudo mv /etc/NetworkManager/NetworkManager.conf /etc/NetworkManager/NetworkManager.conf.bak
sudo touch /etc/NetworkManager/NetworkManager.conf
fi
echo "[main]
plugins=ifupdown,keyfile,ofono
dns=dnsmasq
[ifupdown]
managed=false
[keyfile]
unmanaged-devices=mac:${addresses[$iface]}
" > /etc/NetworkManager/NetworkManager.conf
sudo chown root:root /etc/NetworkManager/NetworkManager.conf
sudo chmod 644 /etc/NetworkManager/NetworkManager.conf
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment