diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..78ee506 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +__pycache__/ +bulletins.db +venv/ + diff --git a/README.md b/README.md index 38300ef..dd9c3ad 100644 --- a/README.md +++ b/README.md @@ -4,13 +4,14 @@ This is the TC²-BBS system integrated with Meshtastic devices. The system allows for message handling, bulletin boards, mail systems, and a channel directory. -## Setup +### Docker -### Docker installation -TC²-BBS Meshtastic is available on Docker Hub +If you're a Docker user, TC²-BBS Meshtastic is available on Docker Hub! [![Docker HUB](https://icon-icons.com/downloadimage.php?id=151885&root=2530/PNG/128/&file=docker_button_icon_151885.png)](https://hub.docker.com/r/thealhu/tc2-bbs-mesh) +## Setup + ### Requirements - Python 3.x @@ -20,81 +21,132 @@ TC²-BBS Meshtastic is available on Docker Hub ### Installation 1. Clone the repository: - -```sh -git clone https://github.com/TheCommsChannel/TC2-BBS-mesh.git -cd TC2-BBS-mesh -``` - -2. Set up a Python virtual environment: - -```sh -python -m venv venv -``` - -3. Activate the virtual environment: - - -- On Windows: - -```sh -venv\Scripts\activate -``` - -- On macOS and Linux: - -```sh -source venv/bin/activate -``` - -4. Install the required packages: - -```sh -pip install -r requirements.txt -``` - -5. Set up the configuration in `config.ini`: - **[interface]** - - If using `type = serial` and you have multiple devices connected, you will need to uncomment the `port =` line and enter in the port of your device. - - Linux Example: - `port = /dev/ttyUSB0` - - Windows Example: - `port = COM3` - - If using type = tcp you will need to uncomment the hostname = 192.168.x.x line and put in the IP address of your Meshtastic device - - **[sync]** - - Enter in a list of other BBS nodes you would like to sync messages and bulletins with. Separate each by comma and no spaces as shown in the example below. - You can find the nodeID in the menu under `Radio Configuration > User` for each node, or use this script for getting nodedb data from a device: - - [Meshtastic-Python-Examples/print-nodedb.py at main · pdxlocations/Meshtastic-Python-Examples (github.com)](https://github.com/pdxlocations/Meshtastic-Python-Examples/blob/main/print-nodedb.py) + ```sh + cd ~ + git clone https://github.com/TheCommsChannel/TC2-BBS-mesh.git + cd TC2-BBS-mesh + ``` - Example Config: -```ini -[interface] -type = serial -# port = /dev/ttyUSB0 -# hostname = 192.168.x.x +2. Set up a Python virtual environment: + + ```sh + python -m venv venv + ``` -[sync] -bbs_nodes = !f53f4abc,!f3abc123 -``` +3. Activate the virtual environment: + + - On Windows: + + ```sh + venv\Scripts\activate + ``` + + - On macOS and Linux: + + ```sh + source venv/bin/activate + ``` + +4. Install the required packages: + + ```sh + pip install -r requirements.txt + ``` + +5. Set up the configuration in `config.ini`: + + **[interface]** + If using `type = serial` and you have multiple devices connected, you will need to uncomment the `port =` line and enter the port of your device. + + Linux Example: + `port = /dev/ttyUSB0` + + Windows Example: + `port = COM3` + + If using type = tcp you will need to uncomment the hostname = 192.168.x.x line and put in the IP address of your Meshtastic device. + + **[sync]** + Enter a list of other BBS nodes you would like to sync messages and bulletins with. Separate each by comma and no spaces as shown in the example below. + You can find the nodeID in the menu under `Radio Configuration > User` for each node, or use this script for getting nodedb data from a device: + + [Meshtastic-Python-Examples/print-nodedb.py at main · pdxlocations/Meshtastic-Python-Examples (github.com)](https://github.com/pdxlocations/Meshtastic-Python-Examples/blob/main/print-nodedb.py) + + Example Config: + + ```ini + [interface] + type = serial + # port = /dev/ttyUSB0 + # hostname = 192.168.x.x + + [sync] + bbs_nodes = !f53f4abc,!f3abc123 + ``` ### Running the Server Run the server with: ```sh -python server.py +python server.py``` ``` Be sure you've followed the Python virtual environment steps above and activated it before running. +## Automatically run at boot + +If you would like to have the script automatically run at boot, follow the steps below: + +1. **Edit the service file** + + First, edit the mesh-bbs.service file using your preferred text editor. The 3 following lines in that file are what we need to edit: + + ```sh + User=pi + WorkingDirectory=/home/pi/TC2-BBS-mesh + ExecStart=/home/pi/TC2-BBS-mesh/venv/bin/python3 /home/pi/TC2-BBS-mesh/server.py + ``` + + The file is currently setup for a user named 'pi' and assumes that the TC2-BBS-mesh directory is located in the home directory (which it should be if the earlier directions were followed) + + We just need to replace the 4 parts that have "pi" in those 3 lines with your username. + +2. **Configuring systemd** + + From the TC2-BBS-mesh directory, run the following commands: + + ```sh + sudo cp mesh-bbs.service /etc/systemd/system/ + ``` + + ```sh + sudo systemctl enable mesh-bbs.service + ``` + + ```sh + sudo systemctl start mesh-bbs.service + ``` + + The service should be started now and should start anytime your device is powered on or rebooted. You can check the status ofk the service by running the following command: + + ```sh + sudo systemctl status mesh-bbs.service + ``` + + If you need to stop the service, you can run the following: + + ```sh + sudo systemctl stop mesh-bbs.service + ``` + + If you make changes to the watchlist.txt file, you will need to restart the service with the following command: + + ```sh + sudo systemctl restart mesh-bbs.service + ``` + ## Features - **Mail System**: Send and receive mail messages. @@ -106,14 +158,13 @@ Be sure you've followed the Python virtual environment steps above and activated ## Usage -You interact with the BBS by sending direct messages to the node that's connected to the system running the Python script. Sending any message to it will get a response with the main menu. +You interact with the BBS by sending direct messages to the node that's connected to the system running the Python script. Sending any message to it will get a response with the main menu. Make selections by sending messages based on the letter or number in brackets - Send M for [M]ail Menu for example. A video of it in use is available on our YouTube channel: [![TC²-BBS-Mesh](https://img.youtube.com/vi/d6LhY4HoimU/0.jpg)](https://www.youtube.com/watch?v=d6LhY4HoimU) - ## Thanks Big thanks to [Meshtastic](https://github.com/meshtastic) and [pdxlocations](https://github.com/pdxlocations) for the great Python examples: diff --git a/db_operations.py b/db_operations.py index 0d8aaa3..b1440e8 100644 --- a/db_operations.py +++ b/db_operations.py @@ -66,7 +66,7 @@ def get_channels(): def add_bulletin(board, sender_short_name, subject, content, bbs_nodes, interface, unique_id=None): conn = get_db_connection() c = conn.cursor() - date = datetime.now().strftime('%m/%d/%Y %H:%M') + date = datetime.now().strftime('%Y-%m-%d %H:%M') if not unique_id: unique_id = str(uuid.uuid4()) c.execute( @@ -107,7 +107,7 @@ def delete_bulletin(bulletin_id, bbs_nodes, interface): def add_mail(sender_id, sender_short_name, recipient_id, subject, content, bbs_nodes, interface, unique_id=None): conn = get_db_connection() c = conn.cursor() - date = datetime.now().strftime('%m/%d/%Y %H:%M') + date = datetime.now().strftime('%Y-%m-%d %H:%M') if not unique_id: unique_id = str(uuid.uuid4()) c.execute("INSERT INTO mail (sender, sender_short_name, recipient, date, subject, content, unique_id) VALUES (?, ?, ?, ?, ?, ?, ?)", diff --git a/mesh-bbs.service b/mesh-bbs.service new file mode 100644 index 0000000..5bf33b5 --- /dev/null +++ b/mesh-bbs.service @@ -0,0 +1,14 @@ +[Unit] +Description=TC²-BBS Meshtastic Version +After=multi-user.target + +[Service] +Type=simple +Restart=always +RestartSec=20 +User=pi +WorkingDirectory=/home/pi/TC2-BBS-mesh +ExecStart=/home/pi/TC2-BBS-mesh/venv/bin/python3 /home/pi/TC2-BBS-mesh/server.py + +[Install] +WantedBy=multi-user.target \ No newline at end of file diff --git a/server.py b/server.py index 35dee8e..36ba220 100644 --- a/server.py +++ b/server.py @@ -18,6 +18,7 @@ from config_init import initialize_config, get_interface from db_operations import initialize_database from message_processing import on_receive from pubsub import pub +import time # Configure logging logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s') @@ -51,7 +52,8 @@ def main(): try: while True: - pass + time.sleep(1) + except KeyboardInterrupt: logging.info("Shutting down the server...") interface.close()