93 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
var platform = require('os').platform();
 | 
						|
var spawnSync = require('child_process').spawnSync;
 | 
						|
var readdirSync = require('fs').readdirSync;
 | 
						|
 | 
						|
var GLIBC = 'glibc';
 | 
						|
var MUSL = 'musl';
 | 
						|
 | 
						|
var spawnOptions = {
 | 
						|
  encoding: 'utf8',
 | 
						|
  env: process.env
 | 
						|
};
 | 
						|
 | 
						|
if (!spawnSync) {
 | 
						|
  spawnSync = function () {
 | 
						|
    return { status: 126, stdout: '', stderr: '' };
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
function contains (needle) {
 | 
						|
  return function (haystack) {
 | 
						|
    return haystack.indexOf(needle) !== -1;
 | 
						|
  };
 | 
						|
}
 | 
						|
 | 
						|
function versionFromMuslLdd (out) {
 | 
						|
  return out.split(/[\r\n]+/)[1].trim().split(/\s/)[1];
 | 
						|
}
 | 
						|
 | 
						|
function safeReaddirSync (path) {
 | 
						|
  try {
 | 
						|
    return readdirSync(path);
 | 
						|
  } catch (e) {}
 | 
						|
  return [];
 | 
						|
}
 | 
						|
 | 
						|
var family = '';
 | 
						|
var version = '';
 | 
						|
var method = '';
 | 
						|
 | 
						|
if (platform === 'linux') {
 | 
						|
  // Try getconf
 | 
						|
  var glibc = spawnSync('getconf', ['GNU_LIBC_VERSION'], spawnOptions);
 | 
						|
  if (glibc.status === 0) {
 | 
						|
    family = GLIBC;
 | 
						|
    version = glibc.stdout.trim().split(' ')[1];
 | 
						|
    method = 'getconf';
 | 
						|
  } else {
 | 
						|
    // Try ldd
 | 
						|
    var ldd = spawnSync('ldd', ['--version'], spawnOptions);
 | 
						|
    if (ldd.status === 0 && ldd.stdout.indexOf(MUSL) !== -1) {
 | 
						|
      family = MUSL;
 | 
						|
      version = versionFromMuslLdd(ldd.stdout);
 | 
						|
      method = 'ldd';
 | 
						|
    } else if (ldd.status === 1 && ldd.stderr.indexOf(MUSL) !== -1) {
 | 
						|
      family = MUSL;
 | 
						|
      version = versionFromMuslLdd(ldd.stderr);
 | 
						|
      method = 'ldd';
 | 
						|
    } else {
 | 
						|
      // Try filesystem (family only)
 | 
						|
      var lib = safeReaddirSync('/lib');
 | 
						|
      if (lib.some(contains('-linux-gnu'))) {
 | 
						|
        family = GLIBC;
 | 
						|
        method = 'filesystem';
 | 
						|
      } else if (lib.some(contains('libc.musl-'))) {
 | 
						|
        family = MUSL;
 | 
						|
        method = 'filesystem';
 | 
						|
      } else if (lib.some(contains('ld-musl-'))) {
 | 
						|
        family = MUSL;
 | 
						|
        method = 'filesystem';
 | 
						|
      } else {
 | 
						|
        var usrSbin = safeReaddirSync('/usr/sbin');
 | 
						|
        if (usrSbin.some(contains('glibc'))) {
 | 
						|
          family = GLIBC;
 | 
						|
          method = 'filesystem';
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
var isNonGlibcLinux = (family !== '' && family !== GLIBC);
 | 
						|
 | 
						|
module.exports = {
 | 
						|
  GLIBC: GLIBC,
 | 
						|
  MUSL: MUSL,
 | 
						|
  family: family,
 | 
						|
  version: version,
 | 
						|
  method: method,
 | 
						|
  isNonGlibcLinux: isNonGlibcLinux
 | 
						|
};
 |