node-proc
Version:
Module to access Linux /proc information
207 lines (156 loc) • 4 kB
JavaScript
/**
* Node Proc Pseudo-Filesystem Reader
*
* @package Node-Proc
* @subpackage Index
*
* @author James Cunningham <tetrauk@gmail.com>
* @copyright Copyright 2013 James Cunningham.
*/
/* --- Dependencies ---
-------------------------------------------------- */
var FS = require( 'fs' );
/* --- Filesystem Access Functions ---
-------------------------------------------------- */
/**
* Read Proc File
*
* @param string filename Proc Filename (excluding /proc)
* @param function callback Callback( object err, string filedata )
* @return void
*/
function readProcFile( filename, callback )
{
FS.readFile( '/proc/'+filename, function( err, filedata )
{
if ( err ) return callback( err );
return callback( null, filedata.toString() );
});
}
// Export Function
exports.read = readProcFile;
/**
* Read KeyValue String
*
* @param string input Input String
* @param stirng sep Seperator (default ":")
*/
function readKeyValue( input, sep )
{
if ( !sep ) sep = ":";
input = input.trim().split( "\n" );
var r = {};
for( key in input )
{
line = input[ key ].trim().split( sep );
if ( line.length != 2 ) continue;
line[0] = line[0].trim();
line[1] = line[1].trim();
// Convert kB values to bytes
if ( line[1].slice( -3 ) == ' kB' || line[1].slice( -3 ) == ' KB' )
line[1] = parseInt( line[1].substr( 0, line[1].length -3 ) ) * 1024;
// Append To Response
r[ line[0] ] = line[1];
}
return r;
}
/* --- Memory Information ---
-------------------------------------------------- */
/**
* Memory Info
*
* @param function callback( object err, array meminfo )
* @return void
*/
exports.meminfo = function( callback )
{
readProcFile( 'meminfo', function( err, meminfo )
{
if ( err ) return callback( err );
meminfo = readKeyValue( meminfo );
return callback( null, meminfo );
});
};
/* --- CPU Information ---
-------------------------------------------------- */
/**
* CPU Info
*
* @param function callback( object err, array cpuinfo )
* @return void
*/
exports.cpuinfo = function( callback )
{
readProcFile( 'cpuinfo', function( err, cpuinfo )
{
if ( err ) return callback( err );
// Split Multiple Processors
var procs = cpuinfo.split("\n\n");
var r = [];
// Format Each Processor
for( p in procs )
{
if ( procs[p].length < 1 ) continue;
// Parse and append to response
r.push( readKeyValue( procs[p] ) );
}
return callback( null, r );
});
};
/* --- Network Functions ---
-------------------------------------------------- */
/**
* Network Devices Transfer
*
* @param function callback( object err, array netdev )
* @return void
*/
exports.netdev = function( callback )
{
readProcFile( 'net/dev', function( err, netdev )
{
if ( err ) return callback( err );
netdev = netdev.trim().split( "\n" );
// Remove Headers
netdev.shift(); netdev.shift();
var r = [];
for( dev in netdev )
{
// Split Line by whitespace
line = netdev[dev].trim().match( /\S+/g );
// Append To Response
r.push({
device: line[0].substr( 0, line[0].length - 1 ),
Rx: {
bytes: line[1],
packets: line[2]
},
Tx: {
bytes: line[9],
packets: line[10]
}
});
}
return callback( null, r );
});
};
/* --- System Time ---
-------------------------------------------------- */
/**
* Uptime
*
* @param function callback( object err, integer uptime, integer startTime )
* @return void
*/
exports.uptime = function( callback )
{
readProcFile( 'uptime', function( err, uptime )
{
if ( err ) return callback( err );
uptime = uptime.split( ' ' );
uptime = parseInt( uptime[0].split('.')[0] );
var startTime = Math.floor(new Date().getTime() / 1000) - uptime;
return callback( null, uptime, startTime );
});
};