Advertisement
Guest User

Untitled

a guest
Feb 12th, 2017
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.20 KB | None | 0 0
  1. const Client = require('ssh2').Client;
  2. const fs = require('fs');
  3. const path = require('path');
  4. const config = {
  5. host: 'host',
  6. port: 22,
  7. username: 'username',
  8. password: 'password',
  9. };
  10.  
  11.  
  12. let action;
  13.  
  14. if (process.argv.length == 2) {
  15. action = 'deploy';
  16. } else if (process.argv.length > 2) {
  17. if (process.argv[2] == 'rollback') {
  18. action = 'rollback';
  19. }
  20. }
  21. if (!action) {
  22. console.error('Called with wrong parameter "' + process.argv[2] + '"');
  23. process.exit(1);
  24. }
  25.  
  26.  
  27. const walk = (dir, done) => {
  28. var results = [];
  29. fs.readdir(dir, function(err, list) {
  30. if (err) return done(err);
  31. var pending = list.length;
  32. if (!pending) return done(null, results);
  33. list.forEach(function(file) {
  34. file = path.resolve(dir, file);
  35. fs.stat(file, function(err, stat) {
  36. if (stat && stat.isDirectory()) {
  37. walk(file, function(err, res) {
  38. results = results.concat(res);
  39. if (!--pending) done(null, results);
  40. });
  41. } else {
  42. results.push(file);
  43. if (!--pending) done(null, results);
  44. }
  45. });
  46. });
  47. });
  48. };
  49.  
  50. const end = (conn, err) => {
  51. conn.end();
  52. if (err) {
  53. console.trace(err);
  54. throw err;
  55. }
  56. }
  57.  
  58. const connect = () => {
  59. return new Promise(resolve => {
  60. const conn = new Client();
  61. conn.on('ready', () => {
  62. console.log('Client :: ready');
  63. resolve(conn);
  64. })
  65. .connect(config);
  66. });
  67. }
  68.  
  69. const exec = (conn, command) => {
  70. return new Promise(resolve => {
  71. conn.exec(command, (err, stream) => {
  72. var result = '';
  73. stream.on('close', (code, signal) => {
  74. resolve(result);
  75. })
  76. .on('data', (data) => {
  77. result += 'STDOUT: ' + data;
  78. })
  79. .stderr.on('data', (data) => {
  80. result += 'STDERR: ' + data;
  81. });
  82. });
  83. });
  84. }
  85.  
  86. const upload = (conn, localPath, remotePath) => {
  87. return new Promise(resolve => {
  88. conn.sftp((err, sftp) => {
  89. if (err) end(conn, err);
  90. console.log('Sftp :: send ' + localPath + ' > ' + remotePath);
  91. sftp.fastPut(localPath, remotePath, {}, (err) => {
  92. if (err) end(conn, err);
  93. resolve();
  94. });
  95. })
  96. });
  97. }
  98.  
  99. const deploy = (conn) => {
  100. exec(conn, 'rm -rf www/mokumoku_prepare')
  101. .then((result) => {
  102. console.log('Client :: Deleted prepare folder');
  103. })
  104. .then(() => {
  105. return new Promise(resolve => {
  106. walk(__dirname + '/dist', (err, files) => {
  107. if (err) end(conn, err);
  108. resolve(files);
  109. });
  110. })
  111. })
  112. .then((files) => {
  113. let sent = 0;
  114. const localBase = __dirname + '/dist/';
  115. return new Promise(resolve => {
  116. conn.sftp((err, sftp) => {
  117. if (err) end(conn, err);
  118. let promise = Promise.resolve();
  119.  
  120. files.forEach(file => {
  121. const remotePath = file.replace(localBase, 'www/mokumoku_prepare/');
  122.  
  123. promise = promise.then(() => new Promise(resolve3 => {
  124. let parts = remotePath.split('/');
  125. parts.pop();
  126. const folder = parts.join('/');
  127. exec(conn, 'mkdir -p ' + folder).then((result) => {
  128. resolve3();
  129. });
  130. }));
  131.  
  132. promise = promise.then(() => new Promise(resolve2 => {
  133. console.log(file + ' > ' + remotePath);
  134. sftp.fastPut(file, remotePath, {}, (err) => {
  135. if (err) end(conn, err);
  136. resolve2();
  137. });
  138. }));
  139.  
  140. });
  141. return promise.then(() => {
  142. resolve();
  143. });
  144. });
  145. });
  146. })
  147. .then(() => exec(conn, 'mv www/mokumoku_front www/mokumoku_front_bak'))
  148. .then((result) => exec(conn, 'mv www/mokumoku_prepare www/mokumoku_front'))
  149. .then((result) => exec(conn, 'mv www/mokumoku_front_bak www/mokumoku_prepare'))
  150. .then((result) => {
  151. console.log('Finished');
  152. end(conn);
  153. });
  154. }
  155.  
  156. const rollback = (conn) => {
  157. exec(conn, 'mv www/mokumoku_front www/mokumoku_front_bak')
  158. .then((result) => exec(conn, 'mv www/mokumoku_prepare www/mokumoku_front'))
  159. .then((result) => exec(conn, 'mv www/mokumoku_front_bak www/mokumoku_prepare'))
  160. .then((result) => {
  161. console.log('Rollback finished');
  162. end(conn);
  163. });
  164. }
  165.  
  166. connect().then((conn) => {
  167. if (action == 'deploy') {
  168. deploy(conn);
  169. } else if (action == 'rollback') {
  170. rollback(conn);
  171. }
  172. });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement