Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/router.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/router.py	(revision 2676)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/router.py	(working copy)
@@ -39,6 +39,7 @@
 from hive.utils import upload_receive, UploadResponse, dict_combine, \
     get_device_type, update_frontend_index_html
 from lib.response import FileResponse
+from django.http import FileResponse as file_response
 
 from hive.exceptions import ValidationError, ModelQueryException, ManagerImplError
 
@@ -51,7 +52,40 @@
 
 logger = logging.getLogger('hive.debug')
 
+import subprocess
 
+
+@staticmethod
+def run_command(command, logger, capture_output=False, shell=False, env=None):
+    """
+    Run shell commands and capture output if needed.
+    - command: List[str] (recommended) or str (if shell=True)
+    - logger: Logger instance
+    - capture_output: If True, returns stdout
+    - shell: If True, runs in shell (be careful of injection)
+    - env: Optional dict of environment variables
+    """
+    logger.info(f"Executing: {command}")
+    try:
+        result = subprocess.run(
+            command,
+            shell=shell,
+            capture_output=capture_output,
+            text=True,
+            stderr=subprocess.STDOUT if capture_output else None,
+            env=env
+        )
+        if capture_output:
+            logger.info(f"Output: {result.stdout.strip()}")
+        if result.returncode != 0:
+            logger.error(f"Command failed with code {result.returncode}: {result.stdout}")
+            raise subprocess.CalledProcessError(result.returncode, command, result.stdout)
+        return result.stdout if capture_output else None
+    except subprocess.CalledProcessError as e:
+        logger.error(f"Error executing: {str(e)}")
+        raise
+
+
 def webuiOn(request):
     if request.META['SERVER_NAME'] != 'localhost':
         raise Http404('Page not found')
@@ -1404,44 +1438,39 @@
 
 
 def save_setting(request):
-    # data = json.loads(request.POST.get('post_data', None))
-    # sess = get_current_session()
-    # result = ""
-    # sess.cli.set_config()
-    # output = sess.cli.cmd('write memory')
-    # if output.lower().find('failed') != -1:
-    #     result = output
-    # if result:
-    #     return HttpResponse(json.dumps({"state": False, "data": result}))
-    # else:
-
     fileName = "backup_" + time.strftime("%Y%m%d%H%M%S", time.localtime()) + ".setting"
-
     session = get_current_session()
     session.cli.set_enable()
     output = session.cli.cmd("show version", RegexParser(r'AMP\s+(?P<version>[^\.]+\.AMP(\.[0-9]+)+)'))
-    if output:
-        if output["version"]:
-            os.system("rm -rf /var/tmp/backup*")
-            os.mkdir("/var/tmp/backup")
+    if output and output.get("version"):
+        run_command(["rm", "-rf", "/var/tmp/backup*"], logger)
+        run_command(["mkdir", "-p", "/var/tmp/backup"], logger)
 
-            with open("/var/tmp/backup/version", "w") as f:
-                f.write(output["version"])
+        with open("/var/tmp/backup/version", "w") as f:
+            f.write(output["version"])
 
-            os.system("cp -r /ca/package/upload /var/tmp/backup")
-            os.system("cp -r /ca/config /var/tmp/backup")
-            os.system("cp -r /ca/webui/htdocs/new/src/cm/conf/ /var/tmp/backup")
-            os.system("/usr/pgsql-10/bin/pg_dump -U postgres -h 127.0.0.1 cm > /var/tmp/backup/cm.sql")
-            os.system(
-                "cd /var/tmp && tar -zcvf - backup | openssl des3 -salt -k " + output["version"] + " -out " + fileName)
-            os.system("rm -rf /var/tmp/backup")
+        run_command(["cp", "-r", "/ca/package/upload", "/var/tmp/backup"], logger)
+        run_command(["cp", "-r", "/ca/config", "/var/tmp/backup"], logger)
+        run_command(["cp", "-r", "/ca/webui/htdocs/new/src/cm/conf/", "/var/tmp/backup"], logger)
+        run_command([
+            "/usr/pgsql-17/bin/pg_dump", "-U", "amp_admin", "-h", "127.0.0.1", "-p", "5432", "cm",
+            "-F", "c", "-f", "/var/tmp/backup/postgres_backup.dump"
+        ], logger)
 
+        # Shell command for tar | openssl
+        run_command(
+            f"cd /var/tmp && tar -zcvf - backup | openssl des3 -pbkdf2 -salt -k {output['version']} -out {fileName}",
+            logger,
+            shell=True
+        )
+        run_command(["rm", "-rf", "/var/tmp/backup"], logger)
+
     os.chdir("/var/tmp")
     if os.path.exists(fileName):
-        oper_log('info', 'system', 'Save setting successful. File name: %s.' % (fileName))
-        response = FileResponse(open(fileName, 'rb'))
+        oper_log('info', 'system', f'Save setting successful. File name: {fileName}.')
+        response = file_response(open(fileName, 'rb'))
         response['Content-Type'] = "application/x-compressed"
-        response['Content-Disposition'] = 'attachment; filename=%s' % fileName
+        response['Content-Disposition'] = f'attachment; filename={fileName}'
     else:
         oper_log('error', 'system', 'Save setting failed.')
         response = HttpResponse('The request file is not found.')
@@ -1458,58 +1487,79 @@
         path = FILE_UPLOAD_DIR
         if not os.path.exists(path):
             os.makedirs(path)
-        file_name = path + file.name
-        destination = open(file_name, 'wb+')
-        for chunk in file.chunks():
-            destination.write(chunk)
-        destination.close()
+        file_name = os.path.join(path, file.name)
+        with open(file_name, 'wb+') as destination:
+            for chunk in file.chunks():
+                destination.write(chunk)
     except Exception as e:
         raise Http404('File upload failed: %s' % e)
 
     session = get_current_session()
     session.cli.set_enable()
     output = session.cli.cmd("show version", RegexParser(r'AMP\s+(?P<version>[^\.]+\.AMP(\.[0-9]+)+)'))
-    if output:
-        if output["version"]:
+    if output and output.get("version"):
+        os.chdir("/var/tmp")
+        run_command(["rm", "-rf", "/var/tmp/backup"], logger)
+        # Shell command for dd | openssl | tar
+        run_command(
+            f"dd if={file_name} | openssl des3 -d -pbkdf2 -k {output['version']} | tar zxf -",
+            logger,
+            shell=True
+        )
+        os.remove(file_name)
+        if not os.path.exists("/var/tmp/backup"):
+            oper_log('error', 'system',
+                     'Setting File upload fail. It may result from incorrect Setting File or error transmission. Please check the validation of Setting File and try again.')
+            return HttpResponse(json.dumps({'is_success': False,
+                                            'errorInfo': 'Setting File upload fail. It may result from incorrect Setting File or error transmission. Please check the validation of Setting File and try again.'}))
 
-            os.chdir("/var/tmp")
-            os.system("rm -rf /var/tmp/backup")
-            os.system("dd if=" + file_name + " |openssl des3 -d -k " + output["version"] + " | tar zxf -")
-            os.remove(file_name)
-            if not os.path.exists("/var/tmp/backup"):
-                oper_log('error', 'system',
-                         'Setting File upload fail. It may result from incorrect Setting File or error transmission. Please check the validation of Setting File and try again.')
-                return HttpResponse(json.dumps({'is_success': False,
-                                                'errorInfo': 'Setting File upload fail. It may result from incorrect Setting File or error transmission. Please check the validation of Setting File and try again.'}))
+        if os.path.exists("/var/tmp/backup/version"):
+            with open("/var/tmp/backup/version", "r") as f:
+                version = f.read()
 
-            if os.path.exists("/var/tmp/backup/version"):
-                with open("/var/tmp/backup/version", "r") as f:
-                    version = f.read()
+            if version == output["version"]:
+                if os.path.exists("/var/tmp/backup/config"):
+                    run_command(["rm", "-rf", "/ca/config"], logger)
+                    run_command(["cp", "-r", "/var/tmp/backup/config", "/ca/"], logger)
 
-                if version == output["version"]:
-                    if os.path.exists("/var/tmp/backup/config"):
-                        os.system("rm -rf /ca/config; cp -r /var/tmp/backup/config /ca/")
+                if os.path.exists("/var/tmp/backup/upload"):
+                    run_command(["rm", "-rf", "/ca/package/upload"], logger)
+                    run_command(["cp", "-r", "/var/tmp/backup/upload", "/ca/package/"], logger)
 
-                    if os.path.exists("/var/tmp/backup/upload"):
-                        os.system("rm -rf /ca/package/upload; cp -r /var/tmp/backup/upload /ca/package/")
+                if os.path.exists("/var/tmp/backup/conf"):
+                    run_command(["rm", "-rf", "/ca/webui/htdocs/new/src/cm/conf/"], logger)
+                    run_command(["cp", "-r", "/var/tmp/backup/conf", "/ca/webui/htdocs/new/src/cm/"], logger)
 
-                    if os.path.exists("/var/tmp/backup/conf"):
-                        os.system(
-                            "rm -rf /ca/webui/htdocs/new/src/cm/conf/; cp -r /var/tmp/backup/conf /ca/webui/htdocs/new/src/cm/")
+                try:
+                    # restore postgres backup
+                    pg_dump = os.path.join("/var/tmp/backup", "postgres_backup.dump")
+                    if os.path.exists("/var/tmp/backup/postgres_backup.dump"):
 
-                    if os.path.exists("/var/tmp/backup/cm.sql"):
-                        os.system('/usr/pgsql-10/bin/psql -h 127.0.0.1 -p 5432 -U postgres -c "drop database cm;"')
-                        os.system('/usr/pgsql-10/bin/psql -h 127.0.0.1 -p 5432 -U postgres -c "create database cm;"')
-                        os.system(
-                            '/usr/pgsql-10/bin/psql -h 127.0.0.1 -p 5432 -U postgres -d cm < /var/tmp/backup/cm.sql')
+                        cmd = "PGPASSWORD=Array@123$ /usr/pgsql-17/bin/pg_restore -U amp_admin -h 127.0.0.1 -p 5432 -d cm -c /var/tmp/backup/postgres_backup.dump"
+                        result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
 
-                    db = DB.get_connected_db()
-                    data = db.fetchall("SELECT ip_address FROM device")
-                    db.close()
-                    for item in data:
-                        L.add_lock(item[0])
-                    oper_log('info', 'system', 'Upload setting successful.')
-                    return HttpResponse(json.dumps({'is_success': clear_cache_all()}), content_type='application/json')
+                        if result.returncode != 0:
+                            logger.info(f"Restore failed: {result.stderr}")
+                        else:
+                            logger.info("Restore succeeded")
+                        logger.info(f"Restore returncode: {result.returncode}")
+                        logger.info(f"Restore stdout: {result.stdout}")
+                        logger.info(f"Restore stderr: {result.stderr}")
+
+                except subprocess.CalledProcessError as e:
+                    logger.info('an.model.cli', f'Restore failed! psql exited with status {e.returncode}')
+                except FileNotFoundError as e:
+                    logger.info('an.model.cli', f'File not found: {e.filename}')
+                except Exception as e:
+                    logger.info('an.model.cli', f'Unexpected error: {e}')
+
+                db = DB.get_connected_db()
+                data = db.fetchall("SELECT ip_address FROM device")
+                db.close()
+                for item in data:
+                    L.add_lock(item[0])
+                oper_log('info', 'system', 'Upload setting successful.')
+                return HttpResponse(json.dumps({'is_success': clear_cache_all()}), content_type='application/json')
     oper_log('error', 'system', 'Setting File upload fail. Version mismatch.')
     return HttpResponse(json.dumps({'is_success': False, 'errorInfo': 'Setting File and device version do not match!'}),
                         content_type='application/json')
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/lib/response.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/lib/response.py	(revision 2676)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/lib/response.py	(working copy)
@@ -51,8 +51,7 @@
         self._reason_phrase = reason
         self._charset = charset
         if content_type is None:
-            content_type = '%s; charset=%s' % (settings.DEFAULT_CONTENT_TYPE,
-                                               self.charset)
+            content_type = 'application/octet-stream'
         self['Content-Type'] = content_type
 
     @property
@@ -84,6 +83,7 @@
 
     def serialize_headers(self):
         """HTTP headers as a bytestring."""
+
         def to_bytes(val, encoding):
             return val if isinstance(val, bytes) else val.encode(encoding)
 
@@ -339,7 +339,7 @@
     @property
     def content(self):
         raise AttributeError("This %s instance has no `content` attribute. "
-            "Use `streaming_content` instead." % self.__class__.__name__)
+                             "Use `streaming_content` instead." % self.__class__.__name__)
 
     @property
     def streaming_content(self):
@@ -377,4 +377,4 @@
             value = iter(lambda: filelike.read(self.block_size), b'')
         else:
             self.file_to_stream = None
-        super(FileResponse, self)._set_streaming_content(value)
\ No newline at end of file
+        super(FileResponse, self)._set_streaming_content(value)
