#!/bin/bash # CodeDog Bootstrap installer script # To run this script without cloning or downloading anything: # curl -H 'Cache-Control: no-cache' -kLs 'https://github.com/pyr0ball/PRbL-bashrc/raw/main/extras/Slipstream.install' | bash -s -- -i # Bash expansions to get the name and location of this script when run installdir="$HOME/.local/share/s3dk" scriptname="${BASH_SOURCE[0]##*/}" rundir="${BASH_SOURCE[0]%/*}" # Source PRbL Functions locally or retrieve from online if [ ! -z $prbl_functions ] ; then source $prbl_functions else if [ -f ${rundir}/functions ] ; then source ${rundir}/functions else # Iterate through get commands and fall back on next if unavailable if command -v curl >/dev/null 2>&1; then source <(curl -ks 'https://raw.githubusercontent.com/pyr0ball/PRbL/main/functions') elif command -v wget >/dev/null 2>&1; then source <(wget -qO- 'https://raw.githubusercontent.com/pyr0ball/PRbL/main/functions') elif command -v fetch >/dev/null 2>&1; then source <(fetch -qo- 'https://raw.githubusercontent.com/pyr0ball/PRbL/main/functions') else echo "Error: curl, wget, and fetch commands are not available. Please install one to retrieve PRbL functions." exit 1 fi fi fi logfile="${rundir}/${pretty_date}_${scriptname}.log" # Dependencies sys_packages=( git curl python3 python3-pip ) pip_packages=( pyparsing ) repo_packages=( BruceDLong/CodeDog BruceDLong/Proteus BruceDLong/Slipstream ) prbl_packages=( golang.install ) codedog_bashrc="# CodeDog system path setup export PATH=\"\$PATH:\$HOME/devl/CodeDog\" " # Functions check-deps(){ # Iterate through the list of required packages and check if installed for pkg in ${sys_packages[@]} ; do local _pkg=$(dpkg -l $pkg 2>&1 >/dev/null ; echo $?) # If not installed, add it to the list of missing bins if [[ $_pkg != 0 ]] ; then bins_missing+=($pkg) fi done pybin=$(which python3) if [ -z $pybin ] ; then run install-packages python3 python3-pip # TODO: make a universal package install function fi pipbin=$(which pip3) if [ -z $pipbin ] ; then run install-packages python3-pip fi for pkg in ${pip_packages[@]} ; do pippkg_installed=$(pip list | grep -F $pkg ; echo $?) if [[ $pippkg_installed != 0 ]] ; then bins_missing+=("pip: $pkg") fi done # This installer requires golang to work # TODO: better handling of prbl_packages as dependencies gobin=$(which go) if [ -z $gobin ] ; then bins_missing+=("prbl: golang.install") fi # Count the number of entries in bins_missing local _bins_missing=${#bins_missing[@]} # If higher than 0, return a fail (1) if [[ $_bins_missing != 0 ]] ; then return 1 else return 0 fi } install-deps(){ logger echo "Installing packages: $sys_packages" for _package in ${sys_packages[@]} ; do run install-packages $_package done if [ -f ${rundir}/requirements.txt ] ; then pip install -y ${rundir}/requirements.txt else if [ ! -z $pip_packages ] ; then pip install ${pip_packages[@]} fi fi for _package in $prbl_packages ; do if [ -f ${rundir}/$_package ] ; then if [[ $dry_run != true ]] ; then boxline "running extra $extra" run "${rundir}/$_package -i" else dry_run=false run "${rundir}/$_package -D" dry_run=true fi else if [[ $dry_run != true ]] ; then run-from-url https://raw.githubusercontent.com/pyr0ball/PRbL-bashrc/main/extras/$_package -i else run-from-url https://raw.githubusercontent.com/pyr0ball/PRbL-bashrc/main/extras/$_package -D fi fi done # Sets dependency installed flag to true depsinstalled=true } dry-run-report(){ box-rounded boxborder "${grn}Dry-run Report:${dfl}" box-norm boxborder \ "bins_missing= " \ "${bins_missing[@]}" \ "backup_files= " \ "${backup_files[@]}" \ "installed_files= " \ "${installed_files[@]}" \ "installed_dirs= " \ "${installed_dirs[@]}" } install(){ if [ ! -f $HOME/.bashrc.d/70-CodeDog.bashrc ] ; then run echo -e "$codedog_bashrc" >> $HOME/.bashrc.d/70-CodeDog.bashrc && boxborder "bashc.d/70-CodeDog.bashrc installed..." fi export PATH="$PATH:$HOME/devl/CodeDog" # Check for dependent applications and offer to install if ! check-deps ; then warn "Some of the utilities needed by this install are missing" boxtop logger boxline "Missing utilities:" for bin in ${bins_missing[@]} ; do logger boxline "$bin" done boxbottom boxborder "Would you like to install them? (this will require root password)" utilsmissing_menu=( "$(boxline "${green_check} Yes")" "$(boxline "${red_x} No")" ) case `select_opt "${utilsmissing_menu[@]}"` in 0) boxborder "${grn}Installing dependencies...${dfl}" install-deps ;; 1) warn "Dependent Utilities missing: $bins_missing" ;; esac fi run mkdir -p $installdir pushd $installdir for repo in "${repo_packages[@]}"; do if ! check-git-repository "repositories/${repo#*/}"; then if [ -d "repositories/${repo#*/}" ] ; then warn "Existing repo ${repo#*/} is broken..." return 1 else logger echo "Cloning ${repo} into ${installdir}/repositories/${repo#*/}" clone-repo "https://github.com/$repo" "${installdir}/repositories/${repo#*/}" fi else pushd "repositories/${repo#*/}" if [[ ${VERSIONS[${repo#*/}]} =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then echo "Version tag detected: ${VERSIONS[${repo#*/}]}" git checkout "${VERSIONS[${repo#*/}]}" else echo "Commit hash detected: ${VERSIONS[${repo#*/}]}" git checkout -q "${VERSIONS[${repo#*/}]}" fi popd fi done popd pushd $installdir/Proteus run sudo python3 ruleMgr.py && logger echo "Proteus Initialized..." popd pushd $installdir/Slipstream run $installdir/CodeDog/codeDog ./Slipstream.dog && logger echo "Slipstream app built at ${installdir}/Slipstream/LinuxBuild" popd } # Function for displaying the usage of this script usage(){ boxborder \ "${lbl}Usage:${dfl}" \ "${lyl}./$scriptname ${bld}[args]${dfl}" \ "$(boxseparator)" \ "[args:]" \ " -i [--install]" \ " -d [--dependencies]" \ " -D [--dry-run]" \ " -r [--remove]" \ " -f [--force]" \ " -F [--force-remove]" \ " -u [--update]" \ " -h [--help]" } case $1 in -i | --install) install && success " [${lbl}Slip${gry}Stream ${lyl}Installed${dfl}]" ;; -r | --remove) remove && success " [${lbl}Slip${gry}Stream ${lyl}Removed${dfl}]" ;; -d | --dependencies) install-deps && success "${lbl}Slip${gry}Stream ${dfl} Dependencies installed!" ;; -D | --dry-run) export dry_run=true install dry-run-report usage unset dry_run success "${lbl}Slip${gry}Stream ${lyl}Installer Dry-Run Complete!${dfl}" ;; -u | --update) export update_run=true update && unset update_run && success " [${lbl}Slip${gry}Stream ${lyl}Updated${dfl}]" ;; -f | --force) remove-arbitrary install && success " [${lbl}Slip${blu}Stream ${lyl}Installed${dfl}]" ;; -F | --force-remove) remove-arbitrary && success " [${lbl}Slip${gry}Stream ${lyl}Force-Removed${dfl}]" ;; -h | --help) usage ;; *) warn "Invalid argument $@" usage #exit 2 ;; esac #------------------------------------------------------# # Script begins here #------------------------------------------------------# #install