forked from mudhorn/TC2-BBS-mesh
Merge branch 'TheCommsChannel:main' into main
This commit is contained in:
commit
9ae90ae464
4
.gitignore
vendored
Normal file
4
.gitignore
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
__pycache__/
|
||||||
|
bulletins.db
|
||||||
|
venv/
|
||||||
|
|
185
README.md
185
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.
|
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
|
If you're a Docker user, TC²-BBS Meshtastic is available on Docker Hub!
|
||||||
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)
|
[![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
|
### Requirements
|
||||||
|
|
||||||
- Python 3.x
|
- Python 3.x
|
||||||
|
@ -20,81 +21,132 @@ TC²-BBS Meshtastic is available on Docker Hub
|
||||||
### Installation
|
### Installation
|
||||||
|
|
||||||
1. Clone the repository:
|
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]**
|
```sh
|
||||||
|
cd ~
|
||||||
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.
|
git clone https://github.com/TheCommsChannel/TC2-BBS-mesh.git
|
||||||
|
cd TC2-BBS-mesh
|
||||||
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)
|
|
||||||
|
|
||||||
Example Config:
|
2. Set up a Python virtual environment:
|
||||||
```ini
|
|
||||||
[interface]
|
```sh
|
||||||
type = serial
|
python -m venv venv
|
||||||
# port = /dev/ttyUSB0
|
```
|
||||||
# hostname = 192.168.x.x
|
|
||||||
|
|
||||||
[sync]
|
3. Activate the virtual environment:
|
||||||
bbs_nodes = !f53f4abc,!f3abc123
|
|
||||||
```
|
- 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
|
### Running the Server
|
||||||
|
|
||||||
Run the server with:
|
Run the server with:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
python server.py
|
python server.py```
|
||||||
```
|
```
|
||||||
|
|
||||||
Be sure you've followed the Python virtual environment steps above and activated it before running.
|
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
|
## Features
|
||||||
|
|
||||||
- **Mail System**: Send and receive mail messages.
|
- **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
|
## 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.
|
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:
|
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)
|
[![TC²-BBS-Mesh](https://img.youtube.com/vi/d6LhY4HoimU/0.jpg)](https://www.youtube.com/watch?v=d6LhY4HoimU)
|
||||||
|
|
||||||
|
|
||||||
## Thanks
|
## Thanks
|
||||||
|
|
||||||
Big thanks to [Meshtastic](https://github.com/meshtastic) and [pdxlocations](https://github.com/pdxlocations) for the great Python examples:
|
Big thanks to [Meshtastic](https://github.com/meshtastic) and [pdxlocations](https://github.com/pdxlocations) for the great Python examples:
|
||||||
|
|
|
@ -66,7 +66,7 @@ def get_channels():
|
||||||
def add_bulletin(board, sender_short_name, subject, content, bbs_nodes, interface, unique_id=None):
|
def add_bulletin(board, sender_short_name, subject, content, bbs_nodes, interface, unique_id=None):
|
||||||
conn = get_db_connection()
|
conn = get_db_connection()
|
||||||
c = conn.cursor()
|
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:
|
if not unique_id:
|
||||||
unique_id = str(uuid.uuid4())
|
unique_id = str(uuid.uuid4())
|
||||||
c.execute(
|
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):
|
def add_mail(sender_id, sender_short_name, recipient_id, subject, content, bbs_nodes, interface, unique_id=None):
|
||||||
conn = get_db_connection()
|
conn = get_db_connection()
|
||||||
c = conn.cursor()
|
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:
|
if not unique_id:
|
||||||
unique_id = str(uuid.uuid4())
|
unique_id = str(uuid.uuid4())
|
||||||
c.execute("INSERT INTO mail (sender, sender_short_name, recipient, date, subject, content, unique_id) VALUES (?, ?, ?, ?, ?, ?, ?)",
|
c.execute("INSERT INTO mail (sender, sender_short_name, recipient, date, subject, content, unique_id) VALUES (?, ?, ?, ?, ?, ?, ?)",
|
||||||
|
|
14
mesh-bbs.service
Normal file
14
mesh-bbs.service
Normal file
|
@ -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
|
|
@ -18,6 +18,7 @@ from config_init import initialize_config, get_interface
|
||||||
from db_operations import initialize_database
|
from db_operations import initialize_database
|
||||||
from message_processing import on_receive
|
from message_processing import on_receive
|
||||||
from pubsub import pub
|
from pubsub import pub
|
||||||
|
import time
|
||||||
|
|
||||||
# Configure logging
|
# Configure logging
|
||||||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||||||
|
@ -51,7 +52,8 @@ def main():
|
||||||
|
|
||||||
try:
|
try:
|
||||||
while True:
|
while True:
|
||||||
pass
|
time.sleep(1)
|
||||||
|
|
||||||
except KeyboardInterrupt:
|
except KeyboardInterrupt:
|
||||||
logging.info("Shutting down the server...")
|
logging.info("Shutting down the server...")
|
||||||
interface.close()
|
interface.close()
|
||||||
|
|
Loading…
Reference in a new issue