125 lines
3.2 KiB
Bash
Executable File
125 lines
3.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
function valid_ip()
|
|
{
|
|
local 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 255 ]]
|
|
stat=$?
|
|
fi
|
|
return $stat
|
|
}
|
|
|
|
function valid_mac()
|
|
{
|
|
local mac=$1
|
|
|
|
if [[ $mac =~ ^[0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2}:[0-9a-z]{2}$ ]]; then
|
|
return 0
|
|
fi
|
|
|
|
return 1
|
|
}
|
|
|
|
|
|
if [ $# -lt 2 ]
|
|
then
|
|
echo "Usage: $0 add HOSTNAME IP HWADDR | delete HOSTNAME | set-clone HOSTNAME | set-restore HOSTNAME | set-normal HOSTNAME" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if [[ $2 = *[[:space:]]* ]]
|
|
then
|
|
echo "Hostname must not contain whitespaces"
|
|
exit 1
|
|
fi
|
|
HOSTNAME="$2"
|
|
|
|
if [ "$1" == "status" ]
|
|
then
|
|
echo -n "$HOSTNAME is booting "
|
|
TARGET="`readlink /srv/tftp/pxelinux/pxelinux.cfg/$HOSTNAME`"
|
|
if [ "$TARGET" == "/pxelinux.cfg/local" ]
|
|
then
|
|
echo "from local harddisk"
|
|
elif [ "$TARGET" == "/pxelinux.cfg/live" ]; then
|
|
echo "to live Clonezilla environment"
|
|
elif [ "$TARGET" == "/pxelinux.cfg/clone" ]; then
|
|
echo "to Clonezilla to clone its harddisk"
|
|
elif [ "$TARGET" == "/pxelinux.cfg/live" ]; then
|
|
echo "to Clonezilla to restore its harddisk"
|
|
fi
|
|
|
|
exit 0
|
|
fi
|
|
|
|
if [ "$1" == "add" ]
|
|
then
|
|
if [ $# -lt 4 ]
|
|
then
|
|
echo "Missing arguments" >&2
|
|
exit 1
|
|
fi
|
|
|
|
if ! valid_ip $3; then
|
|
echo "Invalid IP: $3" >&2
|
|
exit 1
|
|
fi
|
|
IP="$3"
|
|
|
|
if ! valid_mac $4; then
|
|
echo "Invalid MAC: $4" >&2
|
|
exit 1
|
|
fi
|
|
HWADDR="$4"
|
|
|
|
grep -q "include \"/etc/dhcpd.d/$HOSTNAME\";" /etc/dhcpd.d/all || echo "include \"/etc/dhcpd.d/$HOSTNAME\";" >> /etc/dhcpd.d/all
|
|
[ -e "/etc/dhcpd.d/$HOSTNAME" ] || cat /etc/dhcpd.client.conf | sed "s/HOSTNAME/$HOSTNAME/g" | sed "s/HWADDR/$HWADDR/g" > "/etc/dhcpd.d/$HOSTNAME"
|
|
grep -q "$HOSTNAME A $IP" /var/named/zotac.zone || (echo "$HOSTNAME A $IP" >> /var/named/zotac.zone && rndc reload zotac)
|
|
|
|
ln -sf /srv/tftp/pxelinux/pxelinux.cfg/default /srv/tftp/pxelinux/pxelinux.cfg/$HOSTNAME
|
|
fi
|
|
|
|
if [ "$1" == "delete" ]
|
|
then
|
|
rm -f "/etc/dhcpd.d/$HOSTNAME"
|
|
sed -i "/include \"\/etc\/dhcpd.d\/$HOSTNAME\";/d" /etc/dhcpd.d/all
|
|
sed -i "/$HOSTNAME A $IP/d" /var/named/zotac.zone
|
|
rndc reload zotac
|
|
|
|
rm -f /srv/tftp/pxelinux/pxelinux.cfg/$HOSTNAME
|
|
fi
|
|
|
|
if [ "$1" == "set-live" ]
|
|
then
|
|
sed -i -E "s/^(\s*)#filename \"\/pxelinux.0\";/\\1filename \"\/pxelinux.0\";/" "/etc/dhcpd.d/$HOSTNAME"
|
|
ln -sf /pxelinux.cfg/default /srv/tftp/pxelinux/pxelinux.cfg/$HOSTNAME
|
|
fi
|
|
|
|
if [ "$1" == "set-clone" ]
|
|
then
|
|
sed -i -E "s/^(\s*)#filename \"\/pxelinux.0\";/\\1filename \"\/pxelinux.0\";/" "/etc/dhcpd.d/$HOSTNAME"
|
|
ln -sf /pxelinux.cfg/clone /srv/tftp/pxelinux/pxelinux.cfg/$HOSTNAME
|
|
fi
|
|
|
|
if [ "$1" == "set-restore" ]
|
|
then
|
|
sed -i -E "s/^(\s*)#filename \"\/pxelinux.0\";/\\1filename \"\/pxelinux.0\";/" "/etc/dhcpd.d/$HOSTNAME"
|
|
ln -sf /pxelinux.cfg/restore /srv/tftp/pxelinux/pxelinux.cfg/$HOSTNAME
|
|
fi
|
|
|
|
if [ "$1" == "set-local" ]
|
|
then
|
|
#sed -i -E "s/^(\s*)filename \"\/pxelinux.0\";/\\1#filename \"\/pxelinux.0\";/" "/etc/dhcpd.d/$HOSTNAME"
|
|
ln -sf /pxelinux.cfg/local /srv/tftp/pxelinux/pxelinux.cfg/$HOSTNAME
|
|
fi
|
|
|
|
systemctl restart dhcpd4@eth1
|