index.js 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. var os = require('os');
  2. var lib = {};
  3. function parallel(tasks, done) {
  4. var results = [];
  5. var errs = [];
  6. var length = 0;
  7. var doneLength = 0;
  8. function doneIt(ix, err, result) {
  9. if (err) {
  10. errs[ix] = err;
  11. } else {
  12. results[ix] = result;
  13. }
  14. doneLength += 1;
  15. if (doneLength >= length) {
  16. done(errs.length > 0 ? errs : errs, results);
  17. }
  18. }
  19. Object.keys(tasks).forEach(function (key) {
  20. length += 1;
  21. var task = tasks[key];
  22. (global.setImmediate || global.setTimeout)(function () {
  23. task(doneIt.bind(null, key), 1);
  24. });
  25. });
  26. }
  27. lib.networkInterfaces = function () {
  28. var ifaces = os.networkInterfaces();
  29. var allAddresses = {};
  30. Object.keys(ifaces).forEach(function (iface) {
  31. addresses = {};
  32. var hasAddresses = false;
  33. ifaces[iface].forEach(function (address) {
  34. if (!address.internal) {
  35. addresses[(address.family || "").toLowerCase()] = address.address;
  36. hasAddresses = true;
  37. if (address.mac) {
  38. addresses.mac = address.mac;
  39. }
  40. }
  41. });
  42. if (hasAddresses) {
  43. allAddresses[iface] = addresses;
  44. }
  45. });
  46. return allAddresses;
  47. };
  48. var _getMacAddress;
  49. switch (os.platform()) {
  50. case 'win32':
  51. _getMacAddress = require('./lib/windows.js');
  52. break;
  53. case 'linux':
  54. _getMacAddress = require('./lib/linux.js');
  55. break;
  56. case 'darwin':
  57. case 'sunos':
  58. _getMacAddress = require('./lib/unix.js');
  59. break;
  60. default:
  61. console.warn("node-macaddress: Unkown os.platform(), defaulting to `unix'.");
  62. _getMacAddress = require('./lib/unix.js');
  63. break;
  64. }
  65. lib.one = function (iface, callback) {
  66. if (typeof iface === 'function') {
  67. callback = iface;
  68. var ifaces = lib.networkInterfaces();
  69. var alleged = [ 'eth0', 'eth1', 'en0', 'en1' ];
  70. iface = Object.keys(ifaces)[0];
  71. for (var i = 0; i < alleged.length; i++) {
  72. if (ifaces[alleged[i]]) {
  73. iface = alleged[i];
  74. break;
  75. }
  76. }
  77. if (!ifaces[iface]) {
  78. if (typeof callback === 'function') {
  79. callback("no interfaces found", null);
  80. }
  81. return null;
  82. }
  83. if (ifaces[iface].mac) {
  84. if (typeof callback === 'function') {
  85. callback(null, ifaces[iface].mac);
  86. }
  87. return ifaces[iface].mac;
  88. }
  89. }
  90. if (typeof callback === 'function') {
  91. _getMacAddress(iface, callback);
  92. }
  93. return null;
  94. };
  95. lib.all = function (callback) {
  96. var ifaces = lib.networkInterfaces();
  97. var resolve = {};
  98. Object.keys(ifaces).forEach(function (iface) {
  99. if (!ifaces[iface].mac) {
  100. resolve[iface] = _getMacAddress.bind(null, iface);
  101. }
  102. });
  103. if (Object.keys(resolve).length === 0) {
  104. if (typeof callback === 'function') {
  105. callback(null, ifaces);
  106. }
  107. return ifaces;
  108. }
  109. parallel(resolve, function (err, result) {
  110. Object.keys(result).forEach(function (iface) {
  111. ifaces[iface].mac = result[iface];
  112. });
  113. if (typeof callback === 'function') {
  114. callback(null, ifaces);
  115. }
  116. });
  117. return null;
  118. };
  119. module.exports = lib;