mmornati/ssh2-keeper

View on GitHub
lib/operations.js

Summary

Maintainability
C
1 day
Test Coverage
var database = require('./database');
var utils = require('./utils');
var config = require('config');
var _ = require('lodash');
const log_config = require('./logConfig');
const {Signale} = require('signale');
const log = new Signale(log_config.options);

const allowed_operations = ['ADD', 'SEARCH', 'DELETE', 'UPDATE'];

function add(server, verbose) {
  if (!utils.updateServer(server, verbose)) {
    console.log("Saving...");
    database[config.server_collection].save(server);
  }
  log.info("Checking tags: " + server.tags);
  if (server.tags && server.tags.length > 0) {
      for (var i = 0; i < server.tags.length; i++) {
        var db_tag = database[config.tag_collection].find({tag: server.tags[i]});
        if (db_tag && db_tag.length>0) {
          log.info("Tag " + server.tags[i] + " already present. Updating it.");
          //supposing tag unique into collection
          db_tag[0].hostnames.push(server.hostname);
          database[config.tag_collection].update({tag: server.tags[i]}, {hostnames: _.uniq(db_tag[0].hostnames)});
        } else {
          log.info("Saving new TAG " + server.tags[i]);
          database[config.tag_collection].save({tag: server.tags[i], hostnames: [server.hostname]});
        }
      }
  }
}

function search(query, verbose) {
  return utils.search(query, verbose);
}

function update(server, verbose) {
  if (server.hostname && !utils.updateServer(server, verbose)) {
    log.error("Server %s is not present into DB", server.hostname);
  }

  if (server.tags && server.tags.length > 0) {
      for (var i = 0; i < server.tags.length; i++) {
        var db_tag = database[config.tag_collection].find({tag: server.tags[i]});
        if (db_tag && db_tag.length>0) {
          console.log("Tag %s found. Updating all servers linked to it: %s", db_tag[0].tag, db_tag[0].hostnames);
          for (var j = 0; j < db_tag[0].hostnames.length; j++) {
            server.hostname = db_tag[0].hostnames[j];
            if (server.hostname && !utils.updateServer(server, verbose)) {
              log.error("Error updating the server %s", db_tag[0].hostnames[j]);
            }
          }
        } else {
          log.error("Tag %s not found", db_tag);
        }
      }
  }
}

function removeHostFromTag(tag, hostname) {
  return tag.hostnames.filter(item => item !== hostname);
}

function removeTagFromHost(host, tagname) {
  return host.tags.filter(item => item !== tagname);
}

function remove(query, verbose) {
  if (query.hostname) {
    log.info("Removing %s server", query.hostname);
    var server = utils.search(query, verbose);
    log.info("Removing host from all related tags %s", server.tags);
    for (var i = 0; i<server.tags.length; i++) {
      var current_tag = database[config.tag_collection].find({tag: server.tags[i]});
      log.info(current_tag[0]);
      current_tag.hostnames = removeHostFromTag(current_tag[0], query.hostname);
      if (current_tag.hostnames && current_tag.hostnames > 0) {
        database[config.tag_collection].update({'tag': current_tag.tag}, current_tag);
      } else {
        console.log("Removing empty tag %s", server.tags[i]);
        database[config.tag_collection].remove(current_tag);
      }
    }
    database[config.server_collection].remove({'hostname': query.hostname}, true);
  } else if (query.tags && query.tags.length > 0) {
    log.info("Removing %s tag, without removing related servers", query.tags);
    for (var j = 0; j < query.tags.length; j++) {
      var tag = database[config.tag_collection].findOne({'tag': query.tags[j]});
      if (tag) {
        for (var k = 0; k < tag.hostnames.length; k++) {
          var db_host = database[config.server_collection].findOne({'hostname': tag.hostnames[k]});
          log.info(db_host);
          db_host.tags = removeTagFromHost(db_host, tag.tag);
          log.info(db_host);
          var updated = database[config.server_collection].update({'hostname': db_host.hostname}, db_host);
          log.info("Updated: %j", updated);
        }
        database[config.tag_collection].remove({"tag": query.tags[j]});
      }
    }
  } else {
    log.error("Missing hostname or tag to remove");
  }
}

module.exports.allowed_operations = allowed_operations;
module.exports.database = database;
module.exports.add = add;
module.exports.search = search;
module.exports.update = update;
module.exports.remove = remove;