node-xen-backup

0.3.2 • Public • Published

node-xen-backup

JavaScript Style Guide NPM version

node-xen-backup is a Node.js module that uses xen-api to take a snapshot of a Xenserver VM and export to a file for backup. The module includes a cli to execute direct on bash.

You can contribute

It is a free software and its use is free for everyone, but if you want to contribute anyway, please submit a donation.

Donate

Support

  • Node.js (tested on >= 7.x)

Installation

Installing global for cli usage

> npm install -g node-xen-backup

Installing as node module

> npm install node-xen-backup
  const XenBackup = require('node-xen-backup')

Cli

Getting help

> xen-backup --help
 
# Usage: xen-backup [options] 
 
 
# Options: 
# 
#    -V, --version              output the version number 
#    -H, --host [host]          IP or hostname from Xenserver. Default: localhost. 
#    -P, --port [port]          TCP port from Xenserver. Default: 80. 
#    -u, --username [username]  Username to login in Xenserver. 
#    -p, --password <password>  Password to login in Xenserver. 
#    -f, --filename <filename>  Path to target file of exported snapshot. 
#    -t, --type <type>          Type of object to export. <vm|vdi> default vm. 
#    -v, --vm <vm>              VM name label or uuid to backup. 
#    -h, --help                 output usage information 

Creating a backup to a VM

# Backup command 
> xen-backup -H 192.168.1.1 -P 80 -u root -p password -f /backup/VMLinux.xva -v VMLinux
# Normal output 
- Searching for VM VMLinux
- Searching VM real reference for UUID 38d15c62-a1a2-f5f8-de3d-55fb360e96c8
- Taking snapshot...
- Getting snapshot data...
- Exporting snapshot VMLinux1516035235 taked in January 15, 2018
- Will be saved on file /backup/VMLinux.xva
- The file has size 784.93MB
- Removing snapshot...
- Snapshot removed successfuly

API

Creating a backup

Example creating a backup using as Node.js module. This is very much like procedure used in cli.

// [another requires...]
 
const XenBackup = require('node-xen-backup')
 
const connOptions = {
  username: 'root',
  password: 'password',
  host: '192.168.1.1',
  port: 80,
  sessionId: null
}
const destFileName = "/backup/filename.xva"
 
// First sets connecion options.
XenBackup.setClient(connOptions.host, connOptions.port)
// Login in xenserver xen-api.
XenBackup.login(connOptions.username, connOptions.password, (err, sessionId) => {
  if (err) return console.error(err)
  // Once logged sets session ID
  connOptions.sessionId = sessionId
  // Calls function to get itens
  getItens((err, itens) => {
    if (err) return console.error(err)
    let founded = false
    // Search for VM or VDI in returned itens
    for (let i in itens) {
      if (itens[i].uuid.toLowerCase() === program.vm.toLowerCase() || itens[i].name.toLowerCase() === program.vm.toLowerCase()) {
        founded = true
        // Takes snapshot
        itens[i].snapshot(itens[i].name.replace(/\s/g, '') + moment().unix(), (err, snapshot) => {
          if (err) return console.error(err)
          let protocol = 'http'
          if ((connOptions.port === '443') || (connOptions.port === 443)) protocol = 'https'
          // Call function to export snapshot
          downloadBackup(protocol, snapshot.uuid, (err, download) => {
            if (err) console.error(err)
            // Removes snapshot
            snapshot.remove((err, removed) => {
              if (err) return console.error(err)
              // SUCCESS!!!
              return console.log("VM OR VDI EXPORTED")
            })
          })
        })
      }
    }
    if (!founded) {
      return console.error('VDI or VHD not found in Xenserver.')
    }
  })
})
 
function getItens (callback) {
  if (program.type === 'vm') {
    XenBackup.getAllVMs((err, vms) => {
      if (err) return callback(err, null)
      return callback(null, vms)
    })
  }
  if (program.type === 'vdi') {
    XenBackup.getAllVDIs((err, vdis) => {
      if (err) return callback(err, null)
      return callback(null, vdis)
    })
  }
  if ((program.type !== 'vdi') && (program.type !== 'mv')) {
    return callback(new Error('Cannot define object type <vm|vdi>.'))
  }
}
 
function downloadBackup (protocol, uuid, callback) {
  let sufix = null
  if (program.type === 'vm') {
    sufix = `/export?session_id=${connOptions.sessionId}&use_compression=true&uuid=`
  }
  if (program.type === 'vdi') {
    sufix = `/export_raw_vdi?session_id=${connOptions.sessionId}&format=vhd&vdi=`
  }
  let req = request.get(`${protocol}://${connOptions.host}:${connOptions.port}${sufix}${uuid}`)
    .on('end', function (response) {
      return callback(null, response)
    })
    .on('error', function (err) {
      console.log(err)
      return callback(err, null)
    })
  if (program.type === 'vdi') {
    req.pipe(GZip).pipe(fs.createWriteStream(destFileName))
  } else {
    req.pipe(fs.createWriteStream(destFileName))
  }
}

Package Sidebar

Install

npm i node-xen-backup

Weekly Downloads

2

Version

0.3.2

License

MIT

Unpacked Size

20.9 kB

Total Files

9

Last publish

Collaborators

  • gsomenzi