Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Changelog

## 0.9.31 (2026-03-05)

- Support zip backup file archive format.

## 0.9.30 (2026-02-03)

- Support backup and restore schedules.
Expand Down
2 changes: 1 addition & 1 deletion python/mujinwebstackclient/version.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
__version__ = '0.9.30'
__version__ = '0.9.31'

# Do not forget to update CHANGELOG.md
37 changes: 35 additions & 2 deletions python/mujinwebstackclient/webstackclient.py
Original file line number Diff line number Diff line change
Expand Up @@ -1070,7 +1070,24 @@ def DeleteAllITLPrograms(self, timeout=5):
# Backup restore
#

def Backup(self, saveconfig=True, savemedia=True, backupscenepks=None, backupSceneFormat=None, savewebapps=True, saveitl=True, savedetection=False, savestate=True, savecalibration=False, savedebug=False, saveeds=True, saveiodd=True, saveschedule=True, timeout=600):
def Backup(
self,
saveconfig=True,
savemedia=True,
backupscenepks=None,
backupSceneFormat=None,
savewebapps=True,
saveitl=True,
savedetection=False,
savestate=True,
savecalibration=False,
savedebug=False,
saveeds=True,
saveiodd=True,
saveschedule=True,
archiveFormat='tar.gz',
timeout=600,
):
"""Downloads a backup file

:param saveconfig: Whether we want to include configs in the backup, defaults to True
Expand All @@ -1086,6 +1103,7 @@ def Backup(self, saveconfig=True, savemedia=True, backupscenepks=None, backupSce
:param saveschedule: Whether we want to include schedules in the backup, defaults to True
:param backupscenepks: List of scenes to backup, defaults to None
:param backupSceneFormat: The scene format to use in backup files, defaults to None
:param archiveFormat: The backup file archive format, supported values are tar.gz and zip, defaults to tar.gz
:param timeout: Amount of time in seconds to wait before failing, defaults to 600
:raises WebstackClientError: If request wasn't successful
:return: A streaming response to the backup file
Expand All @@ -1108,14 +1126,27 @@ def Backup(self, saveconfig=True, savemedia=True, backupscenepks=None, backupSce
'schedule': 'true' if saveschedule else 'false',
'backupScenePks': ','.join(backupscenepks) if backupscenepks else None,
'backupSceneFormat': backupSceneFormat,
'archiveFormat': archiveFormat,
},
timeout=timeout,
)
if response.status_code != 200:
raise WebstackClientError(response.content.decode('utf-8'), response=response.content)
return response

def Restore(self, file, restoreconfig=True, restoremedia=True, restorewebapps=True, restoreitl=True, restoreeds=True, restoreiodd=True, restoreschedule=True, timeout=600):
def Restore(
self,
file,
restoreconfig=True,
restoremedia=True,
restorewebapps=True,
restoreitl=True,
restoreeds=True,
restoreiodd=True,
restoreschedule=True,
archiveFormat=None,
timeout=600,
):
"""Uploads a previously downloaded backup file to restore

:param file: Backup filer in tarball format
Expand All @@ -1126,6 +1157,7 @@ def Restore(self, file, restoreconfig=True, restoremedia=True, restorewebapps=Tr
:param restoreeds: Whether we want to restore the eds files, defaults to True
:param restoreiodd: Whether we want to restore the iodd files, defaults to True
:param restoreschedule: Whether we want to restore the schedules, defaults to True
:param archiveFormat: The backup file archive format, supported values are tar.gz and zip, defaults to None
:param timeout: Amount of time in seconds to wait before failing, defaults to 600
:raises WebstackClientError: If request wasn't successful
:return: JSON response
Expand All @@ -1142,6 +1174,7 @@ def Restore(self, file, restoreconfig=True, restoremedia=True, restorewebapps=Tr
'eds': 'true' if restoreeds else 'false',
'iodd': 'true' if restoreiodd else 'false',
'schedule': 'true' if restoreschedule else 'false',
'archiveFormat': archiveFormat,
},
timeout=timeout,
)
Expand Down