2016-12-18 17:56:47 +00:00
|
|
|
#!/bin/bash
|
2016-11-01 16:12:41 +00:00
|
|
|
|
2016-12-18 17:56:47 +00:00
|
|
|
goodbye()
|
|
|
|
|
{
|
2017-04-20 13:05:49 +00:00
|
|
|
:
|
2019-09-15 10:05:03 +00:00
|
|
|
rm -f $tmp_files
|
2016-12-18 17:56:47 +00:00
|
|
|
}
|
2016-11-01 16:12:41 +00:00
|
|
|
|
|
|
|
|
usage()
|
|
|
|
|
{
|
|
|
|
|
cat << EOT >&2
|
|
|
|
|
|
|
|
|
|
$myname -h
|
|
|
|
|
$myname {net|<image-file>} [-b hostname]
|
|
|
|
|
|
|
|
|
|
EOT
|
|
|
|
|
[ "$1" ] && exit $1
|
|
|
|
|
exit 0
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-18 17:56:47 +00:00
|
|
|
log()
|
|
|
|
|
{
|
2017-04-20 13:05:49 +00:00
|
|
|
echo "$log_delim $*"
|
|
|
|
|
/usr/bin/logger -t "$myname" "$*"
|
2016-12-18 17:56:47 +00:00
|
|
|
}
|
|
|
|
|
|
2016-11-14 14:05:59 +00:00
|
|
|
err()
|
|
|
|
|
{
|
2017-04-20 13:05:49 +00:00
|
|
|
echo "$log_delim $*" >&2
|
|
|
|
|
/usr/bin/logger -t "$myname" "$*"
|
2016-11-14 14:05:59 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fatal()
|
|
|
|
|
{
|
2017-04-20 13:05:49 +00:00
|
|
|
err "Fatal: $@ ... giving up"
|
2016-11-14 14:05:59 +00:00
|
|
|
exit 1
|
|
|
|
|
}
|
2016-11-01 16:12:41 +00:00
|
|
|
|
|
|
|
|
do_sudo()
|
|
|
|
|
{
|
|
|
|
|
if [ "$UID" = 0 ]; then
|
|
|
|
|
while [[ $1 =~ ^- ]]; do shift; done
|
2017-04-20 13:05:49 +00:00
|
|
|
log running $@
|
2016-11-01 16:12:41 +00:00
|
|
|
eval "$@"
|
|
|
|
|
return $?
|
|
|
|
|
fi
|
2019-09-15 10:05:03 +00:00
|
|
|
log running sudo $@
|
|
|
|
|
#sudo -p "Password for $myname:" $@
|
|
|
|
|
eval sudo "$@"
|
|
|
|
|
return $?
|
2016-11-01 16:12:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ldap_search()
|
|
|
|
|
{
|
|
|
|
|
local ldap_server=ldap.lcl
|
|
|
|
|
local binddn=cn=ldapadm,dc=jannet,dc=de
|
2019-09-15 10:05:03 +00:00
|
|
|
local password_files="$HOME/.feedfs-ldap/passwords/$binddn@$ldap_server $HOME/.ldap.secret"
|
|
|
|
|
local p password_file
|
|
|
|
|
for p in $password_files; do
|
|
|
|
|
[ -r "$p" ] || continue
|
|
|
|
|
password_file=$p
|
|
|
|
|
break
|
|
|
|
|
done
|
|
|
|
|
[ "$password_file" ] || fatal "None of the LDAP password files $password_files exists"
|
2016-11-01 16:12:41 +00:00
|
|
|
ldapsearch -y $password_file -xZ -h $ldap_server -D $binddn -b $base,ou=networks,dc=jannet,dc=de $@
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
list_hostnames()
|
|
|
|
|
{
|
|
|
|
|
ldap_search -LLL "(objectClass=dhcpHost)" cn | sed '/cn: / !d; s/cn: //'
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
boot_net()
|
|
|
|
|
{
|
2017-03-25 15:10:42 +00:00
|
|
|
local mac
|
2016-11-01 16:12:41 +00:00
|
|
|
[ "$hostname" ] && {
|
2017-04-20 13:05:49 +00:00
|
|
|
#set -x
|
2017-03-25 15:10:42 +00:00
|
|
|
mac=`ldap_search -LLL "(cn=$short_hostname) dhcpHWAddress" |
|
2016-11-01 16:12:41 +00:00
|
|
|
sed '/dhcpHWAddress:/ !d; s/dhcpHWAddress: ethernet *//'`
|
2017-03-25 15:10:42 +00:00
|
|
|
macaddr=",macaddr=$mac"
|
2016-11-01 16:12:41 +00:00
|
|
|
}
|
|
|
|
|
|
2019-09-15 10:05:03 +00:00
|
|
|
systemctl try-start dhcpd-priv.lcl
|
|
|
|
|
systemctl try-start nfsserver
|
2016-11-01 16:12:41 +00:00
|
|
|
|
2016-11-14 14:05:59 +00:00
|
|
|
[ "$nic_model" ] || nic_model=",model=e1000"
|
2016-11-01 16:12:41 +00:00
|
|
|
# need this for net access, would be nicer if it didn't run as root
|
|
|
|
|
# -nographic
|
2016-12-18 17:56:47 +00:00
|
|
|
|
|
|
|
|
do_sudo -E /usr/bin/$qemu_exe \
|
2016-11-01 16:12:41 +00:00
|
|
|
-boot n \
|
|
|
|
|
-net tap,ifname=tap0,vlan=0,script=$tmpdir/qemu-ifup,downscript=$tmpdir/qemu-ifdown \
|
2017-03-25 15:10:42 +00:00
|
|
|
-net nic,vlan=0$nic_model$macaddr \
|
2016-11-01 16:12:41 +00:00
|
|
|
"$qemu_opts"
|
2016-12-18 17:56:47 +00:00
|
|
|
|
|
|
|
|
# invalid param macaddr
|
|
|
|
|
# do_sudo -E /usr/bin/$qemu_exe \
|
|
|
|
|
# -boot n \
|
|
|
|
|
# -net bridge,br=$bridge,$nic_model,macaddr=$macaddr \
|
|
|
|
|
# $qemu_opts
|
|
|
|
|
|
|
|
|
|
# access denied by ACL files
|
|
|
|
|
# do_sudo -E /usr/bin/$qemu_exe \
|
|
|
|
|
# -boot n \
|
|
|
|
|
# -net bridge,br=$bridge,$nic_model \
|
|
|
|
|
# $qemu_opts
|
2016-11-01 16:12:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
boot_image()
|
|
|
|
|
{
|
|
|
|
|
local boot_image="$1"
|
|
|
|
|
|
2016-11-14 14:05:59 +00:00
|
|
|
test -r "$boot_image" || fatal "inaccessible boot image \"$boot_image\""
|
2016-12-18 17:56:47 +00:00
|
|
|
#-net bridge,br=$bridge \
|
2017-03-25 15:10:42 +00:00
|
|
|
#-net nic,vlan=1$nic_model,macaddr=00:02:36:22:13:6c \
|
|
|
|
|
#-net tap,ifname=tap1,vlan=1,script=$tmpdir/qemu-ifup,downscript=$tmpdir/qemu-ifdown \
|
2017-04-20 13:05:49 +00:00
|
|
|
#set -x
|
2016-12-18 17:56:47 +00:00
|
|
|
do_sudo -E /usr/bin/$qemu_exe \
|
2017-03-25 15:10:42 +00:00
|
|
|
-net nic,vlan=0$nic_model$macaddr \
|
2016-12-18 17:56:47 +00:00
|
|
|
-net tap,ifname=tap0,vlan=0,script=$tmpdir/qemu-ifup,downscript=$tmpdir/qemu-ifdown \
|
2016-11-01 16:12:41 +00:00
|
|
|
"$qemu_opts" \
|
2017-03-25 15:10:42 +00:00
|
|
|
-drive file=$boot_image
|
2016-11-01 16:12:41 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
boot()
|
|
|
|
|
{
|
2019-09-15 10:05:03 +00:00
|
|
|
tmpdir=`mktemp -d /tmp/$myname-XXXXXX`
|
|
|
|
|
ln -s $exe $tmpdir/qemu-ifup
|
|
|
|
|
ln -s $exe $tmpdir/qemu-ifdown
|
2016-11-01 16:12:41 +00:00
|
|
|
|
2017-03-25 15:10:42 +00:00
|
|
|
#do_sudo /sbin/modprobe kvm-intel
|
2017-04-20 13:05:49 +00:00
|
|
|
tmp_files="$tmp_files $tmpdir"
|
2016-12-18 17:56:47 +00:00
|
|
|
xhost +
|
|
|
|
|
|
2016-11-01 16:12:41 +00:00
|
|
|
case $1 in
|
|
|
|
|
net)
|
|
|
|
|
boot_net
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
boot_image "$@"
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# -- here we go
|
|
|
|
|
|
2016-12-18 17:56:47 +00:00
|
|
|
myname=`basename $0`
|
2017-04-20 13:05:49 +00:00
|
|
|
log_delim="==========================="
|
|
|
|
|
log running $0 $@
|
2017-04-20 13:07:53 +00:00
|
|
|
[ -x $0 ] || chmod u+x $0 || fatal "$0 is not executable"
|
2016-12-18 17:56:47 +00:00
|
|
|
exe=`readlink -f $0`
|
|
|
|
|
dirname=`dirname $exe`
|
|
|
|
|
bridge=priv0
|
|
|
|
|
#bridge=in1
|
2017-03-25 15:10:42 +00:00
|
|
|
macaddr=,macaddr=00:0B:DC:9B:D6:DA
|
2016-12-18 17:56:47 +00:00
|
|
|
base=dc=priv,dc=lcl
|
|
|
|
|
qemu_exe=qemu-kvm
|
|
|
|
|
qemu_opts=""
|
|
|
|
|
brctl=`PATH=/usr/sbin:/sbin /usr/bin/which brctl`
|
|
|
|
|
#nic_model=",model=rtl8139"
|
|
|
|
|
tmp_files=""
|
|
|
|
|
tmpdir=""
|
|
|
|
|
|
|
|
|
|
trap goodbye INT QUIT EXIT KILL TERM PIPE
|
|
|
|
|
|
2016-11-01 16:12:41 +00:00
|
|
|
OPTIND=1
|
2017-03-25 15:10:42 +00:00
|
|
|
while getopts lhb:o:x:n:B:M: flag; do
|
2016-11-01 16:12:41 +00:00
|
|
|
case $flag in
|
|
|
|
|
h)
|
|
|
|
|
usage 0;;
|
|
|
|
|
l)
|
|
|
|
|
list_hostnames
|
|
|
|
|
exit 0;;
|
|
|
|
|
b)
|
2016-11-14 14:05:59 +00:00
|
|
|
hostname="$OPTARG"
|
|
|
|
|
short_hostname=`echo $hostname | sed 's/\..*//'`
|
|
|
|
|
dns_domain=`echo $hostname | cut -d. -f2-`
|
|
|
|
|
base=`echo $dns_domain | sed 's/\./,/g; s/\(^\|,\)/\1dc=/g'`
|
|
|
|
|
;;
|
2016-11-01 16:12:41 +00:00
|
|
|
x)
|
2016-12-18 17:56:47 +00:00
|
|
|
qemu_exe="$OPTARG";;
|
2016-11-01 16:12:41 +00:00
|
|
|
o)
|
|
|
|
|
qemu_opts="$OPTARG";;
|
2016-11-14 14:05:59 +00:00
|
|
|
n)
|
|
|
|
|
nic_model=",model=$OPTARG";;
|
2016-12-18 17:56:47 +00:00
|
|
|
B)
|
|
|
|
|
bridge=$OPTARG;;
|
2017-03-25 15:10:42 +00:00
|
|
|
M)
|
|
|
|
|
macaddr=",macaddr=$OPTARG";;
|
|
|
|
|
|
2016-11-01 16:12:41 +00:00
|
|
|
*)
|
|
|
|
|
usage 1;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
shift $(($OPTIND - 1))
|
|
|
|
|
|
|
|
|
|
case $myname in
|
|
|
|
|
*ifup*)
|
2017-04-20 13:05:49 +00:00
|
|
|
#set -x
|
2016-12-18 17:56:47 +00:00
|
|
|
#[ "$1" = tap1 ] || exit 0
|
|
|
|
|
#do_sudo /sbin/ifconfig tap1 up
|
|
|
|
|
#do_sudo $brctl addif in1 tap0
|
|
|
|
|
#do_sudo /sbin/ifconfig tap0 up
|
|
|
|
|
#do_sudo $brctl addif in2 tap1
|
|
|
|
|
#exit 0
|
|
|
|
|
|
|
|
|
|
virt_if=$1
|
2017-04-20 13:05:49 +00:00
|
|
|
touch /tmp/i-ran-$myname
|
2016-12-18 17:56:47 +00:00
|
|
|
do_sudo /sbin/ifconfig $virt_if up
|
|
|
|
|
# this is most certainly always priv0
|
|
|
|
|
do_sudo $brctl addif $bridge $virt_if
|
2016-11-01 16:12:41 +00:00
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
*ifdown*)
|
2016-12-18 17:56:47 +00:00
|
|
|
# this is most certainly always priv0
|
|
|
|
|
do_sudo $brctl delif $bridge $1
|
2016-11-01 16:12:41 +00:00
|
|
|
do_sudo /sbin/ifconfig $1 down
|
|
|
|
|
;;
|
|
|
|
|
qemu.sh)
|
|
|
|
|
boot "$@"
|
|
|
|
|
;;
|
2016-11-01 16:24:41 +00:00
|
|
|
qemu-boot.sh) # legacy
|
2016-11-01 16:12:41 +00:00
|
|
|
boot "$@"
|
|
|
|
|
;;
|
|
|
|
|
*)
|
2016-11-01 16:24:41 +00:00
|
|
|
echo called as unknown executable name $0
|
2016-11-01 16:12:41 +00:00
|
|
|
;;
|
|
|
|
|
esac
|