disk.js 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. 'use strict';
  2. const { CrudService } = require('naf-framework-mongoose-free/lib/service');
  3. const { BusinessError, ErrorCode } = require('naf-core').Error;
  4. const _ = require('lodash');
  5. const d = require('diskinfo');
  6. const fs = require('fs');
  7. const path = require('path');
  8. const moment = require('moment');
  9. const nodemailer = require('nodemailer');
  10. //
  11. class DiskService extends CrudService {
  12. constructor(ctx) {
  13. super(ctx, 'disk');
  14. }
  15. async diskInfo() {
  16. return new Promise(resolve => {
  17. d.getDrives(function(err, aDrives) {
  18. aDrives = aDrives.map(i => _.omit(i, [ 'filesystem' ]));
  19. resolve(aDrives);
  20. });
  21. });
  22. }
  23. async toDir({ route = [ '' ] } = {}) {
  24. const root = this.app.config.dirRoot;
  25. const p = path.resolve(root, ...route);
  26. const dir = fs.readdirSync(p);
  27. const arr = [];
  28. for (const file of dir) {
  29. const fp = path.resolve(p, file);
  30. const fi = fs.statSync(fp);
  31. const obj = { name: file };
  32. if (fi.isDirectory()) obj.type = 'dir';
  33. else if (fi.isFile()) obj.type = 'file';
  34. else obj.type = undefined;
  35. // 文件大小, kb
  36. obj.size = fi.size / 100;
  37. // 创建时间
  38. obj.create_time = moment(fi.ctime).format('YYYY-MM-DD HH:mm:ss');
  39. arr.push(obj);
  40. }
  41. return arr;
  42. }
  43. async delFile({ route, target, times }) {
  44. if (!_.isArray(route)) throw new BusinessError(ErrorCode.BADPARAM, '路径错误');
  45. const root = this.app.config.dirRoot;
  46. const p = path.resolve(root, ...route, target || '');
  47. if (fs.statSync(p).isFile()) {
  48. if (_.get(times, 'start_time') && _.get(times, 'end_time')) {
  49. const r = this.inRange(moment(fs.statSync(p).ctime).format('YYYY-MM-DD HH:mm:ss'), times);
  50. if (!r) return;
  51. }
  52. fs.unlinkSync(p);
  53. } else await this.dirDelete(p, times);
  54. }
  55. /**
  56. * 删除路径下的所有内容
  57. * @param {String} filePath 路径
  58. * @param {Object} times 里面有开始时间和结束时间: start_time;end_time
  59. */
  60. async dirDelete(filePath, times) {
  61. if (fs.existsSync(filePath)) {
  62. const files = fs.readdirSync(filePath);
  63. for (const file of files) {
  64. const curPath = path.resolve(filePath, file);
  65. const fi = fs.statSync(curPath);
  66. if (fi.isDirectory()) {
  67. // recurse
  68. this.dirDelete(curPath);
  69. } else {
  70. // delete file
  71. if (_.get(times, 'start_time') && _.get(times, 'end_time')) {
  72. const r = this.inRange(moment(fi.ctime).format('YYYY-MM-DD HH:mm:ss'), times);
  73. if (!r) continue;
  74. }
  75. fs.unlinkSync(curPath);
  76. }
  77. }
  78. if (!(_.get(times, 'start_time') && _.get(times, 'end_time'))) fs.rmdirSync(filePath);
  79. }
  80. }
  81. /**
  82. * 判断时间是否在范围内
  83. * @param {String} create_time 文件的时间范围
  84. * @param {Object} times 里面有开始时间和结束时间: start_time;end_time
  85. */
  86. inRange(create_time, times) {
  87. console.log(moment(create_time).isBetween(times.start_time, times.end_time, null, '[]'));
  88. return moment(create_time).isBetween(times.start_time, times.end_time, null, '[]');
  89. }
  90. async sendWarningEmail() {
  91. const { receiver, sender } = this.app.config;
  92. if (!receiver) return;
  93. if (!sender) return;
  94. const config = {
  95. host: 'smtp.163.com',
  96. port: 465,
  97. secure: true,
  98. auth: sender,
  99. };
  100. const mailOptions = {
  101. from: `"free服务器" <${sender.user}>`, // 邮件来源
  102. to: receiver, // 邮件发送到哪里,多个邮箱使用逗号隔开
  103. subject: 'free服务器提示', // 邮件主题
  104. text: '项目空间不足', // 存文本类型的邮件正文
  105. html: '<b>清理科企项目空间啦!!</b>', // html类型的邮件正文
  106. };
  107. const transporter = nodemailer.createTransport(config);
  108. transporter.sendMail(mailOptions, (error, info) => {
  109. if (error) console.log(error);
  110. else console.log(info);
  111. });
  112. }
  113. }
  114. module.exports = DiskService;