Compare commits

...

15 Commits
0.4.6 ... 0.4.7

Author SHA1 Message Date
Mark Qvist
d9bba6fd69 Added LXMF transfer size limit options 2024-03-02 00:11:17 +01:00
Mark Qvist
4a3c987cef Merge branch 'master' of github.com:markqvist/NomadNet 2024-03-01 17:55:26 +01:00
Mark Qvist
026ff7b5c7 Updated versions 2024-03-01 17:55:19 +01:00
Mark Qvist
bcca6be487 Updated guide text 2024-03-01 17:55:13 +01:00
markqvist
3181e2124f Merge pull request #34 from qwertyuiopzxcvbnmlkjhgfdsa1/feature/dockerize
dozkerize build
2024-03-01 17:54:22 +01:00
Mark Qvist
6026f42f34 Check browser destination before displaying save dialog. Fixes #35. 2024-02-29 18:42:47 +01:00
Mark Qvist
e695cce3ba Added issue templates 2024-02-29 18:07:34 +01:00
Mark Qvist
ff45c597f8 Updated readme 2024-02-16 17:54:07 +01:00
Mark Qvist
a4c348529e Merge branch 'master' of github.com:markqvist/NomadNet 2024-02-16 17:48:53 +01:00
Mark Qvist
641f326be7 Updated readme 2024-02-16 17:48:34 +01:00
markqvist
014b9faea6 Merge pull request #53 from neutralinsomniac/notify_on_new_message
add message notification bell for textui
2024-02-08 17:30:22 +01:00
markqvist
ac7eecbd99 Merge pull request #50 from penguinolog/docker_fix
Fix docker image build
2024-02-08 17:29:17 +01:00
Jeremy O'Brien
04376a9f96 add message notification bell for textui 2024-01-25 10:14:12 -05:00
Aleksei Stepanov
c004adfb8c Fix docker image build
* Use non-rc python
* Use `pip` for package install
  `python setup.py --install` is deprecated by setuptools
2024-01-23 08:45:58 +01:00
Petr Blaha
a5623978a2 dozkerize build 2023-09-07 10:19:38 +02:00
12 changed files with 218 additions and 53 deletions

11
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,11 @@
blank_issues_enabled: false
contact_links:
- name: ✨ Feature Request or Idea
url: https://github.com/markqvist/Reticulum/discussions/new?category=ideas
about: Propose and discuss features and ideas
- name: 💬 Questions, Help & Discussion
about: Ask anything, or get help
url: https://github.com/markqvist/Reticulum/discussions/new/choose
- name: 📖 Read the Reticulum Manual
url: https://markqvist.github.io/Reticulum/manual/
about: The complete documentation for Reticulum

View File

@@ -0,0 +1,35 @@
---
name: "\U0001F41B Bug Report"
about: Report a reproducible bug
title: ''
labels: ''
assignees: ''
---
**Read the Contribution Guidelines**
Before creating a bug report on this issue tracker, you **must** read the [Contribution Guidelines](https://github.com/markqvist/Reticulum/blob/master/Contributing.md). Issues that do not follow the contribution guidelines **will be deleted without comment**.
- The issue tracker is used by developers of this project. **Do not use it to ask general questions, or for support requests**.
- Ideas and feature requests can be made on the [Discussions](https://github.com/markqvist/Reticulum/discussions). **Only** feature requests accepted by maintainers and developers are tracked and included on the issue tracker. **Do not post feature requests here**.
- After reading the [Contribution Guidelines](https://github.com/markqvist/Reticulum/blob/master/Contributing.md), delete this section from your bug report.
**Describe the Bug**
A clear and concise description of what the bug is.
**To Reproduce**
Describe in detail how to reproduce the bug.
**Expected Behavior**
A clear and concise description of what you expected to happen.
**Logs & Screenshots**
Please include any relevant log output. If applicable, also add screenshots to help explain your problem.
**System Information**
- OS and version
- Python version
- Program version
**Additional context**
Add any other context about the problem here.

View File

@@ -1,4 +1,4 @@
FROM python:3.11-rc-alpine3.14 as build FROM python:3.12-alpine as build
RUN apk add --no-cache build-base linux-headers libffi-dev cargo RUN apk add --no-cache build-base linux-headers libffi-dev cargo
@@ -8,10 +8,10 @@ ENV PATH="/opt/venv/bin:$PATH"
RUN pip3 install setuptools-rust pyopenssl cryptography RUN pip3 install setuptools-rust pyopenssl cryptography
COPY . /app/ COPY . /app/
RUN cd /app/ && python3 setup.py install RUN cd /app/ && pip3 install .
# Use multi-stage build, as we don't need rust compilation on the final image # Use multi-stage build, as we don't need rust compilation on the final image
FROM python:3.11-rc-alpine3.14 FROM python:3.12-alpine
LABEL org.opencontainers.image.documentation="https://github.com/markqvist/NomadNet#nomad-network-daemon-with-docker" LABEL org.opencontainers.image.documentation="https://github.com/markqvist/NomadNet#nomad-network-daemon-with-docker"

32
Dockerfile.build Normal file
View File

@@ -0,0 +1,32 @@
FROM python:alpine
LABEL authors="Petr Blaha petr.blaha@cleverdata.cz"
USER root
RUN apk update
RUN apk add build-base libffi-dev cargo pkgconfig linux-headers py3-virtualenv
RUN addgroup -S myuser && adduser -S -G myuser myuser
USER myuser
WORKDIR /home/myuser
RUN pip install --upgrade pip
RUN pip install setuptools-rust pyopenssl cryptography
ENV PATH="/home/myuser/.local/bin:${PATH}"
################### BEGIN NomadNet ###########################################
COPY --chown=myuser:myuser requirements.txt requirements.txt
RUN pip install --user -r requirements.txt
COPY --chown=myuser:myuser . .
#Python create virtual environment
RUN virtualenv /home/myuser/NomadNet/venv
RUN source /home/myuser/NomadNet/venv/bin/activate
RUN make all
################### END NomadNet ###########################################

6
Dockerfile.howto Normal file
View File

@@ -0,0 +1,6 @@
# Run docker command one by one(all four), it will build NomadNet artifact and copy to dist directory.
# No need to build locally and install dependencies
docker build -t nomadnetdockerimage -f Dockerfile.build .
docker run -d -it --name nomadnetdockercontainer nomadnetdockerimage /bin/sh
docker cp nomadnetdockercontainer:/home/myuser/dist .
docker rm -f nomadnetdockercontainer

View File

@@ -148,11 +148,11 @@ You can help support the continued development of open, free and private communi
``` ```
- Ethereum - Ethereum
``` ```
0x81F7B979fEa6134bA9FD5c701b3501A2e61E897a 0xFDabC71AC4c0C78C95aDDDe3B4FA19d6273c5E73
``` ```
- Bitcoin - Bitcoin
``` ```
3CPmacGm34qYvR6XWLVEJmi2aNe3PZqUuq 35G9uWVzrpJJibzUwpNUQGQNFzLirhrYAH
``` ```
- Ko-Fi: https://ko-fi.com/markqvist - Ko-Fi: https://ko-fi.com/markqvist

View File

@@ -125,6 +125,10 @@ class NomadNetworkApp:
self.peer_announce_at_start = True self.peer_announce_at_start = True
self.try_propagation_on_fail = True self.try_propagation_on_fail = True
self.disable_propagation = False self.disable_propagation = False
self.notify_on_new_message = True
self.lxmf_max_propagation_size = None
self.lxmf_max_incoming_size = None
self.periodic_lxmf_sync = True self.periodic_lxmf_sync = True
self.lxmf_sync_interval = 360*60 self.lxmf_sync_interval = 360*60
@@ -282,7 +286,11 @@ class NomadNetworkApp:
self.directory = nomadnet.Directory(self) self.directory = nomadnet.Directory(self)
self.message_router = LXMF.LXMRouter(identity = self.identity, storagepath = self.storagepath, autopeer = True) self.message_router = LXMF.LXMRouter(
identity = self.identity, storagepath = self.storagepath, autopeer = True,
propagation_limit = self.lxmf_max_propagation_size, delivery_limit = self.lxmf_max_incoming_size,
)
self.message_router.register_delivery_callback(self.lxmf_delivery) self.message_router.register_delivery_callback(self.lxmf_delivery)
for destination_hash in self.ignored_list: for destination_hash in self.ignored_list:
@@ -546,6 +554,9 @@ class NomadNetworkApp:
nomadnet.Conversation.ingest(message, self) nomadnet.Conversation.ingest(message, self)
if self.notify_on_new_message:
self.notify_message_recieved()
if self.should_print(message): if self.should_print(message):
self.print_message(message) self.print_message(message)
@@ -649,6 +660,11 @@ class NomadNetworkApp:
if os.path.isfile(self.conversationpath + "/" + source_hash + "/unread"): if os.path.isfile(self.conversationpath + "/" + source_hash + "/unread"):
os.unlink(self.conversationpath + "/" + source_hash + "/unread") os.unlink(self.conversationpath + "/" + source_hash + "/unread")
def notify_message_recieved(self):
if self.uimode == nomadnet.ui.UI_TEXT:
sys.stdout.write("\a")
sys.stdout.flush()
def clear_tmp_dir(self): def clear_tmp_dir(self):
if os.path.isdir(self.tmpfilespath): if os.path.isdir(self.tmpfilespath):
for file in os.listdir(self.tmpfilespath): for file in os.listdir(self.tmpfilespath):
@@ -722,10 +738,22 @@ class NomadNetworkApp:
else: else:
self.lxmf_sync_limit = None self.lxmf_sync_limit = None
if option == "max_accepted_size":
value = self.config["client"].as_float(option)
if value > 0:
self.lxmf_max_incoming_size = value
else:
self.lxmf_max_incoming_size = 500
if option == "compact_announce_stream": if option == "compact_announce_stream":
value = self.config["client"].as_bool(option) value = self.config["client"].as_bool(option)
self.compact_stream = value self.compact_stream = value
if option == "notify_on_new_message":
value = self.config["client"].as_bool(option)
self.notify_on_new_message = value
if option == "user_interface": if option == "user_interface":
value = value.lower() value = value.lower()
if value == "none": if value == "none":
@@ -816,6 +844,14 @@ class NomadNetworkApp:
else: else:
self.disable_propagation = self.config["node"].as_bool("disable_propagation") self.disable_propagation = self.config["node"].as_bool("disable_propagation")
if not "max_transfer_size" in self.config["node"]:
self.lxmf_max_propagation_size = 256
else:
value = self.config["node"].as_float("max_transfer_size")
if value < 1:
value = 1
self.lxmf_max_propagation_size = value
if not "announce_at_start" in self.config["node"]: if not "announce_at_start" in self.config["node"]:
self.node_announce_at_start = False self.node_announce_at_start = False
else: else:
@@ -953,6 +989,7 @@ destination = file
enable_client = yes enable_client = yes
user_interface = text user_interface = text
downloads_path = ~/Downloads downloads_path = ~/Downloads
notify_on_new_message = yes
# By default, the peer is announced at startup # By default, the peer is announced at startup
# to let other peers reach it immediately. # to let other peers reach it immediately.
@@ -980,6 +1017,13 @@ lxmf_sync_interval = 360
# the limit, and download everything every time. # the limit, and download everything every time.
lxmf_sync_limit = 8 lxmf_sync_limit = 8
# The maximum accepted unpacked size for mes-
# sages received directly from other peers,
# specified in kilobytes. Messages larger than
# this will be rejected before the transfer
# begins.
max_accepted_size = 500
# The announce stream will only show one entry # The announce stream will only show one entry
# per destination or node by default. You can # per destination or node by default. You can
# change this to show as many announces as have # change this to show as many announces as have
@@ -1068,6 +1112,18 @@ announce_at_start = Yes
# and defaults to 2 gigabytes. # and defaults to 2 gigabytes.
# message_storage_limit = 2000 # message_storage_limit = 2000
# The maximum accepted transfer size per in-
# coming propagation transfer, in kilobytes.
# This also sets the upper limit for the size
# of single messages accepted onto this node.
#
# If a node wants to propagate a larger number
# of messages to this node, than what can fit
# within this limit, it will prioritise sending
# the smallest, newest messages first, and try
# with any remaining messages at a later point.
max_transfer_size = 256
# You can tell the LXMF message router to # You can tell the LXMF message router to
# prioritise storage for one or more # prioritise storage for one or more
# destinations. If the message store reaches # destinations. If the message store reaches

View File

@@ -1 +1 @@
__version__ = "0.4.6" __version__ = "0.4.7"

View File

@@ -664,6 +664,8 @@ class Browser:
self.delegate.columns.focus_position = 1 self.delegate.columns.focus_position = 1
def save_node_dialog(self): def save_node_dialog(self):
if self.destination_hash != None:
try:
def dismiss_dialog(sender): def dismiss_dialog(sender):
self.close_dialogs() self.close_dialogs()
@@ -710,6 +712,8 @@ class Browser:
self.delegate.columns.contents[1] = (overlay, options) self.delegate.columns.contents[1] = (overlay, options)
self.delegate.columns.focus_position = 1 self.delegate.columns.focus_position = 1
except Exception as e:
pass
def load_page(self): def load_page(self):
if self.request_data == None: if self.request_data == None:

View File

@@ -300,7 +300,7 @@ To learn how to host your own node, read the `*Hosting a Node`* section of this
TOPIC_HOSTING = '''>Hosting a Node TOPIC_HOSTING = '''>Hosting a Node
To host a node on the network, you must enable it in the configuration file, by setting `*enable_node`* directive to `*yes`*. You should also configure the other node-related parameters such as the node name and announce interval settings. Once node hosting has been enabled in the configuration, Nomad Network will start hosting your node as soon as the program is launched, and other peers on the network will be able to connect and interact with content on your node. To host a node on the network, you must enable it in the configuration file, by setting the `*enable_node`* directive to `*yes`*. You should also configure the other node-related parameters such as the node name and announce interval settings. Once node hosting has been enabled in the configuration, Nomad Network will start hosting your node as soon as the program is launched, and other peers on the network will be able to connect and interact with content on your node.
By default, no content is defined, apart from a short placeholder home page. To learn how to add your own content, read on. By default, no content is defined, apart from a short placeholder home page. To learn how to add your own content, read on.
@@ -310,9 +310,12 @@ All nodes on the network will automatically participate in a distributed message
When Nomad Network is configured to host a node, by default it also configures itself as an LXMF Propagation Node, and automatically discovers and peers with other propagation nodes on the network. This process is completely automatic and requires no configuration from the node operator. When Nomad Network is configured to host a node, by default it also configures itself as an LXMF Propagation Node, and automatically discovers and peers with other propagation nodes on the network. This process is completely automatic and requires no configuration from the node operator.
If there is already an abundance of Propagation Nodes on the network, or the operator simply wishes to host a pageserving-only node, Propagation Node hosting can be disabled in the configuration file. `!However`!, if there is already an abundance of Propagation Nodes on the network, or the operator simply wishes to host a pageserving-only node, Propagation Node hosting can be disabled in the configuration file.
To view LXMF Propagation nodes that are currently peered with your node, go to the `![ Network ]`! part of the program and press `!Ctrl-P`!. In the list of peered Propagation Nodes, it is possible to break peering with a node by pressing `!Ctrl-X`!. It is also possible to request an immediate delivery sync of all unhandled messages for a node, by pressing `!Ctrl-R`!. To view LXMF Propagation nodes that are currently peered with your node, go to the `![ Network ]`! part of the program and press `!Ctrl-P`!. In the list of peered Propagation Nodes, it is possible to:
- Immediately break peering with a node by pressing `!Ctrl-X`!
- Request an immediate delivery sync of all unhandled messages for a node, by pressing `!Ctrl-R`!
The distributed message store is resilient to intermittency, and will remain functional as long as at least one node remains on the network. Nodes that were offline for a time will automatically be synced up to date when they regain connectivity. The distributed message store is resilient to intermittency, and will remain functional as long as at least one node remains on the network. Nodes that were offline for a time will automatically be synced up to date when they regain connectivity.
@@ -326,9 +329,9 @@ You can control how long a peer will cache your pages by including the cache hea
>> Dynamic Pages >> Dynamic Pages
You can use a preprocessor such as PHP, bash, Python (or whatever you prefer) to generate dynamic pages. To do so, just set executable permissions on the relevant page file, and be sure to include the interpreter at the beginning of the file, for example `!#!/usr/bin/python3`!. You can use a preprocessor such as PHP, bash, Python (or whatever you prefer) to generate dynamic pages and fully interactive applications running over Nomad Network. To do so, just set executable permissions on the relevant page file, and be sure to include the interpreter at the beginning of the file, for example `!#!/usr/bin/python3`!.
Data from fields and link variables will be passed to these scipts or programs as environment variables, and can simply be read by any method for acessing such. Data from fields and link variables will be passed to these scipts or programs as environment variables, and can simply be read by any method for accessing such.
In the `!examples`! directory, you can find various small examples for the use of this feature. The currently included examples are: In the `!examples`! directory, you can find various small examples for the use of this feature. The currently included examples are:
@@ -512,6 +515,12 @@ The number of minutes between each automatic sync. The default is equal to 6 hou
On low-bandwidth networks, it can be useful to limit the amount of messages downloaded in each sync. The default is 8. Set to 0 to download all available messages every time a sync occurs. On low-bandwidth networks, it can be useful to limit the amount of messages downloaded in each sync. The default is 8. Set to 0 to download all available messages every time a sync occurs.
< <
>>>
`!max_accepted_size = 500`!
>>>>
The maximum accepted unpacked size for messages received directly from other peers, specified in kilobytes. Messages larger than this will be rejected before the transfer begins.
<
>>> >>>
`!compact_announce_stream = yes`! `!compact_announce_stream = yes`!
>>>> >>>>
@@ -650,6 +659,12 @@ By default, when Nomad Network is hosting a node, it will also run an LXMF propa
Configures the maximum amount of storage, in megabytes, that the LXMF Propagation Node will use to store messages. Configures the maximum amount of storage, in megabytes, that the LXMF Propagation Node will use to store messages.
< <
>>>
`!max_transfer_size = 256`!
>>>>
The maximum accepted transfer size per incoming propagation transfer, in kilobytes. This also sets the upper limit for the size of single messages accepted onto this propagation node. If a node wants to propagate a larger number of messages to this node, than what can fit within this limit, it will prioritise sending the smallest, newest messages first, and try with any remaining messages at a later point.
<
>>> >>>
`!prioritise_destinations = 41d20c727598a3fbbdf9106133a3a0ed, d924b81822ca24e68e2effea99bcb8cf`! `!prioritise_destinations = 41d20c727598a3fbbdf9106133a3a0ed, d924b81822ca24e68e2effea99bcb8cf`!
>>>> >>>>

6
requirements.txt Normal file
View File

@@ -0,0 +1,6 @@
compiler==0.2.0
configobj==5.0.8
lxmf==0.3.2
rns==0.5.7
setuptools==68.0.0
urwid==2.1.2

View File

@@ -30,6 +30,6 @@ setuptools.setup(
entry_points= { entry_points= {
'console_scripts': ['nomadnet=nomadnet.nomadnet:main'] 'console_scripts': ['nomadnet=nomadnet.nomadnet:main']
}, },
install_requires=["rns>=0.7.0", "lxmf>=0.3.9", "urwid>=2.4.2,!=2.4.3", "qrcode"], install_requires=["rns>=0.7.2", "lxmf>=0.4.0", "urwid>=2.4.2,!=2.4.3", "qrcode"],
python_requires=">=3.6", python_requires=">=3.6",
) )