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'}
    ]
}
master
Alejandro Sirgo Rica 2024-05-23 11:17:35 +02:00
parent e2d48ba3a0
commit 8de2b785a9
6 changed files with 74 additions and 0 deletions

View File

@ -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"}

View File

@ -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)

View File

@ -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()

View File

@ -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

View File

@ -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'

View File

@ -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"}