summaryrefslogtreecommitdiffstats
path: root/tools/installer
diff options
context:
space:
mode:
Diffstat (limited to 'tools/installer')
-rwxr-xr-xtools/installer563
1 files changed, 563 insertions, 0 deletions
diff --git a/tools/installer b/tools/installer
new file mode 100755
index 00000000..80a380ad
--- /dev/null
+++ b/tools/installer
@@ -0,0 +1,563 @@
+#!/bin/bash
+
+# include fancy bash color stuff
+. tools/inc/colors
+
+
+# determin distribution
+DISTRO=$(lsb_release -i| sed 's/^[^:]*:\t//' | tr '[:upper:]' '[:lower:]')
+
+# get/set default paths
+[ -z $USR_BIN_PATH ] && USR_BIN_PATH=/usr/bin
+[ -z $SLX_CONFIG_PATH ] && SLX_CONFIG_PATH=/etc/opt/openslx
+[ -z $SLX_BASE_PATH ] && SLX_BASE_PATH=/opt/openslx
+[ -z $SLX_PRIVATE_PATH ] && SLX_PRIVATE_PATH=/var/opt/openslx
+[ -z $SLX_PUBLIC_PATH ] && SLX_PUBLIC_PATH=/srv/openslx
+[ -z $SLX_TEMP_PATH ] && SLX_TEMP_PATH=/tmp
+[ -z $SLX_INSTALL_LOG ] && SLX_INSTALL_LOG=install.log
+
+PREPARE_INSTALL_TARGET="./_install/"
+
+
+
+# helper functions:
+git_version()
+{
+ if [ -d .git ]; then
+ GITVERSION=`git describe`
+ GITMODIFIED=`(git status | grep "modified:\|added:\|deleted:" -q) && echo "-M"`
+ echo $GITVERSION$GITMODIFIED
+ echo $GITVERSION > VERSION
+ else
+ cat VERSION
+ fi
+}
+
+check_perl()
+{
+ echo -n " * checking perl"
+ if ! perl -e '$x=42' 2>>${SLX_INSTALL_LOG} ; then
+ echo -e " [${LightRed}failed${NC}]"
+ echo " Perl is required, please install it.";
+ exit 1;
+ else
+ echo -e " [${LightGreen}ok${NC}]"
+ fi;
+}
+
+
+check_perl_dep()
+{
+ echo -n " * checking perl module dependencies"
+ PERL_MODULES=$(cat tools/inc/perl.modules.base)
+ [ -e .perl_modules_missing ] && rm .perl_modules_missing
+ [ -e .perl_deps_guess ] && rm .perl_deps_guess
+ for pm in $PERL_MODULES; do
+ perl -e "use $pm" 2>>/dev/null || echo $pm >> .perl_modules_missing;
+ done
+ if [ -e .perl_modules_missing ]; then
+ echo -e " [${LightRed}failed${NC}]"
+ echo " Following perl modules are required and could not be found on your system:"
+ for pm in $(cat .perl_modules_missing); do
+ echo -n " $pm"
+ if [ -e tools/inc/perl.modules.$DISTRO ]; then
+ GUESS_INSTALL=$(cat tools/inc/perl.modules.$DISTRO|grep $pm| awk '{print $2}')
+ if [ ! -z $GUESS_INSTALL ]; then
+ echo " ($GUESS_INSTALL)"
+ echo "$GUESS_INSTALL" >> .perl_deps_guess
+ else
+ echo ""
+ fi
+ else
+ echo ""
+ fi
+ done
+ if [ -e .perl_deps_guess ]; then
+ echo " To install the missing dependencies run:"
+ echo -n " apt-get install"
+ for d in $(cat .perl_deps_guess | sort -u); do
+ echo -n " $d"
+ done
+ echo ""
+ exit 1
+ fi
+ else
+ echo -e " [${LightGreen}ok${NC}]"
+ fi
+}
+
+check_perl_db()
+{
+ echo -n " * checking perl db abstraction"
+ DEFAULT_DB_TYPE="";
+ if test -e ${SLX_CONFIG_PATH}/settings; then
+ sed ${SLX_CONFIG_PATH}/settings -e "s,=,=\"," -e "s,$,\"," > /tmp/slxsettings;
+ . /tmp/slxsettings;
+ rm /tmp/slxsettings;
+ fi;
+
+ for m in ${SLX_DB_TYPE} SQLite mysql; do
+ if ! perl -Isrc/lib -Isrc/config-db -e "use OpenSLX::MetaDB::$m" 2>>${SLX_INSTALL_LOG} ; then
+ echo -e " 'DBD::$m' not found (or too old), so $m-databases will not be supported.";
+ else
+ if test "${DEFAULT_DB_TYPE}X" = "X"; then
+ DEFAULT_DB_TYPE=$m;
+ echo -e " [${LightGreen}ok${NC}]"
+ echo " * selected db backend: $m";
+ break;
+ fi;
+ fi;
+ done;
+ if test "${DEFAULT_DB_TYPE}X" = "X"; then
+ echo -e " [${LightRed}failed${NC}]"
+ echo " None of the DB-modules is available! Please install one of them.";
+ exit 1;
+ else
+ echo $${DEFAULT_DB_TYPE} >DEFAULT-DB-TYPE;
+ fi;
+}
+
+check_helper_apps()
+{
+ echo -n " * checking for required linux tools"
+ if ! which rsync >/dev/null 2>&1; then
+ echo -e " [${LightRed}failed${NC}]"
+ echo " rsync is required, please install it.";
+ exit 1;
+ fi;
+ echo -e " [${LightGreen}ok${NC}]"
+}
+
+_install(){
+ FILE=$1
+ BASE_TARGET=$2
+ ADDOPTS=$3
+ [ "$BASE_TARGET" = "config" ] && BASE_TARGET_PATH=${PREPARE_INSTALL_TARGET}${SLX_CONFIG_PATH}
+ [ "$BASE_TARGET" = "base" ] && BASE_TARGET_PATH=${INSTALL_BASE}
+ while read TYPE SOURCE TARGET; do
+ if [ "$TYPE" = "f" ]; then
+ cp src/${SOURCE} ${BASE_TARGET_PATH}/${TARGET}
+ elif [ "$TYPE" = "d" ]; then
+ SOURCE_DIRNAME=$(echo $SOURCE | sed -e 's,^.*/,,' )
+ SOURCE_BASE=$(echo $SOURCE | sed -e 's,\(^.*/\).*,\1,')
+ [ "$SOURCE_DIRNAME" = "$SOURCE" ] && SOURCE_BASE=""
+ tar -cp $ADDOPTS -C src/${SOURCE_BASE} ${SOURCE_DIRNAME} \
+ | tar -xp -C ${BASE_TARGET_PATH}/$TARGET
+ fi
+ done < $FILE
+
+}
+
+prepare_install()
+{
+ echo -n " * prepare OpenSLX installation"
+ [ "${TRACE_INSTALLATION}" = "1" ] && set -x
+ INSTALL_BASE=${PREPARE_INSTALL_TARGET}${SLX_BASE_PATH}
+ [ -e $PREPARE_INSTALL_TARGET ] && rm -rf $PREPARE_INSTALL_TARGET
+ mkdir -p ${PREPARE_INSTALL_TARGET}
+ mkdir -p ${PREPARE_INSTALL_TARGET}${SLX_CONFIG_PATH}/boot-env/syslinux/themes \
+ -p ${INSTALL_BASE}/lib \
+ -p ${INSTALL_BASE}/bin \
+ -p ${INSTALL_BASE}/share/boot-env \
+ -p ${INSTALL_BASE}/share/initramfs \
+ -p ${INSTALL_BASE}/share/squashfs \
+ -p ${INSTALL_BASE}/share/templates \
+ -p ${INSTALL_BASE}/share/ramfstools \
+ -p ${PREPARE_INSTALL_TARGET}${USR_BIN_PATH} \
+ -p ${PREPARE_INSTALL_TARGET}/lib;
+
+ # copy license
+ cp COPYING ${INSTALL_BASE}/
+
+ #### copy OpenSLX perl scripts & required modules ####
+ _install ./tools/inc/files.core base
+
+ #### copy OpenSLX shared data ####
+ opts="--exclude=OpenSLX --exclude=*.example" # --strip-components 1"
+ _install ./tools/inc/files.share base $opts
+
+ #### copy OpenSLX config data ####
+ opts="--exclude=OpenSLX"
+ _install ./tools/inc/files.config config $opts
+
+ # copy distro-info
+ tar --exclude=*.example -cp -C src/lib distro-info \
+ | tar -xp -C ${PREPARE_INSTALL_TARGET}${SLX_BASE_PATH}/share
+ tar --exclude=prereqfiles --exclude=trusted-package-keys/* \
+ --exclude=*.default --exclude=mirrors \
+ -cp -C src/lib distro-info \
+ | tar -xp -C ${PREPARE_INSTALL_TARGET}${SLX_CONFIG_PATH}
+
+ ### link slx binarires ###
+ ln -sf ${SLX_BASE_PATH}/bin/slx* ${PREPARE_INSTALL_TARGET}${USR_BIN_PATH}/
+
+ ### deprecated.. ###
+ ln -sf ${SLX_BASE_PATH}/share/uclib-rootfs/lib/ld-uClibc.so.0 \
+ ${PREPARE_INSTALL_TARGET}/lib/ld-uClibc.so.0
+
+ echo -e " [${LightGreen}ok${NC}]"
+
+}
+
+make_install_tarball()
+{
+ local COMPRESSION=$1
+ local ALTERNATIVE_PREFIX=$2
+ [ "x$COMPRESSION" = "x" ] && \
+ echo -n " * create OpenSLX install tarball"
+ [ "x$COMPRESSION" = "x" ] || \
+ echo -n " * create OpenSLX install tarball (compressed with $COMPRESSION)"
+ VERSIONSTRING="openslx-$(git_version)"
+ if [ ! -f $VERSIONSTRING.tar ]; then
+ cd $PREPARE_INSTALL_TARGET
+ if [ "x$ALTERNATIVE_PREFIX" = "x" ]; then
+ OPT=""
+ else
+ OPT=" --transform \"s,^,/$ALTERNATIVE_PREFIX/,S\" "
+ fi
+ #HACK .. otherwise tar doesn't like parameters..
+ CMD="tar $OPT -c -f ../$VERSIONSTRING.tar *"
+ sh -c "$CMD"
+ cd - 2>&1 >/dev/null
+ fi
+ COMPRESSION_KEEP_ORIG="-k"
+ [ "x$COMPRESSION" = "xgzip" ] && COMPRESSION_KEEP_ORIG=""
+ [ "x$COMPRESSION" = "x" ] || $COMPRESSION -f $COMPRESSION_KEEP_ORIG $VERSIONSTRING.tar
+ echo -e " [${LightGreen}ok${NC}]"
+}
+
+make_source_tarball()
+{
+ local COMPRESSION=$1
+ local ALTERNATIVE_PREFIX=$2
+ [ "x$COMPRESSION" = "x" ] && \
+ echo -n " * create OpenSLX source tarball"
+ [ "x$COMPRESSION" = "x" ] || \
+ echo -n " * create OpenSLX source tarball (compressed with $COMPRESSION)"
+ VERSIONSTRING="openslx-$(git_version)-src"
+ if [ "x$ALTERNATIVE_PREFIX" = "x" ]; then
+ PREFIX="openslx-$(git_version)-src"
+ else
+ PREFIX=$ALTERNATIVE_PREFIX
+ fi
+ git archive --format=tar --prefix=$PREFIX/ -o $VERSIONSTRING.tar HEAD
+ [ "x$COMPRESSION" = "x" ] || $COMPRESSION -f $VERSIONSTRING.tar
+ echo -e " [${LightGreen}ok${NC}]"
+}
+
+prepare_upgrade()
+{
+ echo -n " * cleanup old OpenSLX installation before upgrade"
+ rm -rf ${SLX_BASE_PATH}
+ rm -f ${USR_BIN_PATH}/slx*
+ echo -e " [${LightGreen}ok${NC}]"
+}
+
+do_install()
+{
+ echo -n " * installing OpenSLX"
+ if [ ! "$(whoami)" = "root" ]; then
+ echo -e " [${LightRed}failed${NC}]"
+ echo " you need to be root"
+ exit 1
+ fi
+ check_upgrade
+ make_install_tarball
+ VERSIONSTRING="openslx-$(git_version)"
+ check_upgrade
+ INSTALL_HOME=$(pwd)
+ cd ${SLX_BUILD_PATH}/; tar xf $INSTALL_HOME/$VERSIONSTRING.tar
+ cd $INSTALL_HOME
+}
+
+uninstall()
+{
+ echo -n " * Uninstalling OpenSLX project files but keeping configs and stage1"
+ rm -rf ${SLX_BASE_PATH}
+ rm -rf ${SLX_PUBLIC_PATH}
+ rm -f ${USR_BIN_PATH}/slx*
+ rm -f /lib/ld-uClibc.so.0
+ echo -e " [${LightGreen}ok${NC}]"
+ echo " left config files in ${SLX_CONFIG_PATH} untouched"
+ echo " left config files in ${SLX_PRIVATE_PATH} untouched"
+}
+
+mrproper()
+{
+ echo -n " * Wiping all!"
+ rm -rf ${SLX_BASE_PATH}
+ rm -rf ${SLX_CONFIG_PATH}
+ rm -rf ${SLX_PRIVATE_PATH}
+ rm -rf ${SLX_PUBLIC_PATH}
+ rm -f ${USR_BIN_PATH}/slx*
+ echo -e " [${LightGreen}ok${NC}]"
+}
+
+check_upgrade()
+{
+ # find out if there is an older version installed and, if so, clean that
+ INSTALLED_VERSION=$(slxversion 2>/dev/null)
+ if ! test -z "${INSTALLED_VERSION}"; then
+ if test -e REVISION; then
+ . REVISION
+ else
+ OPENSLX_VERSION_REV=$(git_version)
+ fi;
+ test "${OPENSLX_SVN_SNAPSHOT}" = "0" &&
+ unset OPENSLX_SVN_SNAPSHOT || OPENSLX_SVN_SNAPSHOT="1"
+ . ./VERSIONS;
+ if test ${INSTALLED_VERSION} != ${OPENSLX_VERSION_STRING}; then
+ echo " * preparing upgrade from version (${INSTALLED_VERSION})"
+ prepare_upgrade;
+ fi;
+ fi
+}
+
+postinstall()
+{
+ # create default config folder hierarchy:
+# perl -Ilib -e 'use OpenSLX::ConfigFolder; createConfigFolderForDefaultSystem();'
+#
+# # create complete default settings and empty local settings file:
+# echo -e "# default setup for OpenSLX-installation\
+#\n\
+#\n# paths that are fixed at packaging/installation time:\
+#\nSLX_BASE_PATH=${SLX_BASE_PATH}\
+#\nSLX_CONFIG_PATH=${SLX_CONFIG_PATH}\
+#\n\
+#\n# paths which can be adjusted after installation:\
+#\nSLX_PRIVATE_PATH=${SLX_PRIVATE_PATH}\
+#\nSLX_PUBLIC_PATH=${SLX_PUBLIC_PATH}\
+#\nSLX_TEMP_PATH=${SLX_TEMP_PATH}\n" \
+# > $(SLX_BUILD_PATH)$(SLX_BASE_PATH)/share/settings.default; \
+# test -e $(SLX_BUILD_PATH)$(SLX_CONFIG_PATH)/settings || \
+# echo -e "# Local setup for OpenSLX (overrides default settings).\
+#\n#\n# Please look at $(SLX_BASE_PATH)/share/settings.default and the docs to learn\
+#\n# about the available options.\n" \
+# > $(SLX_BUILD_PATH)$(SLX_CONFIG_PATH)/settings; \
+#
+# @ # create slxversion script:
+# @if test -e REVISION; then \
+# . REVISION; \
+# else \
+# OPENSLX_VERSION_SVNREV=$$(svnversion .); \
+# fi; \
+# test "$${OPENSLX_SVN_SNAPSHOT}" = "0" && \
+# unset OPENSLX_SVN_SNAPSHOT || \
+# OPENSLX_SVN_SNAPSHOT="1"; \
+# . ./VERSIONS; \
+# echo -e "#! /bin/sh\n\necho $${OPENSLX_VERSION_STRING}" \
+# > $(SLX_BUILD_PATH)$(SLX_BASE_PATH)/bin/slxversion; \
+# chmod a+x $(SLX_BUILD_PATH)$(SLX_BASE_PATH)/bin/slxversion; \
+# ln -sf $(SLX_BASE_PATH)/bin/slxversion $(SLX_BUILD_PATH)$(USR_BIN_PATH)/; \
+#
+# @ # set default db-type:
+# @DEFAULT_DB_TYPE=$$(cat DEFAULT-DB-TYPE); \
+# rm DEFAULT-DB-TYPE; \
+# echo -n ' '; slxsettings set db-type="$${DEFAULT_DB_TYPE}";
+echo "123"
+}
+
+build_dpkg_package()
+{
+ make_install_tarball
+
+ dpkg_deb=`which dpkg-deb`
+ if [ -z "$dpkg_deb" ];then
+ echo "You need the program dpkg-deb (contained in package dpkg) to build a debian package"
+ exit
+ fi
+
+ # import default paths for debian installation
+ . ./packaging/dpkg/debianpaths
+
+ # change into folder where we expect the Makefile:
+ if [ ! -e ./Makefile ]; then
+ echo "There is no makefile in this programs directory (`pwd`)."
+ echo "Please run this script only embedded in the context of an openslx checkout."
+ exit
+ fi
+
+ echo -n " * Building DEB Package(s)"
+
+ export SLX_DEPBUILD_PATH=/tmp/slx-dep-$$
+ mkdir -p $SLX_DEPBUILD_PATH
+
+ INSTALL_HOME=$(pwd)
+ VERSIONSTRING="openslx-$(git_version)"
+
+ cd $SLX_DEPBUILD_PATH
+ tar xf $INSTALL_HOME/$VERSIONSTRING.tar
+ cd $INSTALL_HOME
+
+ #Create Temporary working directory
+ mkdir -p $SLX_DEPBUILD_PATH/DEBIAN
+ cp packaging/dpkg/default_files/control $SLX_DEPBUILD_PATH/DEBIAN/
+ cp packaging/dpkg/default_files/pre* $SLX_DEPBUILD_PATH/DEBIAN/
+ cp packaging/dpkg/default_files/post* $SLX_DEPBUILD_PATH/DEBIAN/
+
+ OPENSLX_VERSION=$(git describe)
+
+
+ sed -i -e "4r./packaging/dpkg/debianpaths" \
+ $SLX_DEPBUILD_PATH/DEBIAN/postinst
+
+ #update control file
+ sed -e "s/##version##/$OPENSLX_VERSION/" \
+ -e "s/##size##/$(du -s $SLX_BUILD_PATH | awk '{print $1}')/" \
+ -i $SLX_DEPBUILD_PATH/DEBIAN/control
+
+ #Set permissions
+ find $SLX_DEPBUILD_PATH -type d|xargs chmod 755
+
+ #Create the package
+ dpkg-deb --build $SLX_DEPBUILD_PATH > /dev/null
+ cd packaging/dpkg
+
+ echo -e " [${LightGreen}ok${NC}]"
+
+ mkdir -p $INSTALL_HOME/pkgs/
+ sh -c "find $SLX_DEPBUILD_PATH/ -iname \"*.deb\" -exec cp {} $INSTALL_HOME/pkgs/ \;"
+ cd $INSTALL_HOME
+ rm -rf $SLX_DEPBUILD_PATH
+}
+
+build_rpm_package()
+{
+
+ INSTALL_HOME=$(pwd)
+ VERSIONSTRING="openslx-$(git_version)"
+
+ OPENSLX_VERSION=$(git describe | sed -e 's/-.*$//' -e 's/^v//')
+ OPENSLX_REVISION=$(git_version | sed -e 's/[^-]*-//' -e 's/-/_/g')
+
+ rpm_builder=`which rpmbuild`
+ if [ -z "$rpm_builder" ];then
+ echo "You need the program rpmbuild (contained in package ?!?) to build a rpm package"
+ exit
+ fi
+
+ # change into folder where we expect the Makefile:
+ if [ ! -e ./Makefile ]; then
+ echo "There is no makefile in this programs directory (`pwd`)."
+ echo "Please run this script only embedded in the context of an openslx checkout."
+ exit
+ fi
+
+ export SLX_RPMBUILD_PATH=/tmp/slx-rpm-$$
+ mkdir -p $SLX_RPMBUILD_PATH
+ mkdir -p $SLX_RPMBUILD_PATH/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
+
+ #make_source_tarball gzip "openslx-$OPENSLX_VERSION"
+ #make_install_tarball
+ #tar -tf $VERSIONSTRING.tar > $SLX_RPMBUILD_PATH/FILES
+ #sed -i $SLX_RPMBUILD_PATH/FILES -e 's,^,/,'
+
+ [ -f $VERSIONSTRING.tar ] && rm $VERSIONSTRING.tar
+ make_install_tarball gzip "openslx-$OPENSLX_VERSION"
+
+ mv $VERSIONSTRING.tar.gz $SLX_RPMBUILD_PATH/SOURCES/openslx-v$OPENSLX_VERSION-$OPENSLX_REVISION.tar.gz
+
+ echo -n " * Building RPM Package(s)"
+
+ #update control file
+ sed -e "s/###version###/$OPENSLX_VERSION/" \
+ -e "s/###release###/$OPENSLX_REVISION/" \
+ -e "/###authors###/r AUTHORS" \
+ -e "/###authors###/d" \
+ packaging/rpm/openslx.spec \
+ > $SLX_RPMBUILD_PATH/SPECS/openslx.spec
+ [ "x$ARCH" = "x" ] || ARCH="--target=$ARCH"
+ rpmbuild --nodeps -ba --define "_topdir $SLX_RPMBUILD_PATH" \
+ $SLX_RPMBUILD_PATH/SPECS/openslx.spec >>${SLX_INSTALL_LOG} 2>&1
+
+ if [ "$(ls -1 $SLX_RPMBUILD_PATH/RPMS)" = "x86_64" ]; then
+ rpmbuild --target="i386" --nodeps -ba --define "_topdir $SLX_RPMBUILD_PATH" \
+ $SLX_RPMBUILD_PATH/SPECS/openslx.spec >>${SLX_INSTALL_LOG} 2>&1
+ fi
+
+ echo -e " [${LightGreen}ok${NC}]"
+
+ mkdir -p $INSTALL_HOME/pkgs/
+ echo "find $SLX_RPMBUILD_PATH/RPMS/ -iname *.rpm -exec cp {} $INSTALL_HOME/pkgs/ \;"
+ sh -c "find $SLX_RPMBUILD_PATH/RPMS/ -iname \"*.rpm\" -exec cp {} $INSTALL_HOME/pkgs/ \;"
+ rm -rf $SLX_RPMBUILD_PATH
+
+}
+
+clean()
+{
+ echo -n " * Cleanup OpenSLX source directory"
+ for file in ${SLX_INSTALL_LOG} openslx-*.tar.bz2; do
+ rm -f ${file}
+ done
+ echo -e " [${LightGreen}ok${NC}]"
+}
+
+cmd_usage()
+{
+ echo "Usage: ..."
+ echo " plain-install"
+ echo " install"
+ echo " build_rpm"
+ echo " build_deb"
+}
+
+cmd_plain_install()
+{
+ echo "running plain install:"
+ prepare_install
+ do_install
+}
+
+cmd_install()
+{
+ echo "running full install"
+ check_perl
+ check_perl_dep
+ check_perl_db
+ check_helper_apps
+ prepare_install
+ do_install
+}
+
+cmd_build_rpm()
+{
+ echo "creating rpm package(s)"
+ build_rpm_package
+}
+
+cmd_build_dep()
+{
+ echo "creating deb package"
+ build_dpkg_package
+}
+
+
+case "$1" in
+ "plain-install")
+ cmd_plain_install
+ ;;
+ "install")
+ cmd_install
+ ;;
+ "build-rpm")
+ cmd_build_rpm
+ ;;
+ "build-dep")
+ cmd_build_dep
+ ;;
+ *)
+ cmd_usage
+ ;;
+esac
+
+#make_install_tarball
+#make_install_tarball gzip
+#make_install_tarball bzip2
+#make_install_tarball lzma
+#make_source_tarball
+#make_source_tarball gzip
+#make_source_tarball bzip2
+#make_source_tarball lzma
+#git_version \ No newline at end of file