disk.js 3.9 KB

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