#!/bin/bash # Salt Master/Minion preconfiguration script # Copyright (C) 2018 Pekka Helenius # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . ########################################################### # Run on Ubuntu 18.04 LTS Salt master # Compiles LAS tools and CloudCompare for GIS workstation (Ubuntu & Windows) # Downloads necessary GIS tools OSES=(windows ubuntu-1804) # Required OS to run this script REQUIRED_OS="Ubuntu" # Compile CloudCompare for Ubuntu? # TODO: support false option CC_GET_UBUNTU=true # Get this variable from the main script runme.sh # The variable defined whether we should only run local Salt minion (which is running # on Ubuntu 18.04 LTS) or not # if [[ $1 == "true" ]]; then local_only="" fi if [[ $2 == "true" ]]; then winminions_present='' fi ######################## # INSTALL DEV PACKAGES function devPackages() { if [[ -f /etc/os-release ]]; then DISTRO=$(grep ^PRETTY_NAME /etc/os-release | grep -oP '(?<=")[^\s]*') if [[ $DISTRO == ${REQUIRED_OS} ]]; then # for LAStools echo -e "Updating local package databases & installing necessary dev tools for LASTools & CloudCompare\n" apt-get update apt-get install -y make git build-essential if [[ $CC_GET_UBUNTU == "true" ]]; then # for CloudCompare apt-get install -y cmake libhpdf-dev debhelper fakeroot CC_DEVDEPENDS=( libhpdf-dev libqt5opengl5-dev libcgal-dev libdxflib-dev libglew-dev libfreenect-dev libgdal-dev liblas-c-dev liblas-dev libboost-all-dev libjsoncpp-dev libpdal-dev libcurl4-gnutls-dev ) function checkDevVersions() { function generateDevVersions() { if [[ ! -f compiled/cc_devpkg_versions ]]; then touch compiled/cc_devpkg_versions fi for devpkg_version in ${CC_DEVDEPENDS[@]}; do echo -e "$(dpkg -s $devpkg_version | grep -E '^Package:|^Version:' | awk '{print $2}' | tr '\n' ' ')" \ >> compiled/cc_devpkg_versions if [[ $? -ne 0 ]]; then exit 1 fi done } # Check if we need to update our CloudCompare makedepend packages if [[ -f compiled/cc_devpkg_versions ]]; then local IFS=$'\n' for devpackage in $(cat compiled/cc_devpkg_versions); do if [[ $(apt-cache policy $(echo $devpackage | awk '{print $1}') | grep 'Candidate' | awk '{print $2}') != $(echo $devpackage | awk '{print $2}') ]]; then LOCAL_DEVPKG_OLD_FLAG="" fi done if [[ -v LOCAL_DEVPKG_OLD_FLAG ]]; then apt-get install -y ${CC_DEVDEPENDS[*]} rm compiled/cc_devpkg_versions fi else touch compiled/cc_devpkg_versions apt-get install -y ${CC_DEVDEPENDS[*]} generateDevVersions fi if [[ ! -f compiled/cc_devpkg_versions ]]; then generateDevVersions fi } checkDevVersions fi else echo -e "This is not ${REQUIRED_OS} Linux distribution. Aborting.\n" exit 1 fi else echo -e "Can't recognize your Linux distribution. Aborting.\n" exit 1 fi } ######################## # COMPILE LASTOOLS # Compile open-source LAS tools # Q: What is this? # A: See descriptions of binaries below # Main reason for this: Not available from software repositories but # still an essential toolset for GIS workflow # las2las: extracts last returns, clips, subsamples, translates, etc ... # las2txt: turns LAS into human-readable and easy-to-parse ASCII # lasdiff: compares the LIDAR data of two LAS/LAZ/ASCII files and reports whether they are identical or whether they are different. # lasindex: creates a spatial index LAX file for fast spatial queries # lasinfo: prints out a quick overview of the contents of a LAS file # lasmerge: merges several LAS or LAZ files into a single LAS or LAZ file # lasprecision: analyses the actual precision of the LIDAR points # laszip: compresses the LAS files in a completely lossless manner # txt2las: converts LIDAR data from ASCII text to binary LAS format LASTOOLS=( las2las las2txt lasdiff lasindex lasinfo lasmerge lasprecision laszip txt2las ) # There are closed source LAS tools available for Windows platform LASTOOLS_WIN=( blast2dem blast2iso bytecopy bytediff e572las las2dem las2iso las2shp las2tin lasboundary lascanopy lasclassify lasclip lascolor lascontrol lascopy lasduplicate lasgrid lasground lasground_new lasheight laslayers lasnoise lasoptimize lasoverage lasoverlap lasplanes laspublish lasreturn lassort lassplit lasthin lastile lastool lastrack lasvalidate lasview lasvoxel shp2las sonarnoiseblaster ) function compileLAStools() { if [[ ! -d $1/files/lastools ]]; then mkdir -p $1/files/lastools fi if [[ $(ls $1/files/lastools | wc -l) -eq 0 ]]; then if [[ ! -d compiled/LAStools ]]; then git clone https://github.com/LAStools/LAStools cd LAStools/ make -j$(nproc --ignore 1) if [[ $? -eq 0 ]]; then cd .. mv LAStools compiled/ fi fi if [[ $? -eq 0 ]]; then if [[ $1 = *"ubuntu"* ]]; then for lastool in ${LASTOOLS[*]}; do cp ./compiled/LAStools/src/$lastool \ $1/files/lastools/ done elif [[ $1 = *"windows"* ]]; then if [[ ! -v local_only ]] && [[ -v winminions_present ]]; then for lastool_win1 in ${LASTOOLS[*]}; do cp ./compiled/LAStools/bin/$lastool_win1.exe \ $1/files/lastools/ done for lastool_win2 in ${LASTOOLS_WIN[*]}; do cp ./compiled/LAStools/bin/$lastool_win2.exe \ $1/files/lastools/ done fi fi fi fi } ######################## function getOtherGIS() { if [[ $CC_GET_UBUNTU == "true" ]]; then if [[ $1 = *"ubuntu"* ]]; then # Compile CloudCompare for Ubuntu # # Main reason for this: Not yet available as a binary download for Ubuntu 18.04 LTS # BREAKS EASILY! # Issues: compatibility with other Linux distros may not be stable. # Currently available only for Ubuntu if [[ ! -f compiled/cloudcompare_${CC_VERSION_UBUNTU}-1_amd64.deb ]] || [[ -v LOCAL_DEVPKG_OLD_FLAG ]] ; then # Get CloudCompare source files & Debian control files wget http://http.debian.net/debian/pool/main/c/cloudcompare/cloudcompare_${CC_VERSION_UBUNTU}.orig.tar.gz wget http://http.debian.net/debian/pool/main/c/cloudcompare/cloudcompare_${CC_VERSION_UBUNTU}-1.debian.tar.xz # Extract CloudCompare source files tar xf cloudcompare_${CC_VERSION_UBUNTU}.orig.tar.gz # Make CloudCompare source root directory compatible with dpkg-buildpackage command mv CloudCompare-master cloudcompare-${CC_SHORT_UBUNTU} # Extract Debian control files tar xf cloudcompare_${CC_VERSION_UBUNTU}-1.debian.tar.xz --directory cloudcompare-${CC_SHORT_UBUNTU}/ # Compile CloudCompare cd cloudcompare-${CC_SHORT_UBUNTU} dpkg-buildpackage -rfakeroot -b -us -uc -j$(nproc --ignore 1) if [[ $? -eq 0 ]]; then cd .. mv ./{*.tar.*,*.buildinfo,*.changes,*.deb} compiled/ rm -Rf cloudcompare-${CC_SHORT_UBUNTU} fi fi if [[ ! -f $1/files/cloudcompare_${CC_VERSION_UBUNTU}-1_amd64.deb ]]; then cp compiled/cloudcompare_${CC_VERSION_UBUNTU}-1_amd64.deb $1/files/ fi fi fi if [[ $1 == *"windows"* ]]; then if [[ ! -v local_only ]] && [[ -v winminions_present ]]; then if [[ ! -d compiled/windows ]]; then mkdir -p compiled/windows fi # Download Visual C++ Redistributable Packages for Visual Studio 2013 for Windows # Required by CloudCompare if [[ ! -f compiled/windows/vcrun2013_64.exe ]]; then wget https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x64.exe -O \ compiled/windows/vcrun2013_64.exe fi # Download CloudCompare for Windows if [[ ! -f compiled/windows/CloudCompare_${CC_VERSION_WIN}_setup_x64.exe ]]; then wget http://cloudcompare.org/release/CloudCompare_${CC_VERSION_WIN}_setup_x64.exe -O \ compiled/windows/CloudCompare_${CC_VERSION_WIN}_setup_x64.exe fi # Download QGIS for Windows if [[ ! -f compiled/windows/QGIS-OSGeo4W-${QGIS_VERSION_WIN}-Setup-x86_64.exe ]]; then wget http://qgis.org/downloads/QGIS-OSGeo4W-${QGIS_VERSION_WIN}-Setup-x86_64.exe -O \ compiled/windows/QGIS-OSGeo4W-${QGIS_VERSION_WIN}-Setup-x86_64.exe fi # Download gpx2shp. NOTE: Outdated version, but only out-of-the-box binary for Windows available GPX2SHP_WIN_1="gpx2shp-0.69_win_notest" GPX2SHP_WIN_2="gpx2shp-0.69_wintest" if [[ ! -f compiled/windows/gpx2shp.exe ]]; then wget https://dotsrc.dl.osdn.net/osdn/gpx2shp/13458/${GPX2SHP_WIN_1}.zip -O \ compiled/windows/${GPX2SHP_WIN_1}.zip unzip -j compiled/windows/${GPX2SHP_WIN_1}.zip ${GPX2SHP_WIN_2}/gpx2shp.exe -d compiled/windows/ &> /dev/null rm compiled/windows/${GPX2SHP_WIN_1}.zip fi # Download Merkaartor if [[ ! -f compiled/windows/merkaartor-${MERK_VERSION_WIN}-64bit.exe ]]; then wget http://merkaartor.be/files/merkaartor-${MERK_VERSION_WIN}-64bit.exe -O \ compiled/windows/merkaartor-${MERK_VERSION_WIN}-64bit.exe fi # Download Quickroute GPS # NOTE: Get MSI GUID for 32-bit uninstaller (for sls) by running the following in Windows Powershell: # get-wmiobject Win32_Product | Format-Table IdentifyingNumber, Name if [[ ! -f compiled/windows/QuickRoute_${QR_VERSION_WIN}_Setup.msi ]]; then wget http://www.matstroeng.se/quickroute/download/QuickRoute_${QR_VERSION_WIN}_Setup.msi -O \ compiled/windows/QuickRoute_${QR_VERSION_WIN}_Setup.msi fi # Download GPS Daemon # NOTE: Deprecated version. Newer version is available for Unix platforms if [[ ! -f compiled/windows/GPSd-4-win_${GPSD_VERSION_WIN}.exe ]]; then wget https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/gpsd-4-win/GPSd-4-win_${GPSD_VERSION_WIN}.exe -O \ compiled/windows/GPSd-4-win_${GPSD_VERSION_WIN}.exe fi ## GPSBabel # #wget https://www.gpsbabel.org/plan9.php # #GPSBabel-1.5.4-Setup.exe for win_installer in compiled/windows/*; do cp $win_installer /srv/salt/win/repo-ng/installers/ done cp compiled/windows/gpx2shp.exe /srv/salt/gis_windows/files/ rm /srv/salt/win/repo-ng/installers/gpx2shp.exe fi fi } ######################## devPackages # Create directory for compiled programs if [[ ! -d compiled ]]; then mkdir compiled fi for OS in ${OSES[*]}; do if [[ $OS = *"ubuntu"* ]]; then CC_VERSION_UBUNTU="2.9.1+git20180223" CC_SHORT_UBUNTU="2.9.1" elif [[ $OS == *"windows"* ]] && [[ ! -v $skip_windows ]]; then CC_VERSION_WIN="v2.10.alpha" CC_SHORT_WIN="2.10" MERK_VERSION_WIN="0.18.3" QGIS_VERSION_WIN="2.18.19-1" QR_VERSION_WIN="2.4" GPSD_VERSION_WIN="0.2.0.0" fi OS_SALT_PATH="/srv/salt/gis_${OS}" compileLAStools ${OS_SALT_PATH} getOtherGIS ${OS_SALT_PATH} done unset LOCAL_DEVPKG_OLD_FLAG unset local_only unset winminions_present