vmsnap
Version:
A Node based backup and backup rotation tool for KVM domains.
2 lines (1 loc) • 1.89 kB
JavaScript
import{sep as l}from"path";import{readdir as h,stat as m}from"fs/promises";import w from"pretty-bytes";import{fileExists as u,parseArrayParam as z}from"./general.js";import{findBitmaps as T}from"./qemu-img.js";import{fetchAllDomains as g,findCheckpoints as b}from"./virsh.js";import{FREQUENCY_MONTHLY as D,getBackupFolder as E}from"./libnbdbackup.js";export const STATUS_OK=0,STATUS_INCONSISTENT=1,STATUSES=new Map([[STATUS_OK,"OK"],[STATUS_INCONSISTENT,"INCONSISTENT"]]);const N=5,O=async(i,o=void 0,n=D,s=!1)=>{const a={},e=await z(i,g);let t={};for(const p of e){const f=await b(p);t.checkpoints=[];for(const r of f)t.checkpoints.push(r);const S=await T(p);t.disks=[];let c={};for(const r of S){c.disk=r.disk,c.virtualSize=k(r.virtualSize,s),c.actualSize=k(r.actualSize,s),c.bitmaps=[];for(const $ of r.bitmaps)c.bitmaps.push($.name);t.disks.push(c),c={}}t.overallStatus=I(t),o&&typeof o=="string"&&(await v(p,t,o,n,s),t.overallStatus===STATUS_OK&&t.backupDirStats.checkpoints!==t.checkpoints.length&&(t.overallStatus=STATUS_INCONSISTENT)),a[p]=t,t={}}return a},k=(i,o=!1)=>o?w(i):i,v=async(i,o,n,s,a=!1)=>{const e={path:null,totalFiles:0,checkpoints:0,totalSize:0},t=`${n}${l}${i}${l}${E(s)}`;e.path=t;const p=`${t}${l}checkpoints`;if(await u(t)&&await u(p)){const f=await h(`${t}${l}checkpoints`);let S,c=0;for(const r of f)S=await m(`${t}${l}checkpoints${l}${r}`),c+=S.size;e.totalFiles=f.length,e.checkpoints=f.length,e.totalSize=c,await d(e,t)}o.backupDirStats={...e,totalSize:k(e.totalSize,a)}},I=i=>{let o=STATUS_OK;const n=i.checkpoints;let s=[];for(const a of i.disks)if(s=a.bitmaps,n.length!==s.length){o=STATUS_INCONSISTENT;break}return o},d=async(i,o,n=0)=>{if(n===N)throw new Error(`Recursion limit reached for ${o}`);let s,a;for(const e of await h(o))a=`${o}${l}${e}`,s=await m(a),s.isDirectory()&&await d(i,a,++n),i.totalFiles++,i.totalSize+=s.size};export{O as getStatus};