msimerson/log-ship-elastic-postfix

View on GitHub
lib/spool.js

Summary

Maintainability
A
1 hr
Test Coverage
var fs        = require('fs');
var path      = require('path');

var logger    = require('./logger');

exports.isValidDir = function(dir, done) {

  if (!done) {
    if (this.isDirectory(dir) && this.isWritable(dir)) {
      return true;
    }
    if (!this.isDirectory(dir)) {
      var parentDir = path.dirname(dir);
      logger.info('parent dir: ' + parentDir);
      if (!this.isDirectory(parentDir)) {
        fs.mkdirSync(parentDir);
      }
      fs.mkdirSync(dir);
    }

    return false;
  }

  this.isDirectory(dir, function (err) {
    if (err) return done(err);
    this.isWritable(dir, function (err) {
      if (err) return done(err);
      done(err, true);
    });
  }.bind(this));
};

exports.isDirectory = function(dir, done) {
  if (!done) {
    try {
      var stat = fs.statSync(dir);
    }
    catch (ignore) {}
    if (!stat) return false;
    return stat.isDirectory();
  }

  fs.stat(dir, function (err, stats) {
    if (err) {
      if (err.code === 'ENOENT') {
        // TODO: make this recursive
        logger.info('mkdir: ' + dir);
        fs.mkdir(dir, function (err) {
          if (err) return done(err);
          done(err, true);
        });
      }
      return done(err);
    }
    return done(err, stats.isDirectory());
  });
};

exports.isWritable = function(dir, done) {
  if (!fs.access) { return this.isWritablePreV12(dir, done); }
  if (!done) {
    try {
      fs.accessSync(dir, fs.W_OK);
    }
    catch (e) {
      return false;
    }
    return true;
  }

  fs.access(dir, fs.W_OK, function (err) {
    if (err) {
      logger.error('ERROR: spool dir is not writable: ' + err.code);
      return done(err);
    }
    done(err, true);
  });
};

exports.isWritablePreV12 = function(dir, done) {
  var tmpFile = path.resolve(dir, '.tmp');
  if (!done) {
    try {
      fs.writeFileSync(tmpFile, 'write test');
      fs.unlinkSync(tmpFile);
    }
    catch (e) {
      return false;
    }
    return true;
  }

  fs.writeFile(tmpFile, 'write test', function (err) {
    if (err) {
      logger.error('ERROR: spool dir is not writable: ' + err.code);
      return done(err);
    }
    fs.unlink(tmpFile, function(err) {
      done(err, true);
    });
  });
};