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.

Usage no npm install needed!

<script type="module">
  import nodeXenBackup from '';



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.



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


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')


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 -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


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: '',
  port: 80,
  sessionId: null
const destFileName = "/backup/filename.xva"

// First sets connecion options.
XenBackup.setClient(, 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.port}${sufix}${uuid}`)
    .on('end', function (response) {
      return callback(null, response)
    .on('error', function (err) {
      return callback(err, null)
  if (program.type === 'vdi') {
  } else {