Compare commits

...

8 Commits

Author SHA1 Message Date
Ben Meadors
7422d9d314 Update 2025-03-04 08:15:55 -06:00
Ben Meadors
5ee0264737 Where's intellisense when you need it 2025-03-03 15:28:14 -06:00
Ben Meadors
ec13bd308a Remove print 2025-03-03 15:23:48 -06:00
Ben Meadors
2d88d8e918 Good lawd I did that in a hurry 2025-03-03 15:23:21 -06:00
Ben Meadors
fb48fc20b3 Optionals 2025-03-03 07:56:03 -06:00
Ben Meadors
336e5154a3 Add args for cli 2025-03-03 06:58:45 -06:00
Ben Meadors
3008e039fb Bump version 2025-03-03 06:51:12 -06:00
Ben Meadors
4bf61d4c98 Add backup / restore admin commands 2025-03-03 06:48:06 -06:00
3 changed files with 86 additions and 3 deletions

View File

@@ -59,7 +59,7 @@ except ImportError as e:
have_powermon = False
powermon_exception = e
meter = None
from meshtastic.protobuf import channel_pb2, config_pb2, portnums_pb2
from meshtastic.protobuf import admin_pb2, channel_pb2, config_pb2, portnums_pb2
from meshtastic.version import get_active_version
def onReceive(packet, interface) -> None:
@@ -462,6 +462,22 @@ def onConnected(interface):
waitForAckNak = True
interface.getNode(args.dest, False, **getNode_kwargs).removeFavorite(args.remove_favorite_node)
if args.backup_prefs:
closeNow = True
waitForAckNak = True
print(f"Backing up preferences to {args.backup_prefs}")
interface.getNode(args.dest, False, **getNode_kwargs).backupPreferences(args.backup_prefs)
if args.restore_prefs:
closeNow = True
waitForAckNak = True
interface.getNode(args.dest, False, **getNode_kwargs).restorePreferences(args.restore_prefs)
if args.remove_backup_prefs:
closeNow = True
waitForAckNak = True
interface.getNode(args.dest, False, **getNode_kwargs).removePreferencesBackups(args.remove_backup_prefs)
if args.set_ignored_node:
closeNow = True
waitForAckNak = True
@@ -1794,12 +1810,40 @@ def addRemoteAdminArgs(parser: argparse.ArgumentParser) -> argparse.ArgumentPars
action="store_true",
)
group.add_argument(
"--backup-prefs",
help="Tell the destination node to create a backup preferences file."
"Location: 0 for local flash, 1 for SD card.",
default=admin_pb2.AdminMessage.BackupLocation.FLASH,
nargs="?",
const=0,
)
group.add_argument(
"--restore-prefs",
help="Tell the destination node to remove backup preferences files."
"Location: 0 for local flash, 1 for SD card.",
default=admin_pb2.AdminMessage.BackupLocation.FLASH,
nargs="?",
const=0,
)
group.add_argument(
"--remove-backup-prefs",
help="Tell the destination node to remove backup preferences files."
"Location: 0 for local flash, 1 for SD card.",
default=admin_pb2.AdminMessage.BackupLocation.FLASH,
nargs="?",
const=0,
)
group.add_argument(
"--remove-node",
help="Tell the destination node to remove a specific node from its NodeDB. "
"Use the node ID with a '!' or '0x' prefix or the node number.",
metavar="!xxxxxxxx"
)
group.add_argument(
"--set-favorite-node",
help="Tell the destination node to set the specified node to be favorited on the NodeDB. "

View File

@@ -707,8 +707,47 @@ class Node:
onResponse = self.onAckNak
return self._sendAdmin(p, onResponse=onResponse)
def backupPreferences(self, location: Optional[admin_pb2.AdminMessage.BackupLocation.ValueType] = 0):
"""Tell the node to backup preferences to flash."""
self.ensureSessionKey()
p = admin_pb2.AdminMessage()
p.backup_preferences = location
if self == self.iface.localNode:
onResponse = None
else:
onResponse = self.onAckNak
return self._sendAdmin(p, onResponse=onResponse)
def restorePreferences(self, location: Optional[admin_pb2.AdminMessage.BackupLocation.ValueType] = 0):
"""Tell the node to restore preferences from backup."""
self.ensureSessionKey()
p = admin_pb2.AdminMessage()
p.restore_preferences = location
if self == self.iface.localNode:
onResponse = None
else:
onResponse = self.onAckNak
return self._sendAdmin(p, onResponse=onResponse)
def removePreferencesBackups(self, location: Optional[admin_pb2.AdminMessage.BackupLocation.ValueType] = 0):
"""Tell the node to remove backup preferences from the filesystem."""
self.ensureSessionKey()
p = admin_pb2.AdminMessage()
p.remove_backup_preferences = location
if self == self.iface.localNode:
onResponse = None
else:
onResponse = self.onAckNak
return self._sendAdmin(p, onResponse=onResponse)
def removeFavorite(self, nodeId: Union[int, str]):
"""Tell the node to set the specified node ID to be un-favorited on the NodeDB on the device"""
"""Tell the node to set the specified node ID to be un-favorited on the NodeDB on the device."""
self.ensureSessionKey()
if isinstance(nodeId, str):
if nodeId.startswith("!"):

View File

@@ -1,6 +1,6 @@
[tool.poetry]
name = "meshtastic"
version = "2.5.12"
version = "2.6.0a1"
description = "Python API & client shell for talking to Meshtastic devices"
authors = ["Meshtastic Developers <contact@meshtastic.org>"]
license = "GPL-3.0-only"