From 3ef6ceb06fe725c9fecb10ceab973722aeb4f38c Mon Sep 17 00:00:00 2001 From: Roland Date: Thu, 3 Nov 2022 20:27:12 -0600 Subject: [PATCH] Splitting map scripts to offer initializing and resetting map. --- scripts/import_map.sh | 11 +++- scripts/initialize_map.sh | 43 +++++++++++++++ scripts/install_map_debian_11.sh | 18 ++----- scripts/install_map_ubuntu_20.04.sh | 68 +++++------------------ scripts/reset_map.sh | 84 +++++++++++++++++++++++++++++ 5 files changed, 155 insertions(+), 69 deletions(-) create mode 100755 scripts/initialize_map.sh create mode 100755 scripts/reset_map.sh diff --git a/scripts/import_map.sh b/scripts/import_map.sh index a216afef..e508137d 100755 --- a/scripts/import_map.sh +++ b/scripts/import_map.sh @@ -17,6 +17,13 @@ if [ "${1}" == "" ]; then exit 3 fi +HAS_ICE_SHEET=false +psql gis wrolpi -c '\d' | grep icesheet_polygons && HAS_ICE_SHEET=true +if [ ${HAS_ICE_SHEET} = false ]; then + echo "Missing icesheet_polygons. Run reset_map.sh" + exit 4 +fi + function cleanup() { if [ -f ${MERGED_TMP_FILE} ]; then rm ${MERGED_TMP_FILE} @@ -60,11 +67,11 @@ if [[ ${1} == *.osm.pbf ]]; then elif [[ ${1} == *.dump ]]; then if [ ! -f "${1}" ]; then echo "File does not exist! ${1}" - exit 4 + exit 7 fi # Import a Postgresql dump. nice -n 18 pg_restore -j3 --no-owner -d gis "${1}" else echo "Cannot import unknown map file" - exit 7 + exit 8 fi diff --git a/scripts/initialize_map.sh b/scripts/initialize_map.sh new file mode 100755 index 00000000..465e168a --- /dev/null +++ b/scripts/initialize_map.sh @@ -0,0 +1,43 @@ +#!/bin/bash + +if [ ! -d /opt/openstreetmap-carto ]; then + echo "/opt/openstreetmap-carto does not exist. Run install.sh!" + exit 1 +fi + +# Use D.C. to initialized DB because it is so small. +wget --continue https://download.geofabrik.de/north-america/us/district-of-columbia-latest.osm.pbf \ + -O /tmp/district-of-columbia-latest.osm.pbf || : + +cd /opt/openstreetmap-carto || exit 2 + +# Initialize indexes and global polygons. This may take multiple tries. +MAX_TRIES=3 +COUNT=0 +SUCCESS=false +external_data=true +dc_import=false +indexes=false +while [ "${COUNT}" -lt "${MAX_TRIES}" ]; do + [[ "${external_data}" = false ]] && + sudo -u wrolpi nice -n 18 /opt/openstreetmap-carto/scripts/get-external-data.py \ + -C \ + -d gis -U wrolpi && + external_data=true + [[ "${dc_import}" = false ]] && + sudo -u wrolpi nice -n 18 /opt/wrolpi/scripts/import_map.sh /tmp/district-of-columbia-latest.osm.pbf && + dc_import=true + [[ "${indexes}" = false ]] && + sudo -u wrolpi psql -d gis -f /opt/openstreetmap-carto/indexes.sql && + indexes=true + if [[ "${external_data}" == true && "${dc_import}" == true && "${indexes}" == true ]]; then + SUCCESS=true + break + fi + ((COUNT = COUNT + 1)) +done + +if [[ "${SUCCESS}" == false ]]; then + echo "Could not initialize map data. Try running reset_map.sh, or install.sh." + exit 3 +fi diff --git a/scripts/install_map_debian_11.sh b/scripts/install_map_debian_11.sh index 7957af13..41de321e 100755 --- a/scripts/install_map_debian_11.sh +++ b/scripts/install_map_debian_11.sh @@ -1,6 +1,6 @@ #! /usr/bin/bash # This script installs OpenStreetMap tile server. -# This server uses Apache2, renderd and mod_tile to render and display map tiles. +# This server uses Apache2, renderd, and mod_tile to render and display map tiles. set -x set -e @@ -31,26 +31,18 @@ sed -i -e 's/^DAEMON=.*/DAEMON=\/usr\/bin\/$NAME/' /etc/init.d/renderd sed -i -e 's/^DAEMON_ARGS=.*/DAEMON_ARGS="-c \/etc\/renderd.conf"/' /etc/init.d/renderd cp /tmp/mod_tile/debian/renderd.service /lib/systemd/system/ chmod +x /etc/init.d/renderd -[ ! -d /var/lib/mod_tile ] && mkdir /var/lib/mod_tile -chown wrolpi /var/lib/mod_tile # Initialize gis database. git clone https://github.com/lrnselfreliance/openstreetmap-carto.git /opt/openstreetmap-carto || : +sudo -u wrolpi /bin/bash -c '(cd /opt/openstreetmap-carto && git fetch && git checkout master && git reset --hard origin/master && git pull --ff)' chown -R wrolpi:wrolpi /opt/openstreetmap-carto cd /opt/openstreetmap-carto if [[ ! -f /opt/openstreetmap-carto/mapnik.xml || ! -s /opt/openstreetmap-carto/mapnik.xml ]]; then /usr/local/bin/carto project.mml >/opt/openstreetmap-carto/mapnik.xml fi -# Initialize indexes and global polygons. -sudo -u wrolpi /opt/openstreetmap-carto/scripts/get-external-data.py -d gis -U wrolpi -# Use D.C. to initialized DB because it is so small. -wget --continue https://download.geofabrik.de/north-america/us/district-of-columbia-latest.osm.pbf \ - -O /tmp/district-of-columbia-latest.osm.pbf -# Run import in "create" mode so basic tables will be created. -sudo -u wrolpi osm2pgsql -d gis --create --slim -G --hstore --tag-transform-script \ - /opt/openstreetmap-carto/openstreetmap-carto.lua -C 2000 --number-processes 4 \ - -S /opt/openstreetmap-carto/openstreetmap-carto.style /tmp/district-of-columbia-latest.osm.pbf -sudo -u wrolpi psql -d gis -f /opt/openstreetmap-carto/indexes.sql + +# Reset map. Force it. +/opt/wrolpi/scripts/reset_map.sh -f cp /opt/wrolpi/etc/debian11/renderd.conf /etc/renderd.conf # Configure Apache2 to listen on 8084. diff --git a/scripts/install_map_ubuntu_20.04.sh b/scripts/install_map_ubuntu_20.04.sh index b4d0a326..cfee73cd 100755 --- a/scripts/install_map_ubuntu_20.04.sh +++ b/scripts/install_map_ubuntu_20.04.sh @@ -1,6 +1,16 @@ #! /usr/bin/bash # This script installs OpenStreetMap tile server. -# This server uses Apache2, renderd and mod_tile to render and display map tiles. +# This server uses Apache2, renderd, and mod_tile to render and display map tiles. + +function yes_or_no { + while true; do + read -p "$* [y/n]:" yn + case $yn in + [Yy]*) return 0 ;; + [Nn]*) return 1 ;; + esac + done +} set -x set -e @@ -18,21 +28,6 @@ apt install -y libboost-all-dev git tar unzip wget bzip2 build-essential autocon /usr/bin/npm install -g carto /usr/bin/carto -v -function yes_or_no { - while true; do - read -p "$* [y/n]:" yn - case $yn in - [Yy]*) return 0 ;; - [Nn]*) return 1 ;; - esac - done -} - -sudo -u postgres psql -c '\l' | grep gis && - yes_or_no "Map database already exists. Replace it?" && - systemctl stop renderd && - sudo -u postgres dropdb gis - # Create `gis` database for map. sudo -u postgres psql -c '\l' | grep gis || sudo -u postgres createdb -E UTF8 -O wrolpi gis sudo -u postgres psql -d gis -c "CREATE EXTENSION postgis;" || : @@ -56,50 +51,15 @@ chown wrolpi /var/lib/mod_tile # Initialize gis database. git clone https://github.com/lrnselfreliance/openstreetmap-carto.git /opt/openstreetmap-carto || : +sudo -u wrolpi /bin/bash -c '(cd /opt/openstreetmap-carto && git fetch && git checkout master && git reset --hard origin/master && git pull --ff)' chown -R wrolpi:wrolpi /opt/openstreetmap-carto cd /opt/openstreetmap-carto if [[ ! -f /opt/openstreetmap-carto/mapnik.xml || ! -s /opt/openstreetmap-carto/mapnik.xml ]]; then /usr/bin/carto project.mml >/opt/openstreetmap-carto/mapnik.xml fi -# Use D.C. to initialized DB because it is so small. -wget --continue https://download.geofabrik.de/north-america/us/district-of-columbia-latest.osm.pbf \ - -O /tmp/district-of-columbia-latest.osm.pbf -# Initialize indexes and global polygons. This may take multiple tries. -set +e -MAX_TRIES=3 -COUNT=0 -SUCCESS=false -external_data=false -dc_import=false -indexes=false -while [ "${COUNT}" -lt "${MAX_TRIES}" ]; do - [[ "${external_data}" = false ]] && - sudo -u wrolpi /opt/openstreetmap-carto/scripts/get-external-data.py -d gis -U wrolpi && - external_data=true - [[ "${dc_import}" = false ]] && - # Run import in "create" mode so basic tables will be created. - sudo -u wrolpi nice -n 18 osm2pgsql -d gis --create --slim -G --hstore \ - --tag-transform-script /opt/openstreetmap-carto/openstreetmap-carto.lua \ - -C 2000 --number-processes 3 \ - -S /opt/openstreetmap-carto/openstreetmap-carto.style /tmp/district-of-columbia-latest.osm.pbf && - dc_import=true - [[ "${indexes}" = false ]] && - sudo -u wrolpi psql -d gis -f /opt/openstreetmap-carto/indexes.sql && - indexes=true - if [[ "${external_data}" == true && "${dc_import}" == true && "${indexes}" == true ]]; then - SUCCESS=true - break - fi - ((COUNT = COUNT + 1)) -done - -if [[ "${SUCCESS}" == false ]]; then - echo "Could not import map data" - exit 6 -fi - -set -e +# Reset map. Force it. +/opt/wrolpi/scripts/reset_map.sh -f cp /opt/wrolpi/etc/ubuntu20.04/renderd.conf /usr/local/etc/renderd.conf # Enable mod_tile. diff --git a/scripts/reset_map.sh b/scripts/reset_map.sh new file mode 100755 index 00000000..987c6ed7 --- /dev/null +++ b/scripts/reset_map.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +# Use 1/4 of the RAM to import. 1/2 causes crashes on RPi. +RAM_KB=$(grep MemTotal /proc/meminfo | awk '{print $2}') +MAX_CACHE=$((RAM_KB / 1024 / 4)) + +function yes_or_no { + while true; do + read -p "$* [y/n]:" yn + case $yn in + [Yy]*) return 0 ;; + [Nn]*) return 1 ;; + esac + done +} + +Help() { + # Display Help + echo "Reset the Map cache/database" + echo + echo "Syntax: reset_map.sh [-h] [-f]" + echo "options:" + echo "h Print this help." + echo "f Reset without prompt." + echo +} + +FORCE=false +while getopts ":hf:" option; do + case $option in + h) # display Help + Help + exit + ;; + f) + FORCE=true + ;; + *) # invalid argument(s) + echo "Error: Invalid option" + exit 1 + ;; + esac +done + +if [ "${FORCE}" == false ]; then + yes_or_no "Are you sure you want to delete the map database and cache? This can't be undone!" || exit 1 +fi + +if [[ ! -f /usr/lib/apache2/modules/mod_tile.so || + ! -f /opt/openstreetmap-carto/mapnik.xml || + ! -s /opt/openstreetmap-carto/mapnik.xml || + ! -f /opt/openstreetmap-carto/scripts/get-external-data.py || + ! -f /opt/openstreetmap-carto/openstreetmap-carto.style || + ! -f /opt/openstreetmap-carto/indexes.sql ]]; then + echo "The map has not been installed. Run install.sh" + exit 2 +fi + +set -e +set -x + +systemctl stop renderd + +if [ -d /var/lib/mod_tile ]; then + rm -rf /var/lib/mod_tile/* +else + mkdir /var/lib/mod_tile +fi +chown -R wrolpi:wrolpi /var/lib/mod_tile + +sudo -u postgres dropdb gis || : + +sudo -u postgres createdb -E UTF8 -O wrolpi gis +sudo -u postgres psql -d gis -c "CREATE EXTENSION postgis;" || : +sudo -u postgres psql -d gis -c "CREATE EXTENSION hstore;" || : +sudo -u postgres psql -d gis -c "ALTER TABLE geometry_columns OWNER TO wrolpi;" +sudo -u postgres psql -d gis -c "ALTER TABLE spatial_ref_sys OWNER TO wrolpi;" + +# Reset "imported" status of any map files. +sudo -u postgres psql -d wrolpi -c "UPDATE map_file SET imported=false" + +/opt/wrolpi/scripts/initialize_map.sh + +echo "Map has been reset"