files.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. /* eslint-disable prefer-promise-reject-errors */
  2. // eslint-disable-next-line strict
  3. const Service = require('egg').Service;
  4. const fs = require('fs');
  5. const path = require('path');
  6. const exec = require('child_process').exec;
  7. class FileService extends Service {
  8. // 上传证书
  9. async upload({ uuid, stream, uri }) {
  10. return new Promise((resolve, reject) => {
  11. const name = `${uuid}.cer`;
  12. const target = path.join(`${uri}${name}`);
  13. const remoteFileStream = fs.createWriteStream(target);
  14. stream.pipe(remoteFileStream);
  15. let errFlag;
  16. remoteFileStream.on('error', err => {
  17. errFlag = true;
  18. remoteFileStream.destroy();
  19. reject(err);
  20. });
  21. remoteFileStream.on('finish', async () => {
  22. if (errFlag) return;
  23. resolve({ errcode: 0, errmsg: '' });
  24. });
  25. });
  26. }
  27. // 证书下载
  28. async download({ filePath }) {
  29. const target = path.join(filePath);
  30. this.ctx.attachment(target);
  31. this.ctx.set('Content-Type', 'application/octet-stream');
  32. const msg = fs.createReadStream(target);
  33. return msg;
  34. }
  35. // 解析ca证书
  36. async read({ filePath }) {
  37. return new Promise((resolve, reject) => {
  38. exec(`openssl x509 -in ${filePath} -noout -text -certopt no_header,no_version,no_extensions,no_sigdump,no_serial`, function(error, stdout) {
  39. if (error) {
  40. reject(error);
  41. }
  42. resolve({ errcode: 0, errmsg: '', data: stdout });
  43. });
  44. });
  45. }
  46. // 创建key
  47. async applykey({ pwatype, uuid }) {
  48. return new Promise((resolve, reject) => {
  49. const keyname = `${this.app.config.filePath.key}${uuid}.key`;
  50. // 创建密钥对
  51. exec(`pki --gen --type ${pwatype} ${pwatype === 'rsa' ? '--size 2048' : ''} --outform pem`, function(error, stdout) {
  52. if (error) {
  53. reject(error);
  54. }
  55. fs.writeFile(keyname, stdout, {}, function(err) {
  56. if (err) {
  57. reject(err);
  58. }
  59. resolve({ errmsg: '', errcode: 0 });
  60. });
  61. });
  62. });
  63. }
  64. async applyreq({ dn, uuid }) {
  65. return new Promise((resolve, reject) => {
  66. const keyname = `${this.app.config.filePath.key}${uuid}.key`;
  67. const reqname = `${this.app.config.filePath.req}${uuid}.pem`;
  68. // 创建申请书
  69. exec(`pki --req --type priv --in ${keyname} \ --dn ${dn} \ --outform pem`, function(error, stdout) {
  70. if (error) {
  71. reject(error);
  72. }
  73. fs.writeFile(reqname, stdout, {}, function(err) {
  74. if (err) {
  75. fs.unlink(keyname, function(err) {
  76. if (err) {
  77. reject(err);
  78. }
  79. });
  80. reject(err);
  81. }
  82. resolve({ errmsg: '', errcode: 0 });
  83. });
  84. });
  85. });
  86. }
  87. // 文件写入
  88. async write({ filePath, str }) {
  89. return new Promise((resolve, reject) => {
  90. fs.writeFile(path.resolve(filePath), str, {}, function(err) {
  91. if (err) {
  92. reject(err);
  93. }
  94. resolve({ errmsg: '', errcode: 0 });
  95. });
  96. });
  97. }
  98. async filewrite({ filePath, stream }) {
  99. return new Promise((resolve, reject) => {
  100. const target = path.join(filePath);
  101. const remoteFileStream = fs.createWriteStream(target);
  102. stream.pipe(remoteFileStream);
  103. let errFlag;
  104. remoteFileStream.on('error', err => {
  105. errFlag = true;
  106. remoteFileStream.destroy();
  107. reject(err);
  108. });
  109. remoteFileStream.on('finish', async () => {
  110. if (errFlag) return;
  111. resolve({ errcode: 0, errmsg: '' });
  112. });
  113. });
  114. }
  115. // 解析key
  116. async keys({ target, password }) {
  117. return new Promise((resolve, reject) => {
  118. exec(`openssl pkcs12 -info -in ${target} -nodes -nocerts -password pass:${password}`, function(error, stdout) {
  119. if (error) {
  120. reject(error);
  121. }
  122. const srart = stdout.indexOf('-----BEGIN PRIVATE KEY-----');
  123. const data = stdout.slice(srart, stdout.length);
  124. resolve({ errcode: 0, errmsg: '', data });
  125. });
  126. });
  127. }
  128. // key格式转换
  129. async transform({ files, target }) {
  130. return new Promise((resolve, reject) => {
  131. exec(`openssl pkcs8 -in ${this.app.config.filePath.key}${files} -traditional -out ${this.app.config.filePath.key}${target} -nocrypt`, function(error, stdout) {
  132. if (error) {
  133. reject(error);
  134. }
  135. console.log(stdout);
  136. resolve({ errcode: 0, errmsg: '', data: stdout });
  137. });
  138. });
  139. }
  140. // 解析证书
  141. async certs({ target, password }) {
  142. return new Promise((resolve, reject) => {
  143. exec(`openssl pkcs12 -info -in ${target} -password pass:${password} -nokeys -clcerts`, function(error, stdout) {
  144. if (error) {
  145. reject(error);
  146. }
  147. const srart = stdout.indexOf('-----BEGIN CERTIFICATE-----');
  148. const data = stdout.slice(srart, stdout.length);
  149. resolve({ errcode: 0, errmsg: '', data });
  150. });
  151. });
  152. }
  153. // 权限验证
  154. async login() {
  155. const { userName } = this.ctx.state.user;
  156. if (userName !== 'admin') {
  157. return { errcode: 403, errmsg: '没有权限' };
  158. }
  159. return { errcode: 0, errmsg: '' };
  160. }
  161. // 开机运行dhcp
  162. async dhcp({ type }) {
  163. return new Promise((resolve, reject) => {
  164. exec(`systemctl ${type} isc-dhcp-server.service`, function(error) {
  165. if (error) {
  166. reject(error);
  167. }
  168. resolve({ errcode: 0, errmsg: '' });
  169. });
  170. });
  171. }
  172. // 开机运行openvpn enable 开机运行 disable 开机不运行 restart 重新启动服务
  173. async openvpn({ type }) {
  174. return new Promise((resolve, reject) => {
  175. exec(`systemctl ${type} openvpn.service`, function(error) {
  176. if (error) {
  177. reject(error);
  178. }
  179. resolve({ errcode: 0, errmsg: '' });
  180. });
  181. });
  182. }
  183. // ipseca
  184. async ipsecas({ type }) {
  185. return new Promise((resolve, reject) => {
  186. exec(`systemctl ${type} strongswan-swanctl`, function(error) {
  187. if (error) {
  188. reject(error);
  189. }
  190. resolve({ errcode: 0, errmsg: '' });
  191. });
  192. });
  193. }
  194. // 重启服务器
  195. async reboot() {
  196. return new Promise((resolve, reject) => {
  197. exec('reboot', function(error) {
  198. if (error) {
  199. reject(error);
  200. }
  201. resolve({ errcode: 0, errmsg: '' });
  202. });
  203. });
  204. }
  205. }
  206. module.exports = FileService;