├── .github └── workflows │ └── shellcheck.yml ├── CHANGELOG.md ├── LICENSE ├── Launcher-Template.sh ├── LogosLinuxInstaller.bash ├── LogosLinuxInstaller.sh ├── README.md ├── controlPanel-Template.sh ├── export └── img ├── logos4-128-icon.png ├── step_01.png ├── step_02.png ├── step_03.png ├── step_04.png ├── step_05.png ├── step_06.png ├── step_07.png ├── step_08.png ├── step_09.png ├── step_10.png ├── step_11.png ├── step_12.png ├── step_13.png ├── step_14.png ├── step_15.png ├── step_16.png ├── step_17.png ├── step_18.png ├── step_19.png ├── step_20.png ├── step_21.png ├── step_22.png └── verbum-128-icon.png /.github/workflows/shellcheck.yml: -------------------------------------------------------------------------------- 1 | # This is a basic workflow to help you get started with Actions 2 | 3 | name: ShellCheck 4 | 5 | # Controls when the action will run. Triggers the workflow on push or pull request 6 | # events but only for the master branch 7 | on: 8 | push: 9 | branches: [ master ] 10 | pull_request: 11 | branches: [ master ] 12 | 13 | # A workflow run is made up of one or more jobs that can run sequentially or in parallel 14 | jobs: 15 | # This workflow contains a single job called "build" 16 | build: 17 | # The type of runner that the job will run on 18 | runs-on: ubuntu-latest 19 | 20 | # Steps represent a sequence of tasks that will be executed as part of the job 21 | steps: 22 | # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it 23 | - uses: actions/checkout@v3 24 | 25 | - name: ShellCheck 26 | uses: ludeeus/action-shellcheck@master 27 | with: 28 | ignore_names: controlPanel-Template.sh Launcher-Template.sh 29 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | * 3.7.5 3 | - Fix #131. [T. H. Wright] 4 | - Fix #132. [T. H. Wright] 5 | - Fix #157. [T. H. Wright] 6 | - Fix #161. [T. H. Wright] 7 | - Create logos_reuse_downloads(). 8 | * 3.7.4 9 | - Fix #194. [T. H. Wright] 10 | * 3.7.3 11 | - Fix #186. [T. H. Wright] 12 | - Add GUI logging at `~/.local/state/Logos_on_Linux/install.log`. [T. H. Wright] 13 | * 3.7.2 14 | - Fix #178. [T. H. Wright] 15 | - Make AppImage default install. [T. H. Wright] 16 | - Add options to `-D|--debug`. [T. H. Wright] 17 | * 3.7.1 18 | - Add installer `-V|--verbose`. Fix #165. [T. H. Wright] 19 | - Add installer `-k|--make_skel` and `-b|--custom-binary-path`. Resolve TODOs. Fix #166. [T. H. Wright] 20 | - Disable wine 8.0 installs. Fix #148. [T. H. Wright] 21 | * 3.7.0 22 | - Decoupled script from `zenity` and compatible with `dialog` and `whiptail`. Fix #104. [T. H. Wright] 23 | - Make bash path environment agnostic [Vskillet] 24 | - Add bash completion file [T. H. Wright] 25 | - Fix controlPanel's `--winetricks` function [T. H. Wright] 26 | - Fix installer's `-c|--config` function [T. H. Wright] 27 | - Fix launcher's `-s|--short` function [T. H. Wright] 28 | * 3.6.3-1 29 | - Introduce logos_info() and logos_warn() to simplify script feedback. [T. H. Wright] 30 | * 3.6.2 31 | - Retrieve Logos release version from XML feed [T. H. Wright] 32 | - Modify the script version, and update the CHANGELOG to reflect this change. 33 | * 3.6.1 34 | - Introduce logos_error() to simplify error messages. [T. H. Wright] 35 | * 3.6.0 36 | - [T. H. Wright] 37 | - Move generated scripts to separate files: `Launcher-Template.sh`, `controlPanel-Template.sh`. 38 | - Moved generated scripts case statements to optargs (e.g., `-i|--indexing`). Fix #108. 39 | - Added Logos.sh: `-b|--backup`. Fix #110. 40 | - Added Logos.sh: `-r|--restore`. 41 | - Added Logos.sh: `-e|--edit-config`. 42 | - Added `-r|--regenerate-scripts`. 43 | - Added LOGOS.sh: `-R|--check-resources`. Requires `sysstat` and `psrecord`. 44 | - Fix #129. 45 | * 3.5.1 46 | - [T. H. Wright] 47 | - Fix #68. 48 | * 3.5.0 49 | - [T. H. Wright] 50 | - Change in numbering scheme to note if Logos was updated or the script 51 | - Fix #116. 52 | - Added `-c|--config`. 53 | - Added `-F|--skip-fonts`. 54 | * 3.4.0 55 | - [T. H. Wright] 56 | - Fix #36. 57 | - Fix #81. 58 | - Fix #97. 59 | - Fix #99. 60 | - Fix #102. 61 | - Fix #103. 62 | - Fix #107. 63 | - Fix #109. 64 | - Fix #112. 65 | - Added `-f|--force-root`. 66 | - Added `-D|--debug`. 67 | * 3.3.0 68 | - [T. H. Wright] 69 | - Fix #93. 70 | * 3.2.0 71 | - [T. H. Wright] 72 | - Fix #92. 73 | * 3.1.0 74 | - Install DLL d3dcompiler_47 (jg00dman, thw26) 75 | - L10: Change winetricks URL 76 | - L10: allow using local winetricks (thw26) 77 | - L10: add winetricks_dll_install (thw26) 78 | - Add basic optargs: `-h|--help` and `-v|--version` (thw26) 79 | * 3.0.0: 80 | - Refactoring and renaming of scripts, updates to README, by T. H. Wright (thw26) 81 | - Logos 10 and Verbum 10 install scripts by John Goodman (jg00dman) 82 | - NOTE: Scripts are now numbered by Logos version. 83 | - Removal of broken Logos 9 AppImage script by T. H. Wright (thw26) 84 | * v2.41: 85 | - update to LogosBible 9.17.0.0010 86 | * v2.40: 87 | - update to LogosBible 9.15.0.0005 88 | * v2.39: 89 | - added `removeLibraryCatalog` option (thw26) 90 | - update to LogosBible 9.13.0.0018 (thw26) 91 | * v2.38: 92 | - update to LogosBible 9.11.0.0022 93 | * v2.37: 94 | - update to LogosBible 9.10.0.0017 95 | * v2.36: 96 | - update to LogosBible 9.9.0.0011 97 | * v2.35: 98 | - update to LogosBible 9.8.0.0004 99 | * v2.34: 100 | - update to LogosBible 9.7.0.0025 101 | * v2.33: 102 | - added Tahoma 103 | - update to LogosBible 9.7.0.0020 104 | * v2.32: 105 | - update to LogosBible 9.6.0.0024 106 | * v2.31: 107 | - update to LogosBible 9.6.0.0023 108 | * v2.30: 109 | - update to LogosBible 9.6.0.0020 110 | * v2.29: 111 | - update to LogosBible 9.5.0.0019 112 | * v2.28: 113 | - default option to be the WINE native 114 | - removed nodeps AppImage option 115 | - update to LogosBible 9.5.0.0014 116 | * v2.27: 117 | - update to WINE default AppImage 118 | * v2.26: 119 | - update to WINE AppImage v6.5 120 | - added AppImage with deps and new default option 121 | * v2.25: 122 | - update to LogosBible 9.4.0.0009 123 | * v2.24: 124 | - update to LogosBible 9.3.0.0049 by John Goodman (jg00dman) 125 | - added change to vista on winebottle by John Goodman (jg00dman) 126 | * v2.23: 127 | - Typos, spelling, grammar by T. H. Wright (thw26) 128 | - update to LogosBible 9.3.0.0040 129 | * v2.22: 130 | - update to LogosBible 9.2.0.0014 131 | * v2.21: 132 | - update to LogosBible 9.1.0.0018 133 | * v2.20: 134 | - Added default message for some deps 135 | - Removed the unsupported 32bit version 136 | - Changed the AppImage to include one extra libjpeg8 (if you don't have on installed) 137 | - update to LogosBible 9.0.0.0168 138 | * v2.19: 139 | - update to LogosBible 8.17.0.0011 140 | * v2.18: 141 | - LogosBible logo update to optimized file size keeping the quality 142 | - added silent `wineboot` after `selectAppImage` 143 | - change default AppImage to `f11-build-v5.11` with `wineserver` bugfix patch. 144 | * v2.17: 145 | - refactory to a more clean code, improving QA 146 | - added `dirlink` option to `Logos.sh` to create on link to the LogosBible folder inside the Bottle 147 | - added `removeAllIndex` option to `Logos.sh` to workaround some issues (by Frank Sauer) 148 | * v2.16: 149 | - added patch command to dependencies list 150 | - many improves in code quality 151 | - removed `WINETRICKS_EXTRA_OPTION` and added `WINETRICKS_UNATTENDED` 152 | - `winetricks` (mod-updated) tee output and improvements on feedback logs 153 | - added `shortcut` option to `Logos.sh` 154 | - changed default value of `DOWNLOADED_RESOURCES` to `PWD` 155 | - avoiding option on `wineboot` using `DISPLAY=""`, added `WINEBOOT_GUI` to turn it on 156 | * v2.15: 157 | - improved `wait_process_using_dir` function using `lsof` instead of `fuser` 158 | - close all wine process in the bottle if `winetricks` error 159 | - refactor of basic dependencies check. 160 | - added `FORCE_ROOT` variable to allow root installation (that is blocked by default now) 161 | - removed `wait_process_using_dir` for small operations 162 | * v2.14: 163 | - Using one modded `winetricks` with wait function to bugfix installation. 164 | * v2.13: 165 | - improved QA of the script code 166 | - bugfix `WINETRICKS_EXTRA_OPTION` use, now we can do `WINETRICKS_EXTRA_OPTION=""` 167 | - added `logsOn` and `logsOff` options on `Logos.sh` to LogosBible logs 168 | - removed zsync file from `data` directory, it's useful just to fast download. 169 | - removed old `option 4`, then the old `option 5` become new `option 4` 170 | - changed the old `option 5` to use the new AppImage of `wine64`, but without dependencies 171 | - now all AppImage installations use full named AppImage filename, no more generic one 172 | * v2.12: 173 | - added one better wait system to be sure that the installation is ok 174 | - Working in progress of the new `Option 5` to install 64bits 175 | - update LogosBible to 8.16.0.0002 176 | * v2.11: 177 | - scripts refactored to be more clean 178 | - the creation of the scripts are made in the beginning of the installation to make easy debug 179 | - Bugfix some bugs that make wine send exit code before ending (now we wait for any wine procedure in the wineBottle). 180 | - added `bin` directory and links for `wine64` installation and skel64 181 | - added `selectAppImage` option on `Logos.sh` and `controlPanel.sh` 182 | * v2.10: 183 | - call `wineboot` before download and install LogosBible 184 | - improved version of gtk_download 185 | - improved Winetricks opetations 186 | - more optional variables (`LOGOS_URL, LOGOS64_URL, WINE_APPIMAGE_URL, WINE4_APPIMAGE_URL, WINE5_APPIMAGE_URL, WINETRICKS_URL`) 187 | - more space to the multiple option window 188 | - now we can use other `winetricks` after installation, instead of the git one (just put it to the same dir that the `Logos.sh` file) 189 | * v2.9: 190 | - `winetricks` can be get from `DOWNLOADED_RESOURCES` now 191 | - `WINETRICKS_DOWNLOADER` default to `wget` but can be changed setting the variable 192 | - removed the clean question and just clean at the end 193 | - added option 4 that use AppImage wine-staging v4.21 up to dotnet48 then the v5.x to install and run LogosBible 194 | * v2.8: 195 | - back to `Jul 23, 2020` `winetricks` because of automated test fail 196 | - workaround possible issue only setting `PATH` if there is one valid wine on the bin dir. 197 | * v2.7: 198 | - Some workaround to solve pipe error on test servers 199 | - more QA code improvements 200 | - winetricks to `Aug 8, 2020` release 201 | - change wine AppImage url to one exclusive for logos 202 | * v2.5: 203 | - using the `"2020 Jul 23"` `winetricks` now (because of some issues with the last git) 204 | - removed `WINETRICKS_EXTRA_OPTION` `--force` option 205 | - QA fix improve in the generated scripts. 206 | * v2.4: 207 | - variable `WORKDIR` or random tmp. 208 | - more feedback to get download and install winetricks error, terminal feedback too, cancellation is working now, and others. 209 | - `WINETRICKS_EXTRA_OPTION` variable with default `--force` (to install dotnet with new Wine that have bug reports) 210 | - 2 options to make the skel: `skel32` and `skel64`. 211 | - default `DOWNLOADED_RESOURCES` is `/tmp` now. 212 | - many Quality Assurance (qa) fixes too. 213 | * v2.3 there is: 214 | - bugfix links creation 215 | - added the option to index without open LogosBible 216 | * v2.2 there is: 217 | - added `cabextract` and `ntlm_auth` dependency verification 218 | - added `wineserver` Run to the scripts 219 | - added one way to get only the scripts from the installer, so you can just replace the old ones inside your installation (if needed). 220 | * v2.1 is just a bugfix for the unstable 64bits installation. # NOTE: the v2.0 break compatibility with previous versions 221 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 DanielDevBR 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Launcher-Template.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | TITLE="${FLPRODUCT}.sh" 3 | VERSION="${LOGOS_SCRIPT_VERSION}" 4 | AUTHOR="${LOGOS_SCRIPT_AUTHOR}" 5 | # generated by "${LOGOS_SCRIPT_VERSION}" script from https://github.com/ferion11/LogosLinuxInstaller 6 | 7 | # BEGIN ENVIRONMENT 8 | HERE="\$(dirname "\$(readlink -f "\${0}")")" 9 | 10 | # Save IFS 11 | IFS_TMP=\${IFS} 12 | IFS=$'\n' 13 | 14 | # Set config path if the user does not supply one at CLI. 15 | if [ -z "\${CONFIG_PATH}" ]; then 16 | CONFIG_PATH="\${HOME}/.config/Logos_on_Linux/Logos_on_Linux.conf"; export CONFIG_PATH; 17 | fi 18 | 19 | # Source the config path, else use the values saved from when the script was run 20 | # in case the config file's generation failed. This should maintain functionality 21 | # from before the addition of the config file and after. 22 | if [ -f \${CONFIG_PATH} ]; then 23 | set -a; 24 | source \${CONFIG_PATH}; 25 | set +a; 26 | if [ -z "\${FLPRODUCT}" ] || [ -z "\${WINEPREFIX}" ] || [ -z "\${WINE_EXE}" ] || [ -z "\${WINESERVER_EXE}" ] || [ -z "\${LOGOS_EXE}" ] || [ -z "\${LOGOS_DIR}" ]; then 27 | echo "controlPanel.sh needs these variables set in the config file:" 28 | echo "- FLPRODUCT" 29 | echo "- WINEPREFIX" 30 | echo "- WINE_EXE" 31 | echo "- WINESERVER_EXE" 32 | echo "- LOGOS_EXE" 33 | echo "- LOGOS_DIR" 34 | echo "Config file incomplete. Exiting." >&2 && exit 1; 35 | fi 36 | else 37 | [ -x "\${HERE}/data/bin/wine64" ] && export PATH="\${HERE}/data/bin:\${PATH}" 38 | export WINEPREFIX="\${HERE}/data/wine64_bottle"; export WINEPREFIX; 39 | export WINE_EXE="${WINE_EXE}"; export WINE_EXE; 40 | export WINESERVER_EXE="${WINESERVER_EXE}"; export WINESERVER_EXE; 41 | LOGOS_EXE=\$(find "\${WINEPREFIX}" -name ${FLPRODUCT}.exe | grep "${FLPRODUCT}\/${FLPRODUCT}.exe"); export LOGOS_EXE; 42 | LOGOS_DIR="\$(dirname "\${LOGOS_EXE}")"; export LOGOS_DIR; 43 | LOGS="DISABLED"; export LOGS; 44 | fi 45 | 46 | LOGOS_USER="\$(find "\${HERE}"/data/wine64_bottle/drive_c/users/*/AppData/Local/Logos -name Data | sed -r "s@\${HERE}/data/wine64_bottle/drive_c/users/(.*)/AppData/Local/Logos/Data@\1@")"; export LOGOS_USER; 47 | 48 | if [ "\$(find "\${HERE}/data/wine64_bottle/drive_c/users/\${LOGOS_USER}/AppData/Local/Logos/Data/"* -maxdepth 0 -type d | awk -F'/' '{print \$NF}')" ]; then 49 | LOGOS_UID="\$(find "\${HERE}/data/wine64_bottle/drive_c/users/\${LOGOS_USER}/AppData/Local/Logos/Data/"* -maxdepth 0 -type d | awk -F'/' '{print \$NF}')"; export LOGOS_UID; 50 | elif [ -z "LOGOS_UID" ]; then 51 | LOGOS_UID="NoUser"; export LOGOS_UID; 52 | else 53 | : 54 | fi 55 | 56 | [ -z "\${LOGOS_ICON_URL}" ] && export LOGOS_ICON_URL="${LOGOS_ICON_URL}" 57 | LOGOS_ICON_FILENAME="\$(basename "\${LOGOS_ICON_URL}")"; export LOGOS_ICON_FILENAME; 58 | if [ -z "\${WINEDEBUG}" ]; then WINEDEBUG="fixme-all,err-all"; export WINEDEBUG; fi # Make wine output less verbose 59 | # END ENVIRONMENT 60 | # BEGIN FUNCTION DECLARATIONS 61 | usage() { 62 | cat << UEOF 63 | \$TITLE, by \$AUTHOR, \$VERSION. 64 | 65 | Usage: ./\$TITLE 66 | Interact with ${FLPRODUCT} Bible Software in Wine on Linux. 67 | 68 | Options: 69 | -h --help Prints this help message and exit. 70 | -v --version Prints version information and exit. 71 | -D --debug Makes Wine print out additional info. 72 | -f --force-root Sets LOGOS_FORCE_ROOT to true, which 73 | permits the root user to run the script. 74 | -R --check-resources Check ${FLPRODUCT}'s resource usage. 75 | -e --edit-config Edit the Logos on Linux config file. 76 | -i --indexing Run the ${FLPRODUCT} indexer in the 77 | background. 78 | -b --backup Saves ${FLPRODUCT} data to the config's 79 | backup location. 80 | -r --restore Restores ${FLPRODUCT} data from the config's 81 | backup location. 82 | -l --logs Turn Logos logs on or off. 83 | -d --dirlink Create a symlink to the Windows Logos directory 84 | in your Logos on Linux install dir. 85 | The symlink's name will be 'installation_dir'. 86 | -s --shortcut Create or update the Logos shortcut, located in 87 | HOME/.local/share/applications. 88 | --remove-all-index Removes all index and library catalog files. 89 | --remove-library-catalog Removes all library catalog files. 90 | --install-bash-completion Installs the bash completion file to 91 | /etc/bash_completion.d/. 92 | UEOF 93 | } 94 | 95 | resourceSnapshot() { 96 | if [[ \$(which pidstat) ]]; then 97 | PIDSTR=\$(ps faux | grep "\${FLPRODUCT}" | grep "\${LOGOS_USER}" | grep -vE "(grep)" | awk '{printf "%s%s",sep, \$2; sep=" -p "} END{print ""}'); 98 | printf "Snapshot of Logos System Resource Usage:\n\n" 99 | eval "pidstat --human -p \${PIDSTR}" 100 | eval "pidstat --human -d -p \${PIDSTR}" 101 | printf "\n---\n" 102 | echo "Note: There may be some processes improperly included." 103 | else 104 | echo "ERR: You need to install the 'sysstat' package in order to get the resource checking option's resource usage snapshot." 105 | fi 106 | } 107 | 108 | resourcePlot() { 109 | if [[ \$(which psrecord) ]]; then 110 | declare -a PIDARR PLOT; 111 | PIDARR=(\$(ps faux | grep "\${FLPRODUCT}" | grep "\${LOGOS_USER}" | grep -vE "(grep)" | awk '{print \$2}')); 112 | for i in \${!PIDARR[@]}; do 113 | PLOTNAME="\${APPDIR}/Logos-Resource-Plot_\${PIDARR[\$i]}.png" 114 | psrecord "\${PIDARR[\$i]}" --interval 1 --duration 60 --plot "\${PLOTNAME}" & PLOT[\$i]=\$! 115 | echo "Writing resource plot to \${PLOTNAME}." 116 | WAIT_PIDS="\${WAIT_PIDS} \${PLOT[\$i]}" 117 | done 118 | echo "Recordings will take 1 minute." 119 | eval "wait \${WAIT_PIDS}" 120 | exit ; 121 | else 122 | echo "ERR: You need to install the 'psrecord' package in order to get the resource checking option's resource usage plot." 123 | fi 124 | } 125 | 126 | removeAllIndex() { 127 | echo "======= removing all ${FLPRODUCT}Bible BibleIndex, LibraryIndex, PersonalBookIndex, and LibraryCatalog files: =======" 128 | LOGOS_EXE="\$(find "\${WINEPREFIX}" -name ${FLPRODUCT}.exe | grep "${FLPRODUCT}\/${FLPRODUCT}.exe")" 129 | LOGOS_DIR="\$(dirname "\${LOGOS_EXE}")" 130 | rm -fv "\${LOGOS_DIR}"/Data/*/BibleIndex/* 131 | rm -fv "\${LOGOS_DIR}"/Data/*/LibraryIndex/* 132 | rm -fv "\${LOGOS_DIR}"/Data/*/PersonalBookIndex/* 133 | rm -fv "\${LOGOS_DIR}"/Data/*/LibraryCatalog/* 134 | echo "======= removing all ${FLPRODUCT}Bible index files done! =======" 135 | exit 0 136 | } 137 | 138 | removeLibraryCatalog() { 139 | echo "======= removing ${FLPRODUCT}Bible LibraryCatalog files only: =======" 140 | rm -fv "\${LOGOS_DIR}"/Data/*/LibraryCatalog/* 141 | echo "======= removing all ${FLPRODUCT}Bible index files done! =======" 142 | exit 0 143 | } 144 | 145 | indexing() { 146 | LOGOS_INDEXER_EXE=\$(find "\${WINEPREFIX}" -name ${FLPRODUCT}Indexer.exe | grep "${FLPRODUCT}\/System\/${FLPRODUCT}Indexer.exe") 147 | if [ -z "\${LOGOS_INDEXER_EXE}" ] ; then 148 | echo "* ERROR: the ${FLPRODUCT}Indexer.exe can't be found!!!" 149 | exit 1 150 | fi 151 | echo "* Closing anything running in this wine bottle:" 152 | "\${WINESERVER_EXE}" -k 153 | echo "* Running the indexer:" 154 | "\${WINE_EXE}" "\${LOGOS_INDEXER_EXE}" 155 | "\${WINESERVER_EXE}" -w 156 | echo "======= indexing of ${FLPRODUCT}Bible run done! =======" 157 | exit 0 158 | } 159 | 160 | have_dep() { 161 | command -v "\$1" >/dev/null 2>&1 162 | } 163 | 164 | check_commands() { 165 | for cmd in "\$@"; do 166 | if have_dep "\${cmd}"; then 167 | : 168 | else 169 | MISSING_CMD+=("\${cmd}") 170 | fi 171 | done 172 | if [ "\${#MISSING_CMD[@]}" -ne 0 ]; then 173 | echo "Your system is missing \${MISSING_CMD[*]}. Please install your distro's \${MISSING_CMD[*]} packages. Exiting." 174 | exit 1; 175 | fi 176 | } 177 | 178 | yes_or_no() { 179 | while true; do 180 | read -p "\$* [Y/n]: " yn 181 | case "\$yn" in 182 | [Yy]*) return 0 ;; 183 | [Nn]*) echo "Exiting"; return 1 ;; 184 | esac 185 | done 186 | } 187 | 188 | # Source: https://unix.stackexchange.com/a/259254/123999 189 | bytesToHumanReadable() { 190 | local i=\${1:-0} d="" s=0 S=("Bytes" "KiB" "MiB" "GiB" "TiB" "PiB" "EiB" "YiB" "ZiB") 191 | while ((i > 1024 && s < \${#S[@]}-1)); do 192 | printf -v d ".%02d" \$((i % 1024 * 100 / 1024)) 193 | i=\$((i / 1024)) 194 | s=\$((s + 1)) 195 | done 196 | echo "\$i$d \${S[\$s]}" 197 | } 198 | 199 | checkDiskSpace() { 200 | if [ "\$1" == "b" ]; then 201 | DOCUMENTS_SPACE=\$(du --max=1 "\${SOURCEDIR}/Documents" | tail -n1 | cut -f1) 202 | USERS_SPACE=\$(du --max=1 "\${SOURCEDIR}/Users" | tail -n1 | cut -f1) 203 | DATA_SPACE=\$(du --max=1 "\${SOURCEDIR}/Data" | tail -n1 | cut -f1) 204 | REQUIRED_SPACE="\$(echo "\${DOCUMENTS_SPACE}" + "\${USERS_SPACE}" + "\${DATA_SPACE}" ' * 1024' | bc)"; export REQUIRED_SPACE; 205 | AVAILABLE_SPACE=\$(echo \$(df "\${BACKUPDIR}" | awk 'NR==2 {print \$4}') ' * 1024' | bc); export AVAILABLE_SPACE; 206 | REQUIRED_SPACE_HR=\$(bytesToHumanReadable "\${REQUIRED_SPACE}"); export REQUIRED_SPACE_HR; 207 | AVAILABLE_SPACE_HR=\$(bytesToHumanReadable "\${AVAILABLE_SPACE}"); export AVAILABLE_SPACE_HR; 208 | if (( \$AVAILABLE_SPACE < \$REQUIRED_SPACE )); then 209 | echo "Your install needs no more than \$REQUIRED_SPACE_HR but your backup directory only has \$AVAILABLE_SPACE_HR."; 210 | return 1; 211 | else 212 | if [[ "\$(read -e -p "Your install needs no more than \$REQUIRED_SPACE_HR. Your backup directory has \$AVAILABLE_SPACE_HR. Linux systems usually suggest using no more than 80% disk capacity. Proceed with backup? [Y/n]: "; echo \$REPLY)" == [Yy]* ]]; then 213 | return 0; 214 | else 215 | echo "Exiting."; 216 | exit 1; 217 | fi 218 | fi 219 | elif [ "\$1" == "r" ]; then 220 | REQUIRED_SPACE="\$(du --max=1 "\${BACKUPDIR}" | tail -n1 | cut -f1)"; export REQUIRED_SPACE; 221 | AVAILABLE_SPACE="\$(df "\${SOURCEDIR}" | awk 'NR==2 {print \$4}')"; export AVAILABLE_SPACE; 222 | REQUIRED_SPACE_HR="\$(du --max=1 "\${BACKUPDIR}" | tail -n1 | cut -f1)"; export REQUIRED_SPACE_HR; 223 | AVAILABLE_SPACE_HR="\$(df -h "\${SOURCEDIR}" | awk 'NR==2 {print \$4}')"; export AVAILABLE_SPACE_HR 224 | if (( \$AVAILABLE_SPACE < \$REQUIRED_SPACE )); then 225 | echo "Your install needs no more than \$REQUIRED_SPACE but your install directory only has \$AVAILABLE_SPACE."; 226 | return 1; 227 | else 228 | if [[ "\$(read -e -p "Your install needs no more than \$REQUIRED_SPACE. Your backup directory has \$AVAILABLE_SPACE. Linux systems usually suggest using no more than 80% disk capacity. Proceed with backup? [Y/n]: "; echo \$REPLY)" == [Yy]* ]]; then 229 | return 0; 230 | else 231 | echo "Exiting."; 232 | exit 1; 233 | fi 234 | fi 235 | fi 236 | } 237 | 238 | backup() { 239 | check_commands rsync; 240 | 241 | if [ "\${LOGOS_UID}" = "NoUser" ]; then 242 | echo "You must log in to your account first. Exiting." 243 | exit 1; 244 | fi 245 | 246 | if [ -d "\${BACKUPDIR}" ]; then 247 | SOURCEDIR="\${HERE}/data/wine64_bottle/drive_c/users/\${LOGOS_USER}/AppData/Local/Logos"; export SOURCEDIR; 248 | BACKUPDIR="\$BACKUPDIR"; export BACKUPDIR; 249 | checkDiskSpace b; 250 | mkdir -p "\${BACKUPDIR}/\${LOGOS_UID}" 251 | rsync -avhP --delete "\${SOURCEDIR}/Documents/" "\${BACKUPDIR}/\${LOGOS_UID}/Documents/"; 252 | rsync -avhP --delete "\${SOURCEDIR}/Users/" "\${BACKUPDIR}/\${LOGOS_UID}/Users/"; 253 | rsync -avhP --delete "\${SOURCEDIR}/Data/" "\${BACKUPDIR}/\${LOGOS_UID}/Data/"; 254 | exit 0; 255 | else 256 | echo "Backup directory does not exist. Exiting."; 257 | exit 1; 258 | fi 259 | } 260 | 261 | # TODO: The restore command restores the backup's Logos UID, but if this is a new install, this UID will be different. The restore command should account for this change. 262 | restore() { 263 | check_commands rsync; 264 | 265 | if [ "\${LOGOS_UID}" = "NoUser" ]; then 266 | echo "You must log in to your account first. Exiting." 267 | exit 1; 268 | fi 269 | 270 | if [ -d "\${BACKUPDIR}" ]; then 271 | SOURCEDIR="\${HERE}/data/wine64_bottle/drive_c/users/\${LOGOS_USER}/AppData/Local/Logos"; export SOURCEDIR; 272 | BACKUPDIR="\$BACKUPDIR"; export BACKUPDIR; 273 | checkDiskSpace r; 274 | rsync -avhP "\$BACKUPDIR/\$LOGOS_UID/Documents/" "\$SOURCEDIR/Documents/"; 275 | rsync -avhP "\$BACKUPDIR/\$LOGOS_UID/Users/" "\$SOURCEDIR/Users/"; 276 | rsync -avhP "\$BACKUPDIR/\$LOGOS_UID/Data/" "\$SOURCEDIR/Data/"; 277 | exit 0; 278 | else 279 | echo "Backup directory does not exist. Exiting."; 280 | exit 1; 281 | fi 282 | } 283 | 284 | logsOn() { 285 | echo "======= enable ${FLPRODUCT}Bible logging only: =======" 286 | "\${WINE_EXE}" reg add "HKCU\\\\Software\\\\Logos4\\\\Logging" /v Enabled /t REG_DWORD /d 0001 /f 287 | "\${WINESERVER_EXE}" -w 288 | sed -i 's/LOGS="DISABLED"/LOGS="ENABLED"/' \${CONFIG_PATH} 289 | echo "======= enable ${FLPRODUCT}Bible logging done! =======" 290 | exit 0 291 | } 292 | 293 | logsOff() { 294 | echo "======= disable ${FLPRODUCT}Bible logging only: =======" 295 | "\${WINE_EXE}" reg add "HKCU\\\\Software\\\\Logos4\\\\Logging" /v Enabled /t REG_DWORD /d 0000 /f 296 | "\${WINESERVER_EXE}" -w 297 | sed -i -E 's/LOGS=".*"/LOGS="DISABLED"/' \${CONFIG_PATH} 298 | echo "======= disable ${FLPRODUCT}Bible logging done! =======" 299 | exit 0 300 | } 301 | 302 | dirlink() { 303 | echo "======= making ${FLPRODUCT}Bible directory lik only: =======" 304 | LOGOS_DIR_RELATIVE="\$(realpath --relative-to="\${HERE}" "\${LOGOS_DIR}")" 305 | rm -f "\${HERE}/installation_dir" 306 | ln -s "\${LOGOS_DIR_RELATIVE}" "\${HERE}/installation_dir" 307 | echo "dirlink created at: \${HERE}/installation_dir" 308 | echo "======= making ${FLPRODUCT}Bible directory link done! =======" 309 | exit 0 310 | } 311 | 312 | shortcut() { 313 | echo "======= making new ${FLPRODUCT}Bible shortcut only: =======" 314 | [ ! -f "\${HERE}/data/\${LOGOS_ICON_FILENAME}" ] && wget --inet4-only -c "\${LOGOS_ICON_URL}" -P "\${HERE}/data" 315 | mkdir -p "\${HOME}/.local/share/applications" 316 | rm -rf "\${HOME}/.local/share/applications/${FLPRODUCT}Bible.desktop" 317 | rm -rf "\${HOME}/.local/share/applications/${FLPRODUCT} Bible.desktop" 318 | [ ! -f "\${HOME}/.local/share/applications/${FLPRODUCT}Bible.desktop" ] && touch "\${HOME}/.local/share/applications/${FLPRODUCT}Bible.desktop" 319 | cat > "\${HOME}/.local/share/applications/${FLPRODUCT}Bible.desktop" << SEOF 320 | [Desktop Entry] 321 | Name=${FLPRODUCT}Bible 322 | Comment=A Bible Study Library with Built-In Tools 323 | Exec=\${HERE}/${FLPRODUCT}.sh 324 | Icon=\${HERE}/data/${FLPRODUCTi}-128-icon.png 325 | Terminal=false 326 | Type=Application 327 | Categories=Education; 328 | SEOF 329 | chmod 755 "\${HOME}/.local/share/applications/${FLPRODUCT}Bible.desktop" 330 | echo "File: \${HOME}/.local/share/applications/${FLPRODUCT}Bible.desktop updated" 331 | echo "======= making new ${FLPRODUCT}Bible.desktop shortcut done! =======" 332 | exit 0 333 | } 334 | 335 | installBashCompletion() { 336 | URL="https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/master/LogosLinuxInstaller.bash" 337 | wget -O "${HOME}/Downloads/LogosLinuxInstaller.bash" "${URL}" 338 | if [ -d "/etc/bash_completion.d" ]; then 339 | sudo mv "${HOME}/Downloads/LogosLinuxInstaller.bash" /etc/bash_completion.d/ 340 | else 341 | echo "ERROR: /etc/bash_completion.d is missing." 342 | exit 1 343 | fi 344 | } 345 | # END FUNCTION DECLARATIONS 346 | # BEGIN OPTARGS 347 | RESET_OPTARGS=true 348 | for arg in "\$@" 349 | do 350 | if [ -n "\$RESET_OPTARGS" ]; then 351 | unset RESET_OPTARGS 352 | set -- 353 | fi 354 | case "\$arg" in # Relate long options to short options 355 | --help) set -- "\$@" -h ;; 356 | --version) set -- "\$@" -v ;; 357 | --force-root) set -- "\$@" -f ;; 358 | --debug) set -- "\$@" -D ;; 359 | --check-resources) set -- "\$@" -R ;; 360 | --edit-config) set -- "\$@" -e ;; 361 | --indexing) set -- "\$@" -i ;; 362 | --backup) set -- "\$@" -b ;; 363 | --restore) set -- "\$@" -r ;; 364 | --logs) set -- "\$@" -l ;; 365 | --dirlink) set -- "\$@" -d ;; 366 | --shortcut) set -- "\$@" -s ;; 367 | *) set -- "\$@" "\$arg" ;; 368 | esac 369 | done 370 | OPTSTRING=':-:bdDefhilRrsv' # Available options 371 | 372 | # First loop: set variable options which may affect other options 373 | while getopts "\$OPTSTRING" opt; do 374 | case \$opt in 375 | f) export LOGOS_FORCE_ROOT="1"; ;; 376 | D) export DEBUG=true; 377 | WINEDEBUG=""; ;; 378 | \\?) echo "\$TITLE: -\$OPTARG: undefined option." >&2 && usage >&2 && exit ;; 379 | :) echo "\$TITLE: -\$OPTARG: missing argument." >&2 && usage >&2 && exit ;; 380 | esac 381 | done 382 | OPTIND=1 # Reset the index. 383 | 384 | # Second loop: determine user action 385 | while getopts "\$OPTSTRING" opt; do 386 | case \$opt in 387 | h) usage && exit ;; 388 | v) echo "\$TITLE, \$VERSION by \$AUTHOR. Logos Installer Version (may be updated since): \$LOGOS_EXECUTABLE"; 389 | "\${WINE_EXE}" "--version" 390 | exit ;; 391 | -) 392 | case "\${OPTARG}" in 393 | remove-all-index) 394 | removeAllIndex ;; 395 | remove-library-catalog) 396 | removeLibraryCatalog ;; 397 | install-bash-completion) 398 | installBashCompletion ;; 399 | *) 400 | if [ "\$OPTERR" = 1 ] && [ "\${OPTSTRING:0:1}" != ":" ]; then 401 | echo "\$TITLE: --\${OPTARG}: undefined option." >&2 && usage >&2 && exit 402 | fi 403 | esac;; 404 | R) 405 | resourceSnapshot; 406 | resourcePlot; 407 | exit ;; 408 | e) 409 | if [ -n "\${EDITOR}" ]; then 410 | "\${EDITOR}" "\${CONFIG_PATH}" ; 411 | else 412 | echo "Error: The EDITOR variable is not set in user's environment." 413 | fi 414 | exit ;; 415 | i) 416 | indexing ;; 417 | b) 418 | backup ;; 419 | r) 420 | restore ;; 421 | l) 422 | if [ -f "\${CONFIG_PATH}" ]; then 423 | if [ "\${LOGS}" -eq "DISABLED" ]; then 424 | logsOn; 425 | elif [ "\${LOGS}" -eq "ENABLED" ]; then 426 | logsOff; 427 | else 428 | echo "LOGS var improperly set. Disabling ${FLPRODUCT} logs and resetting the LOGS value."; 429 | logsOff; 430 | fi 431 | else 432 | echo "--logs command failed. \${CONFIG_FILE} does not exist. Exiting."; 433 | fi 434 | ;; 435 | d) 436 | dirlink ;; 437 | s) 438 | shortcut ;; 439 | \\?) echo "\$TITLE: -\$OPTARG: undefined option." >&2 && usage >&2 && exit ;; 440 | :) echo "\$TITLE: -\$OPTARG: missing argument." >&2 && usage >&2 && exit ;; 441 | esac 442 | done 443 | if [ "\$OPTIND" -eq '1' ]; then 444 | echo "No options were passed."; 445 | fi 446 | shift \$((OPTIND-1)) 447 | # END OPTARGS 448 | 449 | # BEGIN DIE IF ROOT 450 | if [ "\$(id -u)" -eq '0' ] && [ -z "\${LOGOS_FORCE_ROOT}" ]; then 451 | echo "* Running Wine/winetricks as root is highly discouraged. Use -f|--force-root if you must run as root. See https://wiki.winehq.org/FAQ#Should_I_run_Wine_as_root.3F" 452 | exit 1; 453 | fi 454 | # END DIE IF ROOT 455 | 456 | debug() { 457 | [[ \$DEBUG = true ]] && return 0 || return 1 458 | } 459 | 460 | debug && echo "Debug mode enabled." 461 | 462 | if [ -z "\${LOGOS_EXE}" ] ; then 463 | echo "======= Running control: =======" 464 | "\${HERE}/controlPanel.sh" "\$@" 465 | echo "======= control run done! =======" 466 | exit 0 467 | fi 468 | 469 | "\${WINE_EXE}" "\${LOGOS_EXE}" 470 | "\${WINESERVER_EXE}" -w 471 | #------------------------------------------------- 472 | 473 | #------------- Ending block ---------------------- 474 | # restore IFS 475 | IFS=\${IFS_TMP} 476 | #------------------------------------------------- 477 | 478 | -------------------------------------------------------------------------------- /LogosLinuxInstaller.bash: -------------------------------------------------------------------------------- 1 | # shellcheck disable=SC2207 2 | _logoslinuxinstaller_completions() { 3 | LOGOSLINUXINSTALLER_OPTIONS='-h --help -v --version -D --debug -c --config -r --regenerate-scripts -F --skip-fonts -f --force-root' 4 | COMPREPLY=($(compgen -W "${LOGOSLINUXINSTALLER_OPTIONS}" -- "${COMP_WORDS[1]}")) 5 | } 6 | 7 | complete -F _logoslinuxinstaller_completions ./LogosLinuxInstaller.sh 8 | complete -F _logoslinuxinstaller_completions LogosLinuxInstaller 9 | 10 | _logos_completions() { 11 | LOGOS_OPTIONS='-h --help -v --version -D --debbug -f --force-root -R --check-resources -e --edit-config -i --indexing -b --backup -r --restore -l --logs -d --dirlink -s --shortcut --remove-all-index --remove-library-catalog --install-bash-completion' 12 | COMPREPLY=($(compgen -W "${LOGOS_OPTIONS}" -- "${COMP_WORDS[1]}")) 13 | } 14 | 15 | complete -F _logos_completions ./Logos.sh 16 | complete -F _logos_completions ./Verbum.sh 17 | complete -F _logos_completions Logos 18 | complete -F _logos_completions Verbum 19 | complete -F _logos_completions logos 20 | complete -F _logos_completions verbum 21 | complete -F _logos_completions lbs 22 | 23 | _logos_controlpanel_completions() { 24 | CONTROLPANEL_OPTIONS='-h --help -v --version -D --debug -f --force-root --wine64 --wineserver --winetricks --setAppImage' 25 | COMPREPLY=($(compgen -W "${CONTROLPANEL_OPTIONS}" -- "${COMP_WORDS[1]}")) 26 | } 27 | 28 | complete -F _logos_controlpanel_completions ./controlPanel.sh 29 | complete -F _logos_controlpanel_completions controlPanel 30 | 31 | # ex: filetype=sh 32 | 33 | -------------------------------------------------------------------------------- /LogosLinuxInstaller.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # shellcheck disable=SC2317 3 | export LOGOS_SCRIPT_TITLE="Logos Linux Installer" # From https://github.com/ferion11/LogosLinuxInstaller 4 | export LOGOS_SCRIPT_AUTHOR="Ferion11, John Goodman, T. H. Wright" 5 | export LOGOS_SCRIPT_VERSION="3.7.5" # Script version for this Installer Script 6 | 7 | ##### 8 | # Originally written by Ferion11. 9 | # Modified to install Logoos 10 by Revd. John Goodman M0RVJ 10 | # Made script agnostic to Logos and Verbum as well as version; made script functions abstract, added optargs, made CLI first class, general code refactoring by Revd. T. H. Wright 11 | ##### 12 | 13 | # BEGIN ENVIRONMENT 14 | if [ -z "${WINE64_APPIMAGE_FULL_VERSION}" ]; then WINE64_APPIMAGE_FULL_VERSION="v7.18-staging"; export WINE64_APPIMAGE_FULL_VERSION; fi 15 | if [ -z "${WINE64_APPIMAGE_FULL_URL}" ]; then WINE64_APPIMAGE_FULL_URL="https://github.com/ferion11/LogosLinuxInstaller/releases/download/wine-devel-8.19/wine-devel_8.19-x86_64.AppImage"; export WINE64_APPIMAGE_FULL_URL; fi 16 | if [ -z "${WINE64_APPIMAGE_FULL_FILENAME}" ]; then WINE64_APPIMAGE_FULL_FILENAME="$(basename "${WINE64_APPIMAGE_FULL_URL}")"; export WINE64_APPIMAGE_FULL_FILENAME; fi 17 | if [ -z "${WINE64_APPIMAGE_VERSION}" ]; then WINE64_APPIMAGE_VERSION="v7.18-staging"; export WINE64_APPIMAGE_VERSION; fi 18 | if [ -z "${WINE64_APPIMAGE_URL}" ]; then WINE64_APPIMAGE_URL="https://github.com/ferion11/LogosLinuxInstaller/releases/download/v10.0-1/wine-staging_7.18-x86_64.AppImage"; export WINE64_APPIMAGE_URL; fi 19 | if [ -z "${WINE64_BOTTLE_TARGZ_URL}" ]; then WINE64_BOTTLE_TARGZ_URL="https://github.com/ferion11/wine64_bottle_dotnet/releases/download/v5.11b/wine64_bottle.tar.gz"; export WINE64_BOTTLE_TARGZ_URL; fi 20 | if [ -z "${WINE64_BOTTLE_TARGZ_NAME}" ]; then WINE64_BOTTLE_TARGZ_NAME="wine64_bottle.tar.gz"; export WINE64_BOTTLE_TARGZ_NAME; fi 21 | if [ -z "${WINE64_APPIMAGE_FILENAME}" ]; then WINE64_APPIMAGE_FILENAME="$(basename "${WINE64_APPIMAGE_URL}" .AppImage)"; export WINE64_APPIMAGE_FILENAME; fi 22 | if [ -z "${APPIMAGE_LINK_SELECTION_NAME}" ]; then APPIMAGE_LINK_SELECTION_NAME="selected_wine.AppImage"; export APPIMAGE_LINK_SELECTION_NAME; fi 23 | if [ -z "${WINETRICKS_URL}" ]; then WINETRICKS_URL="https://raw.githubusercontent.com/Winetricks/winetricks/5904ee355e37dff4a3ab37e1573c56cffe6ce223/src/winetricks"; export WINETRICKS_URL; fi 24 | if [ -z "${LAUNCHER_TEMPLATE_URL}" ]; then LAUNCHER_TEMPLATE_URL="https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/master/Launcher-Template.sh"; export LAUNCHER_TEMPLATE_URL; fi 25 | if [ -z "${CONTROL_PANEL_TEMPLATE_URL}" ]; then CONTROL_PANEL_TEMPLATE_URL="https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/master/controlPanel-Template.sh"; export CONTROL_PANEL_TEMPLATE_URL; fi 26 | if [ -z "${WINETRICKS_DOWNLOADER+x}" ]; then WINETRICKS_DOWNLOADER="wget" ; export WINETRICKS_DOWNLOADER; fi 27 | if [ -z "${WINETRICKS_UNATTENDED+x}" ]; then WINETRICKS_UNATTENDED="" ; export WINETRICKS_UNATTENDED; fi 28 | if [ -z "${WORKDIR}" ]; then WORKDIR="$(mktemp -d /tmp/LBS.XXXXXXXX)"; export WORKDIR ; fi 29 | if [ -z "${PRESENT_WORKING_DIRECTORY}" ]; then PRESENT_WORKING_DIRECTORY="${PWD}" ; export PRESENT_WORKING_DIRECTORY; fi 30 | if [ -z "${LOGOS_FORCE_ROOT+x}" ]; then export LOGOS_FORCE_ROOT="" ; fi 31 | if [ -z "${WINEBOOT_GUI+x}" ]; then export WINEBOOT_GUI="" ; fi 32 | if [ -z "${EXTRA_INFO}" ]; then EXTRA_INFO="The following packages are usually necessary: winbind cabextract libjpeg8."; export EXTRA_INFO; fi 33 | if [ -z "${DEFAULT_CONFIG_PATH}" ]; then DEFAULT_CONFIG_PATH="${HOME}/.config/Logos_on_Linux/Logos_on_Linux.conf"; export DEFAULT_CONFIG_PATH; fi 34 | if [ -z "${LOGOS_LOG}" ]; then LOGOS_LOG="${HOME}/.local/state/Logos_on_Linux/install.log"; mkdir -p "${HOME}/.local/state/Logos_on_Linux"; touch "${LOGOS_LOG}"; export LOGOS_LOG; fi 35 | if [ -z "${WINEDEBUG}" ]; then WINEDEBUG="fixme-all,err-all"; fi; export WINEDEBUG # Make wine output less verbose 36 | if [ -z "${DEBUG}" ]; then DEBUG="FALSE"; fi; export DEBUG 37 | if [ -z "${VERBOSE}" ]; then VERBOSE="FALSE"; fi; export VERBOSE 38 | 39 | # END ENVIRONMENT 40 | # BEGIN FUNCTION DECLARATIONS 41 | usage() { 42 | cat << EOF 43 | $LOGOS_SCRIPT_TITLE, by $LOGOS_SCRIPT_AUTHOR, $LOGOS_SCRIPT_VERSION. 44 | 45 | Usage: ./LogosLinuxInstaller.sh 46 | Installs ${FLPRODUCT} Bible Software with Wine on Linux. 47 | 48 | Options: 49 | -h --help Prints this help message and exit. 50 | -v --version Prints version information and exit. 51 | -V --verbose Enable extra CLI verbosity. 52 | -D --debug Makes Wine print out additional info. 53 | -c --config Use the Logos on Linux config file when 54 | setting environment variables. Defaults to: 55 | \$HOME/.config/Logos_on_Linux/Logos_on_Linux.conf 56 | Optionally can accept a config file provided by 57 | the user. 58 | -b --custom-binary-path Set a custom path to search for wine binaries 59 | during the install. 60 | -r --regenerate-scripts Regenerates the Logos.sh and controlPanel.sh 61 | scripts using the config file. 62 | -F --skip-fonts Skips installing corefonts and tahoma. 63 | -f --force-root Sets LOGOS_FORCE_ROOT to true, which permits 64 | the root user to run the script. 65 | -k --make-skel Make a skeleton install only. 66 | EOF 67 | } 68 | 69 | die-if-running() { 70 | PIDF=/tmp/LogosLinuxInstaller.pid 71 | 72 | if [ -f "${PIDF}" ]; then 73 | if logos_continue_question "The script is already running on PID $(cat "${PIDF}"). Should it be killed to allow this instance to run?" "The script is already running. Exiting." "1"; then 74 | kill -9 "$(cat "${PIDF}")" 75 | fi 76 | fi 77 | trap 'rm -f -- "${PIDF}"' EXIT 78 | echo $$ > "${PIDF}" 79 | } 80 | 81 | die-if-root() { 82 | if [ "$(id -u)" -eq '0' ] && [ -z "${LOGOS_FORCE_ROOT}" ]; then 83 | logos_error "Running Wine/winetricks as root is highly discouraged. Use -f|--force-root if you must run as root. See https://wiki.winehq.org/FAQ#Should_I_run_Wine_as_root.3F" 84 | fi 85 | } 86 | 87 | verbose() { [[ $VERBOSE = true ]] && return 0 || return 1; }; 88 | 89 | debug() { [[ $DEBUG = true ]] && return 0 || return 1; }; 90 | 91 | setDebug() { 92 | DEBUG="true"; 93 | VERBOSE="true"; 94 | WINEDEBUG=""; 95 | set -x; 96 | echo "Debug mode enabled." >> "${LOGOS_LOG}"; 97 | } 98 | 99 | die() { echo >&2 "$*"; exit 1; }; 100 | 101 | t(){ type "$1"&>/dev/null; }; 102 | 103 | # Sources: 104 | # https://askubuntu.com/a/1021548/680649 105 | # https://unix.stackexchange.com/a/77138/123999 106 | getDialog() { 107 | if [ -z "${DISPLAY}" ]; then 108 | logos_error "The installer does not work unless you are running a display" 109 | exit 1 110 | fi 111 | 112 | DIALOG="" 113 | DIALOG_ESCAPE="" 114 | 115 | if [[ -t 0 ]]; then 116 | verbose && echo "Running in terminal." 117 | while :; do 118 | t whiptail && DIALOG=whiptail && break 119 | t dialog && DIALOG=dialog && DIALOG_ESCAPE=-- && export DIALOG_ESCAPE && break 120 | if test "${XDG_CURRENT_DESKTOP}" != "KDE"; then 121 | t zenity && DIALOG=zenity && GUI=true && break 122 | #t kdialog && DIALOG=kdialog && GUI=true && break 123 | elif test "${XDG_CURRENT_DESKTOP}" == "KDE"; then 124 | #t kdialog && DIALOG=kdialog && GUI=true && break 125 | t zenity && DIALOG=zenity && GUI=true && break 126 | else 127 | echo "No dialog program found. Please install either dialog, whiptail, zenity, or kdialog"; 128 | fi 129 | done; 130 | else 131 | verbose && echo "Running by double click." >> "${LOGOS_LOG}" 132 | while :; do 133 | if test "${XDG_CURRENT_DESKTOP}" != "KDE"; then 134 | t zenity && DIALOG=zenity && GUI=true && break 135 | #t kdialog && DIALOG=kdialog && GUI=true && break 136 | elif test "${XDG_CURRENT_DESKTOP}" == "KDE"; then 137 | #t kdialog && DIALOG=kdialog && GUI=true && break 138 | t zenity && DIALOG=zenity && GUI=true && break 139 | else 140 | no-diag-msg "No dialog program found. Please install either zenity or kdialog." 141 | fi 142 | done; 143 | fi; export DIALOG; export GUI; 144 | } 145 | 146 | have_dep() { 147 | command -v "$1" >/dev/null 2>&1 148 | } 149 | 150 | clean_all() { 151 | logos_info "Cleaning all temp files…" 152 | rm -fr "/tmp/LBS.*" 153 | rm -fr "${WORKDIR}" 154 | logos_info "done" 155 | } 156 | 157 | light_wineserver_wait() { 158 | ${WINESERVER_EXE} -w | logos_progress "Waiting for ${WINE_EXE} to end properly…" "Waiting for ${WINE_EXE} to end properly…" 159 | } 160 | 161 | heavy_wineserver_wait() { 162 | wait_process_using_dir "${WINEPREFIX}" | logos_progress "Waiting for ${WINE_EXE} to end properly…" "Waiting for ${WINE_EXE} to end properly…" 163 | "${WINESERVER_EXE}" -w | logos_progress "Waiting for ${WINE_EXE} proper end" "Waiting for ${WINE_EXE} to end properly…" 164 | } 165 | mkdir_critical() { 166 | mkdir "$1" || logos_error "Can't create the $1 directory" 167 | } 168 | 169 | ## BEGIN DIALOG FUNCTIONS 170 | no-diag-msg() { 171 | echo "${1}" >> "${LOGOS_LOG}"; 172 | xterm -hold -e printf "%s\n" "${1}"; 173 | die; 174 | } 175 | cli_msg() { 176 | printf "%s\n" "${1}" | sed 's/\\n/\n/g' 177 | } 178 | gtk_info() { 179 | zenity --info --width=300 --height=200 --text="$*" --title='Information' 180 | } 181 | gtk_progress() { 182 | zenity --progress --title="${1}" --text="${2}" --pulsate --auto-close --no-cancel 183 | } 184 | gtk_warn() { 185 | zenity --warning --width=300 --height=200 --text="$*" --title='Warning!' 186 | } 187 | gtk_error() { 188 | zenity --error --width=300 --height=200 --text="$*" --title='Error!' 189 | } 190 | logos_info() { 191 | INFO_MESSAGE="${1}" 192 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 193 | cli_msg "${INFO_MESSAGE}" 194 | elif [[ "${DIALOG}" == "zenity" ]]; then 195 | gtk_info "${INFO_MESSAGE}"; 196 | echo "$(date) ${INFO_MESSAGE}" >> "${LOGOS_LOG}"; 197 | elif [[ "${DIALOG}" == "kdialog" ]]; then 198 | : 199 | fi 200 | } 201 | logos_progress() { 202 | PROGRESS_TITLE="${1}" 203 | PROGRESS_TEXT="${2}" 204 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 205 | cli_msg "${PROGRESS_TEXT}" 206 | elif [[ "${DIALOG}" == "zenity" ]]; then 207 | gtk_progress "${PROGRESS_TITLE}" "${PROGRESS_TEXT}" 208 | elif [[ "${DIALOG}" == "kdialog" ]]; then 209 | : 210 | fi 211 | } 212 | logos_warn() { 213 | WARN_MESSAGE="${1}" 214 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 215 | cli_msg "${WARN_MESSAGE}" 216 | elif [[ "${DIALOG}" == "zenity" ]]; then 217 | gtk_warn "${WARN_MESSAGE}" 218 | echo "$(date) ${WARN_MESSAGE}" >> "${LOGOS_LOG}"; 219 | elif [[ "${DIALOG}" == "kdialog" ]]; then 220 | : 221 | fi 222 | } 223 | logos_error() { 224 | WIKI_LINK="https://github.com/ferion11/LogosLinuxInstaller/wiki" 225 | TELEGRAM_LINK="https://t.me/linux_logos" 226 | MATRIX_LINK="https://matrix.to/#/#logosbible:matrix.org" 227 | ERROR_MESSAGE="${1}" 228 | SECONDARY="${2}" 229 | HELP_MESSAGE="If you need help, please consult:\n\n${WIKI_LINK}\n${TELEGRAM_LINK}\n${MATRIX_LINK}" 230 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 231 | cli_msg "${ERROR_MESSAGE}\n\n${HELP_MESSAGE}"; 232 | elif [[ "${DIALOG}" == "zenity" ]]; then 233 | gtk_error "${ERROR_MESSAGE}\n\n${HELP_MESSAGE}"; 234 | echo "$(date) ${ERROR_MESSAGE}" >> "${LOGOS_LOG}"; 235 | elif [[ "${DIALOG}" == "kdialog" ]]; then 236 | : 237 | fi 238 | if [ -z "${SECONDARY}" ]; then 239 | rm /tmp/LogosLinuxInstaller.pid 240 | kill -SIGKILL "-$(($(ps -o pgid= -p "${$}")))" 241 | fi 242 | exit 1; 243 | } 244 | cli_question() { 245 | QUESTION_TEXT=${1} 246 | while true; do 247 | read -rp "${QUESTION_TEXT} [Y/n]: " yn 248 | 249 | case $yn in 250 | [yY]* ) return 0; break;; 251 | [nN]* ) return 1; break;; 252 | * ) echo "Type Y[es] or N[o].";; 253 | esac 254 | done 255 | } 256 | cli_continue_question() { 257 | QUESTION_TEXT="${1}" 258 | NO_TEXT="${2}" 259 | SECONDARY="${3}" 260 | if ! cli_question "${QUESTION_TEXT}"; then logos_error "${NO_TEXT}" "${SECONDARY}"; fi 261 | } 262 | cli_acknowledge_question() { 263 | QUESTION_TEXT=${1} 264 | NO_TEXT="${2}" 265 | if ! cli_question "${QUESTION_TEXT}"; then logos_info "${NO_TEXT}"; fi 266 | } 267 | gtk_question() { 268 | if zenity --question --width=300 --height=200 --text "$@" --title='Question:' 269 | then return 0 270 | else return 1 271 | fi 272 | } 273 | gtk_continue_question() { 274 | QUESTION_TEXT="${1}" 275 | NO_TEXT="${2}" 276 | SECONDARY="${3}" 277 | if ! gtk_question "${QUESTION_TEXT}"; then logos_error "The installation was cancelled!" "${SECONDARY}"; fi 278 | } 279 | gtk_acknowledge_question() { 280 | QUESTION_TEXT="${1}" 281 | NO_TEXT=${2} 282 | if ! gtk_question "${QUESTION_TEXT}"; then logos_info "${NO_TEXT}"; fi 283 | } 284 | logos_continue_question() { 285 | QUESTION_TEXT="${1}" 286 | NO_TEXT=${2} 287 | SECONDARY="${3}" 288 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 289 | cli_continue_question "${QUESTION_TEXT}" "${NO_TEXT}" "${SECONDARY}" 290 | elif [[ "${DIALOG}" == "zenity" ]]; then 291 | gtk_continue_question "${QUESTION_TEXT}" "${NO_TEXT}" "${SECONDARY}" 292 | elif [[ "${DIALOG}" == "kdialog" ]]; then 293 | : 294 | fi 295 | } 296 | logos_acknowledge_question() { 297 | QUESTION_TEXT="${1}" 298 | NO_TEXT="${2}" 299 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 300 | cli_acknowledge_question "${QUESTION_TEXT}" "${NO_TEXT}" 301 | elif [[ "${DIALOG}" == "zenity" ]]; then 302 | gtk_acknowledge_question "${QUESTION_TEXT}" "${NO_TEXT}" 303 | elif [[ "${DIALOG}" == "kdialog" ]]; then 304 | : 305 | fi 306 | } 307 | cli_download() { 308 | # NOTE: here must be a limitation to handle it easily. $2 can be dir if it already exists or if it ends with '/' 309 | URI="${1}" 310 | DESTINATION="${2}" 311 | # extract last field of URI as filename: 312 | FILENAME="${URI##*/}" 313 | 314 | if [ "${DESTINATION}" != "${DESTINATION%/}" ]; then 315 | # it has '/' at the end or it is existing directory 316 | TARGET="${DESTINATION}/${1##*/}" 317 | [ -d "${DESTINATION}" ] || mkdir -p "${DESTINATION}" || logos_error "Cannot create ${DESTINATION}" 318 | elif [ -d "${DESTINATION}" ]; then 319 | # it's existing directory 320 | TARGET="${DESTINATION}/${1##*/}" 321 | else 322 | TARGET="${DESTINATION}" 323 | # ensure that the directory where the target file will be exists 324 | [ -d "${DESTINATION%/*}" ] || mkdir -p "${DESTINATION%/*}" || logos_error "Cannot create directory ${DESTINATION%/*}" 325 | fi 326 | wget -c "${URI}" -O "${TARGET}" 327 | } 328 | # shellcheck disable=SC2028 329 | gtk_download() { 330 | # NOTE: here must be a limitation to handle it easily. $2 can be dir if it already exists or if it ends with '/' 331 | URI="${1}" 332 | DESTINATION="${2}" 333 | # extract last field of URI as filename: 334 | FILENAME="${URI##*/}" 335 | 336 | if [ "${DESTINATION}" != "${DESTINATION%/}" ]; then 337 | # it has '/' at the end or it is existing directory 338 | TARGET="${DESTINATION}/${1##*/}" 339 | [ -d "${DESTINATION}" ] || mkdir -p "${DESTINATION}" || logos_error "Cannot create ${DESTINATION}" 340 | elif [ -d "${DESTINATION}" ]; then 341 | # it's existing directory 342 | TARGET="${DESTINATION}/${1##*/}" 343 | else 344 | TARGET="${DESTINATION}" 345 | # ensure that the directory where the target file will be exists 346 | [ -d "${DESTINATION%/*}" ] || mkdir -p "${DESTINATION%/*}" || logos_error "Cannot create directory ${DESTINATION%/*}" 347 | fi 348 | 349 | pipe_progress="$(mktemp)" 350 | rm -rf "${pipe_progress}" 351 | mkfifo "${pipe_progress}" 352 | 353 | pipe_wget="$(mktemp)" 354 | rm -rf "${pipe_wget}" 355 | mkfifo "${pipe_wget}" 356 | 357 | # zenity GUI feedback 358 | # NOTE: Abstracting this progress dialog to a function breaks download capabilities due to the pipe. 359 | zenity --progress --title "Downloading ${FILENAME}..." --text="Downloading: ${FILENAME}\ninto: ${DESTINATION}\n" --percentage=0 --auto-close < "${pipe_progress}" & 360 | ZENITY_PID="${!}" 361 | 362 | # download the file with wget: 363 | wget -c "${URI}" -O "${TARGET}" > "${pipe_wget}" 2>&1 & 364 | WGET_PID="${!}" 365 | 366 | # process the dialog progress bar 367 | total_size="Starting…" 368 | percent="0" 369 | current="Starting…" 370 | speed="Starting…" 371 | remain="Starting…" 372 | while read -r data; do 373 | if echo "${data}" | grep -q '^Length:' ; then 374 | result="$(echo "${data}" | grep "^Length:" | sed 's/.*\((.*)\).*/\1/' | tr -d '()')" 375 | if [ ${#result} -le 10 ]; then total_size=${result} ; fi 376 | fi 377 | 378 | if echo "${data}" | grep -q '[0-9]*%' ;then 379 | result="$(echo "${data}" | grep -o "[0-9]*%" | tr -d '%')" 380 | if [ ${#result} -le 3 ]; then percent=${result} ; fi 381 | 382 | result="$(echo "${data}" | grep "[0-9]*%" | sed 's/\([0-9BKMG]\+\).*/\1/' )" 383 | if [ ${#result} -le 10 ]; then current=${result} ; fi 384 | 385 | result="$(echo "${data}" | grep "[0-9]*%" | sed 's/.*\(% [0-9BKMG.]\+\).*/\1/' | tr -d ' %')" 386 | if [ ${#result} -le 10 ]; then speed=${result} ; fi 387 | 388 | result="$(echo "${data}" | grep -o "[0-9A-Za-z]*$" )" 389 | if [ ${#result} -le 10 ]; then remain=${result} ; fi 390 | fi 391 | 392 | if [ -z "$(pgrep -P "${$}" zenity)" ]; then 393 | WGET_PID_CURRENT="$(pgrep -P "${$}" wget)" 394 | [ -n "${WGET_PID_CURRENT}" ] && kill -SIGKILL "${WGET_PID_CURRENT}" 395 | fi 396 | 397 | [ "${percent}" == "100" ] && break 398 | 399 | # Update zenity's progress bar 400 | echo "${percent}" 401 | echo "#Downloading: ${FILENAME}\ninto: ${DESTINATION}\n\n${current} of ${total_size} \(${percent}%\)\nSpeed : ${speed}/Sec\nEstimated time : ${remain}" 402 | done < "${pipe_wget}" > "${pipe_progress}" 403 | 404 | wait "${WGET_PID}" 405 | WGET_RETURN="${?}" 406 | 407 | wait "${ZENITY_PID}" 408 | ZENITY_RETURN="${?}" 409 | 410 | fuser -TERM -k -w "${pipe_progress}" 411 | rm -rf "${pipe_progress}" 412 | 413 | fuser -TERM -k -w "${pipe_wget}" 414 | rm -rf "${pipe_wget}" 415 | 416 | # NOTE: sometimes the process finishes before the wait command, giving the error code 127 417 | if [ "${ZENITY_RETURN}" == "0" ] || [ "${ZENITY_RETURN}" == "127" ] ; then 418 | if [ "${WGET_RETURN}" != "0" ] && [ "${WGET_RETURN}" != "127" ] ; then 419 | logos_error "ERROR: The installation was cancelled because of an error while attempting a download.\n\nAttmpted Downloading: ${URI}\n\nTarget Destination: ${DESTINATION}\n\n File Name: ${FILENAME}\n\n - Error Code: WGET_RETURN: ${WGET_RETURN}" 420 | fi 421 | else 422 | logos_error "The installation was cancelled!\n * ZENITY_RETURN: ${ZENITY_RETURN}" 423 | fi 424 | verbose && echo "${FILENAME} download finished!" 425 | } 426 | logos_download() { 427 | URI="${1}" 428 | DESTINATION="${2}" 429 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 430 | cli_download "${URI}" "${DESTINATION}" 431 | elif [[ "${DIALOG}" == "zenity" ]]; then 432 | gtk_download "${URI}" "${DESTINATION}" 433 | elif [[ "${DIALOG}" == "kdialog" ]]; then 434 | no-diag-msg "kdialog not implemented." 435 | else 436 | no-diag-msg "No dialog tool found." 437 | fi 438 | } 439 | logos_reuse_download() { 440 | SOURCEURL="${1}" 441 | FILE="${2}" 442 | TARGETDIR="${3}" 443 | DOWNLOADS="${HOME}/Downloads" 444 | DIRS=( 445 | "${INSTALLDIR}" 446 | "${PRESENT_WORKING_DIRECTORY}" 447 | "${DOWNLOADS}" 448 | ) 449 | FOUND=1 450 | for i in "${DIRS[@]}"; do 451 | if [ -f "${i}/${FILE}" ]; then 452 | logos_info "${FILE} exists in ${i}. Using it…" 453 | cp "${i}/${FILE}" "${TARGETDIR}/" | logos_progress "Copying…" "Copying ${FILE}\ninto ${TARGETDIR}" 454 | FOUND=0 455 | break 456 | fi 457 | done 458 | if [[ "${FOUND}" == 1 ]]; then 459 | logos_info "${FILE} does not exist. Downloading…" 460 | logos_download "${SOURCEURL}" "${DOWNLOADS}/${FILE}" 461 | cp "${DOWNLOADS}/${FILE}" "${TARGETDIR}/" | logos_progress "Copying…" "Copying: ${FILE}\ninto: ${TARGETDIR}" 462 | fi 463 | } 464 | ## END DIALOG FUNCTIONS 465 | # wait on all processes that are using the ${1} directory to finish 466 | wait_process_using_dir() { 467 | VERIFICATION_DIR="${1}" 468 | VERIFICATION_TIME=7 469 | VERIFICATION_NUM=3 470 | 471 | verbose && echo "* Starting wait_process_using_dir…" 472 | i=0 ; while true; do 473 | i=$((i+1)) 474 | verbose && echo "wait_process_using_dir: loop with i=${i}" 475 | 476 | echo "wait_process_using_dir: sleep ${VERIFICATION_TIME}" 477 | sleep "${VERIFICATION_TIME}" 478 | 479 | FIST_PID="$(lsof -t "${VERIFICATION_DIR}" | head -n 1)" 480 | verbose && echo "wait_process_using_dir FIST_PID: ${FIST_PID}" 481 | if [ -n "${FIST_PID}" ]; then 482 | i=0 483 | verbose && echo "wait_process_using_dir: tail --pid=${FIST_PID} -f /dev/null" 484 | tail --pid="${FIST_PID}" -f /dev/null 485 | continue 486 | fi 487 | 488 | [ "${i}" -lt "${VERIFICATION_NUM}" ] || break 489 | done 490 | verbose && echo "* End of wait_process_using_dir." 491 | } 492 | 493 | make_skel() { 494 | # ${1} - SET_APPIMAGE_FILENAME 495 | export SET_APPIMAGE_FILENAME="${1}" 496 | 497 | verbose && echo "* Making skel64 inside ${INSTALLDIR}" 498 | mkdir -p "${INSTALLDIR}" 499 | mkdir "${APPDIR}" || die "can't make dir: ${APPDIR}" 500 | mkdir "${APPDIR_BINDIR}" || die "can't make dir: ${APPDIR_BINDIR}" 501 | 502 | # Making the links 503 | cd "${APPDIR_BINDIR}" || die "ERROR: Can't open dir: ${APPDIR_BINDIR}" 504 | ln -s "${SET_APPIMAGE_FILENAME}" "${APPDIR_BINDIR}/${APPIMAGE_LINK_SELECTION_NAME}" 505 | ln -s "${APPIMAGE_LINK_SELECTION_NAME}" wine 506 | ln -s "${APPIMAGE_LINK_SELECTION_NAME}" wine64 507 | ln -s "${APPIMAGE_LINK_SELECTION_NAME}" wineserver 508 | cd - || die "ERROR: Can't go back to preview dir!" 509 | 510 | mkdir "${APPDIR}/wine64_bottle" 511 | 512 | verbose && echo "skel64 done!" 513 | } 514 | 515 | ## BEGIN CHECK DEPENDENCIES FUNCTIONS 516 | check_commands() { 517 | for cmd in "$@"; do 518 | if have_dep "${cmd}"; then 519 | verbose && echo "* command ${cmd} is installed!" 520 | else 521 | verbose && echo "* command ${cmd} not installed!" 522 | MISSING_CMD+=("${cmd}") 523 | fi 524 | done 525 | if [ "${#MISSING_CMD[@]}" -ne 0 ]; then 526 | logos_error "Your system is missing ${MISSING_CMD[*]}. Please install your distro's ${MISSING_CMD[*]} package(s).\n ${EXTRA_INFO}" 527 | fi 528 | } 529 | # shellcheck disable=SC2001 530 | check_libs() { 531 | for lib in "$@"; do 532 | HAVE_LIB="$(ldconfig -N -v "$(sed 's/:/ /g' <<< "${LD_LIBRARY_PATH}")" 2>/dev/null | grep "${lib}")" 533 | if [ -n "${HAVE_LIB}" ]; then 534 | verbose && echo "* ${lib} is installed!" 535 | else 536 | logos_error "Your system does not have lib: ${lib}. Please install ${lib} package.\n ${EXTRA_INFO}" 537 | fi 538 | done 539 | } 540 | 541 | checkDependencies() { 542 | verbose && echo "Checking system's for dependencies:" 543 | check_commands mktemp patch lsof wget find sed grep ntlm_auth awk tr bc xmllint curl; 544 | } 545 | 546 | checkDependenciesLogos10() { 547 | verbose && echo "All dependencies found. Continuing…" 548 | } 549 | 550 | checkDependenciesLogos9() { 551 | verbose && echo "Checking dependencies for Logos 9." 552 | check_commands xwd cabextract; 553 | verbose && echo "All dependencies found. Continuing…" 554 | } 555 | ## END CHECK DEPENDENCIES FUNCTIONS 556 | 557 | ## BEGIN INSTALL OPTIONS FUNCTIONS 558 | chooseProduct() { 559 | BACKTITLE="Choose Product Menu" 560 | TITLE="Choose Product" 561 | QUESTION_TEXT="Choose which FaithLife product the script should install:" 562 | if [ -z "${FLPRODUCT}" ]; then 563 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 564 | productChoice="$($DIALOG --backtitle "${BACKTITLE}" --title "${TITLE}" --radiolist "${QUESTION_TEXT}" 0 0 0 "Logos" "Logos Bible Software." ON "Verbum" "Verbum Bible Software." OFF "Exit" "Exit." OFF 3>&1 1>&2 2>&3 3>&-)" 565 | elif [[ "${DIALOG}" == "zenity" ]]; then 566 | productChoice="$(zenity --width="700" --height="310" --title="${TITLE}" --text="${QUESTION_TEXT}" --list --radiolist --column "S" --column "Description" TRUE "Logos Bible Software." FALSE "Verbum Bible Software." FALSE "Exit.")" 567 | #zenity --width="700" --height="310" --title="${TITLE}" --text="${QUESTION_TEXT}" --list --radiolist --column "S" --column "Description" TRUE "Logos Bible Software." FALSE "Verbum Bible Software." FALSE "Exit." 568 | elif [[ "${DIALOG}" == "kdialog" ]]; then 569 | no-diag-msg "kdialog not implemented." 570 | else 571 | no-diag-msg "No dialog tool found" 572 | fi 573 | else 574 | productChoice="${FLPRODUCT}" 575 | fi 576 | 577 | case "${productChoice}" in 578 | "Logos"*) 579 | verbose && echo "Installing Logos Bible Software" 580 | export FLPRODUCT="Logos" 581 | export FLPRODUCTi="logos4" #This is the variable referencing the icon path name in the repo. 582 | ;; 583 | "Verbum"*) 584 | verbose && echo "Installing Verbum Bible Software" 585 | export FLPRODUCT="Verbum" 586 | export FLPRODUCTi="verbum" #This is the variable referencing the icon path name in the repo. 587 | export VERBUM_PATH="Verbum/" 588 | ;; 589 | "Exit"*) 590 | logos_error "Exiting installation.";; 591 | *) 592 | logos_error "Unknown product. Installation canceled!";; 593 | esac 594 | 595 | if [ -z "${LOGOS_ICON_URL}" ]; then export LOGOS_ICON_URL="https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/master/img/${FLPRODUCTi}-128-icon.png" ; fi 596 | } 597 | 598 | chooseVersion() { 599 | BACKTITLE="Choose Version Menu" 600 | TITLE="Choose Product Version" 601 | QUESTION_TEXT="Which version of ${FLPRODUCT} should the script install?" 602 | if [ -z "$TARGETVERSION" ]; then 603 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 604 | versionChoice="$($DIALOG --backtitle "${BACKTITLE}" --title "${TITLE}" --radiolist "${QUESTION_TEXT}" 0 0 0 "${FLPRODUCT} 10" "10" ON "${FLPRODUCT} 9" "9" OFF "Exit." "Exit." OFF 3>&1 1>&2 2>&3 3>&-)" 605 | elif [[ "${DIALOG}" == "zenity" ]]; then 606 | versionChoice="$(zenity --width="700" --height="310" --title="${TITLE}" --text="${QUESTION_TEXT}" --list --radiolist --column "S" --column "Description" TRUE "${FLPRODUCT} 10" FALSE "${FLPRODUCT} 9" FALSE "Exit")" 607 | elif [[ "${DIALOG}" == "kdialog" ]]; then 608 | no-diag-msg "kdialog not implemented." 609 | else 610 | no-diag-msg "No dialog tool found." 611 | fi 612 | else 613 | versionChoice="$TARGETVERSION" 614 | fi 615 | case "${versionChoice}" in 616 | *"10") 617 | checkDependenciesLogos10; 618 | export TARGETVERSION="10"; 619 | ;; 620 | *"9") 621 | checkDependenciesLogos9; 622 | export TARGETVERSION="9"; 623 | ;; 624 | "Exit.") 625 | exit 626 | ;; 627 | *) 628 | logos_error "Unknown version. Installation canceled!" 629 | esac 630 | 631 | LOGOS_RELEASE_VERSION=$(curl -s "https://clientservices.logos.com/update/v1/feed/logos${TARGETVERSION}/stable.xml" | xmllint --format - | sed -e 's/ xmlns.*=".*"//g' | sed -e 's@logos:minimum-os-version@minimum-os-version@g' | sed -e 's@logos:version@version@g' | xmllint --xpath "/feed/entry[1]/version/text()" -); export LOGOS_RELEASE_VERSION; 632 | if [ -z "${LOGOS64_URL}" ]; then export LOGOS64_URL="https://downloads.logoscdn.com/LBS${TARGETVERSION}/${VERBUM_PATH}Installer/${LOGOS_RELEASE_VERSION}/${FLPRODUCT}-x64.msi" ; fi 633 | 634 | if [ "${FLPRODUCT}" = "Logos" ]; then 635 | LOGOS_VERSION="$(echo "${LOGOS64_URL}" | cut -d/ -f6)"; 636 | elif [ "${FLPRODUCT}" = "Verbum" ]; then 637 | LOGOS_VERSION="$(echo "${LOGOS64_URL}" | cut -d/ -f7)"; 638 | else 639 | logos_error "FLPRODUCT not set in config. Please update your config to specify either 'Logos' or 'Verbum'." 640 | fi 641 | export LOGOS_VERSION; 642 | LOGOS64_MSI="$(basename "${LOGOS64_URL}")"; export LOGOS64_MSI 643 | 644 | if [ -z "${INSTALLDIR}" ]; then 645 | export INSTALLDIR="${HOME}/${FLPRODUCT}Bible${TARGETVERSION}" ; 646 | fi 647 | if [ -z "${APPDIR}" ]; then 648 | export APPDIR="${INSTALLDIR}/data" 649 | fi 650 | if [ -z "${APPDIR_BINDIR}" ]; then 651 | export APPDIR_BINDIR="${APPDIR}/bin" 652 | fi 653 | } 654 | 655 | wineBinaryVersionCheck() { 656 | # Does not check for Staging. Will not implement: expecting merging of commits in time. 657 | TESTBINARY="${1}" 658 | 659 | if [ "${TARGETVERSION}" == "10" ]; then 660 | WINE_MINIMUM="7.18" 661 | elif [ "${TARGETVERSION}" == "9" ]; then 662 | WINE_MINIMUM="7.0" 663 | else 664 | logos_error "TARGETVERSION not set." 665 | fi 666 | 667 | # Check if the binary is executable. If so, check if TESTBINARY's version is ≥ WINE_MINIMUM, or if it is Proton or a link to a Proton binary, else remove. 668 | if [ -x "${TESTBINARY}" ]; then 669 | TESTWINEVERSION=$("$TESTBINARY" --version | awk -F' ' '{print $1}' | awk -F'-' '{print $2}' | awk -F'.' '{print $1"."$2}'); 670 | if (( $(echo "$TESTWINEVERSION >= $WINE_MINIMUM" | bc -l) )); then 671 | if (( $(echo "$TESTWINEVERSION != 8.0" | bc -l) )); then 672 | return 0; 673 | fi 674 | elif [[ ${TESTBINARY} =~ .*"Proton - Experimental".* ]]; then 675 | return 0; 676 | # If it is a symlink, check its actual path. If it is Proton, let it pass. 677 | elif [ -L "${TESTBINARY}" ]; then 678 | TESTWINE=$(readlink -f "$TESTBINARY") 679 | if [[ "${TESTWINE}" =~ .*"Proton - Experimental".* ]]; then 680 | return 0; 681 | fi 682 | else 683 | return 1; 684 | fi 685 | fi 686 | } 687 | 688 | checkPath() { 689 | IFS=: 690 | for dir in $PATH; do 691 | if [ -x "$dir/$1" ]; then 692 | echo "$dir/$1" 693 | fi 694 | done 695 | 696 | } 697 | 698 | createWineBinaryList() { 699 | logos_info "Creating binary list." 700 | #TODO: Make optarg to add custom path to this array. 701 | WINEBIN_PATH_ARRAY=( "/usr/local/bin" "$HOME/bin" "$HOME/PlayOnLinux/wine/linux-amd64/*/bin" "$HOME/.steam/steam/steamapps/common/Proton - Experimental/files/bin" "${CUSTOMBINPATH}" ) 702 | 703 | # Temporarily modify PATH for additional WINE64 binaries. 704 | for p in "${WINEBIN_PATH_ARRAY[@]}"; do 705 | if [[ ":$PATH:" != *":${p}:"* ]] && [ -d "${p}" ]; then 706 | PATH="$PATH:${p}" 707 | fi 708 | done 709 | 710 | # Check each directory in PATH for wine64; add to list 711 | checkPath wine64 > "${WORKDIR}/winebinaries" 712 | 713 | cp "${WORKDIR}/winebinaries" "${WORKDIR}/winebinaries.bak" 714 | 715 | # Check remaining binary versions 716 | while read -r i; do 717 | if wineBinaryVersionCheck "$i"; then 718 | # Skip 719 | : 720 | else 721 | sed -i "\@$i@d" "${WORKDIR}/winebinaries" 722 | fi 723 | done < "${WORKDIR}/winebinaries.bak"; 724 | } 725 | 726 | getAppImage() { 727 | logos_reuse_download "${WINE64_APPIMAGE_FULL_URL}" "${WINE64_APPIMAGE_FULL_FILENAME}" "${APPDIR_BINDIR}" 728 | } 729 | 730 | chooseInstallMethod() { 731 | 732 | if [ -z "$WINEPREFIX" ]; then 733 | export WINEPREFIX="${APPDIR}/wine64_bottle" 734 | fi 735 | 736 | if [ -z "$WINE_EXE" ]; then 737 | createWineBinaryList; 738 | 739 | WINEBIN_OPTIONS=() 740 | 741 | # Add AppImage to list 742 | if [[ "${TARGETVERSION}" != "9" ]]; then 743 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 744 | # NOTE: The missing quotations in this array are intentional and accounted for below. 745 | WINEBIN_OPTIONS+=("AppImage ${APPDIR_BINDIR}/${WINE64_APPIMAGE_FULL_FILENAME}" "AppImage of Wine64 ${WINE64_APPIMAGE_FULL_VERSION}" ON) 746 | elif [[ "${DIALOG}" == "zenity" ]]; then 747 | WINEBIN_OPTIONS+=(TRUE "AppImage" "AppImage of Wine64 ${WINE64_APPIMAGE_FULL_VERSION}" "${APPDIR_BINDIR}/${WINE64_APPIMAGE_FULL_FILENAME}") 748 | elif [[ "${DIALOG}" == "kdialog" ]]; then 749 | no-diag-msg "kdialog not implemented." 750 | else 751 | no-diag-msg "No dialog tool found." 752 | fi 753 | fi 754 | 755 | while read -r line; do 756 | # Set binary code, description, and path based on path 757 | if [ -L "$line" ]; then 758 | WINEOPT=$(readlink -f "$line") 759 | else 760 | WINEOPT="$line" 761 | fi 762 | 763 | if [[ "$WINEOPT" == *"/usr/bin/"* ]]; then 764 | WINEOPT_CODE="System" 765 | WINEOPT_DESCRIPTION="\"Use the system binary (i.e., /usr/bin/wine64). WINE must be 7.18-staging or later. Stable or Devel do not work.\"" 766 | WINEOPT_PATH="${line}" 767 | elif [[ "$WINEOPT" == *"Proton"* ]]; then 768 | WINEOPT_CODE="Proton" 769 | WINEOPT_DESCRIPTION="\"Install using the Steam Proton fork of WINE.\"" 770 | WINEOPT_PATH="${line}" 771 | elif [[ "$WINEOPT" == *"PlayOnLinux"* ]]; then 772 | WINEOPT_CODE="PlayOnLinux" 773 | WINEOPT_DESCRIPTION="\"Install using a PlayOnLinux WINE64 binary.\"" 774 | WINEOPT_PATH="${line}" 775 | else 776 | WINEOPT_CODE="Custom" 777 | WINEOPT_DESCRIPTION="\"Use a WINE64 binary from another directory.\"" 778 | WINEOPT_PATH="${line}" 779 | fi 780 | 781 | # Create wine binary option array 782 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 783 | # NOTE: The missing quotations in this array are intentional and accounted for below. 784 | WINEBIN_OPTIONS+=("${WINEOPT_CODE} ${WINEOPT_PATH}" "${WINEOPT_DESCRIPTION}" OFF) 785 | elif [[ "${DIALOG}" == "zenity" ]]; then 786 | WINEBIN_OPTIONS+=(FALSE "${WINEOPT_CODE}" "${WINEOPT_DESCRIPTION}" "${WINEOPT_PATH}") 787 | elif [[ "${DIALOG}" == "kdialog" ]]; then 788 | no-diag-msg "kdialog not implemented." 789 | else 790 | no-diag-msg "No dialog tool found." 791 | fi 792 | done < "${WORKDIR}/winebinaries" 793 | 794 | 795 | BACKTITLE="Choose Wine Binary Menu" 796 | TITLE="Choose Wine Binary" 797 | QUESTION_TEXT="Which Wine binary and install method should the script use to install ${FLPRODUCT} v${LOGOS_VERSION} in ${INSTALLDIR}?" 798 | WINEBIN_OPTIONS_LENGTH="${#WINEBIN_OPTIONS[@]}" 799 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 800 | installationChoice=$( $DIALOG --backtitle "${BACKTITLE}" --title "${TITLE}" --radiolist "${QUESTION_TEXT}" 0 0 "${WINEBIN_OPTIONS_LENGTH}" "${WINEBIN_OPTIONS[@]}" 3>&1 1>&2 2>&3 3>&- ) 801 | read -r -a installArray <<< "${installationChoice}" 802 | WINEBIN_CODE=$(echo "${installArray[0]}" | awk -F' ' '{print $1}'); export WINEBIN_CODE 803 | WINE_EXE=$(echo "${installArray[0]}" | awk -F' ' '{print $2}'); export WINE_EXE 804 | elif [[ "${DIALOG}" == "zenity" ]]; then 805 | column_names=(--column "Choice" --column "Code" --column "Description" --column "Path") 806 | installationChoice=$(zenity --width=1024 --height=480 \ 807 | --title="${TITLE}" \ 808 | --text="${QUESTION_TEXT}" \ 809 | --list --radiolist "${column_names[@]}" "${WINEBIN_OPTIONS[@]}" --print-column=2,3,4); 810 | OIFS=$IFS 811 | IFS='|' read -r -a installArray <<< "${installationChoice}" 812 | IFS=$OIFS 813 | export WINEBIN_CODE=${installArray[0]} 814 | export WINE_EXE=${installArray[2]} 815 | elif [[ "${DIALOG}" == "kdialog" ]]; then 816 | no-diag-msg "kdialog not implemented." 817 | else 818 | no-diag-msg "No dialog tool found." 819 | fi 820 | fi 821 | verbose && echo "chooseInstallMethod(): WINEBIN_CODE: ${WINEBIN_CODE}; WINE_EXE: ${WINE_EXE}" 822 | } 823 | 824 | checkExistingInstall() { 825 | # Now that we know what the user wants to install and where, determine whether an install exists and whether to continue. 826 | if [ -d "${INSTALLDIR}" ]; then 827 | if find "${INSTALLDIR}" -name Logos.exe -o -name Verbum.exe | grep -qE "(Logos\/Logos.exe|Verbum\/Verbum.exe)"; then 828 | EXISTING_LOGOS_INSTALL=1; export EXISTING_LOGOS_INSTALL; 829 | logos_error "An install was found at ${INSTALLDIR}. Please remove/rename it or use another location by setting the INSTALLDIR variable." 830 | else 831 | EXISTING_LOGOS_DIRECTORY=1; export EXISTING_LOGOS_DIRECTORY; 832 | logos_error "A directory exists at ${INSTALLDIR}. Please remove/rename it or use another location by setting the INSTALLDIR variable." 833 | fi 834 | else 835 | verbose && echo "Installing to an empty directory at ${INSTALLDIR}." 836 | fi 837 | } 838 | 839 | beginInstall() { 840 | if [ "${SKEL}" = "1" ]; then 841 | verbose && echo "Making a skeleton install of the project only. Exiting after completion." 842 | make_skel "none.AppImage" 843 | exit 0; 844 | fi 845 | if [ -n "${WINEBIN_CODE}" ]; then 846 | case "${WINEBIN_CODE}" in 847 | "AppImage"*) 848 | check_libs libfuse; 849 | verbose && echo "Installing ${FLPRODUCT} Bible ${TARGETVERSION} using ${WINE64_APPIMAGE_FULL_VERSION} AppImage…" 850 | if [ -z "${REGENERATE}" ]; then 851 | make_skel "${WINE64_APPIMAGE_FULL_FILENAME}" 852 | 853 | # exporting PATH to internal use if using AppImage, doing backup too: 854 | export OLD_PATH="${PATH}" 855 | export PATH="${APPDIR_BINDIR}":"${PATH}" 856 | 857 | # Geting the AppImage: 858 | getAppImage; 859 | chmod +x "${APPDIR_BINDIR}/${WINE64_APPIMAGE_FULL_FILENAME}" 860 | export WINE_EXE="${APPDIR_BINDIR}/wine64" 861 | fi 862 | ;; 863 | "System"|"Proton"|"PlayOnLinux"|"Custom") 864 | verbose && echo "Installing ${FLPRODUCT} Bible ${TARGETVERSION} using a ${WINEBIN_CODE} WINE64 binary…" 865 | if [ -z "${REGENERATE}" ]; then 866 | make_skel "none.AppImage" 867 | fi 868 | ;; 869 | *) 870 | logos_error "WINEBIN_CODE error. Installation canceled!" 871 | esac 872 | else 873 | verbose && echo "WINEBIN_CODE is not set in your config file." 874 | fi 875 | 876 | verbose && echo "Using: $(${WINE_EXE} --version)" 877 | 878 | # Set WINESERVER_EXE based on WINE_EXE. 879 | if [ -z "${WINESERVER_EXE}" ]; then 880 | if [ -x "$(dirname "${WINE_EXE}")/wineserver" ]; then 881 | WINESERVER_EXE="$(echo "$(dirname "${WINE_EXE}")/wineserver" | tr -d '\n')"; export WINESERVER_EXE; 882 | else 883 | logos_error "$(dirname "${WINE_EXE}")/wineserver not found. Please either add it or create a symlink to it, and rerun." 884 | fi 885 | fi 886 | } 887 | ## END INSTALL OPTIONS FUNCTIONS 888 | ## BEGIN WINE BOTTLE AND WINETRICKS FUNCTIONS 889 | prepareWineBottle() { 890 | logos_continue_question "Now the script will create and configure the Wine Bottle at ${WINEPREFIX}. You can cancel the installation of Mono. Do you wish to continue?" "The installation was cancelled!" 891 | verbose && echo "${WINE_EXE} wineboot" 892 | if [ -z "${WINEBOOT_GUI}" ]; then 893 | (DISPLAY="" ${WINE_EXE} wineboot) | logos_progress "Waiting for ${WINE_EXE} wineboot" "Waiting for ${WINE_EXE} wineboot…" 894 | else 895 | ${WINE_EXE} wineboot 896 | fi 897 | light_wineserver_wait 898 | } 899 | 900 | wine_reg_install() { 901 | REG_FILENAME="${1}" 902 | verbose && echo "${WINE_EXE} regedit.exe ${REG_FILENAME}" 903 | "${WINE_EXE}" regedit.exe "${WORKDIR}"/"${REG_FILENAME}" | logos_progress "Wine regedit" "Wine is installing ${REG_FILENAME} in ${WINEPREFIX}" 904 | 905 | light_wineserver_wait 906 | verbose && echo "${WINE_EXE} regedit.exe ${REG_FILENAME} DONE!" 907 | } 908 | 909 | downloadWinetricks() { 910 | logos_reuse_download "${WINETRICKS_URL}" "winetricks" "${APPDIR_BINDIR}" 911 | chmod 755 "${APPDIR_BINDIR}/winetricks" 912 | } 913 | 914 | setWinetricks() { 915 | # Check if local winetricks version available; else, download it 916 | if [ -z "${WINETRICKSBIN}" ]; then 917 | if [ "$(which winetricks)" ]; then 918 | # Check if local winetricks version is up-to-date; if so, offer to use it or to download; else, download it 919 | LOCAL_WINETRICKS_VERSION=$(winetricks --version | awk -F' ' '{print $1}') 920 | if [ "${LOCAL_WINETRICKS_VERSION}" -ge "20220411" ]; then 921 | BACKTITLE="Choose Winetricks Menu" 922 | TITLE="Choose Winetricks" 923 | QUESTION_TEXT="Should the script use the system's local winetricks or download the latest winetricks from the Internet? The script needs to set some Wine options that ${FLPRODUCT} requires on Linux." 924 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 925 | winetricksChoice="$($DIALOG --backtitle "${BACKTITLE}" --title "${TITLE}" --radiolist "${QUESTION_TEXT}" 0 0 0 "1" "Use local winetricks." ON "2" "Download winetricks from the Internet." OFF 3>&1 1>&2 2>&3 3>&-)" 926 | elif [[ "${DIALOG}" == "zenity" ]]; then 927 | winetricksChoice="$(zenity --width=700 --height=310 \ 928 | --title="${TITLE}" \ 929 | --text="${QUESTION_TEXT}" \ 930 | --list --radiolist --column "S" --column "Description" \ 931 | TRUE "1- Use local winetricks." \ 932 | FALSE "2- Download winetricks from the Internet." )" 933 | elif [[ "${DIALOG}" == "kdialog" ]]; then 934 | no-diag-msg "kdialog not implemented." 935 | else 936 | no-diag-msg "No dialog tool found." 937 | fi 938 | 939 | case "${winetricksChoice}" in 940 | 1*) 941 | verbose && echo "Setting winetricks to the local binary…" 942 | WINETRICKSBIN="$(which winetricks)"; 943 | export WINETRICKSBIN; 944 | ;; 945 | 2*) 946 | downloadWinetricks; 947 | WINETRICKSBIN="${APPDIR_BINDIR}/winetricks"; 948 | export WINETRICKSBIN; 949 | ;; 950 | *) 951 | logos_error "Installation canceled!" 952 | esac 953 | else 954 | logos_info "The system's winetricks is too old. Downloading an up-to-date winetricks from the Internet…" 955 | downloadWinetricks; 956 | export WINETRICKSBIN="${APPDIR_BINDIR}/winetricks" 957 | fi 958 | else 959 | verbose && echo "Local winetricks not found. Downloading winetricks from the Internet…" 960 | downloadWinetricks; 961 | export WINETRICKSBIN="${APPDIR_BINDIR}/winetricks" 962 | fi 963 | fi 964 | 965 | verbose && echo "Winetricks is ready to be used." 966 | } 967 | 968 | winetricks_install() { 969 | verbose && echo "winetricks ${*}" 970 | if [[ "${DIALOG}" == "whiptail" ]] || [[ "${DIALOG}" == "dialog" ]]; then 971 | "$WINETRICKSBIN" "${@}" 972 | elif [[ "${DIALOG}" == "zenity" ]]; then 973 | pipe_winetricks="$(mktemp)" 974 | rm -rf "${pipe_winetricks}" 975 | mkfifo "${pipe_winetricks}" 976 | 977 | # zenity GUI feedback 978 | logos_progress "Winetricks ${*}" "Winetricks installing ${*}" < "${pipe_winetricks}" & 979 | ZENITY_PID="${!}"; 980 | 981 | "$WINETRICKSBIN" "${@}" | tee "${pipe_winetricks}"; 982 | WINETRICKS_STATUS="${?}"; 983 | 984 | wait "${ZENITY_PID}"; 985 | ZENITY_RETURN="${?}"; 986 | 987 | rm -rf "${pipe_winetricks}"; 988 | 989 | # NOTE: sometimes the process finishes before the wait command, giving the error code 127 990 | if [ "${ZENITY_RETURN}" == "0" ] || [ "${ZENITY_RETURN}" == "127" ] ; then 991 | if [ "${WINETRICKS_STATUS}" != "0" ] ; then 992 | ${WINESERVER_EXE} -k; 993 | logos_error "Winetricks Install ERROR: The installation was cancelled because of sub-job failure!\n * winetricks ${*}\n - WINETRICKS_STATUS: ${WINETRICKS_STATUS}"; 994 | fi 995 | else 996 | "${WINESERVER_EXE}" -k; 997 | logos_error "The installation was cancelled!\n * ZENITY_RETURN: ${ZENITY_RETURN}"; 998 | fi 999 | elif [[ "${DIALOG}" == "kdialog" ]]; then 1000 | no-diag-msg "kdialog not implemented." 1001 | else 1002 | no-diag-msg "No dialog tool found." 1003 | fi 1004 | 1005 | verbose && echo "winetricks ${*} DONE!"; 1006 | 1007 | heavy_wineserver_wait; 1008 | } 1009 | 1010 | winetricks_dll_install() { 1011 | verbose && echo "winetricks ${*}" 1012 | logos_continue_question "Now the script will install the DLL ${*}. This may take a while. There will not be any GUI feedback for this. Continue?" "The installation was cancelled!" 1013 | "$WINETRICKSBIN" "${@}" 1014 | verbose && echo "winetricks ${*} DONE!"; 1015 | heavy_wineserver_wait; 1016 | } 1017 | 1018 | getPremadeWineBottle() { 1019 | verbose && echo "Installing pre-made wineBottle 64bits…" 1020 | logos_reuse_download "${WINE64_BOTTLE_TARGZ_URL}" "${WINE64_BOTTLE_TARGZ_NAME}" "${WORKDIR}" 1021 | tar xzf "${WORKDIR}"/"${WINE64_BOTTLE_TARGZ_NAME}" -C "${APPDIR}"/ | logos_progress "Extracting…" "Extracting: ${WINE64_BOTTLE_TARGZ_NAME}\ninto: ${APPDIR}" 1022 | } 1023 | ## END WINE BOTTLE AND WINETRICKS FUNCTIONS 1024 | ## BEGIN LOGOS INSTALL FUNCTIONS 1025 | getLogosExecutable() { 1026 | # This VAR is used to verify the downloaded MSI is latest 1027 | if [ -z "${LOGOS_EXECUTABLE}" ]; then 1028 | LOGOS_EXECUTABLE="${FLPRODUCT}_v${LOGOS_VERSION}-x64.msi" 1029 | fi 1030 | 1031 | logos_continue_question "Now the script will check for the MSI installer. Then it will download and install ${FLPRODUCT} Bible at ${WINEPREFIX}. You will need to interact with the installer. Do you wish to continue?" "The installation was cancelled!" 1032 | 1033 | # Geting and install ${FLPRODUCT} Bible 1034 | # First check current directory to see if the .MSI is present; if not, check user'\''s Downloads/; if not, download it new. Once found, copy it to WORKDIR for future use. 1035 | verbose && echo "Installing ${FLPRODUCT}Bible 64bits…" 1036 | if [ -f "${PRESENT_WORKING_DIRECTORY}/${LOGOS_EXECUTABLE}" ]; then 1037 | verbose && echo "${LOGOS_EXECUTABLE} exists. Using it…" 1038 | cp "${PRESENT_WORKING_DIRECTORY}/${LOGOS_EXECUTABLE}" "${APPDIR}/" | logos_progress "Copying…" "Copying: ${LOGOS_EXECUTABLE}\ninto: ${APPDIR}" 1039 | elif [ -f "${HOME}/Downloads/${LOGOS_EXECUTABLE}" ]; then 1040 | verbose && echo "${LOGOS_EXECUTABLE} exists. Using it…" 1041 | cp "${HOME}/Downloads/${LOGOS_EXECUTABLE}" "${APPDIR}/" | logos_progress "Copying…" "Copying: ${LOGOS_EXECUTABLE}\ninto: ${APPDIR}" 1042 | else 1043 | verbose && echo "${LOGOS_EXECUTABLE} does not exist. Downloading…" 1044 | logos_download "${LOGOS64_URL}" "${HOME}/Downloads/" 1045 | mv "${HOME}/Downloads/${LOGOS64_MSI}" "${HOME}/Downloads/${LOGOS_EXECUTABLE}" 1046 | cp "${HOME}/Downloads/${LOGOS_EXECUTABLE}" "${APPDIR}/" | logos_progress "Copying…" "Copying: ${LOGOS_EXECUTABLE}\ninto: ${APPDIR}" 1047 | fi 1048 | } 1049 | 1050 | installMSI() { 1051 | # Execute the .MSI 1052 | verbose && echo "Running: ${WINE_EXE} msiexec /i ${APPDIR}/${LOGOS_EXECUTABLE}" 1053 | "${WINE_EXE}" msiexec /i "${APPDIR}"/"${LOGOS_EXECUTABLE}" 1054 | } 1055 | 1056 | installFonts() { 1057 | if [ -z "${WINETRICKS_UNATTENDED}" ]; then 1058 | if [ -z "${SKIP_FONTS}" ]; then 1059 | winetricks_install -q corefonts 1060 | winetricks_install -q tahoma 1061 | fi 1062 | winetricks_install -q settings fontsmooth=rgb 1063 | else 1064 | if [ -z "${SKIP_FONTS}" ]; then 1065 | winetricks_install corefonts 1066 | winetricks_install tahoma 1067 | fi 1068 | winetricks_install settings fontsmooth=rgb 1069 | fi 1070 | } 1071 | 1072 | installD3DCompiler() { 1073 | if [ -z "${WINETRICKS_UNATTENDED}" ]; then 1074 | winetricks_dll_install -q d3dcompiler_47; 1075 | else 1076 | winetricks_dll_install d3dcompiler_47; 1077 | fi 1078 | } 1079 | 1080 | installLogos9() { 1081 | getPremadeWineBottle; 1082 | 1083 | setWinetricks; 1084 | installFonts; 1085 | installD3DCompiler; 1086 | getLogosExecutable; 1087 | installMSI; 1088 | 1089 | verbose && echo "======= Set ${FLPRODUCT}Bible Indexing to Vista Mode: =======" 1090 | "${WINE_EXE}" reg add "HKCU\\Software\\Wine\\AppDefaults\\${FLPRODUCT}Indexer.exe" /v Version /t REG_SZ /d vista /f 1091 | verbose && echo "======= ${FLPRODUCT}Bible logging set to Vista mode! =======" 1092 | } 1093 | 1094 | installLogos10() { 1095 | cat > "${WORKDIR}"/disable-winemenubuilder.reg << EOF 1096 | REGEDIT4 1097 | 1098 | [HKEY_CURRENT_USER\Software\Wine\DllOverrides] 1099 | "winemenubuilder.exe"="" 1100 | 1101 | EOF 1102 | 1103 | cat > "${WORKDIR}"/renderer_gdi.reg << EOF 1104 | REGEDIT4 1105 | 1106 | [HKEY_CURRENT_USER\Software\Wine\Direct3D] 1107 | "DirectDrawRenderer"="gdi" 1108 | "renderer"="gdi" 1109 | 1110 | EOF 1111 | 1112 | wine_reg_install "disable-winemenubuilder.reg"; 1113 | wine_reg_install "renderer_gdi.reg"; 1114 | 1115 | setWinetricks; 1116 | installFonts; 1117 | installD3DCompiler; 1118 | 1119 | if [ -z "${WINETRICKS_UNATTENDED}" ]; then 1120 | winetricks_install -q settings win10 1121 | else 1122 | winetricks_install settings win10 1123 | fi 1124 | 1125 | getLogosExecutable; 1126 | installMSI; 1127 | } 1128 | ## END LOGOS INSTALL FUNCTIONS 1129 | 1130 | getScriptTemplate() { 1131 | SCRIPT_TEMPLATE="${1}" 1132 | if [ "${SCRIPT_TEMPLATE}" = "Launcher-Template.sh" ]; then 1133 | SCRIPT_TEMPLATE_URL="${LAUNCHER_TEMPLATE_URL}" 1134 | else 1135 | SCRIPT_TEMPLATE_URL="${CONTROL_PANEL_TEMPLATE_URL}" 1136 | fi 1137 | verbose && echo "Downloading the launcher script template…" 1138 | if [ -f "${PRESENT_WORKING_DIRECTORY}/${SCRIPT_TEMPLATE}" ]; then 1139 | verbose && echo "${SCRIPT_TEMPLATE} found. Using it…" 1140 | cp "${PRESENT_WORKING_DIRECTORY}/${SCRIPT_TEMPLATE}" "${WORKDIR}/" | logos_progress "Copying…" "Copying: ${SCRIPT_TEMPLATE} into ${WORKDIR}" 1141 | elif [ -f "${HOME}/Downloads/${SCRIPT_TEMPLATE}" ]; then 1142 | verbose && echo "${SCRIPT_TEMPLATE} found in Downloads. Replacing it…" 1143 | rm -f "${HOME}/Downloads/${SCRIPT_TEMPLATE}" 1144 | logos_download "${SCRIPT_TEMPLATE_URL}" "${HOME}/Downloads/" 1145 | cp "${HOME}/Downloads/${SCRIPT_TEMPLATE}" "${WORKDIR}/" | logos_progress "Copying…" "Copying: ${SCRIPT_TEMPLATE} into ${WORKDIR}" 1146 | else 1147 | logos_download "${SCRIPT_TEMPLATE_URL}" "${HOME}/Downloads/" 1148 | cp "${HOME}/Downloads/${SCRIPT_TEMPLATE}" "${WORKDIR}/" | logos_progress "Copying…" "Copying: ${SCRIPT_TEMPLATE} into ${WORKDIR}" 1149 | fi 1150 | } 1151 | 1152 | # See https://stackoverflow.com/a/17921589/1896800 1153 | apply_shell_expansion() { 1154 | file="$1" 1155 | data=$(< "$file") 1156 | delimiter="__apply_shell_expansion_delimiter__" 1157 | command="cat <<$delimiter"$'\n'"$data"$'\n'"$delimiter" 1158 | eval "$command" 1159 | } 1160 | 1161 | createLauncher() { 1162 | getScriptTemplate "Launcher-Template.sh"; 1163 | printf "%s\n" "$(apply_shell_expansion "${WORKDIR}/Launcher-Template.sh")" > "${WORKDIR}"/"${FLPRODUCT}".sh; 1164 | chmod 755 "${WORKDIR}"/"${FLPRODUCT}".sh; 1165 | mv "${WORKDIR}"/"${FLPRODUCT}".sh "${INSTALLDIR}"/ 1166 | } 1167 | 1168 | createControlPanel() { 1169 | getScriptTemplate "controlPanel-Template.sh"; 1170 | printf "%s\n" "$(apply_shell_expansion "${WORKDIR}/controlPanel-Template.sh")" > "${WORKDIR}"/controlPanel.sh; 1171 | chmod 755 "${WORKDIR}"/controlPanel.sh; 1172 | mv "${WORKDIR}"/controlPanel.sh "${INSTALLDIR}"/ 1173 | } 1174 | 1175 | create_starting_scripts() { 1176 | verbose && echo "Creating starting scripts for ${FLPRODUCT}Bible 64 bits…" 1177 | createLauncher; 1178 | createControlPanel; 1179 | } 1180 | 1181 | createConfig() { 1182 | cat > "${HOME}/.config/Logos_on_Linux/Logos_on_Linux.conf" << EOF 1183 | # INSTALL OPTIONS 1184 | FLPRODUCT="${FLPRODUCT}" 1185 | FLPRODUCTi="${FLPRODUCTi}" 1186 | TARGETVERSION="${TARGETVERSION}" 1187 | INSTALLDIR="${INSTALLDIR}" 1188 | APPDIR="${APPDIR}" 1189 | APPDIR_BINDIR="${APPDIR_BINDIR}" 1190 | WINETRICKSBIN="${WINETRICKSBIN}" 1191 | WINEPREFIX="${WINEPREFIX}" 1192 | WINEBIN_CODE="${WINEBIN_CODE}" 1193 | WINE_EXE="${WINE_EXE}" 1194 | WINESERVER_EXE="${WINESERVER_EXE}" 1195 | WINE64_APPIMAGE_FULL_URL="${WINE64_APPIMAGE_FULL_URL}" 1196 | WINE64_APPIMAGE_FULL_FILENAME="${WINE64_APPIMAGE_FULL_FILENAME}" 1197 | APPIMAGE_LINK_SELECTION_NAME="${APPIMAGE_LINK_SELECTION_NAME}" 1198 | LOGOS_EXECUTABLE="${LOGOS_EXECUTABLE}" 1199 | LOGOS_EXE="${LOGOS_EXE}" 1200 | LOGOS_DIR="$(dirname "${LOGOS_EXE}")" 1201 | 1202 | # RUN OPTIONS 1203 | LOGS="DISABLED" 1204 | 1205 | # RESTORE OPTIONS 1206 | BACKUPDIR="" 1207 | EOF 1208 | } 1209 | 1210 | postInstall() { 1211 | if [ -f "${LOGOS_EXE}" ]; then 1212 | logos_info "${FLPRODUCT} Bible ${TARGETVERSION} installed!" 1213 | if [ -z "$LOGOS_CONFIG" ] && [ ! -f "${DEFAULT_CONFIG_PATH}" ]; then 1214 | mkdir -p "${HOME}/.config/Logos_on_Linux"; 1215 | if [ -d "${HOME/.config/Logos_on_Linux}" ]; then 1216 | createConfig; 1217 | logos_info "A config file was created at ${DEFAULT_CONFIG_PATH}."; 1218 | else 1219 | logos_warn "${HOME}/.config/Logos_on_Linux does not exist. Failed to create config file." 1220 | fi 1221 | elif [ -z "$LOGOS_CONFIG" ] && [ -f "${DEFAULT_CONFIG_PATH}" ]; then 1222 | if logos_acknowledge_question "The script found a config file at ${DEFAULT_CONFIG_PATH}. Should the script overwrite the existing config?" "The existing config file was not overwritten."; then 1223 | if [ -d "${HOME/.config/Logos_on_Linux}" ]; then 1224 | createConfig; 1225 | else 1226 | logos_warn "${HOME}/.config/Logos_on_Linux does not exist. Failed to create config file." 1227 | fi 1228 | fi 1229 | else 1230 | # Script was run with a config file. Skip modifying the config. 1231 | : 1232 | fi 1233 | 1234 | if logos_acknowledge_question "A launch script has been placed in ${INSTALLDIR} for your use. The script's name is ${FLPRODUCT}.sh.\n\nDo you want to run it now?\n\nNOTE: There may be an error on first execution. You can close the error dialog." "The Script has finished. Exiting…"; then 1235 | "${INSTALLDIR}"/"${FLPRODUCT}".sh 1236 | else verbose && echo "The script has finished. Exiting…"; 1237 | fi 1238 | else 1239 | logos_error "Installation failed. ${LOGOS_EXE} not found. Exiting…\n\nThe ${FLPRODUCT} executable was not found. This means something went wrong while installing ${FLPRODUCT}. Please contact the Logos on Linux community for help." 1240 | fi 1241 | } 1242 | 1243 | main() { 1244 | { echo "$LOGOS_SCRIPT_TITLE, $LOGOS_SCRIPT_VERSION by $LOGOS_SCRIPT_AUTHOR."; 1245 | # BEGIN PREPARATION 1246 | verbose && date; checkDependencies; # We verify the user is running a graphical UI and has majority of required dependencies. 1247 | verbose && date; chooseProduct; # We ask user for his Faithlife product's name and set variables. 1248 | verbose && date; chooseVersion; # We ask user for his Faithlife product's version, set variables, and create project skeleton. 1249 | verbose && date; chooseInstallMethod; # We ask user for his desired install method. 1250 | # END PREPARATION 1251 | if [ -z "${REGENERATE}" ]; then 1252 | verbose && date; checkExistingInstall; 1253 | verbose && date; beginInstall; 1254 | verbose && date; prepareWineBottle; # We run wineboot. 1255 | case "${TARGETVERSION}" in 1256 | 10*) 1257 | verbose && date; installLogos10; ;; # We run the commands specific to Logos 10. 1258 | 9*) 1259 | verbose && date; installLogos9; ;; # We run the commands specific to Logos 9. 1260 | *) 1261 | logos_error "Installation canceled!" ;; 1262 | esac 1263 | 1264 | verbose && date; 1265 | create_starting_scripts; 1266 | heavy_wineserver_wait; 1267 | clean_all; 1268 | 1269 | LOGOS_EXE=$(find "${WINEPREFIX}" -name ${FLPRODUCT}.exe | grep "${FLPRODUCT}/${FLPRODUCT}.exe"); export LOGOS_EXE; 1270 | 1271 | verbose && date; postInstall; 1272 | else 1273 | create_starting_scripts; 1274 | logos_info "The scripts have been regenerated." 1275 | fi 1276 | } | tee -a "${LOGOS_LOG}"; 1277 | } 1278 | # END FUNCTION DECLARATIONS 1279 | 1280 | # BEGIN SCRIPT EXECUTION 1281 | if [ -z "${DIALOG}" ]; then 1282 | getDialog; 1283 | if test "${GUI}" == "true"; then 1284 | echo "Running in a GUI. Enabling logging." >> "${LOGOS_LOG}" 1285 | setDebug; 1286 | fi 1287 | fi 1288 | 1289 | die-if-running; 1290 | die-if-root; 1291 | 1292 | # BEGIN OPTARGS 1293 | RESET_OPTARGS=true 1294 | for arg in "$@" 1295 | do 1296 | if [ -n "$RESET_OPTARGS" ]; then 1297 | unset RESET_OPTARGS 1298 | set -- 1299 | fi 1300 | case "$arg" in # Relate long options to short options 1301 | --help) set -- "$@" -h ;; 1302 | --version) set -- "$@" -v ;; 1303 | --verbose) set -- "$@" -V ;; 1304 | --config) set -- "$@" -c ;; 1305 | --skip-fonts) set -- "$@" -F ;; 1306 | --regenerate-scripts) set -- "$@" -r ;; 1307 | --force-root) set -- "$@" -f ;; 1308 | --debug) set -- "$@" -D ;; 1309 | --make-skel) set -- "$@" -k ;; 1310 | --custom-binary-path) set -- "$@" -b ;; 1311 | *) set -- "$@" "$arg" ;; 1312 | esac 1313 | done 1314 | OPTSTRING=':hvVcDfFrkb:' # Available options 1315 | 1316 | # First loop: set variable options which may affect other options 1317 | while getopts "$OPTSTRING" opt; do 1318 | case $opt in 1319 | c) 1320 | NEXTOPT="${!OPTIND}" 1321 | if [[ -n "$NEXTOPT" && "$NEXTOPT" != "-*" ]]; then 1322 | OPTIND=$((OPTIND + 1)) 1323 | if [ -f "$NEXTOPT" ]; then 1324 | OPTIND=$(( OPTIND + 1 )) 1325 | echo "${NEXTOPT}" 1326 | LOGOS_CONFIG="${NEXTOPT}" 1327 | export LOGOS_CONFIG; 1328 | set -a 1329 | # shellcheck disable=SC1090 1330 | source "$LOGOS_CONFIG"; 1331 | set +a 1332 | else 1333 | logos_info "$LOGOS_SCRIPT_TITLE: -$OPTARG: Invalid config file path." >&2 && usage >&2 && exit; 1334 | fi 1335 | elif [ -f "$HOME/.config/Logos_on_Linux/Logos_on_Linux.conf" ]; then 1336 | LOGOS_CONFIG="$HOME/.config/Logos_on_Linux/Logos_on_Linux.conf" 1337 | export LOGOS_CONFIG 1338 | set -a 1339 | # shellcheck disable=SC1090 1340 | source "$LOGOS_CONFIG"; 1341 | set +a 1342 | else 1343 | logos_info "No config file found." 1344 | fi 1345 | ;; 1346 | V) export VERBOSE="true" ;; 1347 | F) export SKIP_FONTS="1" ;; 1348 | f) export LOGOS_FORCE_ROOT="1"; ;; 1349 | r) export REGENERATE="1"; ;; 1350 | D) export setDebug; 1351 | ;; 1352 | k) export SKEL="1"; ;; 1353 | b) CUSTOMBINPATH="$2"; 1354 | if [ -d "$CUSTOMBINPATH" ]; then 1355 | export CUSTOMBINPATH; 1356 | else 1357 | logos_info "$LOGOS_SCRIPT_TITLE: User supplied path: \"${OPTARG}\". Custom binary path does not exist." >&2 && usage >&2 && exit 1358 | fi; shift 2 ;; 1359 | \?) logos_info "$LOGOS_SCRIPT_TITLE: -$OPTARG: undefined option." >&2 && usage >&2 && exit ;; 1360 | :) logos_info "$LOGOS_SCRIPT_TITLE: -$OPTARG: missing argument." >&2 && usage >&2 && exit ;; 1361 | esac 1362 | done 1363 | OPTIND=1 # Reset the index. 1364 | 1365 | # Second loop: determine user action 1366 | while getopts "$OPTSTRING" opt; do 1367 | case $opt in 1368 | h) usage && exit ;; 1369 | v) logos_info "$LOGOS_SCRIPT_TITLE, $LOGOS_SCRIPT_VERSION by $LOGOS_SCRIPT_AUTHOR." && exit ;; 1370 | \?) logos_info "$LOGOS_SCRIPT_TITLE: -$OPTARG: undefined option." >&2 && usage >&2 && exit ;; 1371 | :) logos_info "$LOGOS_SCRIPT_TITLE: -$OPTARG: missing argument." >&2 && usage >&2 && exit ;; 1372 | esac 1373 | done 1374 | # If no options passed. 1375 | if [ "${OPTIND}" -eq '1' ]; then 1376 | : 1377 | fi 1378 | shift $((OPTIND-1)) 1379 | # END OPTARGS 1380 | 1381 | main; 1382 | 1383 | exit 0; 1384 | # END SCRIPT EXECUTION 1385 | 1386 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![Codacy Badge](https://api.codacy.com/project/badge/Grade/f730f74748c348cb9b3ff2fa1654c84b)](https://app.codacy.com/manual/ferion11/LogosLinuxInstaller?utm_source=github.com&utm_medium=referral&utm_content=ferion11/LogosLinuxInstaller&utm_campaign=Badge_Grade_Dashboard) 2 | [![Automation testing](https://img.shields.io/badge/Automation-testing-sucess)](https://github.com/ferion11/LogosLinuxInstallTests) [![Installer LogosBible](https://img.shields.io/badge/Installer-LogosBible-blue)](https://www.logos.com) [![LastRelease](https://img.shields.io/github/v/release/ferion11/LogosLinuxInstaller)](https://github.com/ferion11/LogosLinuxInstaller/releases) 3 | 4 | # Logos Bible Software on Linux Install Scripts 5 | 6 | This project is now archived, all future development is now on our new python installer which has more features etc. 7 | See the new project here: https://github.com/FaithLife-Community/LogosLinuxInstaller 8 | 9 | This repository contains a set of bash scripts for installing Logos Bible (Verbum) Software on Linux. 10 | 11 | # Usage 12 | 13 | ## LogosLinuxInstaller.sh 14 | 15 | ``` 16 | Usage: ./LogosLinuxInstaller.sh 17 | Installs ${FLPRODUCT} Bible Software with Wine on Linux. 18 | 19 | Options: 20 | -h --help Prints this help message and exit. 21 | -v --version Prints version information and exit. 22 | -V --verbose Enable extra CLI verbosity. 23 | -D --debug Makes Wine print out additional info. 24 | -c --config Use the Logos on Linux config file when 25 | setting environment variables. Defaults to: 26 | \$HOME/.config/Logos_on_Linux/Logos_on_Linux.conf 27 | Optionally can accept a config file provided by 28 | the user. 29 | -b --custom-binary-path Set a custom path to search for wine binaries 30 | during the install. 31 | -r --regenerate-scripts Regenerates the Logos.sh and controlPanel.sh 32 | scripts using the config file. 33 | -F --skip-fonts Skips installing corefonts and tahoma. 34 | -f --force-root Sets LOGOS_FORCE_ROOT to true, which permits 35 | the root user to run the script. 36 | -k --make-skel Make a skeleton install only. 37 | ``` 38 | 39 | ## Logos.sh 40 | 41 | ``` 42 | Usage: ./Logos.sh 43 | Interact with Logos Bible Software in Wine on Linux. 44 | 45 | Options: 46 | -h --help Prints this help message and exit. 47 | -v --version Prints version information and exit. 48 | -D --debug Makes Wine print out additional info. 49 | -f --force-root Sets LOGOS_FORCE_ROOT to true, which 50 | permits the root user to run the script. 51 | -R --check-resources Check Logos's resource usage. 52 | -e --edit-config Edit the Logos on Linux config file. 53 | -i --indexing Run the Logos indexer in the 54 | background. 55 | -b --backup Saves Logos data to the config's 56 | backup location. 57 | -r --restore Restores Logos data from the config's 58 | backup location. 59 | -l --logs Turn Logos logs on or off. 60 | -d --dirlink Create a symlink to the Windows Logos directory 61 | in your Logos on Linux install dir. 62 | The symlink's name will be 'installation_dir'. 63 | -s --shortcut Create or update the Logos shortcut, located in 64 | HOME/.local/share/applications. 65 | --remove-all-index Removes all index and library catalog files. 66 | --remove-library-catalog Removes all library catalog files. 67 | ``` 68 | 69 | ## controlPanel.sh 70 | 71 | ``` 72 | Usage: ./controlPanel.sh 73 | Interact with Logos Bible Software in Wine on Linux. 74 | 75 | Options:x 76 | -h --help Prints this help message and exit. 77 | -v --version Prints version information and exit. 78 | -D --debug Makes Wine print out additional info. 79 | -f --force-root Sets LOGOS_FORCE_ROOT to true, which permits 80 | the root user to run the script. 81 | --wine64 Run the script's wine64 binary. 82 | --wineserver Run the script's wineserver binary. 83 | --winetricks Run winetricks. 84 | --setAppImage Set the script's AppImage file. NOTE: 85 | Currently broken. Disabled until fixed. 86 | ``` 87 | 88 | # Installation [WIP] 89 | 90 | Once all dependencies are met, you can either run the script from the CLI for a CLI-only install, or you can double click the icon in your file browser or on your desktop for a GUI install. Then, follow the prompts. 91 | 92 | NOTE: You can run Logos on Linux using the Steam Proton Experimental binary, which often has the latest and greatest updates to make Logos run even smoother. The script should be able to find the binary automatically, unless your Steam install is located outside of your HOME directory. 93 | 94 | Your system must either have `dialog` or `whiptail` installed for a CLI install (launched from CLI), or you must have `zenity` installed for a GUI install (launched from double clicking). 95 | 96 | ## Install Guide 97 | 98 | For an install guide with pictures and video, see the wiki's [Install Guide](https://github.com/ferion11/LogosLinuxInstaller/wiki/Install-Guide). 99 | 100 | NOTE: This install guide is outdated. Please see [#173](https://github.com/ferion11/LogosLinuxInstaller/issues/173). 101 | 102 | ## Debian and Ubuntu 103 | 104 | ### Install dialog program, choose one of the following: 105 | 106 | CLI: 107 | 108 | ``` 109 | sudo apt install dialog 110 | ``` 111 | 112 | or 113 | 114 | ``` 115 | sudo apt install whiptail 116 | ``` 117 | 118 | GUI: 119 | 120 | ``` 121 | sudo apt install zenity 122 | ``` 123 | 124 | ### Install Dependencies 125 | 126 | ``` 127 | sudo apt install mktemp patch lsof wget find sed grep gawk tr winbind cabextract x11-apps bc libxml2-utils curl 128 | ``` 129 | 130 | If using wine from a repo, you must install wine staging. Run: 131 | 132 | ``` 133 | sudo dpkg --add-architecture i386 134 | sudo mkdir -pm755 /etc/apt/keyrings 135 | sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key 136 | CODENAME=$(lsb_release -a | grep Codename | awk '{print $2}') 137 | sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/"${CODENAME}"/winehq-"${CODENAME}".sources 138 | sudo apt install --install-recommends winehq-staging 139 | ``` 140 | 141 | See https://wiki.winehq.org/Ubuntu for help. 142 | 143 | If using the AppImage, run: 144 | 145 | ``` 146 | sudo apt install fuse3 147 | ``` 148 | 149 | ## Arch 150 | 151 | ### Install dialog program, choose one of the following: 152 | 153 | CLI: 154 | 155 | ``` 156 | sudo pacman -S dialog 157 | ``` 158 | 159 | or 160 | 161 | ``` 162 | sudo pacman -S whiptail 163 | ``` 164 | 165 | GUI: 166 | 167 | ``` 168 | sudo pacman -S zenity 169 | ``` 170 | 171 | ### Install Dependencies 172 | 173 | ``` 174 | sudo pacman -S patch lsof wget sed grep gawk cabextract samba bc libxml2 curl 175 | ``` 176 | 177 | If using wine from a repo, run: 178 | 179 | ``` 180 | sudo pacman -S wine 181 | ``` 182 | 183 | ### Manjaro 184 | 185 | #### Install dialog program, choose one of the following: 186 | 187 | CLI: 188 | 189 | ``` 190 | sudo pamac install dialog 191 | ``` 192 | 193 | or 194 | 195 | ``` 196 | sudo pamac install whiptail 197 | ``` 198 | 199 | GUI: 200 | 201 | ``` 202 | sudo pamac install zenity 203 | ``` 204 | 205 | #### Install Dependencies 206 | 207 | ``` 208 | sudo pamac install patch lsof wget sed grep gawk cabextract samba bc libxml2 curl 209 | ``` 210 | 211 | If using wine from a repo, run: 212 | 213 | ``` 214 | sudo pamac install wine 215 | ``` 216 | 217 | You may need to install pamac if you are not using Manjaro GNOME: 218 | 219 | ``` 220 | sudo pacman -S pamac-cli 221 | ``` 222 | 223 | ### Steamdeck 224 | 225 | The steam deck has a locked down filesystem. There are some missing dependencies which cause irregular crashes in Logos. These can be installed following this sequence: 226 | 227 | 1. Enter Desktop Mode 228 | 2. Use `passwd` to create a password for the deck user, unless you already did this. 229 | 3. Disable read-only mode: `sudo steamos-readonly disable` 230 | 4. Initialize pacman keyring: `sudo pacman-key --init` 231 | 5. Populate pacman keyring with the default Arch Linux keys: `sudo pacman-key --populate archlinux` 232 | 6. Get package lists: `sudo pacman -Fy` 233 | 7. Fix locale issues `sudo pacman -Syu glibc` 234 | 8. then `sudo locale-gen` 235 | 9. Install dependencies: `sudo pacman -S samba winbind cabextract appmenu-gtk-module patch bc lib32-libjpeg-turbo` 236 | 237 | Packages you install may be overwritten by the next Steam OS update, but you can easily reinstall them if that happens. 238 | 239 | After these steps you can go ahead and run the your install script. 240 | 241 | ## RPM 242 | 243 | ### Install dialog program, choose one of the following: 244 | 245 | CLI: 246 | 247 | ``` 248 | sudo dnf install dialog 249 | ``` 250 | 251 | or 252 | 253 | ``` 254 | sudo dnf install whiptail 255 | ``` 256 | 257 | GUI: 258 | 259 | ``` 260 | sudo dnf install zenity 261 | ``` 262 | 263 | ### Install Dependencies 264 | 265 | ``` 266 | sudo dnf install patch mod_auth_ntlm_winbind samba-winbind cabextract bc libxml2 curl 267 | ``` 268 | 269 | If using wine from a repo, run: 270 | 271 | ``` 272 | sudo dnf install winehq-staging 273 | ``` 274 | 275 | If using the AppImage, run: 276 | 277 | ``` 278 | sudo dnf install fuse3 279 | ``` 280 | 281 | ### CentOS 282 | 283 | #### Install dialog program, choose one of the following: 284 | 285 | CLI: 286 | 287 | ``` 288 | sudo yum install dialog 289 | ``` 290 | 291 | or 292 | 293 | ``` 294 | sudo yum install whiptail 295 | ``` 296 | 297 | GUI: 298 | 299 | ``` 300 | sudo yum install zenity 301 | ``` 302 | 303 | ### Install Dependencies 304 | 305 | ``` 306 | sudo yum install patch mod_auth_ntlm_winbind samba-winbind cabextract bc libxml2 curl 307 | ``` 308 | 309 | If using wine from a repo, run: 310 | 311 | ``` 312 | sudo yum install winehq-staging 313 | ``` 314 | 315 | If using the AppImage, run: 316 | 317 | ``` 318 | sudo yum install fuse3 319 | ``` 320 | 321 | ## OpenSuse 322 | 323 | TODO 324 | 325 | ``` 326 | sudo zypper install … 327 | ``` 328 | 329 | ## Alpine 330 | 331 | TODO 332 | 333 | ``` 334 | sudo apk add … 335 | ``` 336 | 337 | ## BSD 338 | 339 | TODO. The BSDs will require the script to be modified. 340 | 341 | ``` 342 | doas pkg install … 343 | ``` 344 | 345 | This would require rewriting major chunks of the script, which has assumed GNU/Linux and Bash. 346 | 347 | ## ChromeOS 348 | 349 | TODO. 350 | -------------------------------------------------------------------------------- /controlPanel-Template.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | TITLE="controlPanel.sh" 3 | VERSION="${LOGOS_SCRIPT_VERSION}" 4 | AUTHOR="${LOGOS_SCRIPT_AUTHOR}" 5 | # generated by "${LOGOS_SCRIPT_VERSION}" script from https://github.com/ferion11/LogosLinuxInstaller 6 | 7 | # BEGIN ENVIRONMENT 8 | HERE="\$(dirname "\$(readlink -f "\${0}")")" 9 | 10 | # Save IFS 11 | IFS_TMP=\${IFS} 12 | IFS=$'\n' 13 | 14 | # Set config path if the user does not supply one at CLI. 15 | if [ -z "\${CONFIG_PATH}" ]; then 16 | CONFIG_PATH="\${HOME}/.config/Logos_on_Linux/Logos_on_Linux.conf"; export CONFIG_PATH; 17 | fi 18 | 19 | # Source the config path, else use the values saved from when the script was run 20 | # in case the config file's generation failed. This should maintain functionality 21 | # from before the addition of the config file and after. 22 | 23 | if [ -f \${CONFIG_PATH} ]; then 24 | set -a; 25 | source \${CONFIG_PATH}; 26 | set +a; 27 | if [ -z \${WINEPREFIX} ] || [ -z \${WINE_EXE} ] || [ -z "\${WINESERVER_EXE}" ] || [ -z "\${APPDIR_BINDIR}" ] || [ -z "\${APPIMAGE_LINK_SELECTION_NAME}" ] || [ -z "\${WINETRICKSBIN}" ]; then 28 | echo "controlPanel.sh needs these variables set in the config file:" 29 | echo "- WINEPREFIX" 30 | echo "- WINE_EXE" 31 | echo "- WINESERVER_EXE" 32 | echo "- APPDIR_BINDIR" 33 | echo "- APPIMAGE_LINK_SELECTION_NAME" 34 | echo "- WINETRICKSBIN" 35 | echo "Config file incomplete. Exiting." >&2 && exit 1; 36 | fi 37 | else 38 | [ -x "\${HERE}/data/bin/wine64" ] && export PATH="\${HERE}/data/bin:\${PATH}" 39 | export WINEPREFIX="\${HERE}/data/wine64_bottle"; export WINEPREFIX; 40 | export WINE_EXE="${WINE_EXE}"; export WINE_EXE; 41 | export WINESERVER_EXE="${WINESERVER_EXE}"; export WINESERVER_EXE; 42 | export APPDIR_BINDIR="${APPDIR_BINDIR}"; export APPDIR_BINDIR 43 | export APPIMAGE_LINK_SELECTION_NAME="${APPIMAGE_LINK_SELECTION_NAME}"; export APPIMAGE_LINK_SELECTION_NAME; 44 | fi 45 | if [ -z "${WINETRICKS_URL}" ]; then WINETRICKS_URL="https://raw.githubusercontent.com/Winetricks/winetricks/master/src/winetricks"; export WINETRICKS_URL; fi 46 | 47 | if [ -z "\${WINEDEBUG}" ]; then WINEDEBUG="fixme-all,err-all"; export WINEDEBUG; fi # Make wine output less verbose 48 | # END ENVIRONMENT 49 | # BEGIN FUNCTION DECLARATIONS 50 | usage() { 51 | cat << EEOF 52 | \$TITLE, by \$AUTHOR, \$VERSION. 53 | 54 | Usage: ./\$TITLE 55 | Interact with ${FLPRODUCT} Bible Software in Wine on Linux. 56 | 57 | Options: 58 | -h --help Prints this help message and exit. 59 | -v --version Prints version information and exit. 60 | -D --debug Makes Wine print out additional info. 61 | -f --force-root Sets LOGOS_FORCE_ROOT to true, which permits 62 | the root user to run the script. 63 | --wine64 Run the script's wine64 binary. 64 | --wineserver Run the script's wineserver binary. 65 | --winetricks Run winetricks. 66 | --selectAppImage Set the script's AppImage file. 67 | 68 | EEOF 69 | } 70 | 71 | cli_download() { 72 | URI="\${1}" 73 | DESTINATION="\${2}" 74 | FILENAME="\${URI##*/}" 75 | 76 | if [ "\${DESTINATION}" != "\${DESTINATION%/}" ]; then 77 | TARGET="\${DESTINATION}/\${1##*/}" 78 | [ -d "\${DESTINATION}" ] || mkdir -p "\${DESTINATION}" || echo "Cannot create \${DESTINATION}" && exit 1 79 | elif [ -d "\${DESTINATION}" ]; then 80 | TARGET="\${DESTINATION}/${1##*/}" 81 | else 82 | TARGET="\${DESTINATION}" 83 | [ -d "\${DESTINATION%/*}" ] || mkdir -p "\${DESTINATION%/*}" || echo "Cannot create directory \${DESTINATION%/*}" && exit 1 84 | fi 85 | echo "\${URI}" 86 | wget --inet4-only -c "\${URI}" -O "\${TARGET}" 87 | } 88 | setWinetricks() { 89 | if [ -f "\${APPDIR_BINDIR}/winetricks" ]; then 90 | WINETRICKSBIN="\${APPDIR_BINDIR}/winetricks" 91 | elif [ \$(which winetricks) &> /dev/null ]; then 92 | LOCAL_WINETRICKS_VERSION=\$(winetricks --version | awk -F' ' '{print \$1}') 93 | if [ "\${LOCAL_WINETRICKS_VERSION}" -ge "20220411" ]; then 94 | WINETRICKSBIN="\$(which winetricks)" 95 | fi 96 | else 97 | if [ ! -z "\${WINETRICKS_URL}" ]; then 98 | cli_download "\${WINETRICKS_URL}" "\${APPDIR_BINDIR}/winetricks" 99 | chmod 755 "\${APPDIR_BINDIR}/winetricks" 100 | WINETRICKSBIN="\${APPDIR_BINDIR}/winetricks" 101 | if [ -z "${CONFIG_PATH}" ]; then 102 | sed -ri 's/(WINETRICKSBIN=)(".*")/\1TAYLOR/' "\${CONFIG_PATH}" 103 | fi 104 | else 105 | echo "WINETRICKS_URL not set." 106 | fi 107 | fi 108 | export WINETRICKSBIN 109 | } 110 | runWinetricks() { 111 | if [ ! -z "\${WINETRICKSBIN}" ] && [ -f "\${WINETRICKSBIN}" ]; then 112 | : 113 | else 114 | setWinetricks 115 | fi 116 | "\${WINETRICKSBIN}" "$@" 117 | "\${WINESERVER_EXE}" -w 118 | } 119 | 120 | selectAppImage() { 121 | echo "======= Running AppImage Selection only: =======" 122 | APPIMAGE_FILENAME="" 123 | APPIMAGE_LINK_SELECTION_NAME="\${APPIMAGE_LINK_SELECTION_NAME}" 124 | 125 | APPIMAGE_FULLPATH="\$(zenity --file-selection --filename="\${HERE}"/data/*.AppImage --file-filter='AppImage files | *.AppImage *.Appimage *.appImage *.appimage' --file-filter='All files | *')" 126 | if [ -z "\${APPIMAGE_FULLPATH}" ]; then 127 | echo "No *.AppImage file selected! exiting…" 128 | exit 1 129 | fi 130 | 131 | APPIMAGE_FILENAME="\${APPIMAGE_FULLPATH##*/}" 132 | APPIMAGE_DIR="\${APPIMAGE_FULLPATH%\${APPIMAGE_FILENAME}}" 133 | APPIMAGE_DIR="\${APPIMAGE_DIR%?}" 134 | #------- 135 | 136 | if [ "\${APPIMAGE_DIR}" != "\${HERE}/data/bin" ]; then 137 | if zenity --question --width=300 --height=200 --text="Warning: The AppImage isn't at \"./data/bin/ directory\"\!\nDo you want to copy the AppImage to the \"./data/bin/\" directory keeping portability?" -- title='Warning!'; then 138 | [ -f "\${HERE}/data/bin/\${APPIMAGE_FILENAME}" ] && rm -rf "\${HERE}/data/bin/\${APPIMAGE_FILENAME}" 139 | cp "\${APPIMAGE_FULLPATH}" "\${HERE}/data/bin/" 140 | APPIMAGE_FULLPATH="\${HERE}/data/bin/\${APPIMAGE_FILENAME}" 141 | else 142 | echo "Warning: Linking \${APPIMAGE_FULLPATH} to ./data/bin/\${APPIMAGE_LINK_SELECTION_NAME}" 143 | chmod +x "\${APPIMAGE_FULLPATH}" 144 | ln -s "\${APPIMAGE_FULLPATH}" "\${APPIMAGE_LINK_SELECTION_NAME}" 145 | rm -rf "\${HERE}/data/bin/\${APPIMAGE_LINK_SELECTION_NAME}" 146 | mv "\${APPIMAGE_LINK_SELECTION_NAME}" "\${HERE}/data/bin/" 147 | #(DISPLAY="" "\${HERE}/controlPanel.sh" "\${WINE_EXE}" wineboot) | zenity --progress --title="Wine Bottle update" --text="Updating Wine Bottle…" --pulsate --auto-close --no-cancel 148 | echo "======= AppImage Selection run done with external link! =======" 149 | exit 0 150 | fi 151 | fi 152 | 153 | echo "Info: Linking ../\${APPIMAGE_FILENAME} to ./data/bin/\${APPIMAGE_LINK_SELECTION_NAME}" 154 | chmod +x "\${APPIMAGE_FULLPATH}" 155 | ln -s "../\${HERE}/data/bin/\${APPIMAGE_FILENAME}" "\${APPIMAGE_LINK_SELECTION_NAME}" 156 | rm -rf "\${HERE}/data/bin/\${APPIMAGE_LINK_SELECTION_NAME}" 157 | mv "\${APPIMAGE_LINK_SELECTION_NAME}" "\${HERE}/data/bin/" 158 | #(DISPLAY="" "\${HERE}/controlPanel.sh" "\${WINE_EXE}" wineboot) | zenity --progress --title="Wine Bottle update" --text="Updating Wine Bottle…" --pulsate --auto-close --no-cancel 159 | echo "======= AppImage Selection run done! =======" 160 | exit 0 161 | } 162 | # END FUNCTION DECLARATIONS 163 | # BEGIN OPTARGS 164 | RESET_OPTARGS=true 165 | for arg in "\$@" 166 | do 167 | if [ -n "\$RESET_OPTARGS" ]; then 168 | unset RESET_OPTARGS 169 | set -- 170 | fi 171 | case "\$arg" in # Relate long options to short options 172 | --help) set -- "\$@" -h ;; 173 | --version) set -- "\$@" -V ;; 174 | --force-root) set -- "\$@" -f ;; 175 | --debug) set -- "\$@" -D ;; 176 | *) set -- "\$@" "\$arg" ;; 177 | esac 178 | done 179 | OPTSTRING=':-:hvDf' # Available options 180 | 181 | # First loop: set variable options which may affect other options 182 | while getopts "\$OPTSTRING" opt; do 183 | case \$opt in 184 | f) export LOGOS_FORCE_ROOT="1"; ;; 185 | D) export DEBUG=true; 186 | WINEDEBUG=""; ;; 187 | \\?) echo "\$TITLE: -\$OPTARG: undefined option." >&2 && usage >&2 && exit ;; 188 | :) echo "\$TITLE: -\$OPTARG: missing argument." >&2 && usage >&2 && exit ;; 189 | esac 190 | done 191 | OPTIND=1 # Reset the index. 192 | 193 | # Second loop: determine user action 194 | while getopts "\$OPTSTRING" opt; do 195 | case \$opt in 196 | h) usage && exit ;; 197 | v) echo "\$TITLE, \$VERSION by \$AUTHOR." && exit ;; 198 | -) 199 | case "\${OPTARG}" in 200 | wine64) 201 | shift 202 | "\${WINE_EXE}" "\$@" 203 | "\${WINESERVER_EXE}" -w 204 | exit 0 ;; 205 | wineserver) 206 | shift 207 | "\${WINESERVER_EXE}" "\$@" 208 | exit 0 ;; 209 | winetricks) 210 | shift 211 | runWinetricks; 212 | exit 0 ;; 213 | selectAppImage) 214 | selectAppImage; 215 | exit 0;; 216 | *) 217 | if [ "\$OPTERR" = 1 ] && [ "\${OPTSTRING:0:1}" != ":" ]; then 218 | echo "\$TITLE: --\${OPTARG}: undefined option." >&2 && usage >&2 && exit 219 | fi 220 | esac;; 221 | \\?) echo "\$TITLE: -\$OPTARG: undefined option." >&2 && usage >&2 && exit ;; 222 | :) echo "\$TITLE: -\$OPTARG: missing argument." >&2 && usage >&2 && exit ;; 223 | esac 224 | done 225 | if [ "\$OPTIND" -eq '1' ]; then 226 | echo "No options were passed."; 227 | fi 228 | shift \$((OPTIND-1)) 229 | # END OPTARGS 230 | 231 | # BEGIN DIE IF ROOT 232 | if [ "\$(id -u)" -eq '0' ] && [ -z "\${LOGOS_FORCE_ROOT}" ]; then 233 | echo "* Running Wine/winetricks as root is highly discouraged. Use -f|--force-root if you must run as root. See https://wiki.winehq.org/FAQ#Should_I_run_Wine_as_root.3F" 234 | exit 1; 235 | fi 236 | # END DIE IF ROOT 237 | 238 | debug() { 239 | [[ \$DEBUG = true ]] && return 0 || return 1 240 | } 241 | 242 | debug && echo "Debug mode enabled." 243 | 244 | "\${WINE_EXE}" control 245 | "\${WINESERVER_EXE}" -w 246 | #------------------------------------------------- 247 | 248 | #------------- Ending block ---------------------- 249 | # restore IFS 250 | IFS=\${IFS_TMP} 251 | #------------------------------------------------- 252 | -------------------------------------------------------------------------------- /export: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/export -------------------------------------------------------------------------------- /img/logos4-128-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/logos4-128-icon.png -------------------------------------------------------------------------------- /img/step_01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_01.png -------------------------------------------------------------------------------- /img/step_02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_02.png -------------------------------------------------------------------------------- /img/step_03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_03.png -------------------------------------------------------------------------------- /img/step_04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_04.png -------------------------------------------------------------------------------- /img/step_05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_05.png -------------------------------------------------------------------------------- /img/step_06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_06.png -------------------------------------------------------------------------------- /img/step_07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_07.png -------------------------------------------------------------------------------- /img/step_08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_08.png -------------------------------------------------------------------------------- /img/step_09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_09.png -------------------------------------------------------------------------------- /img/step_10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_10.png -------------------------------------------------------------------------------- /img/step_11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_11.png -------------------------------------------------------------------------------- /img/step_12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_12.png -------------------------------------------------------------------------------- /img/step_13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_13.png -------------------------------------------------------------------------------- /img/step_14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_14.png -------------------------------------------------------------------------------- /img/step_15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_15.png -------------------------------------------------------------------------------- /img/step_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_16.png -------------------------------------------------------------------------------- /img/step_17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_17.png -------------------------------------------------------------------------------- /img/step_18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_18.png -------------------------------------------------------------------------------- /img/step_19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_19.png -------------------------------------------------------------------------------- /img/step_20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_20.png -------------------------------------------------------------------------------- /img/step_21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_21.png -------------------------------------------------------------------------------- /img/step_22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/step_22.png -------------------------------------------------------------------------------- /img/verbum-128-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ferion11/LogosLinuxInstaller/554c9a6b1286a1c8c8a5758b172dc436d84ed646/img/verbum-128-icon.png --------------------------------------------------------------------------------