2025-09-08 09:49:49 +02:00
#!/bin/bash
2025-09-10 21:23:37 +02:00
# 5,20,35,50 * * * * $HOME/userfiles/sql/hpr_db_backup.bash >> $HOME/userfiles/sql/cron.log 2>&1 &
#TODO
#add a rss feed with the latest updates. Linking to the changes on gittea.
# run that every 5 minutes and then if there is a change sleep 5 and confirm there has been no change since.
# Then download the db and regenerate the site.
# While making sure to generate the site at least once a day
# check the skip-extended-insert export into of the sql into git, so that the small diffs show up.
# generate a rss feed with the latest changes.
# update all the other scripts reserve, stats etc.
sql_save_dir = " $HOME /userfiles/sql "
credential_file = " ${ sql_save_dir } /.my-hpr.cnf "
2025-09-08 09:49:49 +02:00
last_update_txt = " ${ sql_save_dir } /last_update.txt "
2025-09-10 21:23:37 +02:00
hpr_full_sql = " ${ sql_save_dir } /hpr_hpr_full.sql "
hpr_site_sql = " ${ sql_save_dir } /hpr.sql "
full_mysqldump_sql = " ${ sql_save_dir } /mysqldump.sql "
2025-09-11 17:50:31 +02:00
hpr_database_file = "hackerpublicradio.org/public_html/hpr.sql"
2025-09-08 09:49:49 +02:00
2025-09-10 21:23:37 +02:00
sync_delay_seconds = "300" # 5 minutes
last_update_query = " SELECT
update_time
FROM
information_schema.tables tab
WHERE
update_time > ( current_timestamp( ) - interval 30 day)
AND table_type = 'BASE TABLE'
AND table_name not in ( 'reservations' )
AND table_schema not in ( 'information_schema' , 'sys' , 'performance_schema' , 'mysql' )
ORDER BY
update_time DESC
LIMIT 1; "
2025-09-08 09:49:49 +02:00
if [ ! -s " ${ credential_file } " ]
then
echo " The file \" ${ credential_file } \" is missing "
exit
fi
2025-09-10 21:23:37 +02:00
local_db_last_update_epoch = "0"
2025-09-08 09:49:49 +02:00
if [ -s " ${ last_update_txt } " ]
then
echo " Found the last update file \" ${ last_update_txt } \" "
local_db_last_update_iso8601 = " $( \d ate --utc --date= " $( cat ${ last_update_txt } ) " +%Y-%m-%dT%H:%M:%SZ ) "
local_db_last_update_epoch = " $( \d ate --utc --date= " $( cat ${ last_update_txt } ) " +%s ) "
2025-09-10 21:23:37 +02:00
echo -e " Local DB update time is\t ${ local_db_last_update_iso8601 } ( ${ local_db_last_update_epoch } ) "
fi
live_db_last_update_iso8601 = " $( mysql --defaults-file= " ${ credential_file } " --disable-column-names --batch --execute= " ${ last_update_query } " | sed -e 's/ /T/g' -e 's/$/Z/g' ) "
if [ -z " ${ live_db_last_update_iso8601 } " ]
then
echo "The live db update time \"live_db_last_update_iso8601\" is missing"
exit 1
fi
live_db_last_update_epoch = " $( \d ate --utc --date= " ${ live_db_last_update_iso8601 } " +%s ) "
if [ -z " ${ live_db_last_update_epoch } " ]
then
echo "The live db update time \"live_db_last_update_epoch\" is missing"
exit 2
2025-09-08 09:49:49 +02:00
fi
2025-09-10 21:23:37 +02:00
echo -e " Live DB update time is\t ${ live_db_last_update_iso8601 } ( ${ live_db_last_update_epoch } ) "
2025-09-08 09:49:49 +02:00
2025-09-10 21:23:37 +02:00
if [ " ${ local_db_last_update_epoch } " -eq " ${ live_db_last_update_epoch } " ]
2025-09-08 09:49:49 +02:00
then
2025-09-10 21:23:37 +02:00
echo "No changes detected. Skipping export."
exit 0
2025-09-08 09:49:49 +02:00
fi
2025-09-10 21:23:37 +02:00
echo "Starting export full with -complete-insert."
if [ -s " ${ hpr_full_sql } " ]
then
hpr_full_sql_write_time_iso8601 = " $( \d ate --utc --date= " $( ls -al --full-time " ${ hpr_full_sql } " | awk '{print $6, $7, $8}' ) " +%Y-%m-%dT%H:%M:%SZ ) "
hpr_full_sql_write_time_epoch = " $( \d ate --utc --date= " ${ hpr_full_sql_write_time_iso8601 } " +%s ) "
if [ -z " ${ hpr_full_sql_write_time_epoch } " ]
then
echo "The live db update time \"hpr_full_sql_write_time_epoch\" is missing"
exit 3
fi
echo -e " Full DB write time is\t ${ hpr_full_sql_write_time_iso8601 } ( ${ hpr_full_sql_write_time_epoch } ) "
2025-09-08 09:49:49 +02:00
2025-09-10 21:23:37 +02:00
hpr_full_sql_write_time_with_delay_epoch = " $(( ${ hpr_full_sql_write_time_epoch } + ${ sync_delay_seconds } )) "
time_now_epoch = " $( \d ate --utc +%s ) "
2025-09-08 09:49:49 +02:00
2025-09-10 21:23:37 +02:00
if [ " ${ hpr_full_sql_write_time_with_delay_epoch } " -gt " ${ time_now_epoch } " ]
then
echo " Skipping export. The Database has been recently created \" ${ hpr_full_sql_write_time_iso8601 } \". Try again after $( \d ate --utc --date= " @ ${ hpr_full_sql_write_time_with_delay_epoch } " +%Y-%m-%dT%H:%M:%SZ ) . "
exit 4
fi
fi
mysqldump --defaults-file= " ${ credential_file } " --tz-utc --add-drop-database --extended-insert --complete-insert --skip-extended-insert --default-character-set= utf8 --single-transaction --skip-set-charset --databases hpr_hpr > " ${ hpr_full_sql } "
tail " ${ hpr_full_sql } " | grep 'Dump completed on'
echo "Starting export full for static site generation."
if [ -s " ${ hpr_site_sql } " ]
then
hpr_site_sql_write_time_iso8601 = " $( \d ate --utc --date= " $( ls -al --full-time " ${ hpr_site_sql } " | awk '{print $6, $7, $8}' ) " +%Y-%m-%dT%H:%M:%SZ ) "
hpr_site_sql_write_time_epoch = " $( \d ate --utc --date= " ${ hpr_site_sql_write_time_iso8601 } " +%s ) "
if [ -z " ${ hpr_site_sql_write_time_epoch } " ]
then
echo "The live db update time \"hpr_site_sql_write_time_epoch\" is missing"
exit 5
fi
echo -e " Full DB write time is\t ${ hpr_site_sql_write_time_iso8601 } ( ${ hpr_site_sql_write_time_epoch } ) "
hpr_site_sql_write_time_with_delay_epoch = " $(( ${ hpr_site_sql_write_time_epoch } + ${ sync_delay_seconds } )) "
time_now_epoch = " $( \d ate --utc +%s ) "
if [ " ${ hpr_site_sql_write_time_with_delay_epoch } " -gt " ${ time_now_epoch } " ]
then
echo " Skipping export. The Database has been recently created \" ${ hpr_site_sql_write_time_iso8601 } \". Try again after $( \d ate --utc --date= " @ ${ hpr_site_sql_write_time_with_delay_epoch } " +%Y-%m-%dT%H:%M:%SZ ) . "
exit 6
fi
fi
mysqldump --defaults-file= " ${ credential_file } " --tz-utc --add-drop-database --complete-insert --extended-insert --default-character-set= utf8 --single-transaction --skip-set-charset --databases hpr_hpr --ignore-table= hpr_hpr.reservations > " ${ hpr_site_sql } "
tail " ${ hpr_site_sql } " | grep 'Dump completed on'
echo "Starting export full for data recovery."
if [ -s " ${ full_mysqldump_sql } " ]
then
full_mysqldump_sql_write_time_iso8601 = " $( \d ate --utc --date= " $( ls -al --full-time " ${ full_mysqldump_sql } " | awk '{print $6, $7, $8}' ) " +%Y-%m-%dT%H:%M:%SZ ) "
full_mysqldump_sql_write_time_epoch = " $( \d ate --utc --date= " ${ full_mysqldump_sql_write_time_iso8601 } " +%s ) "
if [ -z " ${ full_mysqldump_sql_write_time_epoch } " ]
then
echo "The live db update time \"full_mysqldump_sql_write_time_epoch\" is missing"
exit 5
fi
echo -e " Full DB write time is\t ${ full_mysqldump_sql_write_time_iso8601 } ( ${ full_mysqldump_sql_write_time_epoch } ) "
full_mysqldump_sql_write_time_with_delay_epoch = " $(( ${ full_mysqldump_sql_write_time_epoch } + ${ sync_delay_seconds } )) "
time_now_epoch = " $( \d ate --utc +%s ) "
if [ " ${ full_mysqldump_sql_write_time_with_delay_epoch } " -gt " ${ time_now_epoch } " ]
then
echo " Skipping export. The Database has been recently created \" ${ full_mysqldump_sql_write_time_iso8601 } \". Try again after $( \d ate --utc --date= " @ ${ full_mysqldump_sql_write_time_with_delay_epoch } " +%Y-%m-%dT%H:%M:%SZ ) . "
exit 6
fi
fi
mysqldump --defaults-file= " ${ credential_file } " --tz-utc --add-drop-database --databases hpr_hpr> " ${ full_mysqldump_sql } "
tail " ${ full_mysqldump_sql } " | grep 'Dump completed on'
2025-09-11 17:50:31 +02:00
echo " <?xml version=\"1.0\" encoding=\"UTF-8\"?>
<rss xmlns:atom= \" https://www.w3.org/2005/Atom\" version = \" 2.0\" >
<channel>
<title>Hacker Public Radio ~ Database Feed</title>
<link>http://hackerpublicradio.org/about.html</link>
<description>This Feed provides information the latest version of the HPR database.</description>
<language>en-us</language>
<copyright>Creative Commons Attribution-ShareAlike 4.0 International ( CC BY-SA 4.0) License</copyright>
<managingEditor>feedback.nospam@nospam.hackerpublicradio.org ( HPR Feedback) </managingEditor>
<webMaster>admin.nospam@nospam.hackerpublicradio.org ( HPR Webmaster) </webMaster>
<generator>https://repo.anhonesthost.net/HPR/hpr-tools/src/branch/main/workflow/hpr_db_backup.bash</generator>
<docs>https://www.rssboard.org/rss-specification</docs>
<ttl>15</ttl>
<image>
<url>http://hackerpublicradio.org/images/hpr_feed_small.png</url>
<title>Hacker Public Radio ~ Database Feed</title>
<link>http://hackerpublicradio.org/about.html</link>
<description>The Hacker Public Radio Old Microphone Logo</description>
<height>164</height>
<width>144</width>
</image>
<atom:link href = \" https://hackerpublicradio.org/hpr.sql.rss\" rel = \" self\" type = \" application/rss+xml\" />
<pubDate>$( date --utc --rfc-email ) </pubDate>
<item>
<title>Export of the Public mariadb SQL for ${ live_db_last_update_iso8601 } </title>
<author>admin.nospam@nospam.hackerpublicradio.org ( Janitors) </author>
<link>http://hackerpublicradio.org/hpr.sql#${ live_db_last_update_iso8601 } </link>
<description/>
<pubDate>$( date --utc --rfc-email ) </pubDate>
<enclosure url = \" http://hackerpublicradio.org/hpr.sql#${ live_db_last_update_iso8601 } \" length = \" $( ls -al " ${ hpr_site_sql } " | awk '{print $5}' ) \" type = \" application/sql\" />
<guid isPermaLink = \" false\" >sha1sum:$( sha1sum " ${ hpr_site_sql } " | awk '{print $1}' ) ,md5sum:$( md5sum " ${ hpr_site_sql } " | awk '{print $1}' ) </guid>
</item>
</channel>
</rss>" > " ${ hpr_site_sql } .rss"
2025-09-10 21:23:37 +02:00
if [ $HOSTNAME = "whp01.cloud-hosting.io" ]
then
2025-09-11 17:50:31 +02:00
cp -v " ${ hpr_site_sql } " " $HOME / ${ hpr_database_file } "
cp -v " ${ hpr_site_sql } .rss " " $HOME / ${ hpr_database_file } .rss "
2025-09-10 21:23:37 +02:00
else
2025-09-11 17:50:31 +02:00
rsync -av --partial --progress ${ hpr_site_sql } hpr:${ hpr_database_file }
rsync -av --partial --progress ${ hpr_site_sql } .rss hpr:${ hpr_database_file } .rss
2025-09-10 21:23:37 +02:00
fi
2025-09-08 09:49:49 +02:00
2025-09-11 17:50:31 +02:00
echo " ${ live_db_last_update_iso8601 } " > " ${ last_update_txt } "
2025-09-08 09:49:49 +02:00
2025-09-11 17:50:31 +02:00
echo " Finished export of \" ${ live_db_last_update_iso8601 } \" "
2025-09-08 09:49:49 +02:00