Can export entire server configuration
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				continuous-integration/drone/push Build is passing
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			This commit is contained in:
		@@ -232,4 +232,16 @@ export class ServerApi {
 | 
			
		||||
      })
 | 
			
		||||
    ).data;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Export all server configs
 | 
			
		||||
   */
 | 
			
		||||
  static async ExportServerConfigs(): Promise<Blob> {
 | 
			
		||||
    return (
 | 
			
		||||
      await APIClient.exec({
 | 
			
		||||
        method: "GET",
 | 
			
		||||
        uri: "/server/export_configs",
 | 
			
		||||
      })
 | 
			
		||||
    ).data;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -9,18 +9,21 @@ import {
 | 
			
		||||
import Icon from "@mdi/react";
 | 
			
		||||
import {
 | 
			
		||||
  Box,
 | 
			
		||||
  IconButton,
 | 
			
		||||
  LinearProgress,
 | 
			
		||||
  Table,
 | 
			
		||||
  TableBody,
 | 
			
		||||
  TableCell,
 | 
			
		||||
  TableHead,
 | 
			
		||||
  TableRow,
 | 
			
		||||
  Tooltip,
 | 
			
		||||
  Typography,
 | 
			
		||||
} from "@mui/material";
 | 
			
		||||
import Grid from "@mui/material/Grid";
 | 
			
		||||
import { PieChart } from "@mui/x-charts";
 | 
			
		||||
import { filesize } from "filesize";
 | 
			
		||||
import humanizeDuration from "humanize-duration";
 | 
			
		||||
import IosShareIcon from "@mui/icons-material/IosShare";
 | 
			
		||||
import React from "react";
 | 
			
		||||
import {
 | 
			
		||||
  DiskInfo,
 | 
			
		||||
@@ -31,6 +34,8 @@ import {
 | 
			
		||||
import { AsyncWidget } from "../widgets/AsyncWidget";
 | 
			
		||||
import { VirtWebPaper } from "../widgets/VirtWebPaper";
 | 
			
		||||
import { VirtWebRouteContainer } from "../widgets/VirtWebRouteContainer";
 | 
			
		||||
import { useLoadingMessage } from "../hooks/providers/LoadingMessageProvider";
 | 
			
		||||
import { useAlert } from "../hooks/providers/AlertDialogProvider";
 | 
			
		||||
 | 
			
		||||
export function SysInfoRoute(): React.ReactElement {
 | 
			
		||||
  const [info, setInfo] = React.useState<ServerSystemInfo>();
 | 
			
		||||
@@ -52,6 +57,23 @@ export function SysInfoRoute(): React.ReactElement {
 | 
			
		||||
export function SysInfoRouteInner(p: {
 | 
			
		||||
  info: ServerSystemInfo;
 | 
			
		||||
}): React.ReactElement {
 | 
			
		||||
  const alert = useAlert();
 | 
			
		||||
  const loadingMessage = useLoadingMessage();
 | 
			
		||||
  const downloadAllConfig = async () => {
 | 
			
		||||
    try {
 | 
			
		||||
      loadingMessage.show("Downloading server config...");
 | 
			
		||||
      const res = await ServerApi.ExportServerConfigs();
 | 
			
		||||
 | 
			
		||||
      const url = URL.createObjectURL(res);
 | 
			
		||||
      window.location.href = url;
 | 
			
		||||
    } catch (e) {
 | 
			
		||||
      console.error("Failed to download server config!", e);
 | 
			
		||||
      alert(`Failed to download server config! ${e}`);
 | 
			
		||||
    } finally {
 | 
			
		||||
      loadingMessage.hide();
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  const sumDiskUsage = p.info.disks.reduce(
 | 
			
		||||
    (prev, disk) => {
 | 
			
		||||
      return {
 | 
			
		||||
@@ -63,7 +85,16 @@ export function SysInfoRouteInner(p: {
 | 
			
		||||
  );
 | 
			
		||||
 | 
			
		||||
  return (
 | 
			
		||||
    <VirtWebRouteContainer label="Sysinfo">
 | 
			
		||||
    <VirtWebRouteContainer
 | 
			
		||||
      label="Sysinfo"
 | 
			
		||||
      actions={
 | 
			
		||||
        <Tooltip title="Export all server configs">
 | 
			
		||||
          <IconButton onClick={downloadAllConfig}>
 | 
			
		||||
            <IosShareIcon />
 | 
			
		||||
          </IconButton>
 | 
			
		||||
        </Tooltip>
 | 
			
		||||
      }
 | 
			
		||||
    >
 | 
			
		||||
      <Grid container spacing={2}>
 | 
			
		||||
        {/* Memory */}
 | 
			
		||||
        <Grid size={{ xs: 4 }}>
 | 
			
		||||
 
 | 
			
		||||
@@ -799,6 +799,11 @@ export function TokenRightsEditor(p: {
 | 
			
		||||
          right={{ verb: "GET", path: "/api/server/bridges" }}
 | 
			
		||||
          label="Get list of network bridges"
 | 
			
		||||
        />
 | 
			
		||||
        <RouteRight
 | 
			
		||||
          {...p}
 | 
			
		||||
          right={{ verb: "GET", path: "/api/server/export_configs" }}
 | 
			
		||||
          label="Export all configurations"
 | 
			
		||||
        />
 | 
			
		||||
      </RightsSection>
 | 
			
		||||
    </>
 | 
			
		||||
  );
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user