From d00e0ef42cfe949d1f575e94ce74d2f284a8ea69 Mon Sep 17 00:00:00 2001 From: Sebastian Hildebrandt Date: Sun, 30 Dec 2018 11:30:44 +0100 Subject: [PATCH] added TypeScript type definitions --- .gitignore | 1 - CHANGELOG.md | 1 + README.md | 12 +- lib/cpu.js | 2 +- lib/graphics.js | 94 ++++++++- lib/index.d.ts | 503 ++++++++++++++++++++++++++++++++++++++++++++++++ lib/osinfo.js | 3 +- package.json | 1 + 8 files changed, 600 insertions(+), 17 deletions(-) create mode 100644 lib/index.d.ts diff --git a/.gitignore b/.gitignore index f6db185..d234c9b 100644 --- a/.gitignore +++ b/.gitignore @@ -63,7 +63,6 @@ package-lock.json test/ dist/ -index.d.ts tsconfig.json tslint.json typings.d.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index a704a79..8173750 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -100,6 +100,7 @@ Other changes | Version | Date | Comment | | -------------- | -------------- | -------- | +| 3.54.0 | 2018-12-30 | added TypeScript type definitions | | 3.53.1 | 2018-12-29 | `versions()` bug fix nginx version | | 3.53.0 | 2018-12-29 | `versions()` added perl, python, gcc | | 3.52.7 | 2018-12-29 | `versions()` bug fix macOS detection | diff --git a/README.md b/README.md index 9b2d888..7d50580 100644 --- a/README.md +++ b/README.md @@ -158,7 +158,7 @@ I also created a nice little command line tool called [mmon][mmon-github-url] ( | | socket | X | X | | X | | socket type e.g. "LGA1356" | | | vendor | X | X | X | X | | vendor ID | | | family | X | X | X | X | | processor family | -| | Model | X | X | X | X | | processor model | +| | model | X | X | X | X | | processor model | | | stepping | X | X | X | X | | processor stepping | | | revision | X | | X | X | | revision | | | voltage | | X | | | | voltage | @@ -245,11 +245,11 @@ I also created a nice little command line tool called [mmon][mmon-github-url] ( | | ...[0].main | X | | X | | | true if main monitor | | | ...[0].builtin | X | | X | | | true if built in monitor | | | ...[0].connection | X | | X | | | e.g. DisplayPort or HDMI | -| | ...[0].resolutionx | X | | X | X | | pixel horizontal | -| | ...[0].resolutiony | X | | X | X | | pixel vertical | -| | ...[0].pixeldepth | X | | X | X | | color depth in bits | | | ...[0].sizex | X | | X | | | size in mm horizontal | | | ...[0].sizey | X | | X | | | size in mm vertical | +| | ...[0].pixeldepth | X | | X | X | | color depth in bits | +| | ...[0].resolutionx | X | | X | X | | pixel horizontal | +| | ...[0].resolutiony | X | | X | X | | pixel vertical | #### 4. Operating System @@ -263,10 +263,10 @@ I also created a nice little command line tool called [mmon][mmon-github-url] ( | | kernel | X | X | X | X | X | kernel release - same as os.release() | | | arch | X | X | X | X | X | same as os.arch() | | | hostname | X | X | X | X | X | same as os.hostname() | +| | codepage | X | X | X | X | | OS build version | | | logofile | X | X | X | X | X | e.g. 'apple', 'debian', 'fedora', ... | | | serial | | X | X | X | | OS/Host serial number | | | build | | | X | X | | OS build version | -| | codepage | X | X | X | X | | OS build version | | si.uuid(cb) | {...} | X | X | X | X | X | object of several UUIDs | | | os | X | X | X | X | | os specific UUID | | si.versions(cb) | {...} | X | X | X | X | X | version information (kernel, ssl, node, ...) | @@ -394,12 +394,14 @@ I also created a nice little command line tool called [mmon][mmon-github-url] ( | si.processLoad('apache2',cb) | {...} | X | X | X | X | | detailed information about given process | | | proc | X | X | X | X | | process name | | | pid | X | X | X | X | | PID | +| | pids | X | X | X | X | | additional pids | | | cpu | X | X | X | X | | process % CPU | | | mem | X | X | X | X | | process % MEM | | si.services('mysql, apache2', cb) | [{...}] | X | X | X | X | | pass comma separated string of services
pass "*" for ALL services (linux/win only) | | | [0].name | X | X | X | X | | name of service | | | [0].running | X | X | X | X | | true / false | | | [0].startmode | | | | X | | manual, automatic, ... | +| | [0].pids | X | X | X | | | pids | | | [0].pcpu | X | X | X | | | process % CPU | | | [0].pmem | X | X | X | | | process % MEM | diff --git a/lib/cpu.js b/lib/cpu.js index 38ac9ad..3c9f656 100644 --- a/lib/cpu.js +++ b/lib/cpu.js @@ -829,7 +829,7 @@ function cpuFlags(callback) { exports.cpuFlags = cpuFlags; // -------------------------- -// CPU Flags +// CPU Cache function cpuCache(callback) { diff --git a/lib/graphics.js b/lib/graphics.js index 101c478..729a063 100644 --- a/lib/graphics.js +++ b/lib/graphics.js @@ -45,8 +45,24 @@ function graphics(callback) { let lastlevel = -1; let controllers = []; let displays = []; - let currentController = {}; - let currentDisplay = {}; + let currentController = { + vendor: '', + model: '', + bus: '', + vram: -1, + vramDynamic: false + }; + let currentDisplay = { + model: '', + main: false, + builtin: false, + connection: '', + sizex: -1, + sizey: -1, + pixeldepth: -1, + resolutionx: -1, + resolutiony: -1 + }; for (let i = 0; i < lines.length; i++) { if ('' !== lines[i].trim()) { let start = lines[i].search(/\S|$/); @@ -57,11 +73,27 @@ function graphics(callback) { if (level < lastlevel) { if (Object.keys(currentController).length > 0) {// just changed to Displays controllers.push(currentController); - currentController = {}; + currentController = { + vendor: '', + model: '', + bus: '', + vram: -1, + vramDynamic: false + }; } if (Object.keys(currentDisplay).length > 0) {// just changed to Displays displays.push(currentDisplay); - currentDisplay = {}; + currentDisplay = { + model: '', + main: false, + builtin: false, + connection: '', + sizex: -1, + sizey: -1, + pixeldepth: -1, + resolutionx: -1, + resolutiony: -1 + }; } } lastlevel = level; @@ -87,6 +119,7 @@ function graphics(callback) { currentDisplay.connection = ''; currentDisplay.sizex = -1; currentDisplay.sizey = -1; + currentDisplay.pixeldepth = -1; } } if (4 === level) { // display controller details level @@ -96,6 +129,7 @@ function graphics(callback) { currentDisplay.resolutiony = (resolution.length > 1 ? parseInt(resolution[1]) : 0); } if (parts.length > 1 && parts[0].replace(/ +/g, '').toLowerCase().indexOf('pixeldepth') !== -1) currentDisplay.pixeldepth = parseInt(parts[1]); // in BIT + if (parts.length > 1 && parts[0].replace(/ +/g, '').toLowerCase().indexOf('framebufferdepth') !== -1) currentDisplay.pixeldepth = parseInt(parts[1]); // in BIT if (parts.length > 1 && parts[0].replace(/ +/g, '').toLowerCase().indexOf('maindisplay') !== -1 && parts[1].replace(/ +/g, '').toLowerCase() === 'yes') currentDisplay.main = true; if (parts.length > 1 && parts[0].replace(/ +/g, '').toLowerCase().indexOf('built-in') !== -1 && parts[1].replace(/ +/g, '').toLowerCase() === 'yes') { currentDisplay.builtin = true; @@ -122,7 +156,13 @@ function graphics(callback) { function parseLinesLinuxControllers(lines) { let controllers = []; - let currentController = {}; + let currentController = { + vendor: '', + model: '', + bus: '', + vram: -1, + vramDynamic: false + }; let isGraphicsController = false; // PCI bus IDs let pciIDs = []; @@ -149,7 +189,13 @@ function graphics(callback) { } if (Object.keys(currentController).length > 0) {// already a controller found controllers.push(currentController); - currentController = {}; + currentController = { + vendor: '', + model: '', + bus: '', + vram: -1, + vramDynamic: false + }; } isGraphicsController = true; let endpos = lines[i].search(/\[[0-9a-f]{4}:[0-9a-f]{4}]|$/); @@ -215,7 +261,17 @@ function graphics(callback) { // --> pixeldepth (?) // --> sizex // --> sizey - let result = {}; + let result = { + model: '', + main: false, + builtin: false, + connection: '', + sizex: -1, + sizey: -1, + pixeldepth: -1, + resolutionx: -1, + resolutiony: -1 + }; // find first "Detailed Timing Description" let start = 108; if (edid.substr(start, 6) === '000000') { @@ -252,7 +308,17 @@ function graphics(callback) { function parseLinesLinuxDisplays(lines, depth) { let displays = []; - let currentDisplay = {}; + let currentDisplay = { + model: '', + main: false, + builtin: false, + connection: '', + sizex: -1, + sizey: -1, + pixeldepth: -1, + resolutionx: -1, + resolutiony: -1 + }; let is_edid = false; let edid_raw = ''; let start = 0; @@ -261,7 +327,17 @@ function graphics(callback) { if (' ' !== lines[i][0] && '\t' !== lines[i][0] && lines[i].toLowerCase().indexOf(' connected ') !== -1) { // first line of new entry if (Object.keys(currentDisplay).length > 0) { // push last display to array displays.push(currentDisplay); - currentDisplay = {}; + currentDisplay = { + model: '', + main: false, + builtin: false, + connection: '', + sizex: -1, + sizey: -1, + pixeldepth: -1, + resolutionx: -1, + resolutiony: -1 + }; } let parts = lines[i].split(' '); currentDisplay.connection = parts[0]; diff --git a/lib/index.d.ts b/lib/index.d.ts new file mode 100644 index 0000000..359fc85 --- /dev/null +++ b/lib/index.d.ts @@ -0,0 +1,503 @@ +// Type definitions for systeminformation +// Project: https://github.com/sebhildebrandt/systeminformation +// Definitions by: sebhildebrandt + +export namespace Systeminformation { + + // 1. General + + interface TimeData { + current: string; + uptime: string; + timezone: string; + timezoneName: string; + } + + // 2. System (HW) + + interface SystemData { + manufacturer: string; + model: string; + version: string; + serial: string; + uuid: string; + sku: string; + } + + interface BiosData { + vendor: string; + version: string; + releaseDate: string; + revision: string; + } + + interface BaseboardData { + manufacturer: string; + model: string; + version: string; + serial: string; + assetTag: string; + } + + // 3. CPU, Memory, Disks, Battery, Graphics + + interface CpuData { + manufacturer: string; + brand: string; + vendor: string; + family: string; + model: string; + stepping: string; + revision: string; + voltage: string; + speed: string; + speedmin: string; + speedmax: string; + cores: number; + physicalCores: number; + processors: number; + socket: string; + cache: CpuCacheData; + } + + interface CpuWithFlagsData extends CpuData { + flags: string; + } + + interface CpuCacheData { + l1d: number; + l1i: number; + l2: number; + l3: number; + } + + interface CpuCurrentSpeedData { + min: string; + max: string; + avg: string; + cores: number[]; + } + + interface CpuTemperatureData { + main: string; + cores: string; + max: string; + } + + interface MemData { + total: number; + free: number; + used: number; + active: number; + available: number; + buffcache: number; + swaptotal: number; + swapused: number; + swapfree: number; + } + + interface MemLayoutData { + size: number; + bank: string; + type: string; + clockSpeed: number; + formFactor: string; + partNum: string; + serialNum: string; + voltageConfigured: number; + voltageMin: number; + voltageMax: number; + } + + interface DiskLayoutData { + type: string; + name: string; + vendor: string; + size: number; + bytesPerSector: number; + totalCylinders: number; + totalHeads: number; + totalSectors: number; + totalTracks: number; + tracksPerCylinder: number; + sectorsPerTrack: number; + firmwareRevision: string; + serialNum: string; + interfaceType: string; + smartStatus: string; + } + + interface BatteryData { + hasbattery: boolean; + cyclecount: number; + ischarging: boolean; + maxcapacity: number; + currentcapacity: number; + percent: number; + timeremaining: number, + acconnected: boolean; + type: string; + model: string; + manufacturer: string; + serial: string; + } + + interface GraphicsData { + controllers: GraphicsControllerData[]; + displays: GraphicsDisplayData[]; + } + + interface GraphicsControllerData { + vendor: string; + model: string; + bus: string; + vram: number; + vramDynamic: boolean; + } + + interface GraphicsDisplayData { + model: string; + main: boolean; + builtin: boolean; + connection: string; + sizex: number; + sizey: number; + pixeldepth: number; + resolutionx: number; + resolutiony: number; + } + + // 4. Operating System + + interface OsData { + platform: string; + distro: string; + release: string; + codename: string; + kernel: string; + arch: string; + hostname: string; + codepage: string; + logofile: string; + serial: string; + build: string; + } + + interface UuidData { + os: string; + } + + interface VersionData { + kernel: string; + openssl: string; + systemOpenssl: string; + systemOpensslLib: string; + node: string; + v8: string; + npm: string; + yarn: string; + pm2: string; + gulp: string; + grunt: string; + git: string; + tsc: string; + mysql: string; + redis: string; + mongodb: string; + nginx: string; + php: string; + docker: string; + postfix: string; + postgresql: string; + perl: string; + python: string; + gcc: string; + } + + interface UserData { + user: string; + tty: string; + date: string; + time: string; + ip: string; + command: string; + } + + // 5. File System + + interface FsSizeData { + fs: string; + type: string; + size: number; + used: number; + use: number; + mount: string; + } + + interface BlockDevicesData { + name: string; + identifier: string; + type: string; + fstype: string; + mount: string; + size: number; + physical: string; + uuid: string; + label: string; + model: string; + serial: string; + removable: boolean; + protocol: string; + } + + interface FsStatsData { + rx: number; + wx: number; + tx: number; + rx_sec: number; + wx_sec: number; + tx_sec: number; + ms: number; + } + + interface DisksIoData { + rIO: number; + wIO: number; + tIO: number; + rIO_sec: number; + wIO_sec: number; + tIO_sec: number; + ms: number; + } + + // 6. Network related functions + + interface NetworkInterfacesData { + iface: string; + ip4: string; + ip6: string; + mac: string; + internal: boolean; + } + + interface NetworkStatsData { + iface: string; + operstate: string; + rx: number; + tx: number; + rx_sec: number; + tx_sec: number; + ms: number; + } + + interface NetworkConnectionsData { + protocol: string; + localaddress: string; + localport: string; + peeraddress: string; + peerport: string; + state: string; + } + + interface InetChecksiteData { + url: string; + ok: boolean; + status: number; + ms: number; + } + + // 7. Current Load, Processes & Services + + interface CurrentLoadData { + avgload: number; + currentload: number; + currentload_user: number; + currentload_system: number; + currentload_nice: number; + currentload_idle: number; + currentload_irq: number; + raw_currentload: number; + raw_currentload_user: number; + raw_currentload_system: number; + raw_currentload_nice: number; + raw_currentload_idle: number; + raw_currentload_irq: number; + cpus: CurrentLoadCpuData[]; + } + + interface CurrentLoadCpuData { + load: number; + load_user: number; + load_system: number; + load_nice: number; + load_idle: number; + load_irq: number; + raw_load: number; + raw_load_user: number; + raw_load_system: number; + raw_load_nice: number; + raw_load_idle: number; + raw_load_irq: number; + } + + interface ProcessesData { + all: number; + running: number; + blocked: number; + sleeping: number; + unknown: number; + list: ProcessesProcessData[]; + } + + interface ProcessesProcessData { + pid: number; + parentPid: number; + name: string, + pcpu: number; + pcpuu: number; + pcpus: number; + pmem: number; + priority: number; + mem_vsz: number; + mem_rss: number; + nice: number; + started: string, + state: number; + tty: number; + user: number; + command: number; + } + + interface ProcessesProcessLoadData { + proc: string; + pid: number; + pids: number[]; + cpu: number; + mem: number; + } + + interface ServicesData { + name: string; + running: boolean; + startmode: string; + pids: number[]; + pcpu: number; + pmem: number; + } + + // 8. Docker + + interface DockerContainerData { + id: string; + name: string; + image: string; + imageID: string; + command: string; + created: number; + state: string; + ports: number[]; + mounts: DockerContainerMountData[]; + } + + interface DockerContainerMountData { + Type: string; + Source: string; + Destination: string; + Mode: string; + RW: boolean; + Propagation: string; + } + + interface DockerContainerStatsData { + id: string; + mem_usage: number; + mem_limit: number; + mem_percent: number; + cpu_percent: number; + netIO: { + rx: number; + wx: number; + }; + blockIO: { + r: number; + w: number; + }; + cpu_stats: any; + precpu_stats: any; + memory_stats: any, + networks: any; + } + + // 9. "Get All at once" - functions + + interface StaticData { + version: string; + system: SystemData; + bios: BiosData; + baseboard: BaseboardData; + os: OsData; + uuid: UuidData; + versions: VersionData; + cpu: CpuWithFlagsData; + graphics: GraphicsData; + net: NetworkInterfacesData[]; + memLayout: MemLayoutData[]; + diskLayout: DiskLayoutData[]; + } + +} + +export function version(): string; +export function system(cb?: (data: Systeminformation.SystemData) => any): Promise; +export function bios(cb?: (data: Systeminformation.BiosData) => any): Promise; +export function baseboard(cb?: (data: Systeminformation.BaseboardData) => any): Promise; + +export function time(): Systeminformation.TimeData; +export function osInfo(cb?: (data: Systeminformation.OsData) => any): Promise; +export function versions(cb?: (data: Systeminformation.VersionData) => any): Promise; +export function shell(cb?: (data: string) => any): Promise; +export function uuid(cb?: (data: Systeminformation.UuidData) => any): Promise; + +export function cpu(cb?: (data: Systeminformation.CpuData) => any): Promise; +export function cpuFlags(cb?: (data: string) => any): Promise; +export function cpuCache(cb?: (data: Systeminformation.CpuCacheData) => any): Promise; +export function cpuCurrentspeed(cb?: (data: Systeminformation.CpuCurrentSpeedData) => any): Promise; +export function cpuTemperature(cb?: (data: Systeminformation.CpuTemperatureData) => any): Promise; +export function currentLoad(cb?: (data: Systeminformation.CurrentLoadData) => any): Promise; +export function fullLoad(cb?: (data: number) => any): Promise; + +export function mem(cb?: (data: Systeminformation.MemData) => any): Promise; +export function memLayout(cb?: (data: Systeminformation.MemLayoutData) => any): Promise; + +export function battery(cb?: (data: Systeminformation.BatteryData) => any): Promise; +export function graphics(cb?: (data: Systeminformation.GraphicsData) => any): Promise; + +export function fsSize(cb?: (data: Systeminformation.FsSizeData[]) => any): Promise; +export function blockDevices(cb?: (data: Systeminformation.BlockDevicesData[]) => any): Promise; +export function fsStats(cb?: (data: Systeminformation.FsStatsData) => any): Promise; +export function disksIO(cb?: (data: Systeminformation.DisksIoData) => any): Promise; +export function diskLayout(cb?: (data: Systeminformation.DiskLayoutData) => any): Promise; + +export function networkInterfaceDefault(cb?: (data: string) => any): Promise; +export function networkInterfaces(cb?: (data: Systeminformation.NetworkInterfacesData[]) => any): Promise; + +export function networkStats(iface?: string, cb?: (data: Systeminformation.NetworkStatsData) => any): Promise; +export function networkConnections(cb?: (data: Systeminformation.NetworkConnectionsData[]) => any): Promise; +export function inetChecksite(url: string, cb?: (data: Systeminformation.InetChecksiteData) => any): Promise; +export function inetLatency(host?: string, cb?: (data: number) => any): Promise; + +export function users(cb?: (data: Systeminformation.UserData[]) => any): Promise; + +export function processes(cb?: (data: Systeminformation.ProcessesData) => any): Promise; +export function processLoad(processName: string, cb?: (data: Systeminformation.ProcessesProcessLoadData) => any): Promise; +export function services(serviceName: string, cb?: (data: Systeminformation.ServicesData[]) => any): Promise; + + +export function dockerContainers(all?: boolean, cb?: (data: Systeminformation.DockerContainerData[]) => any): Promise; +export function dockerContainerStats(id?: string, cb?: (data: Systeminformation.DockerContainerStatsData[]) => any): Promise; +export function dockerContainerProcesses(id?: string, cb?: (data: any) => any): Promise; +export function dockerAll(cb?: (data: any) => any): Promise; + +export function getStaticData(cb?: (data: Systeminformation.StaticData) => any): Promise; +export function getDynamicData(srv?: string, iface?: string, cb?: (data: any) => any): Promise; +export function getAllData(srv?: string, iface?: string, cb?: (data: any) => any): Promise; diff --git a/lib/osinfo.js b/lib/osinfo.js index 9755961..3501c20 100644 --- a/lib/osinfo.js +++ b/lib/osinfo.js @@ -371,9 +371,10 @@ function versions(callback) { }); if (_darwin) { const cmdLineToolsExists = fs.existsSync('/Library/Developer/CommandLineTools/'); + const xcodeAppExists = fs.existsSync('/Applications/Xcode.app/Contents/Developer/Tools'); const xcodeExists = fs.existsSync('/Library/Developer/Xcode/'); const gitHomebrewExists = fs.existsSync('/usr/local/Cellar/git'); - if (cmdLineToolsExists || xcodeExists || gitHomebrewExists) { + if (cmdLineToolsExists || xcodeExists || gitHomebrewExists || xcodeAppExists) { exec('git --version', function (error, stdout) { if (!error) { let git = stdout.toString().split('\n')[0] || ''; diff --git a/package.json b/package.json index b3bd84b..e455f20 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "author": "Sebastian Hildebrandt (https://plus-innovations.com)", "homepage": "https://github.com/sebhildebrandt/systeminformation", "main": "./lib/index.js", + "types": "./lib/index.d.ts", "scripts": { "clean": "rimraf dist", "test-bare": "npm run compile && mocha ./test/**/*.test.js",