Repository navigation
Expand file tree
/
Copy pathdrive.js
More file actions
113 lines (94 loc) · 2.65 KB
/
Copy pathdrive.js
File metadata and controls
113 lines (94 loc) · 2.65 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
/**
* author : Sunil Wang
* createTime : 2017/7/9 20:17
* description :
*/
var bucket = require('./bucket')
var exec = require('./exec')
var DISK_PATTERN = /^(\S+)\n?\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(.+?)\n/mg
function createDiskInfo (headlineArgs, args) {
var info = {}
headlineArgs.forEach(function (h, i) {
info[h] = args[i]
})
return info
}
function parseDfStdout (stdout) {
var dfInfo = []
var headline
stdout.replace(DISK_PATTERN, function () {
var args = Array.prototype.slice.call(arguments, 1, 7)
if (arguments[7] === 0) {
headline = args
return
}
dfInfo.push(createDiskInfo(headline, args))
})
return dfInfo
}
bucket.drive = {
info: function (diskName) {
if (!diskName) {
diskName = '/'
}
return exec('df -kP')().then(function (out) {
var diskInfo = null
var main = null
var lines = parseDfStdout(out)
for (var i = 0; i < lines.length; i++) {
if (lines[i]['Mounted on'] === diskName) {
diskInfo = lines[i]
continue
}
if (lines[i]['Mounted on'] === '/') {
main = lines[i]
continue
}
}
if (diskInfo === null) {
if (main === null) {
throw new Error('disk name invalid and / not found')
}
console.info('disk name invalid, using / as default')
diskInfo = main
}
var total = Math.ceil(((diskInfo['1K-blocks'] || diskInfo['1024-blocks']) * 1024) / Math.pow(1024, 2))
var used = Math.ceil(diskInfo.Used * 1024 / Math.pow(1024, 2))
var free = Math.ceil((diskInfo.Available || diskInfo.Avail) * 1024 / Math.pow(1024, 2))
var totalGb = (total / 1024).toFixed(1)
var usedGb = (used / 1024).toFixed(1)
var freeGb = (free / 1024).toFixed(1)
var usedPercentage = (100 * usedGb / totalGb).toFixed(1)
var freePercentage = (100 * freeGb / totalGb).toFixed(1)
return Promise.resolve({
totalGb: totalGb,
usedGb: usedGb,
freeGb: freeGb,
usedPercentage: usedPercentage,
freePercentage: freePercentage
})
})
},
free: function (diskName) {
var self = this
return self.info(diskName)
.then(function (res) {
return Promise.resolve({
totalGb: res.totalGb,
freeGb: res.freeGb,
freePercentage: res.freePercentage
})
})
},
used: function (diskName) {
var self = this
return self.info(diskName)
.then(function (res) {
return Promise.resolve({
totalGb: res.totalGb,
usedGb: res.freeGb,
usedPercentage: res.freePercentage
})
})
}
}