summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlejandro Sirgo Rica <asirgo@soleta.eu>2024-05-23 11:17:35 +0200
committerAlejandro Sirgo Rica <asirgo@soleta.eu>2024-05-30 17:22:23 +0200
commit8de2b785a9be79f9cc0caa0011293f95a42d4d31 (patch)
tree660b9c7088f56e3d9a768c05fe1a0f65b296bc69
parente2d48ba3a0909f34afcf286ece339aa6a426678c (diff)
src: add POST cache/delete method
Add API REST method to delete cache contents. Resquest payload structure: { 'images': ['windows.img', 'linux.img'] } The client will try to delete as many images in cache as available with names matching the list of filenames in the 'images' field. Resquest response structure: { 'cache': [ {'name': 'windows.img', 'size': 2432370213, checksum: '5d4dcc677bc19f40a647d0002f4ade90'}, {'name': 'linux.img', 'size': 243234534213, checksum: '3eb22f888f88a55ad954f55644e1192e'} ] }
-rw-r--r--src/linux/ogOperations.py3
-rw-r--r--src/live/ogOperations.py40
-rw-r--r--src/ogRest.py18
-rw-r--r--src/restRequest.py7
-rw-r--r--src/virtual/ogOperations.py3
-rw-r--r--src/windows/ogOperations.py3
6 files changed, 74 insertions, 0 deletions
diff --git a/src/linux/ogOperations.py b/src/linux/ogOperations.py
index b71c4f4..7686956 100644
--- a/src/linux/ogOperations.py
+++ b/src/linux/ogOperations.py
@@ -55,6 +55,9 @@ class OgLinuxOperations:
def image_create(self, path, request, ogRest):
raise NotImplementedError
+ def cache_delete(self, request, ogRest):
+ raise NotImplementedError
+
def refresh(self, ogRest):
return {"status": "LINUX"}
diff --git a/src/live/ogOperations.py b/src/live/ogOperations.py
index 6948d98..d557fac 100644
--- a/src/live/ogOperations.py
+++ b/src/live/ogOperations.py
@@ -576,6 +576,46 @@ class OgLiveOperations:
logging.info('Image creation command OK')
return image_info
+ def cache_delete(self, request, ogRest):
+ images = request.getImages()
+ deleted_images = []
+
+ if not mount_cache():
+ return
+
+ img_dir = OG_CACHE_IMAGE_PATH
+
+ if not os.path.isdir(img_dir):
+ return cache_contents
+
+ for file_name in os.listdir(img_dir):
+ file_path = os.path.join(img_dir, file_name)
+
+ if not os.path.isfile(file_path):
+ continue
+ if not file_name.endswith('.img'):
+ continue
+ if os.sep in file_name:
+ logging.info(f'Detected cache deletion request of filename with a path, ignoring {file_name}')
+ continue
+
+ if file_name in images:
+ os.remove(file_path)
+
+ csum_path = file_path + '.full.sum'
+ if not os.path.isfile(csum_path):
+ logging.info(f'Missing checksum file for {file_path}')
+ continue
+
+ os.remove(csum_path)
+
+ result = {'cache': self._get_cache_contents()}
+
+ self._restartBrowser(self._url)
+
+ logging.info('Sending response to cache/delete request')
+ return result
+
def refresh(self, ogRest):
self._restartBrowser(self._url_log)
diff --git a/src/ogRest.py b/src/ogRest.py
index 5d6c746..ad57c8c 100644
--- a/src/ogRest.py
+++ b/src/ogRest.py
@@ -215,6 +215,19 @@ class ogThread():
client.send(response.get())
ogRest.state = ThreadState.IDLE
+ def cache_delete(client, request, ogRest):
+ try:
+ out = ogRest.operations.cache_delete(request, ogRest)
+ except Exception as e:
+ ogRest.send_internal_server_error(client, exc=e)
+ return
+
+ json_body = jsonBody(out)
+
+ response = restResponse(ogResponses.OK, json_body, seq=client.seq)
+ client.send(response.get())
+ ogRest.state = ThreadState.IDLE
+
def refresh(client, ogRest):
try:
out = ogRest.operations.refresh(ogRest)
@@ -328,6 +341,8 @@ class ogRest():
self.process_stop(client)
elif ("image/create" in URI):
self.process_imagecreate(client, request)
+ elif ("cache/delete" in URI):
+ self.process_cache_delete(client, request)
else:
logging.warn('Unsupported request: %s',
URI[:ogRest.LOG_LENGTH])
@@ -430,5 +445,8 @@ class ogRest():
def process_imagecreate(self, client, request):
threading.Thread(target=ogThread.image_create, args=(client, request, self,)).start()
+ def process_cache_delete(self, client, request):
+ threading.Thread(target=ogThread.cache_delete, args=(client, request, self,)).start()
+
def process_refresh(self, client):
threading.Thread(target=ogThread.refresh, args=(client, self,)).start()
diff --git a/src/restRequest.py b/src/restRequest.py
index 8128b08..fdfe633 100644
--- a/src/restRequest.py
+++ b/src/restRequest.py
@@ -37,6 +37,7 @@ class restRequest:
self.code = None
self.seq = None
self.backup = None
+ self.images = None
def parser(self,data):
self.request_line, self.headers_alone = data.split('\n', 1)
@@ -75,6 +76,9 @@ class restRequest:
except:
pass
+ if "images" in json_param:
+ self.images = json_param["images"]
+
if "disk" in json_param:
self.disk = json_param["disk"]
@@ -114,6 +118,9 @@ class restRequest:
def get_method(self):
return self.method
+ def getImages(self):
+ return self.images
+
def get_uri(self):
return self.URI
diff --git a/src/virtual/ogOperations.py b/src/virtual/ogOperations.py
index 3cfe83a..2b69fd1 100644
--- a/src/virtual/ogOperations.py
+++ b/src/virtual/ogOperations.py
@@ -458,6 +458,9 @@ class OgVirtualOperations:
return True
+ def cache_delete(self, request, ogRest):
+ raise NotImplementedError
+
def software(self, request, path, ogRest):
DPKG_PATH = '/var/lib/dpkg/status'
diff --git a/src/windows/ogOperations.py b/src/windows/ogOperations.py
index d20b52c..70d3c5b 100644
--- a/src/windows/ogOperations.py
+++ b/src/windows/ogOperations.py
@@ -110,6 +110,9 @@ class OgWindowsOperations:
def image_create(self, path, request, ogRest):
raise NotImplementedError
+ def cache_delete(self, request, ogRest):
+ raise NotImplementedError
+
def refresh(self, ogRest):
return {"status": "WIN"}