191 lines
4.8 KiB
Bash
Executable file
191 lines
4.8 KiB
Bash
Executable file
#!/usr/bin/env bash
|
|
# Script for running cligen and clixon test scripts on local vagrant virtual hosts
|
|
# 1. Create a vagrant host based on "box" argument
|
|
# 2. setup host for clixon
|
|
# 3. Compile and install clixon
|
|
# 4. Run tests
|
|
# Example run: ./vagrant.sh generic/centos8 2>&1 | tee cilog
|
|
|
|
set -eux # x
|
|
|
|
if [ $# -ne 1 -a $# -ne 2 ]; then
|
|
echo "usage: $0 <box> [destroy]\n <box> as defined in https://vagrantcloud.com/search"
|
|
exit -1
|
|
fi
|
|
|
|
box=$1 # As defined in https://vagrantcloud.com/search
|
|
if [ $# -eq 2 ]; then
|
|
destroy=true
|
|
else
|
|
destroy=false
|
|
fi
|
|
|
|
host=$(echo "$box"|awk -F'/' '{print $2}')
|
|
dir=$box
|
|
# XXX: ad-hoc to get (linux) release from boxname
|
|
# using lsb_release is too heavyweight in many cases
|
|
release=$(echo "$host" | grep -io "[a-z]*" | head -1 | tr '[:upper:]' '[:lower:]')
|
|
wwwuser=www-data
|
|
|
|
# example box="freebsd/FreeBSD-12.1-STABLE"
|
|
test -d $dir || mkdir -p $dir
|
|
|
|
# Write a freebsd vagrant file
|
|
cat<<EOF > $dir/Vagrantfile
|
|
Vagrant.configure("2") do |config|
|
|
# Every Vagrant development environment requires a box. You can search for
|
|
# boxes at https://vagrantcloud.com/search.
|
|
config.vm.box = "$box"
|
|
config.ssh.shell = "sh" # freebsd
|
|
config.vm.define "$host"
|
|
config.vm.hostname = "$host"
|
|
end
|
|
EOF
|
|
|
|
# Start vagrant
|
|
if $destroy; then
|
|
(cd $dir; vagrant destroy -f)
|
|
fi
|
|
(cd $dir; vagrant up)
|
|
|
|
# Get ssh config to make proper ssh/scp calls to local vagrant host
|
|
cfg=$(cd $dir; vagrant ssh-config $host)
|
|
idfile=$(echo "$cfg" |grep "IdentityFile"|awk '{print $2}')
|
|
port=$(echo "$cfg" |grep "Port"|awk '{print $2}')
|
|
# make ssh and scp shorthand commands using vagrant-generated keys
|
|
sshcmd="ssh -o StrictHostKeyChecking=no -i $idfile -p $port vagrant@127.0.0.1"
|
|
scpcmd="scp -p -o StrictHostKeyChecking=no -i $idfile -P $port"
|
|
ssh-keygen -f "$HOME/.ssh/known_hosts" -R "[127.0.0.1]:$port"
|
|
echo "$sshcmd"
|
|
|
|
system=$($sshcmd uname)
|
|
|
|
case $system in
|
|
FreeBSD)
|
|
# packages for building
|
|
$sshcmd sudo pkg install -y git gmake bash
|
|
# cligen
|
|
$sshcmd sudo pkg install -y bison flex
|
|
# Add www user for nginx
|
|
if [ ! $($sshcmd id -u $wwwuser) ]; then
|
|
$sshcmd sudo pw useradd $wwwuser -d /nonexistent -s /usr/sbin/nologin
|
|
fi
|
|
$sshcmd sudo pkg install -y fcgi-devkit nginx
|
|
;;
|
|
Linux)
|
|
case $release in
|
|
centos) # centos 8
|
|
# packages for building
|
|
$sshcmd sudo yum install -y git
|
|
# cligen
|
|
$sshcmd sudo yum install -y bison flex
|
|
# clixon
|
|
if [ ! $($sshcmd id -u $wwwuser) ]; then
|
|
$sshcmd sudo useradd -M $wwwuser
|
|
fi
|
|
$sshcmd sudo yum install -y fcgi-devel nginx
|
|
# clixon utilities
|
|
$sshcmd sudo yum install -y libcurl-devel
|
|
;;
|
|
opensuse) # opensuse42
|
|
# clixon
|
|
$sshcmd sudo zypper install -y nginx
|
|
# XXX: no fastcgi package?
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
;;
|
|
*)
|
|
echo "Unknown system: $system"
|
|
;;
|
|
esac
|
|
|
|
# Hide all complex nginx config in sub-script
|
|
. ./nginx.sh $dir $idfile $port $wwwuser
|
|
|
|
# Setup cligen and clixon
|
|
# This is a script generated at the original host, then copied to the target and run there.
|
|
# 'EOF' means dont expand $
|
|
cat<<'EOF' > $dir/setup.sh
|
|
#!/usr/bin/env bash
|
|
set -eux # x
|
|
|
|
if [ $# -ne 2 ]; then
|
|
echo "usage: $0 <release> <wwwuser>"
|
|
exit -1
|
|
fi
|
|
release=$1
|
|
wwwuser=$2
|
|
# create user & group
|
|
if [ ! $(id -u clicon) ]; then
|
|
if [ $release = "freebsd" ]; then
|
|
sudo pw useradd clicon -d /nonexistent -s /usr/sbin/nologin;
|
|
sudo pw group mod clicon -m vagrant;
|
|
sudo pw group mod clicon -m $wwwuser;
|
|
else
|
|
sudo useradd clicon;
|
|
sudo usermod -a -G clicon vagrant;
|
|
sudo usermod -a -G clicon $wwwuser;
|
|
fi
|
|
fi
|
|
|
|
# cligen
|
|
test -d src || mkdir src
|
|
test -d src/cligen || (cd src;git clone https://github.com/olofhagsand/cligen.git)
|
|
cd src/cligen
|
|
git pull
|
|
|
|
if [ $release = "freebsd" ]; then
|
|
./configure
|
|
MAKE=$(which gmake)
|
|
else
|
|
./configure --prefix=/usr
|
|
MAKE=$(which make)
|
|
fi
|
|
echo "MAKE:$MAKE"
|
|
$MAKE clean
|
|
$MAKE -j10
|
|
sudo $MAKE install
|
|
|
|
# Clixon
|
|
cd
|
|
test -d src/clixon || (cd src;git clone https://github.com/clicon/clixon.git)
|
|
cd src/clixon
|
|
git pull
|
|
|
|
if [ $release = "freebsd" ]; then
|
|
LDFLAGS=-L/usr/local/lib ./configure --with-cligen=/usr/local --enable-optyangs
|
|
else
|
|
# Problems with su not having "sbin" in path on centos when when we run tests later
|
|
./configure --sbindir=/usr/sbin --libdir=/usr/lib --enable-optyangs
|
|
fi
|
|
$MAKE clean
|
|
$MAKE -j10
|
|
sudo $MAKE install
|
|
(cd example; $MAKE)
|
|
(cd util; $MAKE)
|
|
(cd example; sudo $MAKE install)
|
|
(cd util; sudo $MAKE install)
|
|
sudo ldconfig
|
|
cd test
|
|
echo "#!/usr/bin/env bash" > ./site.sh
|
|
if [ $release = "freebsd" ]; then
|
|
echo "make=gmake" >> ./site.sh
|
|
echo 'SKIPLIST="test_api.sh"' >> ./site.sh
|
|
fi
|
|
EOF
|
|
chmod a+x $dir/setup.sh
|
|
|
|
# config and setup cligen and clixon
|
|
$scpcmd $dir/setup.sh vagrant@127.0.0.1:
|
|
$sshcmd ./setup.sh $release $wwwuser
|
|
|
|
# Run tests
|
|
$sshcmd "(cd src/cligen/test; ./sum.sh)"
|
|
$sshcmd "(cd src/clixon/test; ./sum.sh)"
|
|
|
|
# destroy vm
|
|
if $destroy; then
|
|
(cd $dir; vagrant destroy -f)
|
|
fi
|