Compare commits
45 Commits
Author | SHA1 | Date | |
---|---|---|---|
742bf694e4 | |||
38165f11db | |||
ef2b31b4b2 | |||
5b1f800067 | |||
6339a3ed9b | |||
bf27aaf167 | |||
9bc3aea59c | |||
f5ff302d4d | |||
cac8203bf5 | |||
e4532271cc | |||
faf6c91199 | |||
d0009e7a9c | |||
da76df2c3e | |||
a43976110a | |||
c3ee35a699 | |||
a0ce759552 | |||
201d5cc6d7 | |||
e5bdfff743 | |||
967c9fd9d1 | |||
35da2f0b73 | |||
5e991a4e4f | |||
0f75f5238c | |||
e8f3047ac0 | |||
812d28ee3d | |||
fa301eea71 | |||
48ccf317d6 | |||
9b3af8a50a | |||
78aa36c2be | |||
09d96fd94c | |||
f4f60a685d | |||
904129706c | |||
9a96bbd266 | |||
39abfd760b | |||
1b30aa428e | |||
41613c0b93 | |||
2d14617b13 | |||
3106945b47 | |||
2284620387 | |||
cd6bcb974c | |||
eb66ed0244 | |||
d12c7ab621 | |||
84374299cf | |||
b73928109b | |||
1d17dd1b84 | |||
1663d9a266 |
1
.gitignore
vendored
1
.gitignore
vendored
@ -5,3 +5,4 @@ docs/
|
|||||||
ts/typings/
|
ts/typings/
|
||||||
ts/*.js
|
ts/*.js
|
||||||
ts/*.js.map
|
ts/*.js.map
|
||||||
|
test/temp/
|
38
.gitlab-ci.yml
Normal file
38
.gitlab-ci.yml
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
image: hosttoday/ht-docker-node:npmts
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- test
|
||||||
|
- release
|
||||||
|
- page
|
||||||
|
|
||||||
|
testLTS:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- npmci test lts
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- lossless
|
||||||
|
|
||||||
|
testSTABLE:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- npmci test stable
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- lossless
|
||||||
|
|
||||||
|
testLEGACY:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- npmci test legacy
|
||||||
|
allow_failure: true
|
||||||
|
|
||||||
|
release:
|
||||||
|
stage: release
|
||||||
|
script:
|
||||||
|
- npmci publish
|
||||||
|
only:
|
||||||
|
- tags
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
- lossless
|
5
Dockerfile
Normal file
5
Dockerfile
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
FROM hosttoday/ht-docker-node:npmts
|
||||||
|
COPY ./ /node-app
|
||||||
|
WORKDIR /node-app
|
||||||
|
RUN npm install
|
||||||
|
RUN npmts
|
@ -2,7 +2,6 @@
|
|||||||
setups SSH quickly and in a painless manner
|
setups SSH quickly and in a painless manner
|
||||||
|
|
||||||
> Attention: This is still alpha, so some things won't work, not all things are inplemented.
|
> Attention: This is still alpha, so some things won't work, not all things are inplemented.
|
||||||
I (Phil from Lossless) expect this to be ready 2016/05/01.
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
@ -16,16 +15,18 @@ var sshInstance = new smartssh.sshInstance({
|
|||||||
sshInstance.addKey(new smartssh.sshKey({
|
sshInstance.addKey(new smartssh.sshKey({
|
||||||
private: "somestring",
|
private: "somestring",
|
||||||
public: "somestring", // optional
|
public: "somestring", // optional
|
||||||
for:"github.com",
|
host:"github.com",
|
||||||
encoding: "base64" // optional, defaults to "utf8", can be "utf8" or "base64", useful for reading ssh keys from environment variables
|
encoding: "base64" // optional, defaults to "utf8", can be "utf8" or "base64", useful for reading ssh keys from environment variables
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
sshInstance.removeKey(sshInstance.getKey("github.com")); // removes key for host "github.com" is present
|
||||||
|
|
||||||
sshInstance.createKey({
|
sshInstance.createKey({
|
||||||
for:"gitlab.com" // returns new key in the form sshKey, read more about the sshKey class below
|
host:"gitlab.com" // returns new key in the form sshKey, read more about the sshKey class below
|
||||||
})
|
})
|
||||||
|
|
||||||
sshInstance.getKey({ // returns ssh key in the form sshKey, read more about the sshKey class below
|
sshInstance.getKey({ // returns ssh key in the form sshKey, read more about the sshKey class below
|
||||||
for:"github.com"
|
host:"github.com"
|
||||||
});
|
});
|
||||||
|
|
||||||
sshInstance.getKeys() // returns array of all available getKeys. Each key is in form of class sshKey
|
sshInstance.getKeys() // returns array of all available getKeys. Each key is in form of class sshKey
|
||||||
|
5
dist/index.d.ts
vendored
Normal file
5
dist/index.d.ts
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
import "typings-global";
|
||||||
|
export { SshInstance } from "./smartssh.classes.sshinstance";
|
||||||
|
export { SshKey } from "./smartssh.classes.sshkey";
|
||||||
|
export { SshDir } from "./smartssh.classes.sshdir";
|
||||||
|
export { SshConfig } from "./smartssh.classes.sshconfig";
|
11
dist/index.js
vendored
11
dist/index.js
vendored
@ -1,3 +1,12 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
require("typings-global");
|
||||||
|
var smartssh_classes_sshinstance_1 = require("./smartssh.classes.sshinstance");
|
||||||
|
exports.SshInstance = smartssh_classes_sshinstance_1.SshInstance;
|
||||||
|
var smartssh_classes_sshkey_1 = require("./smartssh.classes.sshkey");
|
||||||
|
exports.SshKey = smartssh_classes_sshkey_1.SshKey;
|
||||||
|
var smartssh_classes_sshdir_1 = require("./smartssh.classes.sshdir");
|
||||||
|
exports.SshDir = smartssh_classes_sshdir_1.SshDir;
|
||||||
|
var smartssh_classes_sshconfig_1 = require("./smartssh.classes.sshconfig");
|
||||||
|
exports.SshConfig = smartssh_classes_sshconfig_1.SshConfig;
|
||||||
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxRQUFPLGdCQUNQLENBQUMsQ0FEc0I7QUFHdkIsNkNBQTBCLGdDQUFnQyxDQUFDO0FBQW5ELGlFQUFtRDtBQUMzRCx3Q0FBcUIsMkJBQTJCLENBQUM7QUFBekMsa0RBQXlDO0FBQ2pELHdDQUFxQiwyQkFBMkIsQ0FBQztBQUF6QyxrREFBeUM7QUFDakQsMkNBQXdCLDhCQUE4QixDQUFDO0FBQS9DLDJEQUErQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCJcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vc21hcnRzc2gucGx1Z2luc1wiO1xuXG5leHBvcnQge1NzaEluc3RhbmNlfSBmcm9tIFwiLi9zbWFydHNzaC5jbGFzc2VzLnNzaGluc3RhbmNlXCI7XG5leHBvcnQge1NzaEtleX0gZnJvbSBcIi4vc21hcnRzc2guY2xhc3Nlcy5zc2hrZXlcIjtcbmV4cG9ydCB7U3NoRGlyfSBmcm9tIFwiLi9zbWFydHNzaC5jbGFzc2VzLnNzaGRpclwiO1xuZXhwb3J0IHtTc2hDb25maWd9IGZyb20gXCIuL3NtYXJ0c3NoLmNsYXNzZXMuc3NoY29uZmlnXCI7Il19
|
||||||
|
3
dist/smartssh.classes.helpers.d.ts
vendored
Normal file
3
dist/smartssh.classes.helpers.d.ts
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
import "typings-global";
|
||||||
|
import { SshKey } from "./smartssh.classes.sshkey";
|
||||||
|
export declare let sshKeyArrayFromDir: (dirArg: string) => SshKey[];
|
5
dist/smartssh.classes.helpers.js
vendored
5
dist/smartssh.classes.helpers.js
vendored
@ -1,7 +1,8 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
require("typings-global");
|
||||||
exports.sshKeyArrayFromDir = function (dirArg) {
|
exports.sshKeyArrayFromDir = function (dirArg) {
|
||||||
var sshKeyArray = [];
|
var sshKeyArray = []; //TODO
|
||||||
return sshKeyArray;
|
return sshKeyArray;
|
||||||
};
|
};
|
||||||
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNtYXJ0c3NoLmNsYXNzZXMuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBSVcsMEJBQWtCLEdBQUcsVUFBUyxNQUFhO0lBQ2xELElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUNyQixNQUFNLENBQUMsV0FBVyxDQUFDO0FBQ3ZCLENBQUMsQ0FBQSIsImZpbGUiOiJzbWFydHNzaC5jbGFzc2VzLmhlbHBlcnMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi90eXBpbmdzL21haW4uZC50c1wiIC8+XG5pbXBvcnQgcGx1Z2lucyA9IHJlcXVpcmUoXCIuL3NtYXJ0c3NoLnBsdWdpbnNcIik7XG5pbXBvcnQgY2xhc3NlcyA9IHJlcXVpcmUoXCIuL3NtYXJ0c3NoLmNsYXNzZXNcIik7XG5cbmV4cG9ydCBsZXQgc3NoS2V5QXJyYXlGcm9tRGlyID0gZnVuY3Rpb24oZGlyQXJnOnN0cmluZyk6Y2xhc3Nlcy5zc2hLZXlbXXtcbiAgICBsZXQgc3NoS2V5QXJyYXkgPSBbXTtcbiAgICByZXR1cm4gc3NoS2V5QXJyYXk7XG59Il0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNtYXJ0c3NoLmNsYXNzZXMuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsUUFBTyxnQkFDUCxDQUFDLENBRHNCO0FBSVosMEJBQWtCLEdBQUcsVUFBUyxNQUFhO0lBQ2xELElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDNUIsTUFBTSxDQUFDLFdBQVcsQ0FBQztBQUN2QixDQUFDLENBQUEiLCJmaWxlIjoic21hcnRzc2guY2xhc3Nlcy5oZWxwZXJzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy1nbG9iYWxcIlxuaW1wb3J0ICogYXMgcGx1Z2lucyBmcm9tIFwiLi9zbWFydHNzaC5wbHVnaW5zXCI7XG5pbXBvcnQge1NzaEtleX0gZnJvbSBcIi4vc21hcnRzc2guY2xhc3Nlcy5zc2hrZXlcIjtcblxuZXhwb3J0IGxldCBzc2hLZXlBcnJheUZyb21EaXIgPSBmdW5jdGlvbihkaXJBcmc6c3RyaW5nKTpTc2hLZXlbXXtcbiAgICBsZXQgc3NoS2V5QXJyYXkgPSBbXTsgLy9UT0RPXG4gICAgcmV0dXJuIHNzaEtleUFycmF5O1xufSJdfQ==
|
||||||
|
106
dist/smartssh.classes.js
vendored
106
dist/smartssh.classes.js
vendored
File diff suppressed because one or more lines are too long
16
dist/smartssh.classes.sshconfig.d.ts
vendored
Normal file
16
dist/smartssh.classes.sshconfig.d.ts
vendored
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
import "typings-global";
|
||||||
|
import { SshKey } from "./smartssh.classes.sshkey";
|
||||||
|
export declare class SshConfig {
|
||||||
|
sshKeyArray: SshKey[];
|
||||||
|
constructor(sshKeyArrayArg: SshKey[]);
|
||||||
|
/**
|
||||||
|
* stores a config file
|
||||||
|
*/
|
||||||
|
store(dirPathArg: string): any;
|
||||||
|
read(dirPathArg: any): any;
|
||||||
|
}
|
||||||
|
export interface configObject {
|
||||||
|
configString: string;
|
||||||
|
authorized: boolean;
|
||||||
|
sshKey: SshKey;
|
||||||
|
}
|
47
dist/smartssh.classes.sshconfig.js
vendored
Normal file
47
dist/smartssh.classes.sshconfig.js
vendored
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
"use strict";
|
||||||
|
require("typings-global");
|
||||||
|
var plugins = require("./smartssh.plugins");
|
||||||
|
var SshConfig = (function () {
|
||||||
|
function SshConfig(sshKeyArrayArg) {
|
||||||
|
this.sshKeyArray = sshKeyArrayArg;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* stores a config file
|
||||||
|
*/
|
||||||
|
SshConfig.prototype.store = function (dirPathArg) {
|
||||||
|
var done = plugins.q.defer();
|
||||||
|
var configArray;
|
||||||
|
var configString;
|
||||||
|
for (var key in this.sshKeyArray) {
|
||||||
|
var sshKey = this.sshKeyArray[key];
|
||||||
|
if (sshKey.host) {
|
||||||
|
configString = "Host " + sshKey.host + "\n" +
|
||||||
|
" HostName " + sshKey.host + "\n" +
|
||||||
|
" IdentityFile ~/.ssh/" + sshKey.host + "\n";
|
||||||
|
}
|
||||||
|
configArray.push({
|
||||||
|
configString: configString,
|
||||||
|
authorized: sshKey.authorized,
|
||||||
|
sshKey: sshKey
|
||||||
|
});
|
||||||
|
}
|
||||||
|
var configFile = "";
|
||||||
|
for (var key in configArray) {
|
||||||
|
configFile = configFile + configArray[key].configString + "\n";
|
||||||
|
}
|
||||||
|
;
|
||||||
|
plugins.smartfile.memory.toFsSync(configFile, dirPathArg);
|
||||||
|
return done.promise;
|
||||||
|
};
|
||||||
|
SshConfig.prototype.read = function (dirPathArg) {
|
||||||
|
var done = plugins.q.defer();
|
||||||
|
var configArray;
|
||||||
|
return done.promise;
|
||||||
|
};
|
||||||
|
return SshConfig;
|
||||||
|
}());
|
||||||
|
exports.SshConfig = SshConfig;
|
||||||
|
;
|
||||||
|
;
|
||||||
|
|
||||||
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNtYXJ0c3NoLmNsYXNzZXMuc3NoY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxRQUFPLGdCQUFnQixDQUFDLENBQUE7QUFDeEIsSUFBWSxPQUFPLFdBQU0sb0JBQW9CLENBQUMsQ0FBQTtBQUk5QztJQUVJLG1CQUFZLGNBQXVCO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsY0FBYyxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNILHlCQUFLLEdBQUwsVUFBTSxVQUFpQjtRQUNuQixJQUFJLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksV0FBMEIsQ0FBQztRQUMvQixJQUFJLFlBQVksQ0FBQztRQUNqQixHQUFHLENBQUEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUEsQ0FBQztZQUM3QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLEVBQUUsQ0FBQSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQSxDQUFDO2dCQUNaLFlBQVksR0FBRyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJO29CQUN4QixhQUFhLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJO29CQUNsQyx3QkFBd0IsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQTtZQUNwRSxDQUFDO1lBQ0QsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDYixZQUFZLEVBQUMsWUFBWTtnQkFDekIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUM3QixNQUFNLEVBQUUsTUFBTTthQUNqQixDQUFDLENBQUM7UUFDUCxDQUFDO1FBQ0QsSUFBSSxVQUFVLEdBQVUsRUFBRSxDQUFDO1FBQzNCLEdBQUcsQ0FBQSxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFBLENBQUM7WUFDeEIsVUFBVSxHQUFHLFVBQVUsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNuRSxDQUFDO1FBQUEsQ0FBQztRQUNGLE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUNELHdCQUFJLEdBQUosVUFBSyxVQUFVO1FBQ1gsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixJQUFJLFdBQTBCLENBQUM7UUFFL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDeEIsQ0FBQztJQUNMLGdCQUFDO0FBQUQsQ0F2Q0EsQUF1Q0MsSUFBQTtBQXZDWSxpQkFBUyxZQXVDckIsQ0FBQTtBQUFBLENBQUM7QUFNRCxDQUFDIiwiZmlsZSI6InNtYXJ0c3NoLmNsYXNzZXMuc3NoY29uZmlnLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy1nbG9iYWxcIjtcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vc21hcnRzc2gucGx1Z2luc1wiO1xuaW1wb3J0ICogYXMgaGVscGVycyBmcm9tIFwiLi9zbWFydHNzaC5jbGFzc2VzLmhlbHBlcnNcIjtcbmltcG9ydCB7U3NoS2V5fSBmcm9tIFwiLi9zbWFydHNzaC5jbGFzc2VzLnNzaGtleVwiXG5cbmV4cG9ydCBjbGFzcyBTc2hDb25maWcge1xuICAgIHNzaEtleUFycmF5OlNzaEtleVtdO1xuICAgIGNvbnN0cnVjdG9yKHNzaEtleUFycmF5QXJnOlNzaEtleVtdKXtcbiAgICAgICAgdGhpcy5zc2hLZXlBcnJheSA9IHNzaEtleUFycmF5QXJnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHN0b3JlcyBhIGNvbmZpZyBmaWxlXG4gICAgICovXG4gICAgc3RvcmUoZGlyUGF0aEFyZzpzdHJpbmcpe1xuICAgICAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgICAgICBsZXQgY29uZmlnQXJyYXk6Y29uZmlnT2JqZWN0W107XG4gICAgICAgIGxldCBjb25maWdTdHJpbmc7XG4gICAgICAgIGZvcihsZXQga2V5IGluIHRoaXMuc3NoS2V5QXJyYXkpe1xuICAgICAgICAgICAgbGV0IHNzaEtleSA9IHRoaXMuc3NoS2V5QXJyYXlba2V5XTtcbiAgICAgICAgICAgIGlmKHNzaEtleS5ob3N0KXtcbiAgICAgICAgICAgICAgICBjb25maWdTdHJpbmcgPSBcIkhvc3QgXCIgKyBzc2hLZXkuaG9zdCArIFwiXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiAgSG9zdE5hbWUgXCIgKyBzc2hLZXkuaG9zdCArIFwiXFxuXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIiAgSWRlbnRpdHlGaWxlIH4vLnNzaC9cIiArIHNzaEtleS5ob3N0ICsgXCJcXG5cIlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnQXJyYXkucHVzaCh7XG4gICAgICAgICAgICAgICAgY29uZmlnU3RyaW5nOmNvbmZpZ1N0cmluZyxcbiAgICAgICAgICAgICAgICBhdXRob3JpemVkOiBzc2hLZXkuYXV0aG9yaXplZCxcbiAgICAgICAgICAgICAgICBzc2hLZXk6IHNzaEtleVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGNvbmZpZ0ZpbGU6c3RyaW5nID0gXCJcIjtcbiAgICAgICAgZm9yKGxldCBrZXkgaW4gY29uZmlnQXJyYXkpe1xuICAgICAgICAgICAgY29uZmlnRmlsZSA9IGNvbmZpZ0ZpbGUgKyBjb25maWdBcnJheVtrZXldLmNvbmZpZ1N0cmluZyArIFwiXFxuXCI7XG4gICAgICAgIH07XG4gICAgICAgIHBsdWdpbnMuc21hcnRmaWxlLm1lbW9yeS50b0ZzU3luYyhjb25maWdGaWxlLGRpclBhdGhBcmcpO1xuICAgICAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xuICAgIH1cbiAgICByZWFkKGRpclBhdGhBcmcpe1xuICAgICAgICBsZXQgZG9uZSA9IHBsdWdpbnMucS5kZWZlcigpO1xuICAgICAgICBsZXQgY29uZmlnQXJyYXk6Y29uZmlnT2JqZWN0W107XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZG9uZS5wcm9taXNlO1xuICAgIH1cbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgY29uZmlnT2JqZWN0IHtcbiAgICBjb25maWdTdHJpbmc6c3RyaW5nO1xuICAgIGF1dGhvcml6ZWQ6Ym9vbGVhbjtcbiAgICBzc2hLZXk6U3NoS2V5O1xufTtcblxuIl19
|
12
dist/smartssh.classes.sshdir.d.ts
vendored
Normal file
12
dist/smartssh.classes.sshdir.d.ts
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
import "typings-global";
|
||||||
|
import { SshKey } from "./smartssh.classes.sshkey";
|
||||||
|
import { SshConfig } from "./smartssh.classes.sshconfig";
|
||||||
|
export declare class SshDir {
|
||||||
|
path: string;
|
||||||
|
private sshKeyArray;
|
||||||
|
private sshConfig;
|
||||||
|
constructor(sshKeyArray: SshKey[], sshConfig: SshConfig, sshDirPathArg?: string);
|
||||||
|
writeToDir(): void;
|
||||||
|
readFromDir(): void;
|
||||||
|
getKeys(): SshKey[];
|
||||||
|
}
|
33
dist/smartssh.classes.sshdir.js
vendored
Normal file
33
dist/smartssh.classes.sshdir.js
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
"use strict";
|
||||||
|
require("typings-global");
|
||||||
|
var plugins = require("./smartssh.plugins");
|
||||||
|
var helpers = require("./smartssh.classes.helpers");
|
||||||
|
var SshDir = (function () {
|
||||||
|
function SshDir(sshKeyArray, sshConfig, sshDirPathArg) {
|
||||||
|
this.sshKeyArray = sshKeyArray;
|
||||||
|
if (sshDirPathArg) {
|
||||||
|
this.path = sshDirPathArg;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this.path = plugins.path.join(plugins.smartpath.get.home(), ".ssh/");
|
||||||
|
}
|
||||||
|
;
|
||||||
|
}
|
||||||
|
SshDir.prototype.writeToDir = function () {
|
||||||
|
var _this = this;
|
||||||
|
this.sshKeyArray.forEach(function (sshKeyArg) {
|
||||||
|
sshKeyArg.store(_this.path);
|
||||||
|
});
|
||||||
|
this.sshConfig.store(this.path);
|
||||||
|
};
|
||||||
|
;
|
||||||
|
SshDir.prototype.readFromDir = function () {
|
||||||
|
};
|
||||||
|
SshDir.prototype.getKeys = function () {
|
||||||
|
return helpers.sshKeyArrayFromDir(this.path);
|
||||||
|
};
|
||||||
|
return SshDir;
|
||||||
|
}());
|
||||||
|
exports.SshDir = SshDir;
|
||||||
|
|
||||||
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNtYXJ0c3NoLmNsYXNzZXMuc3NoZGlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxRQUFPLGdCQUFnQixDQUFDLENBQUE7QUFDeEIsSUFBWSxPQUFPLFdBQU0sb0JBQW9CLENBQUMsQ0FBQTtBQUM5QyxJQUFZLE9BQU8sV0FBTSw0QkFBNEIsQ0FBQyxDQUFBO0FBSXREO0lBSUksZ0JBQVksV0FBb0IsRUFBQyxTQUFtQixFQUFDLGFBQXFCO1FBQ3RFLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLEVBQUUsQ0FBQSxDQUFDLGFBQWEsQ0FBQyxDQUFBLENBQUM7WUFDZCxJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQztRQUM5QixDQUFDO1FBQUMsSUFBSSxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hFLENBQUM7UUFBQSxDQUFDO0lBQ04sQ0FBQztJQUNELDJCQUFVLEdBQVY7UUFBQSxpQkFLQztRQUpHLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLFVBQUMsU0FBUztZQUMvQixTQUFTLENBQUMsS0FBSyxDQUFDLEtBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDOztJQUNELDRCQUFXLEdBQVg7SUFFQSxDQUFDO0lBQ0Qsd0JBQU8sR0FBUDtRQUNJLE1BQU0sQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDTCxhQUFDO0FBQUQsQ0F4QkEsQUF3QkMsSUFBQTtBQXhCWSxjQUFNLFNBd0JsQixDQUFBIiwiZmlsZSI6InNtYXJ0c3NoLmNsYXNzZXMuc3NoZGlyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy1nbG9iYWxcIjtcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vc21hcnRzc2gucGx1Z2luc1wiO1xuaW1wb3J0ICogYXMgaGVscGVycyBmcm9tIFwiLi9zbWFydHNzaC5jbGFzc2VzLmhlbHBlcnNcIjtcbmltcG9ydCB7U3NoSW5zdGFuY2V9IGZyb20gXCIuL3NtYXJ0c3NoLmNsYXNzZXMuc3NoaW5zdGFuY2VcIjtcbmltcG9ydCB7U3NoS2V5fSBmcm9tIFwiLi9zbWFydHNzaC5jbGFzc2VzLnNzaGtleVwiO1xuaW1wb3J0IHtTc2hDb25maWd9IGZyb20gXCIuL3NtYXJ0c3NoLmNsYXNzZXMuc3NoY29uZmlnXCI7XG5leHBvcnQgY2xhc3MgU3NoRGlyIHsgLy8gc3NoRGlyIGNsYXNzIC0+IE5PVCBFWFBPUlRFRCwgT05MWSBGT1IgSU5URVJOQUwgVVNFXG4gICAgcGF0aDpzdHJpbmc7IC8vIHRoZSBwYXRoIG9mIHRoZSBzc2ggZGlyZWN0b3J5XG4gICAgcHJpdmF0ZSBzc2hLZXlBcnJheTpTc2hLZXlbXTtcbiAgICBwcml2YXRlIHNzaENvbmZpZzpTc2hDb25maWc7XG4gICAgY29uc3RydWN0b3Ioc3NoS2V5QXJyYXk6U3NoS2V5W10sc3NoQ29uZmlnOlNzaENvbmZpZyxzc2hEaXJQYXRoQXJnPzpzdHJpbmcpe1xuICAgICAgICB0aGlzLnNzaEtleUFycmF5ID0gc3NoS2V5QXJyYXk7XG4gICAgICAgIGlmKHNzaERpclBhdGhBcmcpe1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gc3NoRGlyUGF0aEFyZztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IHBsdWdpbnMucGF0aC5qb2luKHBsdWdpbnMuc21hcnRwYXRoLmdldC5ob21lKCksXCIuc3NoL1wiKTtcbiAgICAgICAgfTtcbiAgICB9XG4gICAgd3JpdGVUb0RpcigpeyAvLyBzeW5jcyBzc2hJbnN0YW5jZSB0byBkaXJlY3RvcnlcbiAgICAgICAgdGhpcy5zc2hLZXlBcnJheS5mb3JFYWNoKChzc2hLZXlBcmcpID0+IHtcbiAgICAgICAgICAgIHNzaEtleUFyZy5zdG9yZSh0aGlzLnBhdGgpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5zc2hDb25maWcuc3RvcmUodGhpcy5wYXRoKTtcbiAgICB9O1xuICAgIHJlYWRGcm9tRGlyKCl7IC8vIHN5bmNzIHNzaEluc3RhbmNlIGZyb20gZGlyZWN0b3J5XG4gICAgICAgIFxuICAgIH1cbiAgICBnZXRLZXlzKCl7XG4gICAgICAgIHJldHVybiBoZWxwZXJzLnNzaEtleUFycmF5RnJvbURpcih0aGlzLnBhdGgpO1xuICAgIH1cbn0iXX0=
|
34
dist/smartssh.classes.sshinstance.d.ts
vendored
Normal file
34
dist/smartssh.classes.sshinstance.d.ts
vendored
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
import "typings-global";
|
||||||
|
import { SshKey } from "./smartssh.classes.sshkey";
|
||||||
|
export declare class SshInstance {
|
||||||
|
private _sshKeyArray;
|
||||||
|
private _sshConfig;
|
||||||
|
private _sshDir;
|
||||||
|
private _sshSync;
|
||||||
|
constructor(optionsArg?: {
|
||||||
|
sshDirPath?: string;
|
||||||
|
sshSync?: boolean;
|
||||||
|
});
|
||||||
|
addKey(sshKeyArg: SshKey): void;
|
||||||
|
removeKey(sshKeyArg: SshKey): void;
|
||||||
|
replaceKey(sshKeyOldArg: SshKey, sshKeyNewArg: SshKey): void;
|
||||||
|
getKey(hostArg: string): SshKey;
|
||||||
|
sshKeys: SshKey[];
|
||||||
|
/**
|
||||||
|
* write SshInstance to disk
|
||||||
|
*/
|
||||||
|
writeToDisk(): void;
|
||||||
|
/**
|
||||||
|
* read ab SshInstance from disk
|
||||||
|
*/
|
||||||
|
readFromDisk(): void;
|
||||||
|
private _makeConfig();
|
||||||
|
/**
|
||||||
|
* method to invoke SshInstance _sync automatically when sshSync is true
|
||||||
|
*/
|
||||||
|
private _syncAuto(directionArg);
|
||||||
|
/**
|
||||||
|
* private method to sync SshInstance
|
||||||
|
*/
|
||||||
|
private _sync(directionArg);
|
||||||
|
}
|
105
dist/smartssh.classes.sshinstance.js
vendored
Normal file
105
dist/smartssh.classes.sshinstance.js
vendored
Normal file
File diff suppressed because one or more lines are too long
22
dist/smartssh.classes.sshkey.d.ts
vendored
Normal file
22
dist/smartssh.classes.sshkey.d.ts
vendored
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import "typings-global";
|
||||||
|
export declare class SshKey {
|
||||||
|
private _privKey;
|
||||||
|
private _pubKey;
|
||||||
|
private _hostVar;
|
||||||
|
private _authorized;
|
||||||
|
constructor(optionsArg?: {
|
||||||
|
private?: string;
|
||||||
|
public?: string;
|
||||||
|
host?: string;
|
||||||
|
authorized?: boolean;
|
||||||
|
});
|
||||||
|
host: string;
|
||||||
|
privKey: string;
|
||||||
|
privKeyBase64: string;
|
||||||
|
pubKey: string;
|
||||||
|
pubKeyBase64: string;
|
||||||
|
authorized: boolean;
|
||||||
|
type: any;
|
||||||
|
read(filePathArg: any): void;
|
||||||
|
store(dirPathArg: string): void;
|
||||||
|
}
|
121
dist/smartssh.classes.sshkey.js
vendored
Normal file
121
dist/smartssh.classes.sshkey.js
vendored
Normal file
File diff suppressed because one or more lines are too long
9
dist/smartssh.plugins.d.ts
vendored
Normal file
9
dist/smartssh.plugins.d.ts
vendored
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
import "typings-global";
|
||||||
|
export import beautylog = require("beautylog");
|
||||||
|
export declare let base64: any;
|
||||||
|
export declare let fs: any;
|
||||||
|
export declare let minimatch: any;
|
||||||
|
export import path = require("path");
|
||||||
|
export declare let q: any;
|
||||||
|
export import smartfile = require("smartfile");
|
||||||
|
export import smartpath = require("smartpath");
|
7
dist/smartssh.plugins.js
vendored
7
dist/smartssh.plugins.js
vendored
@ -1,9 +1,12 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
/// <reference path="./typings/main.d.ts" />
|
require("typings-global");
|
||||||
exports.beautylog = require("beautylog");
|
exports.beautylog = require("beautylog");
|
||||||
exports.base64 = require("js-base64").Base64;
|
exports.base64 = require("js-base64").Base64;
|
||||||
exports.fs = require("fs-extra");
|
exports.fs = require("fs-extra");
|
||||||
|
exports.minimatch = require("minimatch");
|
||||||
exports.path = require("path");
|
exports.path = require("path");
|
||||||
|
exports.q = require("q");
|
||||||
exports.smartfile = require("smartfile");
|
exports.smartfile = require("smartfile");
|
||||||
|
exports.smartpath = require("smartpath");
|
||||||
|
|
||||||
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNtYXJ0c3NoLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLDRDQUE0QztBQUNqQyxpQkFBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNqQyxjQUFNLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUNyQyxVQUFFLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ3pCLFlBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDdkIsaUJBQVMsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUMiLCJmaWxlIjoic21hcnRzc2gucGx1Z2lucy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHBhdGg9XCIuL3R5cGluZ3MvbWFpbi5kLnRzXCIgLz5cbmV4cG9ydCBsZXQgYmVhdXR5bG9nID0gcmVxdWlyZShcImJlYXV0eWxvZ1wiKTtcbmV4cG9ydCBsZXQgYmFzZTY0ID0gcmVxdWlyZShcImpzLWJhc2U2NFwiKS5CYXNlNjQ7XG5leHBvcnQgbGV0IGZzID0gcmVxdWlyZShcImZzLWV4dHJhXCIpO1xuZXhwb3J0IGxldCBwYXRoID0gcmVxdWlyZShcInBhdGhcIik7XG5leHBvcnQgbGV0IHNtYXJ0ZmlsZSA9IHJlcXVpcmUoXCJzbWFydGZpbGVcIik7Il0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9
|
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNtYXJ0c3NoLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sZ0JBQ1AsQ0FBQyxDQURzQjtBQUNULGlCQUFTLFdBQVcsV0FBVyxDQUFDLENBQUM7QUFDcEMsY0FBTSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDckMsVUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN6QixpQkFBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM5QixZQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDMUIsU0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLGlCQUFTLFdBQVcsV0FBVyxDQUFDLENBQUM7QUFDakMsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQyIsImZpbGUiOiJzbWFydHNzaC5wbHVnaW5zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy1nbG9iYWxcIlxuZXhwb3J0IGltcG9ydCBiZWF1dHlsb2cgPSByZXF1aXJlKFwiYmVhdXR5bG9nXCIpO1xuZXhwb3J0IGxldCBiYXNlNjQgPSByZXF1aXJlKFwianMtYmFzZTY0XCIpLkJhc2U2NDtcbmV4cG9ydCBsZXQgZnMgPSByZXF1aXJlKFwiZnMtZXh0cmFcIik7XG5leHBvcnQgbGV0IG1pbmltYXRjaCA9IHJlcXVpcmUoXCJtaW5pbWF0Y2hcIik7XG5leHBvcnQgaW1wb3J0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmV4cG9ydCBsZXQgcSA9IHJlcXVpcmUoXCJxXCIpO1xuZXhwb3J0IGltcG9ydCBzbWFydGZpbGUgPSByZXF1aXJlKFwic21hcnRmaWxlXCIpO1xuZXhwb3J0IGltcG9ydCBzbWFydHBhdGggPSByZXF1aXJlKFwic21hcnRwYXRoXCIpOyJdfQ==
|
||||||
|
4
npmts.json
Normal file
4
npmts.json
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"mode":"default",
|
||||||
|
"coverageTreshold":50
|
||||||
|
}
|
24
package.json
24
package.json
@ -1,14 +1,15 @@
|
|||||||
{
|
{
|
||||||
"name": "smartssh",
|
"name": "smartssh",
|
||||||
"version": "1.0.1",
|
"version": "1.1.3",
|
||||||
"description": "setups SSH quickly and in a painless manner",
|
"description": "setups SSH quickly and in a painless manner",
|
||||||
"main": "dist/index.js",
|
"main": "dist/index.js",
|
||||||
|
"typings": "dist/index.d.ts",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(npmts)"
|
"test": "(npmts)"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
"url": "git+https://github.com/pushrocks/smartssh.git"
|
"url": "git+https://gitlab.com/pushrocks/smartssh.git"
|
||||||
},
|
},
|
||||||
"keywords": [
|
"keywords": [
|
||||||
"SSH",
|
"SSH",
|
||||||
@ -18,17 +19,22 @@
|
|||||||
"author": "Lossless GmbH",
|
"author": "Lossless GmbH",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bugs": {
|
"bugs": {
|
||||||
"url": "https://github.com/pushrocks/smartssh/issues"
|
"url": "https://gitlab.com/pushrocks/smartssh/issues"
|
||||||
},
|
},
|
||||||
"homepage": "https://github.com/pushrocks/smartssh#readme",
|
"homepage": "https://gitlab.com/pushrocks/smartssh#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"beautylog": "^4.1.2",
|
"beautylog": "^5.0.12",
|
||||||
"fs-extra": "^0.28.0",
|
"fs-extra": "^0.30.0",
|
||||||
"js-base64": "^2.1.9",
|
"js-base64": "^2.1.9",
|
||||||
"smartfile": "^3.0.5"
|
"minimatch": "^3.0.2",
|
||||||
|
"q": "^1.4.1",
|
||||||
|
"smartfile": "^4.0.5",
|
||||||
|
"smartpath": "^3.2.2",
|
||||||
|
"typings-global": "^1.0.3",
|
||||||
|
"typings-test": "^1.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"npmts": "^5.0.4",
|
"npmts-g": "^5.2.6",
|
||||||
"should": "^8.3.1"
|
"should": "^9.0.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
test/test.d.ts
vendored
Normal file
2
test/test.d.ts
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
import "typings-test";
|
||||||
|
import "should";
|
76
test/test.js
76
test/test.js
File diff suppressed because one or more lines are too long
73
test/test.ts
73
test/test.ts
@ -1,3 +1,70 @@
|
|||||||
/// <reference path="../ts/typings/main.d.ts" />
|
import "typings-test"
|
||||||
let should = require("should");
|
import "should";
|
||||||
let smartssh = require("../dist/index.js");
|
import smartssh = require("../dist/index");
|
||||||
|
import path = require("path");
|
||||||
|
describe("smartssh",function(){
|
||||||
|
let testSshInstance:smartssh.SshInstance;
|
||||||
|
let testSshKey:smartssh.SshKey;
|
||||||
|
describe(".SshKey",function(){
|
||||||
|
it("'new' keyword should create a valid SshKey object",function(){
|
||||||
|
testSshKey = new smartssh.SshKey({
|
||||||
|
host:"example.com",
|
||||||
|
private:"someExamplePrivateKey",
|
||||||
|
public:"someExamplePublicKey"
|
||||||
|
});
|
||||||
|
testSshKey.should.be.instanceof(smartssh.SshKey);
|
||||||
|
});
|
||||||
|
it(".type should be a valid type",function(){
|
||||||
|
testSshKey.type.should.equal("duplex");
|
||||||
|
});
|
||||||
|
it(".publicKey should be public key",function(){
|
||||||
|
testSshKey.pubKey.should.equal("someExamplePublicKey");
|
||||||
|
});
|
||||||
|
it(".privateKey should be private key",function(){
|
||||||
|
testSshKey.privKey.should.equal("someExamplePrivateKey");
|
||||||
|
});
|
||||||
|
it(".publicKeyBase64 should be public key base 64 encoded",function(){
|
||||||
|
testSshKey.pubKeyBase64;
|
||||||
|
});
|
||||||
|
it(".store() should store the file to disk",function(){
|
||||||
|
testSshKey.store(path.join(process.cwd(),"test/temp"));
|
||||||
|
})
|
||||||
|
});
|
||||||
|
describe(".SshInstance",function(){
|
||||||
|
it("'new' keyword should create a new SshInstance object from class",function(){
|
||||||
|
testSshInstance = new smartssh.SshInstance();
|
||||||
|
testSshInstance.should.be.instanceof(smartssh.SshInstance);
|
||||||
|
});
|
||||||
|
it(".addKey() should accept a new SshKey object",function(){
|
||||||
|
testSshInstance.addKey(new smartssh.SshKey({
|
||||||
|
public:"somePublicKey",
|
||||||
|
private:"somePrivateKey",
|
||||||
|
host:"gitlab.com"
|
||||||
|
}));
|
||||||
|
testSshInstance.addKey(new smartssh.SshKey({
|
||||||
|
public:"somePublicKey",
|
||||||
|
private:"somePrivateKey",
|
||||||
|
host:"bitbucket.org"
|
||||||
|
}));
|
||||||
|
testSshInstance.addKey(new smartssh.SshKey({
|
||||||
|
public:"someGitHubPublicKey",
|
||||||
|
private:"someGitHubPrivateKey",
|
||||||
|
host:"github.com"
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
it(".sshKeys should point to an array of sshKeys",function(){
|
||||||
|
let sshKeyArray = testSshInstance.sshKeys;
|
||||||
|
sshKeyArray.should.be.Array();
|
||||||
|
sshKeyArray[0].host.should.equal("gitlab.com");
|
||||||
|
sshKeyArray[1].host.should.equal("bitbucket.org");
|
||||||
|
sshKeyArray[2].host.should.equal("github.com");
|
||||||
|
});
|
||||||
|
it(".getKey() should get a specific key selected by host",function(){
|
||||||
|
testSshInstance.getKey("github.com").pubKey.should.equal("someGitHubPublicKey");
|
||||||
|
})
|
||||||
|
it(".removeKey() should remove a key",function(){
|
||||||
|
testSshInstance.removeKey(testSshInstance.getKey("bitbucket.org"));
|
||||||
|
testSshInstance.sshKeys[1].host.should.equal("github.com");
|
||||||
|
})
|
||||||
|
});
|
||||||
|
})
|
10
ts/index.ts
10
ts/index.ts
@ -1,3 +1,7 @@
|
|||||||
/// <reference path="./typings/main.d.ts" />
|
import "typings-global"
|
||||||
import plugins = require("./smartssh.plugins");
|
import * as plugins from "./smartssh.plugins";
|
||||||
import classes = require("./smartssh.classes");
|
|
||||||
|
export {SshInstance} from "./smartssh.classes.sshinstance";
|
||||||
|
export {SshKey} from "./smartssh.classes.sshkey";
|
||||||
|
export {SshDir} from "./smartssh.classes.sshdir";
|
||||||
|
export {SshConfig} from "./smartssh.classes.sshconfig";
|
@ -1,8 +1,8 @@
|
|||||||
/// <reference path="./typings/main.d.ts" />
|
import "typings-global"
|
||||||
import plugins = require("./smartssh.plugins");
|
import * as plugins from "./smartssh.plugins";
|
||||||
import classes = require("./smartssh.classes");
|
import {SshKey} from "./smartssh.classes.sshkey";
|
||||||
|
|
||||||
export let sshKeyArrayFromDir = function(dirArg:string):classes.sshKey[]{
|
export let sshKeyArrayFromDir = function(dirArg:string):SshKey[]{
|
||||||
let sshKeyArray = [];
|
let sshKeyArray = []; //TODO
|
||||||
return sshKeyArray;
|
return sshKeyArray;
|
||||||
}
|
}
|
52
ts/smartssh.classes.sshconfig.ts
Normal file
52
ts/smartssh.classes.sshconfig.ts
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import "typings-global";
|
||||||
|
import * as plugins from "./smartssh.plugins";
|
||||||
|
import * as helpers from "./smartssh.classes.helpers";
|
||||||
|
import {SshKey} from "./smartssh.classes.sshkey"
|
||||||
|
|
||||||
|
export class SshConfig {
|
||||||
|
sshKeyArray:SshKey[];
|
||||||
|
constructor(sshKeyArrayArg:SshKey[]){
|
||||||
|
this.sshKeyArray = sshKeyArrayArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* stores a config file
|
||||||
|
*/
|
||||||
|
store(dirPathArg:string){
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
let configArray:configObject[];
|
||||||
|
let configString;
|
||||||
|
for(let key in this.sshKeyArray){
|
||||||
|
let sshKey = this.sshKeyArray[key];
|
||||||
|
if(sshKey.host){
|
||||||
|
configString = "Host " + sshKey.host + "\n" +
|
||||||
|
" HostName " + sshKey.host + "\n" +
|
||||||
|
" IdentityFile ~/.ssh/" + sshKey.host + "\n"
|
||||||
|
}
|
||||||
|
configArray.push({
|
||||||
|
configString:configString,
|
||||||
|
authorized: sshKey.authorized,
|
||||||
|
sshKey: sshKey
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let configFile:string = "";
|
||||||
|
for(let key in configArray){
|
||||||
|
configFile = configFile + configArray[key].configString + "\n";
|
||||||
|
};
|
||||||
|
plugins.smartfile.memory.toFsSync(configFile,dirPathArg);
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
read(dirPathArg){
|
||||||
|
let done = plugins.q.defer();
|
||||||
|
let configArray:configObject[];
|
||||||
|
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
export interface configObject {
|
||||||
|
configString:string;
|
||||||
|
authorized:boolean;
|
||||||
|
sshKey:SshKey;
|
||||||
|
};
|
||||||
|
|
31
ts/smartssh.classes.sshdir.ts
Normal file
31
ts/smartssh.classes.sshdir.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import "typings-global";
|
||||||
|
import * as plugins from "./smartssh.plugins";
|
||||||
|
import * as helpers from "./smartssh.classes.helpers";
|
||||||
|
import {SshInstance} from "./smartssh.classes.sshinstance";
|
||||||
|
import {SshKey} from "./smartssh.classes.sshkey";
|
||||||
|
import {SshConfig} from "./smartssh.classes.sshconfig";
|
||||||
|
export class SshDir { // sshDir class -> NOT EXPORTED, ONLY FOR INTERNAL USE
|
||||||
|
path:string; // the path of the ssh directory
|
||||||
|
private sshKeyArray:SshKey[];
|
||||||
|
private sshConfig:SshConfig;
|
||||||
|
constructor(sshKeyArray:SshKey[],sshConfig:SshConfig,sshDirPathArg?:string){
|
||||||
|
this.sshKeyArray = sshKeyArray;
|
||||||
|
if(sshDirPathArg){
|
||||||
|
this.path = sshDirPathArg;
|
||||||
|
} else {
|
||||||
|
this.path = plugins.path.join(plugins.smartpath.get.home(),".ssh/");
|
||||||
|
};
|
||||||
|
}
|
||||||
|
writeToDir(){ // syncs sshInstance to directory
|
||||||
|
this.sshKeyArray.forEach((sshKeyArg) => {
|
||||||
|
sshKeyArg.store(this.path);
|
||||||
|
});
|
||||||
|
this.sshConfig.store(this.path);
|
||||||
|
};
|
||||||
|
readFromDir(){ // syncs sshInstance from directory
|
||||||
|
|
||||||
|
}
|
||||||
|
getKeys(){
|
||||||
|
return helpers.sshKeyArrayFromDir(this.path);
|
||||||
|
}
|
||||||
|
}
|
103
ts/smartssh.classes.sshinstance.ts
Normal file
103
ts/smartssh.classes.sshinstance.ts
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
import "typings-global"
|
||||||
|
import * as plugins from "./smartssh.plugins";
|
||||||
|
import * as helpers from "./smartssh.classes.helpers";
|
||||||
|
|
||||||
|
import {SshDir} from "./smartssh.classes.sshdir";
|
||||||
|
import {SshConfig} from "./smartssh.classes.sshconfig";
|
||||||
|
import {SshKey} from "./smartssh.classes.sshkey";
|
||||||
|
|
||||||
|
export class SshInstance {
|
||||||
|
private _sshKeyArray:SshKey[]; //holds all ssh keys
|
||||||
|
private _sshConfig:SshConfig; // sshConfig (e.g. represents ~/.ssh/config)
|
||||||
|
private _sshDir:SshDir; // points to sshDir class instance.
|
||||||
|
private _sshSync:boolean; // if set to true, the ssh dir will be kept in sync automatically
|
||||||
|
constructor(optionsArg:{sshDirPath?:string,sshSync?:boolean}={}){
|
||||||
|
optionsArg ? void(0) : optionsArg = {};
|
||||||
|
this._sshKeyArray = [];
|
||||||
|
this._sshConfig = new SshConfig(this._sshKeyArray);
|
||||||
|
this._sshDir = new SshDir(this._sshKeyArray,this._sshConfig,optionsArg.sshDirPath);
|
||||||
|
this._sshSync = optionsArg.sshSync;
|
||||||
|
};
|
||||||
|
|
||||||
|
//altering methods
|
||||||
|
addKey(sshKeyArg:SshKey){
|
||||||
|
this._syncAuto("from");
|
||||||
|
this._sshKeyArray.push(sshKeyArg);
|
||||||
|
this._syncAuto("to");
|
||||||
|
};
|
||||||
|
removeKey(sshKeyArg:SshKey){
|
||||||
|
this._syncAuto("from");
|
||||||
|
let filteredArray = this._sshKeyArray.filter((sshKeyArg2:SshKey) => {
|
||||||
|
return (sshKeyArg != sshKeyArg2);
|
||||||
|
});
|
||||||
|
this._sshKeyArray = filteredArray;
|
||||||
|
this._syncAuto("to");
|
||||||
|
};
|
||||||
|
replaceKey(sshKeyOldArg:SshKey,sshKeyNewArg:SshKey){
|
||||||
|
this._syncAuto("from");
|
||||||
|
this.removeKey(sshKeyOldArg);
|
||||||
|
this.addKey(sshKeyNewArg);
|
||||||
|
this._syncAuto("to");
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
getKey(hostArg:string):SshKey{
|
||||||
|
this._syncAuto("from");
|
||||||
|
let filteredArray = this._sshKeyArray.filter(function(keyArg){
|
||||||
|
return (keyArg.host == hostArg);
|
||||||
|
});
|
||||||
|
if(filteredArray.length > 0){
|
||||||
|
return filteredArray[0];
|
||||||
|
} else {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
get sshKeys():SshKey[] {
|
||||||
|
this._syncAuto("from");
|
||||||
|
return this._sshKeyArray;
|
||||||
|
};
|
||||||
|
|
||||||
|
//FS methods
|
||||||
|
|
||||||
|
/**
|
||||||
|
* write SshInstance to disk
|
||||||
|
*/
|
||||||
|
writeToDisk(){
|
||||||
|
this._sync("to");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* read ab SshInstance from disk
|
||||||
|
*/
|
||||||
|
readFromDisk(){
|
||||||
|
this._sync("from");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===============================================================
|
||||||
|
========================= Private Methods ========================
|
||||||
|
================================================================*/
|
||||||
|
|
||||||
|
private _makeConfig (){
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* method to invoke SshInstance _sync automatically when sshSync is true
|
||||||
|
*/
|
||||||
|
private _syncAuto(directionArg){
|
||||||
|
if(this._sshSync) this._sync(directionArg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* private method to sync SshInstance
|
||||||
|
*/
|
||||||
|
private _sync(directionArg:string){
|
||||||
|
if(directionArg == "from"){
|
||||||
|
this._sshDir.readFromDir(); // call sync method of sshDir class;
|
||||||
|
} else if(directionArg == "to") {
|
||||||
|
this._sshDir.writeToDir();
|
||||||
|
} else {
|
||||||
|
throw new Error("directionArg not recognised. Must be 'to' or 'from'");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
92
ts/smartssh.classes.sshkey.ts
Normal file
92
ts/smartssh.classes.sshkey.ts
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
import "typings-global";
|
||||||
|
import * as plugins from "./smartssh.plugins";
|
||||||
|
import * as helpers from "./smartssh.classes.helpers";
|
||||||
|
|
||||||
|
export class SshKey {
|
||||||
|
private _privKey:string;
|
||||||
|
private _pubKey:string;
|
||||||
|
private _hostVar:string;
|
||||||
|
private _authorized:boolean;
|
||||||
|
constructor(optionsArg:{private?:string,public?:string,host?:string,authorized?:boolean}={}){
|
||||||
|
this._privKey = optionsArg.private;
|
||||||
|
this._pubKey = optionsArg.public;
|
||||||
|
this._hostVar = optionsArg.host;
|
||||||
|
this._authorized = optionsArg.authorized;
|
||||||
|
};
|
||||||
|
|
||||||
|
// this.host
|
||||||
|
get host(){
|
||||||
|
return this._hostVar;
|
||||||
|
};
|
||||||
|
set host(hostArg:string){
|
||||||
|
this._hostVar = hostArg;
|
||||||
|
};
|
||||||
|
|
||||||
|
// this.privKey
|
||||||
|
get privKey(){
|
||||||
|
return this._privKey;
|
||||||
|
};
|
||||||
|
set privKey(privateKeyArg:string){
|
||||||
|
this._privKey = privateKeyArg;
|
||||||
|
};
|
||||||
|
|
||||||
|
// this.privKeyBase64
|
||||||
|
get privKeyBase64(){
|
||||||
|
return plugins.base64.encode(this._privKey);
|
||||||
|
}
|
||||||
|
set privKeyBase64(privateKeyArg:string) {
|
||||||
|
this._privKey = plugins.base64.decode(privateKeyArg);
|
||||||
|
}
|
||||||
|
|
||||||
|
// this.pubKey
|
||||||
|
get pubKey(){
|
||||||
|
return this._pubKey;
|
||||||
|
}
|
||||||
|
set pubKey(publicKeyArg:string){
|
||||||
|
this._pubKey = publicKeyArg;
|
||||||
|
};
|
||||||
|
|
||||||
|
// this.pubKeyBase64
|
||||||
|
get pubKeyBase64(){
|
||||||
|
return plugins.base64.encode(this._pubKey);
|
||||||
|
}
|
||||||
|
set pubKeyBase64(publicKeyArg:string) {
|
||||||
|
this._pubKey = plugins.base64.decode(publicKeyArg);
|
||||||
|
}
|
||||||
|
|
||||||
|
get authorized(){
|
||||||
|
return this._authorized;
|
||||||
|
}
|
||||||
|
set authorized(authorizedArg:boolean){
|
||||||
|
this._authorized = authorizedArg;
|
||||||
|
}
|
||||||
|
get type(){
|
||||||
|
if(this._privKey && this._pubKey){
|
||||||
|
return "duplex";
|
||||||
|
} else if(this._privKey){
|
||||||
|
return "private";
|
||||||
|
} else if(this._pubKey){
|
||||||
|
return "public";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
set type(someVlueArg:any){
|
||||||
|
console.log("the type of an SshKey connot be set. This value is autpcomputed.")
|
||||||
|
}
|
||||||
|
|
||||||
|
// methods
|
||||||
|
read(filePathArg){
|
||||||
|
|
||||||
|
}
|
||||||
|
store(dirPathArg:string){
|
||||||
|
plugins.fs.ensureDirSync(dirPathArg);
|
||||||
|
let fileNameBase = this.host;
|
||||||
|
if(this._privKey){
|
||||||
|
plugins.smartfile.memory.toFsSync(this._privKey,plugins.path.join(dirPathArg,fileNameBase));
|
||||||
|
};
|
||||||
|
if (this._pubKey){
|
||||||
|
plugins.smartfile.memory.toFsSync(this._pubKey,plugins.path.join(dirPathArg,fileNameBase + ".pub"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let testKey = new SshKey();
|
@ -1,78 +0,0 @@
|
|||||||
/// <reference path="./typings/main.d.ts" />
|
|
||||||
import plugins = require("./smartssh.plugins");
|
|
||||||
import helpers = require("./smartssh.classes.helpers");
|
|
||||||
|
|
||||||
export class ssh {
|
|
||||||
private sshDir:string;
|
|
||||||
private sshKeys:sshKey[];
|
|
||||||
private sshSync:boolean; // if set to true, the ssh dir will be kept in sync automatically
|
|
||||||
constructor(optionsArg:{sshDir?:string,sshSync?:boolean}={}){
|
|
||||||
this.sshDir = optionsArg.sshDir
|
|
||||||
this.sshDir ?
|
|
||||||
this.sshKeys = helpers.sshKeyArrayFromDir(this.sshDir)
|
|
||||||
: void(0);
|
|
||||||
this.sshSync = optionsArg.sshSync;
|
|
||||||
};
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export class sshConfig {
|
|
||||||
constructor(){
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export class sshKey {
|
|
||||||
private privKey:string;
|
|
||||||
private pubKey:string;
|
|
||||||
constructor(optionsArg:{private:string,public:string}){
|
|
||||||
if(!optionsArg) optionsArg = {private:undefined,public:undefined};
|
|
||||||
this.privKey = optionsArg.private;
|
|
||||||
this.pubKey = optionsArg.public;
|
|
||||||
};
|
|
||||||
|
|
||||||
// getters
|
|
||||||
get privateKey(){
|
|
||||||
return this.privKey;
|
|
||||||
};
|
|
||||||
get privateKeyBase64(){
|
|
||||||
return plugins.base64.encode(this.privKey);
|
|
||||||
}
|
|
||||||
get publicKey(){
|
|
||||||
return this.publicKey;
|
|
||||||
}
|
|
||||||
get publicKeyBase64(){
|
|
||||||
return plugins.base64.encode(this.pubKey);
|
|
||||||
}
|
|
||||||
get type(){
|
|
||||||
if(this.privKey && this.pubKey){
|
|
||||||
return "duplex";
|
|
||||||
} else if(this.privKey){
|
|
||||||
return "private";
|
|
||||||
} else if(this.pubKey){
|
|
||||||
return "public";
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// setters
|
|
||||||
set privateKey(privateKeyArg:string){
|
|
||||||
this.privKey = privateKeyArg;
|
|
||||||
};
|
|
||||||
// setters
|
|
||||||
set publicKey(publicKeyArg:string){
|
|
||||||
this.pubKey = publicKeyArg;
|
|
||||||
};
|
|
||||||
|
|
||||||
store(filePathArg?:string){
|
|
||||||
let filePathObj = plugins.path.parse(filePathArg);
|
|
||||||
if(filePathObj.ext = ".priv"){
|
|
||||||
plugins.smartfile.memory.toFsSync(this.privKey,{fileName:filePathObj.name + filePathObj.ext,filePath:filePathObj.dir});
|
|
||||||
} else if (filePathObj.ext = ".pub"){
|
|
||||||
plugins.smartfile.memory.toFsSync(this.pubKey,{fileName:filePathObj.name + filePathObj.ext,filePath:filePathObj.dir});
|
|
||||||
} else { //we assume we are given a directory as filePathArg, so we store the whole key
|
|
||||||
plugins.fs.ensureDirSync(filePathObj.dir);
|
|
||||||
this.store(plugins.path.join(filePathObj.dir,"key.priv")); // call this function recursivly
|
|
||||||
this.store(plugins.path.join(filePathObj.dir,"key.priv")); // call this function recursivly
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,6 +1,9 @@
|
|||||||
/// <reference path="./typings/main.d.ts" />
|
import "typings-global"
|
||||||
export let beautylog = require("beautylog");
|
export import beautylog = require("beautylog");
|
||||||
export let base64 = require("js-base64").Base64;
|
export let base64 = require("js-base64").Base64;
|
||||||
export let fs = require("fs-extra");
|
export let fs = require("fs-extra");
|
||||||
export let path = require("path");
|
export let minimatch = require("minimatch");
|
||||||
export let smartfile = require("smartfile");
|
export import path = require("path");
|
||||||
|
export let q = require("q");
|
||||||
|
export import smartfile = require("smartfile");
|
||||||
|
export import smartpath = require("smartpath");
|
@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"version": false,
|
|
||||||
"dependencies": {},
|
|
||||||
"ambientDependencies": {
|
|
||||||
"colors": "registry:dt/colors#0.6.0-1+20160317120654",
|
|
||||||
"node": "registry:dt/node#4.0.0+20160423143914"
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue
Block a user