Epitech's Blih Repository Manager

blih.js 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #!/usr/bin/env node
  2. 'use strict';
  3. const program = require('commander');
  4. const prompt = require('prompt-sync')();
  5. const utf8 = require('utf8');
  6. const crypto = require('crypto');
  7. const request = require('request');
  8. const stringify = require('json-stable-stringify')
  9. class Blih {
  10. constructor(options) {
  11. this.options = options;
  12. this._baseUrl = options.baseurl || 'https://blih.epitech.eu/';
  13. this._user = options.user || this.get_user();
  14. this._token = options.token || this.token_calc();
  15. this._verbose = options.verbose || false;
  16. this._userAgent = options.useragent || 'blih-' + program.version;
  17. }
  18. sign_data(data) {
  19. const sign = crypto.createHmac('sha512', this._token);
  20. return {
  21. user: this._user,
  22. signature: sign.update(this._user + stringify(data, {space: " "})).digest('hex'),
  23. data: data
  24. };
  25. }
  26. request(options) {
  27. const signed_data = this.sign_data(options.data);
  28. request({
  29. url: options.path,
  30. baseUrl: this._baseUrl,
  31. method: options.method || 'GET',
  32. body: JSON.stringify(signed_data),
  33. headers: {
  34. 'Content-Type': options.contentType || 'application/json',
  35. 'User-Agent': this._userAgent
  36. }
  37. }, function (err, res, body) {
  38. if (err)
  39. return console.error('request failed:', err);
  40. return console.log(body);
  41. });
  42. }
  43. get_user() {
  44. return this.options.user || process.env.LOGNAME || process.env.USER ||
  45. process.env.LNAME || process.env.USERNAME;
  46. }
  47. token_calc() {
  48. return crypto.createHash('sha512').update(prompt('Password: ', {echo: '*'})).digest('hex');
  49. }
  50. repo_create(name, type, description) {
  51. var data = { name, type: type || 'git' };
  52. if (description)
  53. data['description'] = description;
  54. return this.request({ path: '/repositories', method:'POST', data: data });
  55. }
  56. }
  57. class subcommand {
  58. constructor(options) {
  59. this.options = options;
  60. }
  61. }
  62. class Repository extends subcommand {
  63. create(params) {
  64. if (params.length < 1)
  65. return this.usage()
  66. const blih = new Blih(this.options)
  67. blih.repo_create(params[0]);
  68. }
  69. list() {
  70. console.log(process.argv);
  71. }
  72. info() {
  73. console.log(process.argv);
  74. }
  75. delete() {
  76. console.log(process.argv);
  77. }
  78. setacl() {
  79. console.log(process.argv);
  80. }
  81. getacl() {
  82. console.log(process.argv);
  83. }
  84. usage() {
  85. console.log('Usage: ' + process.argv[1] + ' [options] repository command ...')
  86. console.log()
  87. console.log('Commands :')
  88. console.log('\tcreate repo\t\t\t-- Create a repository named "repo"')
  89. console.log('\tinfo repo\t\t\t-- Get the repository metadata')
  90. console.log('\tgetacl repo\t\t\t-- Get the acls set for the repository')
  91. console.log('\tlist\t\t\t\t-- List the repositories created')
  92. console.log('\tsetacl repo user [acl]\t\t-- Set (or remove) an acl for "user" on "repo"')
  93. console.log('\t\t\t\t\tACL format:')
  94. console.log('\t\t\t\t\tr for read')
  95. console.log('\t\t\t\t\tw for write')
  96. console.log('\t\t\t\t\ta for admin')
  97. }
  98. }
  99. class sshkey extends subcommand {
  100. list() {
  101. }
  102. upload() {
  103. }
  104. delete() {
  105. }
  106. usage() {
  107. }
  108. }
  109. program
  110. .version('1.7')
  111. .option('-v, --verbose', 'Enable verbose mode')
  112. .option('-u, --user <user>', 'Set user')
  113. .option('-b, --baseurl <url>', 'Set baseurl')
  114. .option('-t, --token <token>', 'Set token')
  115. .option('-U, --useragent <agent>', 'Set useragent');
  116. program
  117. .command('repository [params...]')
  118. .description('Manages repositories')
  119. .action(function (params) {
  120. const action = params.shift();
  121. var repo = new Repository(program);
  122. if (typeof repo[action] === 'function')
  123. repo[action](params);
  124. else
  125. repo.usage();
  126. });
  127. program
  128. .command('sshkey')
  129. .description('Manages SSH keys')
  130. .action(function (params) {
  131. const action = params.unshift();
  132. var sshkeys= new sshkey(program);
  133. if (typeof sshkeys[action] === 'function')
  134. sshkeys[action]();
  135. else
  136. sshkeys.usage();
  137. });
  138. program
  139. .command('whoami')
  140. .description('Ask who you are')
  141. .action(function() {
  142. console.log('whoami');
  143. });
  144. program.parse(process.argv);
  145. if (program.args.length === 0)
  146. program.help();