| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- #!/usr/bin/env node
- 'use strict';
-
- const program = require('commander');
- const prompt = require('prompt-sync')();
- const utf8 = require('utf8');
- const crypto = require('crypto');
- const request = require('request');
- const stringify = require('json-stable-stringify');
- const fs = require('fs');
-
- class Blih {
- constructor(options) {
- this.options = options;
- this._baseUrl = options.baseurl || 'https://blih.epitech.eu/';
- this._user = options.user || this.get_user();
- this._token = options.token || this.token_calc();
- this._verbose = options.verbose || false;
- this._userAgent = options.useragent || 'blih-' + program.version;
- }
-
- sign_data(data) {
- const sign = crypto.createHmac('sha512', this._token);
- sign.update(this._user);
- if (data)
- sign.update(stringify(data, {space: " "}));
- return {
- user: this._user,
- signature: sign.digest('hex'),
- data: data
- };
- }
-
- request(options, cb) {
- cb = cb || ((res) => { console.log(res.message); });
- const signed_data = this.sign_data(options.data);
- request({
- url: options.path,
- baseUrl: this._baseUrl,
- method: options.method || 'GET',
- body: JSON.stringify(signed_data),
- headers: {
- 'Content-Type': options.contentType || 'application/json',
- 'User-Agent': this._userAgent
- }
- }, function (err, res, body) {
- body = JSON.parse(body);
- if (body.error) {
- console.error(`HTTP Error ${res.statusCode}\nError message: '${body.error}'`);
- process.exit(0);
- }
- cb(body);
- });
- }
-
- get_user() {
- return this.options.user || process.env.LOGNAME || process.env.USER ||
- process.env.LNAME || process.env.USERNAME;
- }
-
- token_calc() {
- return crypto.createHash('sha512').update(prompt(`${this._user}'s password: `, {echo: '*'}) || process.exit(1)).digest('hex');
- }
- }
-
- class Subcommand {
- constructor(options) {
- this.options = options;
- this.usage_message = '';
- }
-
- usage() {
- console.log(this.usage_message);
- }
- }
-
- class Repository extends Subcommand {
- constructor(options) {
- super(options);
- this.usage_message =`
- Usage: ${process.argv[1]} [options] repository command ...
-
- Commands :
- create repo\t\t\t-- Create a repository named "repo"
- info repo\t\t\t-- Get the repository metadata
- getacl repo\t\t\t-- Get the acls set for the repository
- list\t\t\t-- List the repositories created
- setacl repo user [acl]\t-- Set (or remove) an acl for "user" on "repo"
- \t\t\t\tACL format:
- \t\t\t\t\tr for read
- \t\t\t\t\tw for write
- \t\t\t\t\ta for admin`;
- this.usage_message = this.usage_message.substr(3).replace(/\n\t\t/g, '\n');
- }
-
- create(params) {
- if (params.length < 1)
- return this.usage();
- const blih = new Blih(this.options);
- blih.request({ path: '/repositories', method:'POST', data: {
- name: params[0],
- type: 'git',
- description: ''
- }});
- }
-
- list() {
- const blih = new Blih(this.options);
- blih.request({ path: '/repositories' }, (res) => {
- if (res.hasOwnProperty("repositories"))
- for (let repo in res.repositories)
- console.log(repo);
- });
- }
-
- info(params) {
- if (params.length < 1)
- return this.usage();
- const blih = new Blih(this.options);
- blih.request({ path: `/repository/${params[0]}` }, (res) => {
- console.log('Repository info :');
- console.log(`name : ${params[0]}`);
- if (res.hasOwnProperty("message"))
- for (let info in res.message)
- console.log(`${info} : ${res.message[info]}`);
- });
- }
-
- delete(params) {
- if (params.length < 1)
- return this.usage();
- const blih = new Blih(this.options);
- blih.request({ path: `/repository/${params[0]}`, method:'DELETE' });
- }
-
- setacl(params) {
- if (params.length < 2)
- return this.usage();
- const blih = new Blih(this.options);
- blih.request({ path: `/repository/${params[0]}/acls`, method:'POST', data: {
- user: params[1],
- acl: params[2] || ''
- }});
- }
-
- getacl(params) {
- if (params.length < 1)
- return this.usage();
- const blih = new Blih(this.options);
- blih.request({ path: `/repository/${params[0]}/acls` }, (res) => {
- for (let info in res)
- console.log(`${info}:${res[info]}`);
- });
- }
- }
-
- class SSHKey extends Subcommand {
- constructor(options) {
- super(options);
- this.usage_message = `
- Usage: ${process.argv[1]} [options] sshkey command ...
-
- Commands :
- upload [file]\t\t\t-- Upload a new ssh-key
- list\t\t\t\t-- List the ssh-keys
- delete [sshkey]\t\t\t-- Delete the sshkey with comment [sshkey]`;
- this.usage_message = this.usage_message.substr(3).replace(/\n\t\t/g, '\n');
- }
-
- list() {
- const blih = new Blih(this.options);
- blih.request({ path: '/sshkeys' }, (res) => {
- console.log();
- for (let info in res)
- console.log(`${info}:\n${res[info]}\n`);
- });
- }
-
- upload(params) {
- if (params.length < 1)
- return this.usage();
- const file = params[0];
- const blih = new Blih(this.options);
- fs.readFile(file, 'utf8', (err, data) => {
- if (err) {
- console.error(`Can't open file : ${file}`);
- process.exit(1);
- }
- blih.request({ path: '/sshkeys', method: 'POST', data: { sshkey: data.trim() } });
- });
- }
-
- delete(params) {
- if (params.length < 1)
- return this.usage();
- const blih = new Blih(this.options);
- blih.request({ path: `/sshkey/${params[0]}`, method: 'DELETE' });
- }
- }
-
- program.version('1.7')
- .option('-v, --verbose', 'Enable verbose mode [ actually no difference ]')
- .option('-u, --user <user>', 'Set user')
- .option('-b, --baseurl <url>', 'Set baseurl')
- .option('-t, --token <token>', 'Set token')
- .option('-U, --useragent <agent>', 'Set useragent');
-
- program.command('repository [params...]')
- .description('Manages repositories')
- .action(function (params) {
- var action = params.shift();
- const repo = new Repository(program);
- if (typeof repo[action] !== 'function')
- action = 'usage';
- repo[action](params);
- });
-
- program.command('sshkey [params...]')
- .description('Manages SSH keys')
- .action(function (params) {
- var action = params.shift();
- const sshkeys = new SSHKey(program);
- if (typeof sshkeys[action] !== 'function')
- action = 'usage';
- sshkeys[action](params);
- });
-
- program.command('whoami')
- .description('Ask who you are')
- .action(function() {
- const blih = new Blih(program);
- blih.request({ path: "/whoami" });
- });
-
- program.parse(process.argv);
-
- if (program.args.length === 0)
- program.help();
|