summaryrefslogtreecommitdiffstats
path: root/_deploy
diff options
context:
space:
mode:
Diffstat (limited to '_deploy')
-rw-r--r--_deploy/okchai/localsettings-okchai.py200
-rw-r--r--_deploy/okchai/os-survey.sh22
-rw-r--r--_deploy/okchai/os-trog24.04.sh92
-rwxr-xr-x_deploy/okchai/pre-push.sh63
-rwxr-xr-x_deploy/okchai/pre-run.sh36
-rw-r--r--_deploy/okchai/venv-trog.sh53
6 files changed, 466 insertions, 0 deletions
diff --git a/_deploy/okchai/localsettings-okchai.py b/_deploy/okchai/localsettings-okchai.py
new file mode 100644
index 0000000..faa3551
--- /dev/null
+++ b/_deploy/okchai/localsettings-okchai.py
@@ -0,0 +1,200 @@
+import sys
+from pathlib import Path
+
+"""Settings for a troggle installation which may vary among different
+installations: for development or deployment, in a docker image or
+python virtual environment (venv), on ubuntu, debian or in Windows
+System for Linux (WSL), on the main server or in the potato hut,
+using SQLite or mariaDB.
+
+It sets the directory locations for the major parts of the system so
+that e.g. expofiles can be on a different filesystem, or /javascript/ can be in
+a system-wide location rather than just a local directory.
+
+This file is included at the end of the main troggle/settings.py file so that
+it overwrites defaults in that file.
+
+Read https://realpython.com/python-pathlib/
+Read https://adamj.eu/tech/2020/03/16/use-pathlib-in-your-django-project/
+"""
+
+print(" * importing troggle/localsettings.py")
+
+
+EXPOUSER = 'expo'
+EXPOADMINUSER = 'expoadmin'
+EXPOUSER_EMAIL = 'wookey@wookware.org'
+EXPOADMINUSER_EMAIL = 'wookey@wookware.org'
+from secret_credentials import *
+
+EMAIL_HOST = "smtp-auth.mythic-beasts.com"
+EMAIL_HOST_USER = "django-test@klebos.eu" # Philip Sargent really
+EMAIL_PORT = 587
+EMAIL_USE_TLS = True
+DEFAULT_FROM_EMAIL = "EXPO SERVER AUTOMATIC <django-test@klebos.eu>"
+# -----------------------------------------------------------------
+# THINK before you push this to a repo
+# - have you checked that secret_credentials.py is in .gitignore ?
+# - we don't want to have to change the expo system password !
+# -----------------------------------------------------------------
+# default values, real secrets will be imported from credentials.py in future
+
+SQLITEFILE = "/home/philip/expo/troggle.sqlite" # can be ':memory:'
+
+PHOTOSREMOTE = False # if True, then re-routes urls in expofiles/photos to remote server. Not implemented yet
+EXPOFILESREMOTE = False # if True, then re-routes urls in expofiles to remote server. Tests are then less accurate.
+# SECURE_SSL_REDIRECT = True # breaks 7 tests in test suite 301 not 200 (or 302) and runserver fails completely
+SERVERPORT = "8000" # not needed as it is the default
+
+ADMINS = (
+ ('Philip', 'philip.sargent@klebos.eu'),
+)
+
+PV = "python" + str(sys.version_info.major) + "." + str(sys.version_info.minor)
+
+# Troggle does a lot of file-handling. This is very error-prone when using primitive methods,
+# so we use pathlib which has been standard since python 3.4
+# If pathlib is new to you, you will need to read https://realpython.com/python-pathlib/
+
+# --------------------- MEDIA redirections BEGIN ---------------------
+REPOS_ROOT_PATH = Path(__file__).parent.parent
+LIBDIR = REPOS_ROOT_PATH / "lib" / PV
+
+TROGGLE_PATH = Path(__file__).parent
+TEMPLATE_PATH = TROGGLE_PATH / "templates"
+MEDIA_ROOT = TROGGLE_PATH / "media"
+JSLIB_ROOT = TROGGLE_PATH / "media" / "jslib" # used for CaveViewer JS utility
+
+# FILES = Path('/mnt/d/expofiles/')
+EXPOFILES = REPOS_ROOT_PATH / "expofiles"
+
+SCANS_ROOT = EXPOFILES / "surveyscans"
+PHOTOS_ROOT = EXPOFILES / "photos"
+PHOTOS_YEAR = "2023"
+NOTABLECAVESHREFS = ["290", "291", "264", "258", "204", "359", "76", "107"]
+
+
+PYTHON_PATH = REPOS_ROOT_PATH / "troggle"
+LOGFILE = PYTHON_PATH / "troggle.log"
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+MEDIA_URL = "/site-media/"
+
+DIR_ROOT = Path("") # this should end in / if a value is given
+URL_ROOT = "/"
+# URL_ROOT = 'http://localhost:'+ SERVERPORT +'/'
+
+# Note that these constants are not actually used in urls.py, they should be..
+# and they all need to end with / so using 'Path' doesn't work..
+MEDIA_URL = Path(URL_ROOT, "/site_media/")
+PHOTOS_URL = Path(URL_ROOT, "/photos/")
+
+
+STATIC_URL = Path(URL_ROOT, "/static/") # used by Django admin pages. Do not delete.
+JSLIB_URL = Path(URL_ROOT, "/javascript/") # used for CaveViewer JS utility
+
+# STATIC_ROOT removed after merging content into MEDIA_ROOT. See urls.py & core/views/surveys.py
+# --------------------- MEDIA redirections END ---------------------
+
+PUBLIC_SITE = True
+DEBUG = True # Always keep this True, even when on public server. Otherwise NO USEFUL ERROR MESSAGES !
+CACHEDPAGES = True # experimental page cache for a handful of page types
+
+# executables:
+CAVERN = "cavern" # for parsing .svx files and producing .3d files
+SURVEXPORT = "survexport" # for parsing .3d files and producing .pos files
+
+DBSQLITE = {
+ "default": {
+ "ENGINE": "django.db.backends.sqlite3", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
+ "NAME": SQLITEFILE,
+ # 'NAME' : ':memory:',
+ "USER": "expo", # Not used with sqlite3.
+ "PASSWORD": "sekrit", # Not used with sqlite3.
+ "HOST": "", # Set to empty string for localhost. Not used with sqlite3.
+ "PORT": "", # Set to empty string for default. Not used with sqlite3.
+ }
+}
+DBMARIADB = {
+ "default": {
+ "ENGINE": "django.db.backends.mysql", # 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
+ "OPTIONS": {
+ "charset": "utf8mb4",
+ },
+ "NAME": "troggle", # Or path to database file if using sqlite3.
+ "USER": "expo",
+ "PASSWORD": MARIADB_SERVER_PASSWORD,
+ "HOST": "", # Set to empty string for localhost. Not used with sqlite3.
+ "PORT": "", # Set to empty string for default. Not used with sqlite3.
+ }
+}
+
+# default database for me is squlite
+DBSWITCH = "sqlite"
+
+if DBSWITCH == "sqlite":
+ DATABASES = DBSQLITE
+if DBSWITCH == "mariadb":
+ DATABASES = DBMARIADB
+
+
+
+TEMPLATES = [
+ {
+ "BACKEND": "django.template.backends.django.DjangoTemplates",
+ "DIRS": [TEMPLATE_PATH],
+ "OPTIONS": {
+ "debug": "DEBUG",
+ "context_processors": [
+ # django.template.context_processors.csrf, # is always enabled and cannot be removed, sets csrf_token
+ "django.contrib.auth.context_processors.auth", # knowledge of logged-on user & permissions
+ "core.context.troggle_context", # in core/context.py - only used in expedition.html
+ "django.template.context_processors.debug",
+ "django.template.context_processors.i18n",
+ "django.template.context_processors.media", # includes a variable MEDIA_URL
+ "django.template.context_processors.static", # includes a variable STATIC_URL used by admin pages
+ "django.template.context_processors.tz",
+ "django.template.context_processors.request", # must be enabled in DjangoTemplates (TEMPLATES) in order to use the admin navigation sidebar.
+ "django.contrib.messages.context_processors.messages",
+ ],
+ "loaders": [
+ "django.template.loaders.filesystem.Loader", # default lcation is troggle/templates/
+ "django.template.loaders.app_directories.Loader", # needed for admin 'app'
+ ],
+ },
+ },
+]
+
+
+
+SURVEX_DATA = REPOS_ROOT_PATH / "loser"
+DRAWINGS_DATA = REPOS_ROOT_PATH / "drawings"
+EXPOWEB = REPOS_ROOT_PATH / "expoweb"
+CAVEDESCRIPTIONS = EXPOWEB / "cave_data"
+ENTRANCEDESCRIPTIONS = EXPOWEB / "entrance_data"
+
+# EXPOWEB_URL = "" # defunct, removed.
+# SCANS_URL = '/survey_scans/' # defunct, removed.
+
+sys.path.append(str(REPOS_ROOT_PATH))
+sys.path.append(str(PYTHON_PATH))
+
+# Sanitise these to be strings as Django seems to be particularly sensitive to crashing if they aren't
+STATIC_URL = str(STATIC_URL) + "/"
+MEDIA_URL = str(MEDIA_URL) + "/"
+
+# Re-enable TinyMCE when Dj upgraded to v3. Also templates/editexpopage.html
+# TINYMCE_DEFAULT_CONFIG = {
+# 'plugins': "table,spellchecker,paste,searchreplace",
+# 'theme': "advanced",
+# }
+# TINYMCE_SPELLCHECKER = False
+# TINYMCE_COMPRESSOR = True
+#TINY_MCE_MEDIA_ROOT = STATIC_ROOT + '/tiny_mce/' # not needed while TinyMCE not installed
+#TINY_MCE_MEDIA_URL = STATIC_URL + '/tiny_mce/' # not needed while TinyMCE not installed
+
+
+# TEST_RUNNER = "django.test.runner.DiscoverRunner"
+
+print(" + finished importing troggle/localsettings.py") \ No newline at end of file
diff --git a/_deploy/okchai/os-survey.sh b/_deploy/okchai/os-survey.sh
new file mode 100644
index 0000000..b41b806
--- /dev/null
+++ b/_deploy/okchai/os-survey.sh
@@ -0,0 +1,22 @@
+#!/bin/bash
+# Run this in a terminal : 'bash os-survey.sh'
+# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
+# 'Open Linux shell here'
+echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
+cat /etc/os-release
+# Expects an Ubuntu 24.04 relatively clean install.
+# 24.04 has python 3.12
+
+
+echo '###'
+echo '### NOW INSTALLING tunnel and therion, go and have a cup of tea. Or a 3-course meal.'
+echo '###'
+sudo apt install tunnelx therion -y
+sudo apt install survex-aven -y
+sudo apt install gpsprune qgis -y
+
+
+cd ~/expo
+rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
+# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
+
diff --git a/_deploy/okchai/os-trog24.04.sh b/_deploy/okchai/os-trog24.04.sh
new file mode 100644
index 0000000..f3d1185
--- /dev/null
+++ b/_deploy/okchai/os-trog24.04.sh
@@ -0,0 +1,92 @@
+#!/bin/bash
+# Run this in a terminal in the troggle directory: 'bash os-trog.sh'
+# On WSL, do Shift-click in the file explorer on the troggle folder to open a Linux command line
+# 'Open Linux shell here'
+echo 'Run this in a terminal in your home directory: "bash os-trog.sh"'
+cat /etc/os-release
+# Expects an Ubuntu 24.04 relatively clean install.
+# 24.04 has python 3.12
+
+# sudo apt install python-is-python3 -y
+python --version : ensure python is an alias for python3 not python2.7
+ssh -V
+sudo apt update -y
+sudo apt dist-upgrade -y
+sudo apt autoremove -y
+
+
+# Already in Ubuntu 24.04 on WSL:
+# sudo apt install git -y
+# sudo apt install wget gpg
+# sudo apt install sftp -y
+# sudo apt install openssh-client -y
+# sudo apt install rsync
+
+# Now using uv not pip:
+# sudo apt install python3-pip -y
+
+sudo apt install sqlite3 -y
+sudo apt install gedit -y
+sudo apt install tig gitg meld -y
+
+# python formatting https://docs.astral.sh/ruff/
+sudo snap install ruff
+
+# # do not actually use this any more
+# sudo useradd expo
+# sudo usermod -a -G sudo expo # to put expo in sudoers group, re-login required
+
+# as debian does not install everything that ubuntu does, you need:
+sudo apt install python3-venv -y
+sudo apt install python3-dev -y
+# sudo apt install python3-distutils -y
+
+# install uv
+curl -LsSf https://astral.sh/uv/install.sh | sh
+
+sudo apt install mariadb-server -y
+sudo apt install libmariadb-dev -y
+
+# Go to https://expo.survex.com/handbook/troggle/troglaptop.html#dbtools
+# sudo service mysql start
+
+
+# We don't install the later version or the earlier versions of python - for dev and "sever mimic" environments
+# we leave that to uv to install now.
+
+# In Dec.2024, the server is running 3.11 but dev work will be using 3.13
+# The setup of the virtual environment is done by troggle/_deploy/wsl/venv-trog.sh
+
+# install VS code - but ONLY on a native ubuntu install, NOT in WSL
+# sudo apt install software-properties-common apt-transport-https
+# wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > packages.microsoft.gpg
+# sudo install -D -o root -g root -m 644 packages.microsoft.gpg /etc/apt/keyrings/packages.microsoft.gpg
+# sudo sh -c 'echo "deb [arch=amd64,arm64,armhf signed-by=/etc/apt/keyrings/packages.microsoft.gpg] https://packages.microsoft.com/repos/code stable main" > /etc/apt/sources.list.d/vscode.list'
+# sudo apt update
+# sudo apt install code
+
+
+mkdir ~/expo
+cd ~/expo
+
+echo '###'
+echo '### Now YOU have to configure the git settings for YOURSELF (not "expo")'
+echo '### because you can't clone the repos without a key
+
+git config --global user.email "philip.sargent@gmail.com"
+git config --global user.name "Philip Sargent"
+git config --global pull.rebase true
+
+#Change this to clone using https?? at least for troggle?
+git clone ssh://expo@expo.survex.com/home/expo/troggle
+git clone ssh://expo@expo.survex.com/home/expo/loser
+git clone ssh://expo@expo.survex.com/home/expo/expoweb
+git clone ssh://expo@expo.survex.com/home/expo/drawings
+
+mkdir expofiles
+rsync -azv --delete-after --prune-empty-dirs expo@expo.survex.com:expofiles/surveyscans/ expofiles/surveyscans
+rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/2018/PhilipSargent/ expofiles/photos/2018/PhilipSargent
+
+rsync -azv --delete-after --prune-empty-dirs --exclude="photos" --exclude="video" --exclude="mapapp" expo@expo.survex.com:expofiles/ expofiles
+# rsync -azv --exclude="*.jpg.xml" --exclude="*.jpeg.xml" --exclude="*.JPG.xml" expo@expo.survex.com:expofiles/photos/ expofiles/photos
+
diff --git a/_deploy/okchai/pre-push.sh b/_deploy/okchai/pre-push.sh
new file mode 100755
index 0000000..9782f20
--- /dev/null
+++ b/_deploy/okchai/pre-push.sh
@@ -0,0 +1,63 @@
+#! /bin/bash
+# create and sanitise files for pushing to repo
+# catatrophically forgot to sanitize localsettingsWSL.py - oops.
+
+#Make sure you have the WSL permissions system working, or you will push unsanitized files as this will fail
+# Philip Sargent 2022/04/12
+
+HOSTNAME=`hostname`
+echo "** This copies file to _deploy/${HOSTNAME}/ !"
+cd ..
+
+cd troggle
+echo `pwd`
+echo deprecations.
+
+PYTHON="uv run"
+
+source .venv/bin/activate
+python3 -Wall manage.py check -v 3 2>deprecations.txt >/dev/null
+deactivate
+echo diffsettings.
+rm diffsettings.txt
+if test -f "diffsettings.txt"; then
+ echo "diffsettings.txt not deleted. You have a serious permissions problem. Aborting.."
+ exit
+fi
+$PYTHON manage.py diffsettings | grep "###" > diffsettings.txt
+
+echo inspectdb.
+# this next line requires database setting to be troggle.sqlite:
+$PYTHON manage.py inspectdb > troggle-inspectdb.py
+#egrep -in "unable|error" troggle-inspectdb.py
+echo remove passwords.
+cp localsettings.py localsettings-${HOSTNAME}.py
+sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
+sed -i '/EXPOUSERPASS/ s/^.*$/EXPOUSERPASS = "nnn:gggggg - real-expo-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
+echo " reset: EXPOUSERPASS = \"nnn:gggggg\" - real-expo-password---imported-from-localsettings.py"
+
+sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' diffsettings.txt
+sed -i '/EXPOADMINUSERPASS/ s/^.*$/EXPOADMINUSERPASS = "gggggg:nnn - real-expo-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
+echo " reset: EXPOUSERPASS = \"gggggg:nnn\" - real-expo-password---imported-from-localsettings.py"
+
+sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' diffsettings.txt
+sed -i '/EMAIL_HOST_PASSWORD/ s/^.*$/EMAIL_HOST_PASSWORD = "real-email-password---imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
+echo " reset: EMAIL_HOST_PASSWORD = \"real-email-password--imported-from-localsettings.py\""
+
+sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' diffsettings.txt
+sed -i '/SECRET_KEY/ s/^.*$/SECRET_KEY = "real-SECRET_KEY--imported-from-localsettings.py"/' localsettings-${HOSTNAME}.py
+echo " reset: SECRET_KEY = \"real-SECRET_KEY--imported-from-localsettings.py\""
+
+mkdir -p _deploy/${HOSTNAME}
+mv _deploy/${HOSTNAME}/localsettings-${HOSTNAME}.py _deploy/${HOSTNAME}/localsettings-${HOSTNAME}.py.bak
+mv localsettings-${HOSTNAME}.py _deploy/${HOSTNAME}
+cp *.sh _deploy/${HOSTNAME}
+
+#
+# Do these before final testing, *not* just before pushing:
+# in ./pre-run.sh
+# $PYTHON reset-django.py
+# $PYTHON manage.py makemigrations
+# $PYTHON manage.py test
+# $PYTHON manage.py inspectdb > troggle-inspectdb.py
+# egrep -i "unable|error" troggle-inspectdb.py
diff --git a/_deploy/okchai/pre-run.sh b/_deploy/okchai/pre-run.sh
new file mode 100755
index 0000000..ab13800
--- /dev/null
+++ b/_deploy/okchai/pre-run.sh
@@ -0,0 +1,36 @@
+#! /bin/bash
+# Do these before final testing, *not* just before pushing:
+# Need to be in an ALREADY activated venv
+PYTHON="python"
+
+echo "** Run inspectdb:"
+$PYTHON manage.py inspectdb > troggle-inspectdb.py
+# egrep -in "unable|error" troggle-inspectdb.py
+echo ""
+# count non-blank lines of python and template HTML code
+# includes all variants of settings.py files
+
+# fix this as core/utils.py has 28,000 lines of numbers.
+find . -name \*.html -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-templates.txt
+
+find . -name \*.py -print0 | xargs -0 egrep -vc "#|^\s*$" | grep -v ":0$" | grep -v ".venv" | grep -v "/migrations/" |grep -v "troggle-inspectdb.py"| awk -F ":" '{ sum +=$2; print $2, $1; } END {print sum}'| sort -n > lines-of-python.txt
+
+echo "** Run reset-django.py - which deletes the database"
+# This deletes the database so must run after generating troggle-inspectdb.py
+$PYTHON reset-django.py
+echo "** After cleanup deletion, remake all migrations."
+$PYTHON manage.py makemigrations >/dev/null
+$PYTHON manage.py migrate
+
+echo "** Now running self check"
+$PYTHON manage.py check -v 3 --deploy 2>security-warnings.txt >/dev/null
+$PYTHON manage.py check -v 3 --deploy
+
+echo "** Now running test suite"
+# $PYTHON manage.py test -v 1
+
+echo ""
+echo `tail -1 lines-of-python.txt` non-comment lines of python. But core/utils.py has 28,000 lines of numbers.
+echo `tail -1 lines-of-templates.txt` non-comment lines of HTML templates.
+
+echo '** If you have an error running manage.py, maybe you are not in an activated venv ?' \ No newline at end of file
diff --git a/_deploy/okchai/venv-trog.sh b/_deploy/okchai/venv-trog.sh
new file mode 100644
index 0000000..5294646
--- /dev/null
+++ b/_deploy/okchai/venv-trog.sh
@@ -0,0 +1,53 @@
+#!/bin/bash
+# now using uv, unbelieveably simpler.
+# Run this in a terminal in ~/expo above the troggle directory: 'bash ~/expo/venv-trog.sh'
+echo '-- Run this in a terminal in the directory above the troggle directory: "bash ~/expo/venv-trog.sh"'
+
+# Expects an Ubuntu 24.04 with all the gubbins already installed
+# If you have not already installed these on your clean Ubuntu install DO THIS FIRST
+# use the script os-trog24.04.sh runniing it in /home/username/
+python3 --version
+cd ~/expo/troggle
+echo "-- EXPO folder [current directory]: `pwd`"
+TROGDIR=$(cd $(dirname $0) && pwd)
+echo "-- Troggle folder: ${TROGDIR}"
+
+cp dev.toml pyproject.toml
+cp ~/expo/troggle/_deploy/wsl/localsettingsWSL.py ~/expo/troggle/localsettings.py
+
+uv self update
+uv sync
+
+
+# fudge for philip's laptop prior to M2 SSD upgrade
+if [ ! -d /mnt/d/EXPO ]; then
+ sudo mkdir /mnt/d
+ sudo mount -t drvfs D: /mnt/d
+fi
+
+uv pip list
+
+echo "Django version:`uv run django-admin --version`"
+
+echo "### Now do
+ '[sudo service mysql start]'
+ '[sudo service mariadb restart]'
+ '[sudo mysql_secure_installation]'
+ 'cd ~/expo/troggle'
+ 'uv run django-admin'
+ 'uv run manage.py check'
+## this tests if you have set up ssh correcting. Refer to documentation https://expo.survex.com/handbook/computing/keyexchange.html
+## you need to follow the Linux instructions.
+ 'ssh expo@expo.survex.com'
+
+## the next tests will fail unless ~/expofiles is set correctly to a folder on your machine
+
+ 'uv run manage.py test -v 2'
+ './pre-run.sh' (runs the tests again)
+
+ 'uv run databaseReset.py reset INIT'
+ 'uv run manage.py runserver 0.0.0.0:8000 (and allow access when the firewall window pops up)'
+ "
+# if [ ! -d /mnt/d/expofiles ]; then
+ # echo '### No valid expofiles directory on /mnt/d . Fix this before any tests will work.'
+# fi \ No newline at end of file