diff --git a/meshtastic/__main__.py b/meshtastic/__main__.py index e5a92435..a9aa05e7 100644 --- a/meshtastic/__main__.py +++ b/meshtastic/__main__.py @@ -59,7 +59,7 @@ 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. " diff --git a/meshtastic/node.py b/meshtastic/node.py index f8e81f63..985f4c96 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -707,8 +707,47 @@ def setFavorite(self, nodeId: Union[int, str]): 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("!"): diff --git a/pyproject.toml b/pyproject.toml index 577e13f9..979ecfe3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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 "] license = "GPL-3.0-only"