2020-02-07 15:51:14 +01:00
#!/bin/sh
# Created by Jacob Hrbek <kreyren@rixotstudio.cz> under license GPL-3 (https://www.gnu.org/licenses/gpl-3.0.en.html)
# Based in part on https://github.com/JesterOrNot/Gitpod-V which is created by Sean Hellum as unlicense
: "
Initialization script made for gitpod to install vlang backend in gitpod
This script is developed to be POSIX-compatible
2020-02-07 16:45:38 +01:00
Use environment variable '$DEBUG' to output verbose info
2020-02-07 15:51:14 +01:00
CONFIGURATION
- $VLANG_SOURCE = Path used for extraction and keeping of vlang source files
- $VLANG_VERSION = Expected vlang version ( value 'latest' is supported through GitHub API)
- $VLANG_GROUP = Group used for those that are expected to have access in vlang
- $CACHEDIR = Path for cache directory, based on FSH3.0 ( 270120) this should be '$HOME/.cache'
- $VLANG_EXE = Path to which we will extract executable for vlang
"
# Configuration
[ -z " $VLANG_SOURCE " ] && VLANG_SOURCE = "/opt/vlang"
[ -z " $VLANG_VERSION " ] && VLANG_VERSION = "0.1.24"
[ -z " $VLANG_GROUP " ] && VLANG_GROUP = "vlang"
[ -z " $CACHEDIR " ] && CACHEDIR = " $HOME /.cache "
[ -z " $VLANG_EXE " ] && VLANG_EXE = "/usr/bin/v"
# Simplified die for assertion
die( ) {
2020-02-07 16:45:38 +01:00
[ -z " $DIE_PREFIX " ] && DIE_PREFIX = "FATAL:"
2020-02-07 15:51:14 +01:00
printf " $DIE_PREFIX %s\\n " " $2 "
unset VLANG_SOURCE VLANG_VERSION DIE_PREFIX CACHEDIR VLANG_EXE
exit " $1 "
}
edebug( ) {
2020-02-07 16:45:38 +01:00
[ -z " $DEBUG_PREFIX " ] && DEBUG_PREFIX = "DEBUG:"
2020-02-07 15:51:14 +01:00
[ -n " $DEBUG " ] && printf " $DEBUG_PREFIX %s\\n " " $1 "
}
# checkroot
if [ " $( id -u) " != "0" ] ; then
die 3 " Insufficient permission UID ' $( id -u) ' used for vlang initialization "
elif [ " $( id -u) " = "0" ] ; then
edebug " Script has been executed from expected used with UID ' $( id -u) ' "
else
die 256 "Unexpected happend while checking root"
fi
# Define latest version
case " $VLANG_VERSION " in
[ 0-9] .[ 0-9] .[ 0-9] | [ 0-9] [ 0-9] .[ 0-9] .[ 0-9] | [ 0-9] [ 0-9] .[ 0-9] [ 0-9] .[ 0-9] | [ 0-9] [ 0-9] .[ 0-9] [ 0-9] .[ 0-9] [ 0-9] | [ 0-9] .[ 0-9] [ 0-9] .[ 0-9] | [ 0-9] .[ 0-9] .[ 0-9] [ 0-9] ) true ; ;
latest)
VLANG_VERSION = " $( curl https://api.github.com/repos/vlang/v/releases/latest 2>/dev/null | grep tag_name | sed '/^[[:blank:]]*"tag_name":[[:blank:]]*"\([^"]*\)",[[:blank:]]*$/!d; s//\1/; q' || die 4 "Unable to get latest vlang version for GitHub API" ) " ; ;
*) die 2 " Unsupported vlang version ' $VLANG_VERSION ' has been parsed in vlang_init script "
esac
# Create cachedir
if [ ! -d " $CACHEDIR " ] ; then
mkdir " $CACHEDIR " || die 1 " Unable to make a new directory in ' $HOME /.cache' used for caching "
edebug " Created a new directory in ' $CACHEDIR ' used for caching "
elif [ -d " $CACHEDIR " ] ; then
edebug " Directory ' $CACHEDIR ' already exits, skipping creation "
else
die 256 "Unexpected happend while creating chachedir, bug?"
fi
# Fetch
if [ ! -f " $CACHEDIR /vlang- $VLANG_VERSION .zip " ] ; then
wget " https://github.com/vlang/v/releases/download/ $VLANG_VERSION /v_linux.zip " -O " $CACHEDIR /vlang- $VLANG_VERSION .zip " || die 1 "Unable to fetch vlang tarball"
edebug " Vlang source tarball has been exported in ' $CACHEDIR /vlang- $VLANG_VERSION .zip' "
elif [ -f " $CACHEDIR /vlang- $VLANG_VERSION .zip " ] ; then
edebug " File ' $CACHEDIR /vlang- $VLANG_VERSION .zip' already exists, skipping fetch "
else
die 256 " Unexpected happend while fetching vlang source tarball in ' $CACHEDIR /vlang- $VLANG_VERSION ' "
fi
# Create a new directory used for source files
if [ ! -d " $VLANG_SOURCE " ] ; then
mkdir " $VLANG_SOURCE " || die 1 "Unable to create a new directory for source extraction of vlang"
edebug " Created a new directory in ' $VLANG_SOURCE ' used for vlang source files "
elif [ -d " $VLANG_SOURCE " ] ; then
edebug " Directory in ' $VLANG_SOURCE ' is already present, skipping creation "
else
die 256 " Unexpected happend while creating a new directory in ' $VLANG_SOURCE ' "
fi
# Extract
if [ ! -f " $VLANG_SOURCE /Makefile " ] ; then
unzip " $CACHEDIR /vlang- $VLANG_VERSION .zip " -d " $VLANG_SOURCE " || die 1 " Unable to extract vlang source in ' $VLANG_SOURCE ' directory "
edebug " vlang source files has been extracted in ' $VLANG_SOURCE ' "
elif [ -f " $VLANG_SOURCE /Makefile " ] ; then
edebug "vlang source files are already extracted, skipping extract"
else
die 256 "Unexpected happend while extracting vlang source files"
fi
# Compile
if [ ! -f " $VLANG_SOURCE /v " ] ; then
make -C " $VLANG_SOURCE " || die 1 "This system is unable to compile vlang"
edebug "vlang has been sucessfully compiled"
elif [ -f " $VLANG_SOURCE /v " ] ; then
edebug "vlang is already compiled, skipping compilation"
else
die 256 "Unexpected happend while compiling vlang source files"
fi
# Export executable
if [ ! -h " $VLANG_EXE " ] && [ ! -f " $VLANG_EXE " ] ; then
ln -sf " $VLANG_SOURCE /v " " $VLANG_EXE " || die 1 " Unable to symlink vlang executable in ' $VLANG_EXE ' "
edebug "Vlang executable has been sucessfully symlinked"
elif [ -f " $VLANG_EXE " ] ; then
die 1 " Pathname ' $VLANG_EXE ' is a file where symlink to compiled vlang compiler is expected "
elif [ -h " $VLANG_EXE " ] ; then
edebug "Vlang executable is already symlinked, skipping.."
fi
# Create a new user-group for vlang users
if ! grep -qF vlang /etc/passwd 2>/dev/null; then
groupadd vlang || die 1 "Unable to make a new user-group 'vlang'"
edebug "Created a new user-group 'vlang'"
elif grep -qF vlang /etc/passwd 2>/dev/null; then
edebug "User-group 'vlang' already exists, skipping creation"
else
die 256 "Unexpected happend while creating new user-group 'vlang'"
fi
# Transfer ownership of VLANG_SOURCE to vlang user-group
if [ " $( stat -c '%G' " $VLANG_SOURCE " ) " != vlang ] ; then
chown -R root:vlang " $VLANG_SOURCE " || die 1 " Unable to transfer ownership of ' $VLANG_SOURCE ' directory to vlang user-group "
edebug " Permission to ' $VLANG_SOURCE ' directory has been transfered to vlang user-group "
elif [ " $( stat -c '%G' " $VLANG_SOURCE " ) " = vlang ] ; then
edebug " Directory ' $VLANG_SOURCE ' is already owned by 'vlang' user-group "
else
die 256 " Unexpected happend while transfering ' $VLANG_SOURCE ' directory to 'vlang' user-group "
fi
# Add gitpod user in vlang group
2020-02-07 16:50:45 +01:00
if ! groups | grep -qF " $VLANG_GROUP " ; then
2020-02-07 15:51:14 +01:00
usermod -a -G " $VLANG_GROUP " gitpod || die 1 " Unable to transfer user 'gitpod' in user-group ' $VLANG_GROUP ' "
2020-02-07 17:39:02 +01:00
chmod -R 0775 " $VLANG_SOURCE " || die 1 " Unable to set ownership to ' $VLANG_SOURCE "
2020-02-07 15:51:14 +01:00
edebug " User 'gitpod' has been added in user-group ' $VLANG_GROUP ' "
elif groups | grep -qF $VLANG_GROUP ; then
edebug " User 'gitpod' is already in user-group ' $VLANG_GROUP ' "
else
die 256 " Unexpected happend while adding user 'gitpod' in user-group ' $VLANG_GROUP ' "
fi
# Selfcheck
# FIXME: Fix selfcheck
# su gitpod -c "$VLANG_EXE" help 1>/dev/null
# case "$?" in
# 0) printf 'INFO: %s\n' "builtin vlang selfcheck passed" ;;
# *) die "$?" "builtin vlang selfcheck failed"
# esac
# Master unset
2020-02-07 16:50:45 +01:00
unset VLANG_SOURCE VLANG_VERSION DIE_PREFIX CACHEDIR VLANG_EXE