public:radio:2024:yaddnet_data_backup
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| public:radio:2024:yaddnet_data_backup [19/04/24 09:40 BST] – [Backup UDP receive and logrotate] john | public:radio:2024:yaddnet_data_backup [06/03/25 06:49 GMT] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| - | ====== | + | ====== |
| ** Offsite Text file backups of all DSC messages ** | ** Offsite Text file backups of all DSC messages ** | ||
| - | ===== YaDDNet UDP Mirror ===== | + | * Alan Spindel initially suggested an offsite backup of the DSC messages in 2019 |
| + | * YaDDNet | ||
| + | * The DSC messages are sent by UDP as simple plain text, for easy archiving | ||
| + | * The archived text file can be used if necessary to rebuild the SQL database table containing the DSC messages in case of disaster | ||
| + | * Since I'm now hosting YaDDNet again I decided I should run a UDP log receiver at home to improve the backup provision | ||
| + | * The daily archive files will be '' | ||
| + | * I could share the link to anyone who is interested in using the saved data | ||
| + | ===== YaDDNet UDP Send to Mirror ===== | ||
| + | |||
| + | * In the '' | ||
| + | * This involves converting MMSI -> Coast or Ship name, finding the '' | ||
| + | * Prior to using the newly created message to inject new data into the SQL server '' | ||
| + | * '' | ||
| + | * Any addressed & listening UDP clients receive the UDP packets and append them to a log file | ||
| <code python> | <code python> | ||
| Line 23: | Line 36: | ||
| </ | </ | ||
| ===== Backup UDP receive and logrotate ===== | ===== Backup UDP receive and logrotate ===== | ||
| + | |||
| + | |||
| + | ==== UDP Listener ==== | ||
| <code python> | <code python> | ||
| # | # | ||
| + | # | ||
| + | # udp_logger.py | ||
| + | # | ||
| import SocketServer | import SocketServer | ||
| import socket | import socket | ||
| import threading | import threading | ||
| - | import re | ||
| - | #import PyYadd | ||
| - | #import pysql | ||
| - | import time | ||
| - | |||
| - | |||
| - | | ||
| - | | ||
| class ThreadedUDPRequestHandler(SocketServer.BaseRequestHandler): | class ThreadedUDPRequestHandler(SocketServer.BaseRequestHandler): | ||
| - | |||
| def handle(self): | def handle(self): | ||
| data = self.request[0].strip() | data = self.request[0].strip() | ||
| socket = self.request[1] | socket = self.request[1] | ||
| - | | ||
| self.write_file(data) | self.write_file(data) | ||
| - | # | + | |
| - | + | ||
| def write_file(self, | def write_file(self, | ||
| filename = '/ | filename = '/ | ||
| f = open(filename, | f = open(filename, | ||
| - | #timenow = time.strftime(" | ||
| log = text | log = text | ||
| - | #log = " " | ||
| - | #print log | ||
| f.write(log+" | f.write(log+" | ||
| f.close() | f.close() | ||
| return | return | ||
| - | |||
| - | | ||
| - | | ||
| class ThreadedUDPServer(SocketServer.ThreadingMixIn, | class ThreadedUDPServer(SocketServer.ThreadingMixIn, | ||
| Line 69: | Line 70: | ||
| if __name__ == " | if __name__ == " | ||
| - | # | ||
| HOST, PORT = "", | HOST, PORT = "", | ||
| - | |||
| server = ThreadedUDPServer((HOST, | server = ThreadedUDPServer((HOST, | ||
| ip, port = server.server_address | ip, port = server.server_address | ||
| server.serve_forever() | server.serve_forever() | ||
| # Start a thread with the server -- | # Start a thread with the server -- | ||
| - | # that thread will then start one | + | |
| # more thread for each request | # more thread for each request | ||
| server_thread = threading.Thread(target=server.serve_forever) | server_thread = threading.Thread(target=server.serve_forever) | ||
| Line 85: | Line 84: | ||
| </ | </ | ||
| + | |||
| + | |||
| + | * The UDP Log Receiver listens to UDP/2505 for incoming packets from YaDDNet. These are of the form: | ||
| + | |||
| + | < | ||
| + | |||
| + | [log]; | ||
| + | [log]; | ||
| + | </ | ||
| + | |||
| + | |||
| + | * each new packet is appended to the running log file ''/ | ||
| + | * the file will grow indefinitely if left to itself! | ||
| + | |||
| + | ==== Logrotate === | ||
| + | |||
| + | * run by Crontab every day at midnight | ||
| + | * copies the current running log to a timestamped file | ||
| + | * erases the contents of the running log file | ||
| + | * '' | ||
| + | |||
| + | <code bash> | ||
| + | |||
| + | ## CRONTAB ENTRY | ||
| + | |||
| + | 00 00 * * * / | ||
| + | </ | ||
| + | |||
| + | <code bash> | ||
| + | |||
| + | #!/bin/bash | ||
| + | # | ||
| + | # yaddlog_rotate.sh | ||
| + | |||
| + | DROPBOX=/ | ||
| + | DIR=/ | ||
| + | |||
| + | INFILE=yaddnet_udp_log.txt | ||
| + | |||
| + | TIMESTAMP=`date +%Y%m%d_%H%M` | ||
| + | |||
| + | OUTFILE=$TIMESTAMP\_$INFILE | ||
| + | |||
| + | cp $DIR/ | ||
| + | cat /dev/null > $DIR/ | ||
| + | |||
| + | |||
| + | gzip $DIR/ | ||
| + | |||
| + | mv $DIR/ | ||
| + | |||
| + | </ | ||
| + | |||
| + | * This creates a '' | ||
| + | |||
| + | === Starting the UDP Listener at boot-up === | ||
| + | |||
| + | * crontab entry to start it as a background job at '' | ||
| + | |||
| + | <code bash> | ||
| + | # | ||
| + | # CRONTAB ENTRY | ||
| + | # | ||
| + | @reboot python / | ||
| + | |||
| + | </ | ||
| + | |||
| --- //John Pumford-Green 19/04/24 09:31 BST// | --- //John Pumford-Green 19/04/24 09:31 BST// | ||
| + | |||
| + | Last updated : ~~LASTMOD~~ | ||
| ===== Further Information ===== | ===== Further Information ===== | ||
| + | [[https:// | ||
| - | {{tag>}} | + | {{tag>radio yaddnet}} |
public/radio/2024/yaddnet_data_backup.1713516034.txt.gz · Last modified: (external edit)
