blob: 8afa6e9cc470a6f75358daa2fce563a544c762dd [file]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
import type { CommandResponse } from '../../client/index.js';
import { COMMAND_CODE } from '../command.code.js';
import { wrapCommand } from '../command.utils.js';
export const SnapshotCompression = {
Stored: 1,
Deflated: 2,
Bzip2: 3,
Zstd: 4,
Lzma: 5,
Xz: 6,
} as const;
export type SnapshotCompression =
typeof SnapshotCompression[keyof typeof SnapshotCompression];
export const SystemSnapshotType = {
FilesystemOverview: 1,
ProcessList: 2,
ResourceUsage: 3,
Test: 4,
ServerLogs: 5,
ServerConfig: 6,
All: 100,
} as const;
export type SystemSnapshotType =
typeof SystemSnapshotType[keyof typeof SystemSnapshotType];
export const SNAPSHOT_COMPRESSION = SnapshotCompression;
export const SYSTEM_SNAPSHOT_TYPE = SystemSnapshotType;
export type SnapshotOptions = {
compression?: SnapshotCompression,
snapshotTypes?: SystemSnapshotType[]
};
export type Snapshot = SnapshotOptions;
const serializeSnapshot = (payload?: SnapshotOptions | void): Buffer => {
const compression =
payload && payload.compression ? payload.compression : SnapshotCompression.Deflated;
const snapshotTypes =
payload && payload.snapshotTypes ? payload.snapshotTypes : [SystemSnapshotType.All];
if (snapshotTypes.length > 255) {
throw new Error('snapshotTypes count cannot exceed 255');
}
if (snapshotTypes.length > 1 && snapshotTypes.includes(SystemSnapshotType.All)) {
throw new Error('SystemSnapshotType.All cannot be combined with specific snapshot types');
}
const buf = Buffer.allocUnsafe(2 + snapshotTypes.length);
buf.writeUInt8(compression, 0);
buf.writeUInt8(snapshotTypes.length, 1);
for (let i = 0; i < snapshotTypes.length; i++) {
buf.writeUInt8(snapshotTypes[i], 2 + i);
}
return buf;
};
export const SNAPSHOT = {
code: COMMAND_CODE.GetSnapshot,
serialize: serializeSnapshot,
deserialize: (r: CommandResponse): Buffer => r.data
};
/**
* Captures and packages the current system state as a raw ZIP archive.
*
* @param options - Optional configuration for snapshot compression and section types.
* Defaults to Deflated compression and `SystemSnapshotType.All` (code 100), capturing all
* available diagnostic sections (filesystem overview, process list, resource usage, server
* logs, and server configuration) for complete debugging.
* @returns A Buffer containing the raw ZIP archive bytes.
*
* @remarks
* - Authentication is required, and the caller must have administrative permissions.
* - The server enforces a single-flight mutex guard: only one snapshot can be collected
* at a time across the cluster.
* - Subject to the client's default 30-second socket timeout budget.
*/
export const snapshot = wrapCommand<SnapshotOptions | void, Buffer>(SNAPSHOT);