Compare commits
22 Commits
Author | SHA1 | Date | |
---|---|---|---|
1f1bf7c21f | |||
c652d0bf07 | |||
eccc6294a8 | |||
f8a75a8d42 | |||
d5c2bc1b53 | |||
d577a82a7b | |||
f0b52c8da7 | |||
4cb6aa03e6 | |||
8b85b6c8bc | |||
c032ff69d0 | |||
0454eef45f | |||
def368f8ab | |||
6853fa28b6 | |||
56318f28cf | |||
32b26f21cd | |||
32c2698af7 | |||
27237f14c7 | |||
8f29f234f1 | |||
5091625953 | |||
f74b3a51b0 | |||
062f3ad060 | |||
ecd0fd8fad |
26
.gitignore
vendored
26
.gitignore
vendored
@ -1,8 +1,20 @@
|
|||||||
.idea/
|
.nogit/
|
||||||
node_modules/
|
|
||||||
|
# artifacts
|
||||||
coverage/
|
coverage/
|
||||||
docs/
|
public/
|
||||||
ts/typings/
|
pages/
|
||||||
ts/*.js
|
|
||||||
ts/*.js.map
|
# installs
|
||||||
test/temp/
|
node_modules/
|
||||||
|
|
||||||
|
# caches
|
||||||
|
.yarn/
|
||||||
|
.cache/
|
||||||
|
.rpt2_cache
|
||||||
|
|
||||||
|
# builds
|
||||||
|
dist/
|
||||||
|
dist_*/
|
||||||
|
|
||||||
|
# custom
|
136
.gitlab-ci.yml
136
.gitlab-ci.yml
@ -1,38 +1,128 @@
|
|||||||
image: hosttoday/ht-docker-node:npmts
|
# gitzone ci_default
|
||||||
|
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||||
|
|
||||||
|
cache:
|
||||||
|
paths:
|
||||||
|
- .npmci_cache/
|
||||||
|
key: '$CI_BUILD_STAGE'
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- test
|
- security
|
||||||
- release
|
- test
|
||||||
- page
|
- release
|
||||||
|
- metadata
|
||||||
|
|
||||||
testLTS:
|
before_script:
|
||||||
stage: test
|
- npm install -g @shipzone/npmci
|
||||||
|
|
||||||
|
# ====================
|
||||||
|
# security stage
|
||||||
|
# ====================
|
||||||
|
auditProductionDependencies:
|
||||||
|
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||||
|
stage: security
|
||||||
script:
|
script:
|
||||||
- npmci test lts
|
- npmci npm prepare
|
||||||
|
- npmci command npm install --production --ignore-scripts
|
||||||
|
- npmci command npm config set registry https://registry.npmjs.org
|
||||||
|
- npmci command npm audit --audit-level=high --only=prod --production
|
||||||
tags:
|
tags:
|
||||||
- docker
|
- docker
|
||||||
- lossless
|
|
||||||
|
|
||||||
testSTABLE:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci test stable
|
|
||||||
tags:
|
|
||||||
- docker
|
|
||||||
- lossless
|
|
||||||
|
|
||||||
testLEGACY:
|
|
||||||
stage: test
|
|
||||||
script:
|
|
||||||
- npmci test legacy
|
|
||||||
allow_failure: true
|
allow_failure: true
|
||||||
|
|
||||||
|
auditDevDependencies:
|
||||||
|
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
|
||||||
|
stage: security
|
||||||
|
script:
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci command npm install --ignore-scripts
|
||||||
|
- npmci command npm config set registry https://registry.npmjs.org
|
||||||
|
- npmci command npm audit --audit-level=high --only=dev
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
allow_failure: true
|
||||||
|
|
||||||
|
# ====================
|
||||||
|
# test stage
|
||||||
|
# ====================
|
||||||
|
|
||||||
|
testStable:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci node install stable
|
||||||
|
- npmci npm install
|
||||||
|
- npmci npm test
|
||||||
|
coverage: /\d+.?\d+?\%\s*coverage/
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
|
||||||
|
testBuild:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci node install stable
|
||||||
|
- npmci npm install
|
||||||
|
- npmci command npm run build
|
||||||
|
coverage: /\d+.?\d+?\%\s*coverage/
|
||||||
|
tags:
|
||||||
|
- docker
|
||||||
|
|
||||||
release:
|
release:
|
||||||
stage: release
|
stage: release
|
||||||
script:
|
script:
|
||||||
- npmci publish
|
- npmci node install stable
|
||||||
|
- npmci npm publish
|
||||||
only:
|
only:
|
||||||
- tags
|
- tags
|
||||||
tags:
|
tags:
|
||||||
- docker
|
|
||||||
- lossless
|
- lossless
|
||||||
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
|
# ====================
|
||||||
|
# metadata stage
|
||||||
|
# ====================
|
||||||
|
codequality:
|
||||||
|
stage: metadata
|
||||||
|
allow_failure: true
|
||||||
|
only:
|
||||||
|
- tags
|
||||||
|
script:
|
||||||
|
- npmci command npm install -g typescript
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci npm install
|
||||||
|
tags:
|
||||||
|
- lossless
|
||||||
|
- docker
|
||||||
|
- priv
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
stage: metadata
|
||||||
|
script:
|
||||||
|
- npmci trigger
|
||||||
|
only:
|
||||||
|
- tags
|
||||||
|
tags:
|
||||||
|
- lossless
|
||||||
|
- docker
|
||||||
|
- notpriv
|
||||||
|
|
||||||
|
pages:
|
||||||
|
stage: metadata
|
||||||
|
script:
|
||||||
|
- npmci node install stable
|
||||||
|
- npmci npm prepare
|
||||||
|
- npmci npm install
|
||||||
|
- npmci command npm run buildDocs
|
||||||
|
tags:
|
||||||
|
- lossless
|
||||||
|
- docker
|
||||||
|
- notpriv
|
||||||
|
only:
|
||||||
|
- tags
|
||||||
|
artifacts:
|
||||||
|
expire_in: 1 week
|
||||||
|
paths:
|
||||||
|
- public
|
||||||
|
allow_failure: true
|
||||||
|
12
.travis.yml
12
.travis.yml
@ -1,12 +0,0 @@
|
|||||||
language: node_js
|
|
||||||
node_js:
|
|
||||||
- '4'
|
|
||||||
- stable
|
|
||||||
deploy:
|
|
||||||
provider: npm
|
|
||||||
email: npm@lossless.digital
|
|
||||||
api_key:
|
|
||||||
secure: xApCMlDyZcTOgq+iomxR2A/2aMBhhPpgEBxdFYqXDNC/AGkr+NQJhGt67W4840FMrSUFEDZNQhOS+t6gYMqxUHv+vJFc0cHskFSuLDnAH2MS45TqtFYNcP+GARs1suuM9Il5hXNEvjVJ6XF0lYlNlK8mJstKQscdEKWyBHj42oSsgWRcuzBgqps8Vnbp+Ey2Bpfaw1yV+P1fyv8dNnkwG5dSt3EIxAcbGiMOhCz0u6oMroKfAYfNTxMJjja2uJJOqoTTShzeMyIYx+YwxorcZGfchI+TOPHHeVc+fByCHfzTZJYCy9qTSSTvWcKD/H7q3RGciEXHzhwMj0d8dlY3WPHC6BBliD6bLwVgDmToD3cdHm8OLsxW7hjFLO51vOIbhJZrWBVztlusuLwuyVAlIgeAsV8Yb5FxetxZmBU42qr5itykPl45rNd7talI0ZcoFPRTAWxxmCD8hp0d3ZLdjcEdbCzc5GYmEFN0NwKLTZF3Q1G4UbsHMgN8Pe4ohjdaYYhJ7RKgbmLR0J4NBrWIAUOhDaUTkZhgsHFyEmtbKI6JkxQtwCEBBBursemZWFQSIdtj2+O/RBaBCgoUNIpxUDBFq+D3Pir7BZP7DK2m3Otl0F9aCdqJmhCc7rOn3MueLpmndjtO1RFteXAdAkDxKp2RehIB6yohxbRmQ1O9PsA=
|
|
||||||
on:
|
|
||||||
tags: true
|
|
||||||
repo: pushrocks/smartssh
|
|
11
.vscode/launch.json
vendored
Normal file
11
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
{
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"command": "npm test",
|
||||||
|
"name": "Run npm test",
|
||||||
|
"request": "launch",
|
||||||
|
"type": "node-terminal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
26
.vscode/settings.json
vendored
Normal file
26
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
{
|
||||||
|
"json.schemas": [
|
||||||
|
{
|
||||||
|
"fileMatch": ["/npmextra.json"],
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"npmci": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for npmci"
|
||||||
|
},
|
||||||
|
"gitzone": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "settings for gitzone",
|
||||||
|
"properties": {
|
||||||
|
"projectType": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["website", "element", "service", "npm", "wcc"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -1,5 +0,0 @@
|
|||||||
FROM hosttoday/ht-docker-node:npmts
|
|
||||||
COPY ./ /node-app
|
|
||||||
WORKDIR /node-app
|
|
||||||
RUN npm install
|
|
||||||
RUN npmts
|
|
2
LICENSE
2
LICENSE
@ -1,6 +1,6 @@
|
|||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2016 Push.Rocks
|
Copyright (c) 2016 Lossless GmbH
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
34
README.md
34
README.md
@ -1,34 +0,0 @@
|
|||||||
# smartssh
|
|
||||||
setups SSH quickly and in a painless manner
|
|
||||||
|
|
||||||
> Attention: This is still alpha, so some things won't work, not all things are inplemented.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var smartssh = require("smartssh");
|
|
||||||
var sshInstance = new smartssh.sshInstance({
|
|
||||||
sshDir: "/some/path/.ssh", // the standard ssh directory, optional, defaults to "~./.ssh"
|
|
||||||
sshSync: true // sync ssh this instance will represent the status of an ssh dir if set to true;
|
|
||||||
});
|
|
||||||
|
|
||||||
sshInstance.addKey(new smartssh.sshKey({
|
|
||||||
private: "somestring",
|
|
||||||
public: "somestring", // optional
|
|
||||||
host:"github.com",
|
|
||||||
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({
|
|
||||||
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
|
|
||||||
host:"github.com"
|
|
||||||
});
|
|
||||||
|
|
||||||
sshInstance.getKeys() // returns array of all available getKeys. Each key is in form of class sshKey
|
|
||||||
|
|
||||||
```
|
|
5
dist/index.d.ts
vendored
5
dist/index.d.ts
vendored
@ -1,5 +0,0 @@
|
|||||||
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";
|
|
12
dist/index.js
vendored
12
dist/index.js
vendored
@ -1,12 +0,0 @@
|
|||||||
"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;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImluZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxRQUFPLGdCQUNQLENBQUMsQ0FEc0I7QUFHdkIsNkNBQTBCLGdDQUFnQyxDQUFDO0FBQW5ELGlFQUFtRDtBQUMzRCx3Q0FBcUIsMkJBQTJCLENBQUM7QUFBekMsa0RBQXlDO0FBQ2pELHdDQUFxQiwyQkFBMkIsQ0FBQztBQUF6QyxrREFBeUM7QUFDakQsMkNBQXdCLDhCQUE4QixDQUFDO0FBQS9DLDJEQUErQyIsImZpbGUiOiJpbmRleC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBcInR5cGluZ3MtZ2xvYmFsXCJcbmltcG9ydCAqIGFzIHBsdWdpbnMgZnJvbSBcIi4vc21hcnRzc2gucGx1Z2luc1wiO1xuXG5leHBvcnQge1NzaEluc3RhbmNlfSBmcm9tIFwiLi9zbWFydHNzaC5jbGFzc2VzLnNzaGluc3RhbmNlXCI7XG5leHBvcnQge1NzaEtleX0gZnJvbSBcIi4vc21hcnRzc2guY2xhc3Nlcy5zc2hrZXlcIjtcbmV4cG9ydCB7U3NoRGlyfSBmcm9tIFwiLi9zbWFydHNzaC5jbGFzc2VzLnNzaGRpclwiO1xuZXhwb3J0IHtTc2hDb25maWd9IGZyb20gXCIuL3NtYXJ0c3NoLmNsYXNzZXMuc3NoY29uZmlnXCI7Il19
|
|
3
dist/smartssh.classes.helpers.d.ts
vendored
3
dist/smartssh.classes.helpers.d.ts
vendored
@ -1,3 +0,0 @@
|
|||||||
import "typings-global";
|
|
||||||
import { SshKey } from "./smartssh.classes.sshkey";
|
|
||||||
export declare let sshKeyArrayFromDir: (dirArg: string) => SshKey[];
|
|
8
dist/smartssh.classes.helpers.js
vendored
8
dist/smartssh.classes.helpers.js
vendored
@ -1,8 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
require("typings-global");
|
|
||||||
exports.sshKeyArrayFromDir = function (dirArg) {
|
|
||||||
var sshKeyArray = []; //TODO
|
|
||||||
return sshKeyArray;
|
|
||||||
};
|
|
||||||
|
|
||||||
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNtYXJ0c3NoLmNsYXNzZXMuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsUUFBTyxnQkFDUCxDQUFDLENBRHNCO0FBSVosMEJBQWtCLEdBQUcsVUFBUyxNQUFhO0lBQ2xELElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQyxDQUFDLE1BQU07SUFDNUIsTUFBTSxDQUFDLFdBQVcsQ0FBQztBQUN2QixDQUFDLENBQUEiLCJmaWxlIjoic21hcnRzc2guY2xhc3Nlcy5oZWxwZXJzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy1nbG9iYWxcIlxuaW1wb3J0ICogYXMgcGx1Z2lucyBmcm9tIFwiLi9zbWFydHNzaC5wbHVnaW5zXCI7XG5pbXBvcnQge1NzaEtleX0gZnJvbSBcIi4vc21hcnRzc2guY2xhc3Nlcy5zc2hrZXlcIjtcblxuZXhwb3J0IGxldCBzc2hLZXlBcnJheUZyb21EaXIgPSBmdW5jdGlvbihkaXJBcmc6c3RyaW5nKTpTc2hLZXlbXXtcbiAgICBsZXQgc3NoS2V5QXJyYXkgPSBbXTsgLy9UT0RPXG4gICAgcmV0dXJuIHNzaEtleUFycmF5O1xufSJdfQ==
|
|
16
dist/smartssh.classes.sshconfig.d.ts
vendored
16
dist/smartssh.classes.sshconfig.d.ts
vendored
@ -1,16 +0,0 @@
|
|||||||
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
47
dist/smartssh.classes.sshconfig.js
vendored
@ -1,47 +0,0 @@
|
|||||||
"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
12
dist/smartssh.classes.sshdir.d.ts
vendored
@ -1,12 +0,0 @@
|
|||||||
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
33
dist/smartssh.classes.sshdir.js
vendored
@ -1,33 +0,0 @@
|
|||||||
"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
34
dist/smartssh.classes.sshinstance.d.ts
vendored
@ -1,34 +0,0 @@
|
|||||||
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
105
dist/smartssh.classes.sshinstance.js
vendored
File diff suppressed because one or more lines are too long
22
dist/smartssh.classes.sshkey.d.ts
vendored
22
dist/smartssh.classes.sshkey.d.ts
vendored
@ -1,22 +0,0 @@
|
|||||||
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
121
dist/smartssh.classes.sshkey.js
vendored
File diff suppressed because one or more lines are too long
9
dist/smartssh.plugins.d.ts
vendored
9
dist/smartssh.plugins.d.ts
vendored
@ -1,9 +0,0 @@
|
|||||||
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");
|
|
12
dist/smartssh.plugins.js
vendored
12
dist/smartssh.plugins.js
vendored
@ -1,12 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
require("typings-global");
|
|
||||||
exports.beautylog = require("beautylog");
|
|
||||||
exports.base64 = require("js-base64").Base64;
|
|
||||||
exports.fs = require("fs-extra");
|
|
||||||
exports.minimatch = require("minimatch");
|
|
||||||
exports.path = require("path");
|
|
||||||
exports.q = require("q");
|
|
||||||
exports.smartfile = require("smartfile");
|
|
||||||
exports.smartpath = require("smartpath");
|
|
||||||
|
|
||||||
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNtYXJ0c3NoLnBsdWdpbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLFFBQU8sZ0JBQ1AsQ0FBQyxDQURzQjtBQUNULGlCQUFTLFdBQVcsV0FBVyxDQUFDLENBQUM7QUFDcEMsY0FBTSxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFDckMsVUFBRSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN6QixpQkFBUyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUM5QixZQUFJLFdBQVcsTUFBTSxDQUFDLENBQUM7QUFDMUIsU0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNkLGlCQUFTLFdBQVcsV0FBVyxDQUFDLENBQUM7QUFDakMsaUJBQVMsV0FBVyxXQUFXLENBQUMsQ0FBQyIsImZpbGUiOiJzbWFydHNzaC5wbHVnaW5zLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwidHlwaW5ncy1nbG9iYWxcIlxuZXhwb3J0IGltcG9ydCBiZWF1dHlsb2cgPSByZXF1aXJlKFwiYmVhdXR5bG9nXCIpO1xuZXhwb3J0IGxldCBiYXNlNjQgPSByZXF1aXJlKFwianMtYmFzZTY0XCIpLkJhc2U2NDtcbmV4cG9ydCBsZXQgZnMgPSByZXF1aXJlKFwiZnMtZXh0cmFcIik7XG5leHBvcnQgbGV0IG1pbmltYXRjaCA9IHJlcXVpcmUoXCJtaW5pbWF0Y2hcIik7XG5leHBvcnQgaW1wb3J0IHBhdGggPSByZXF1aXJlKFwicGF0aFwiKTtcbmV4cG9ydCBsZXQgcSA9IHJlcXVpcmUoXCJxXCIpO1xuZXhwb3J0IGltcG9ydCBzbWFydGZpbGUgPSByZXF1aXJlKFwic21hcnRmaWxlXCIpO1xuZXhwb3J0IGltcG9ydCBzbWFydHBhdGggPSByZXF1aXJlKFwic21hcnRwYXRoXCIpOyJdfQ==
|
|
17
npmextra.json
Normal file
17
npmextra.json
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
{
|
||||||
|
"npmci": {
|
||||||
|
"npmGlobalTools": [],
|
||||||
|
"npmAccessLevel": "public"
|
||||||
|
},
|
||||||
|
"gitzone": {
|
||||||
|
"projectType": "npm",
|
||||||
|
"module": {
|
||||||
|
"githost": "gitlab.com",
|
||||||
|
"gitscope": "pushrocks",
|
||||||
|
"gitrepo": "smartssh",
|
||||||
|
"description": "setups SSH quickly and in a painless manner",
|
||||||
|
"npmPackagename": "@pushrocks/smartssh",
|
||||||
|
"license": "MIT"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,4 +0,0 @@
|
|||||||
{
|
|
||||||
"mode":"default",
|
|
||||||
"coverageTreshold":50
|
|
||||||
}
|
|
12983
package-lock.json
generated
Normal file
12983
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
57
package.json
57
package.json
@ -1,11 +1,16 @@
|
|||||||
{
|
{
|
||||||
"name": "smartssh",
|
"name": "@pushrocks/smartssh",
|
||||||
"version": "1.1.3",
|
"version": "1.2.7",
|
||||||
|
"private": false,
|
||||||
"description": "setups SSH quickly and in a painless manner",
|
"description": "setups SSH quickly and in a painless manner",
|
||||||
"main": "dist/index.js",
|
"main": "dist_ts/index.js",
|
||||||
"typings": "dist/index.d.ts",
|
"typings": "dist_ts/index.d.ts",
|
||||||
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "(npmts)"
|
"test": "(tstest test/)",
|
||||||
|
"testDocker": "tsdocker",
|
||||||
|
"build": "(tsbuild --allowimplicitany)",
|
||||||
|
"buildDocs": "tsdoc"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
@ -23,18 +28,36 @@
|
|||||||
},
|
},
|
||||||
"homepage": "https://gitlab.com/pushrocks/smartssh#readme",
|
"homepage": "https://gitlab.com/pushrocks/smartssh#readme",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"beautylog": "^5.0.12",
|
"@pushrocks/smartfile": "^10.0.5",
|
||||||
"fs-extra": "^0.30.0",
|
"@pushrocks/smartpath": "^5.0.5",
|
||||||
"js-base64": "^2.1.9",
|
"@pushrocks/smartpromise": "^3.0.2",
|
||||||
"minimatch": "^3.0.2",
|
"@pushrocks/smartshell": "^2.0.23",
|
||||||
"q": "^1.4.1",
|
"@pushrocks/smartstring": "^4.0.5",
|
||||||
"smartfile": "^4.0.5",
|
"@types/fs-extra": "^9.0.13",
|
||||||
"smartpath": "^3.2.2",
|
"@types/minimatch": "^5.1.2",
|
||||||
"typings-global": "^1.0.3",
|
"fs-extra": "^10.1.0",
|
||||||
"typings-test": "^1.0.1"
|
"minimatch": "^5.1.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"npmts-g": "^5.2.6",
|
"@gitzone/tsbuild": "^2.1.11",
|
||||||
"should": "^9.0.2"
|
"@gitzone/tsrun": "^1.2.6",
|
||||||
}
|
"@gitzone/tstest": "^1.0.24",
|
||||||
|
"@pushrocks/tapbundle": "^5.0.4",
|
||||||
|
"@types/node": "^18.8.4"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"ts/**/*",
|
||||||
|
"ts_web/**/*",
|
||||||
|
"dist/**/*",
|
||||||
|
"dist_*/**/*",
|
||||||
|
"dist_ts/**/*",
|
||||||
|
"dist_ts_web/**/*",
|
||||||
|
"assets/**/*",
|
||||||
|
"cli.js",
|
||||||
|
"npmextra.json",
|
||||||
|
"readme.md"
|
||||||
|
],
|
||||||
|
"browserslist": [
|
||||||
|
"last 1 chrome versions"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
|
4213
pnpm-lock.yaml
generated
Normal file
4213
pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
68
readme.md
Normal file
68
readme.md
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
# @pushrocks/smartssh
|
||||||
|
setups SSH quickly and in a painless manner
|
||||||
|
|
||||||
|
## Availabililty and Links
|
||||||
|
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/smartssh)
|
||||||
|
* [gitlab.com (source)](https://gitlab.com/pushrocks/smartssh)
|
||||||
|
* [github.com (source mirror)](https://github.com/pushrocks/smartssh)
|
||||||
|
* [docs (typedoc)](https://pushrocks.gitlab.io/smartssh/)
|
||||||
|
|
||||||
|
## Status for master
|
||||||
|
|
||||||
|
Status Category | Status Badge
|
||||||
|
-- | --
|
||||||
|
GitLab Pipelines | [](https://lossless.cloud)
|
||||||
|
GitLab Pipline Test Coverage | [](https://lossless.cloud)
|
||||||
|
npm | [](https://lossless.cloud)
|
||||||
|
Snyk | [](https://lossless.cloud)
|
||||||
|
TypeScript Support | [](https://lossless.cloud)
|
||||||
|
node Support | [](https://nodejs.org/dist/latest-v10.x/docs/api/)
|
||||||
|
Code Style | [](https://lossless.cloud)
|
||||||
|
PackagePhobia (total standalone install weight) | [](https://lossless.cloud)
|
||||||
|
PackagePhobia (package size on registry) | [](https://lossless.cloud)
|
||||||
|
BundlePhobia (total size when bundled) | [](https://lossless.cloud)
|
||||||
|
Platform support | [](https://lossless.cloud) [](https://lossless.cloud)
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
var smartssh = require('smartssh');
|
||||||
|
var sshInstance = new smartssh.sshInstance({
|
||||||
|
sshDir: '/some/path/.ssh', // the standard ssh directory, optional, defaults to "~./.ssh"
|
||||||
|
sshSync: true, // sync ssh this instance will represent the status of an ssh dir if set to true;
|
||||||
|
});
|
||||||
|
|
||||||
|
sshInstance.addKey(
|
||||||
|
new smartssh.sshKey({
|
||||||
|
private: 'somestring',
|
||||||
|
public: 'somestring', // optional
|
||||||
|
host: 'github.com',
|
||||||
|
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({
|
||||||
|
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
|
||||||
|
host: 'github.com',
|
||||||
|
});
|
||||||
|
|
||||||
|
sshInstance.getKeys(); // returns array of all available getKeys. Each key is in form of class sshKey
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## Contribution
|
||||||
|
|
||||||
|
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
|
||||||
|
|
||||||
|
For further information read the linked docs at the top of this readme.
|
||||||
|
|
||||||
|
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
|
||||||
|
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
|
||||||
|
|
||||||
|
[](https://maintainedby.lossless.com)
|
1
test/temp/bitbucket.org
Normal file
1
test/temp/bitbucket.org
Normal file
@ -0,0 +1 @@
|
|||||||
|
somePrivateKey
|
1
test/temp/bitbucket.org.pub
Normal file
1
test/temp/bitbucket.org.pub
Normal file
@ -0,0 +1 @@
|
|||||||
|
somePublicKey
|
15
test/temp/config
Normal file
15
test/temp/config
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
Host gitlab.com
|
||||||
|
HostName gitlab.com
|
||||||
|
IdentityFile ~/.ssh/gitlab.com
|
||||||
|
StrictHostKeyChecking no
|
||||||
|
|
||||||
|
Host bitbucket.org
|
||||||
|
HostName bitbucket.org
|
||||||
|
IdentityFile ~/.ssh/bitbucket.org
|
||||||
|
StrictHostKeyChecking no
|
||||||
|
|
||||||
|
Host github.com
|
||||||
|
HostName github.com
|
||||||
|
IdentityFile ~/.ssh/github.com
|
||||||
|
StrictHostKeyChecking no
|
||||||
|
|
1
test/temp/example.com
Normal file
1
test/temp/example.com
Normal file
@ -0,0 +1 @@
|
|||||||
|
someExamplePrivateKey
|
1
test/temp/example.com.pub
Normal file
1
test/temp/example.com.pub
Normal file
@ -0,0 +1 @@
|
|||||||
|
someExamplePublicKey
|
1
test/temp/github.com
Normal file
1
test/temp/github.com
Normal file
@ -0,0 +1 @@
|
|||||||
|
someGitHubPrivateKey
|
1
test/temp/github.com.pub
Normal file
1
test/temp/github.com.pub
Normal file
@ -0,0 +1 @@
|
|||||||
|
someGitHubPublicKey
|
1
test/temp/gitlab.com
Normal file
1
test/temp/gitlab.com
Normal file
@ -0,0 +1 @@
|
|||||||
|
somePrivateKey
|
1
test/temp/gitlab.com.pub
Normal file
1
test/temp/gitlab.com.pub
Normal file
@ -0,0 +1 @@
|
|||||||
|
somePublicKey
|
2
test/test.d.ts
vendored
2
test/test.d.ts
vendored
@ -1,2 +0,0 @@
|
|||||||
import "typings-test";
|
|
||||||
import "should";
|
|
73
test/test.js
73
test/test.js
File diff suppressed because one or more lines are too long
154
test/test.ts
154
test/test.ts
@ -1,70 +1,84 @@
|
|||||||
import "typings-test"
|
import { expect, tap } from '@pushrocks/tapbundle';
|
||||||
import "should";
|
import * as smartssh from '../ts/index.js';
|
||||||
import smartssh = require("../dist/index");
|
import * as path from 'path';
|
||||||
import path = require("path");
|
|
||||||
describe("smartssh",function(){
|
let testSshInstance: smartssh.SshInstance;
|
||||||
let testSshInstance:smartssh.SshInstance;
|
let testSshKey: smartssh.SshKey;
|
||||||
let testSshKey:smartssh.SshKey;
|
tap.test('should create a valid SshKey object', async () => {
|
||||||
describe(".SshKey",function(){
|
testSshKey = new smartssh.SshKey({
|
||||||
it("'new' keyword should create a valid SshKey object",function(){
|
host: 'example.com',
|
||||||
testSshKey = new smartssh.SshKey({
|
private: 'someExamplePrivateKey',
|
||||||
host:"example.com",
|
public: 'someExamplePublicKey',
|
||||||
private:"someExamplePrivateKey",
|
});
|
||||||
public:"someExamplePublicKey"
|
expect(testSshKey).toBeInstanceOf(smartssh.SshKey);
|
||||||
});
|
});
|
||||||
testSshKey.should.be.instanceof(smartssh.SshKey);
|
tap.test('.type should be a valid type', async () => {
|
||||||
});
|
expect(testSshKey.type).toEqual('duplex');
|
||||||
it(".type should be a valid type",function(){
|
});
|
||||||
testSshKey.type.should.equal("duplex");
|
tap.test('.publicKey should be public key', async () => {
|
||||||
});
|
expect(testSshKey.pubKey).toEqual('someExamplePublicKey');
|
||||||
it(".publicKey should be public key",function(){
|
});
|
||||||
testSshKey.pubKey.should.equal("someExamplePublicKey");
|
tap.test('.privateKey should be private key', async () => {
|
||||||
});
|
expect(testSshKey.privKey).toEqual('someExamplePrivateKey');
|
||||||
it(".privateKey should be private key",function(){
|
});
|
||||||
testSshKey.privKey.should.equal("someExamplePrivateKey");
|
tap.test('.publicKeyBase64 should be public key base 64 encoded', async () => {
|
||||||
});
|
// tslint:disable-next-line:no-unused-expression
|
||||||
it(".publicKeyBase64 should be public key base 64 encoded",function(){
|
testSshKey.pubKeyBase64;
|
||||||
testSshKey.pubKeyBase64;
|
});
|
||||||
});
|
tap.test('.store() should store the file to disk', async () => {
|
||||||
it(".store() should store the file to disk",function(){
|
testSshKey.store(path.join(process.cwd(), 'test/temp'));
|
||||||
testSshKey.store(path.join(process.cwd(),"test/temp"));
|
});
|
||||||
})
|
|
||||||
});
|
// SSH INstance
|
||||||
describe(".SshInstance",function(){
|
tap.test("'new' keyword should create a new SshInstance object from class", async () => {
|
||||||
it("'new' keyword should create a new SshInstance object from class",function(){
|
testSshInstance = new smartssh.SshInstance({
|
||||||
testSshInstance = new smartssh.SshInstance();
|
sshDirPath: path.join(process.cwd(), 'test/temp/'),
|
||||||
testSshInstance.should.be.instanceof(smartssh.SshInstance);
|
});
|
||||||
});
|
expect(testSshInstance).toBeInstanceOf(smartssh.SshInstance);
|
||||||
it(".addKey() should accept a new SshKey object",function(){
|
});
|
||||||
testSshInstance.addKey(new smartssh.SshKey({
|
tap.test('.addKey() should accept a new SshKey object', async () => {
|
||||||
public:"somePublicKey",
|
testSshInstance.addKey(
|
||||||
private:"somePrivateKey",
|
new smartssh.SshKey({
|
||||||
host:"gitlab.com"
|
public: 'somePublicKey',
|
||||||
}));
|
private: 'somePrivateKey',
|
||||||
testSshInstance.addKey(new smartssh.SshKey({
|
host: 'gitlab.com',
|
||||||
public:"somePublicKey",
|
})
|
||||||
private:"somePrivateKey",
|
);
|
||||||
host:"bitbucket.org"
|
testSshInstance.addKey(
|
||||||
}));
|
new smartssh.SshKey({
|
||||||
testSshInstance.addKey(new smartssh.SshKey({
|
public: 'somePublicKey',
|
||||||
public:"someGitHubPublicKey",
|
private: 'somePrivateKey',
|
||||||
private:"someGitHubPrivateKey",
|
host: 'bitbucket.org',
|
||||||
host:"github.com"
|
})
|
||||||
}));
|
);
|
||||||
});
|
testSshInstance.addKey(
|
||||||
it(".sshKeys should point to an array of sshKeys",function(){
|
new smartssh.SshKey({
|
||||||
let sshKeyArray = testSshInstance.sshKeys;
|
public: 'someGitHubPublicKey',
|
||||||
sshKeyArray.should.be.Array();
|
private: 'someGitHubPrivateKey',
|
||||||
sshKeyArray[0].host.should.equal("gitlab.com");
|
host: 'github.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");
|
tap.test('.sshKeys should point to an array of sshKeys', async () => {
|
||||||
})
|
let sshKeyArray = testSshInstance.sshKeys;
|
||||||
it(".removeKey() should remove a key",function(){
|
expect(sshKeyArray).toBeInstanceOf(Array);
|
||||||
testSshInstance.removeKey(testSshInstance.getKey("bitbucket.org"));
|
expect(sshKeyArray[0].host).toEqual('gitlab.com');
|
||||||
testSshInstance.sshKeys[1].host.should.equal("github.com");
|
expect(sshKeyArray[1].host).toEqual('bitbucket.org');
|
||||||
})
|
expect(sshKeyArray[2].host).toEqual('github.com');
|
||||||
});
|
});
|
||||||
})
|
|
||||||
|
tap.test('.getKey() should get a specific key selected by host', async () => {
|
||||||
|
expect(testSshInstance.getKey('github.com').pubKey).toEqual('someGitHubPublicKey');
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('.removeKey() should remove a key', async () => {
|
||||||
|
testSshInstance.removeKey(testSshInstance.getKey('bitbucket.org'));
|
||||||
|
expect(testSshInstance.sshKeys[1].host).toEqual('github.com');
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.test('it should store to disk', async () => {
|
||||||
|
testSshInstance.writeToDisk();
|
||||||
|
});
|
||||||
|
|
||||||
|
tap.start();
|
||||||
|
8
ts/00_commitinfo_data.ts
Normal file
8
ts/00_commitinfo_data.ts
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
/**
|
||||||
|
* autocreated commitinfo by @pushrocks/commitinfo
|
||||||
|
*/
|
||||||
|
export const commitinfo = {
|
||||||
|
name: '@pushrocks/smartssh',
|
||||||
|
version: '1.2.7',
|
||||||
|
description: 'setups SSH quickly and in a painless manner'
|
||||||
|
}
|
11
ts/index.ts
11
ts/index.ts
@ -1,7 +1,6 @@
|
|||||||
import "typings-global"
|
import * as plugins from './smartssh.plugins.js';
|
||||||
import * as plugins from "./smartssh.plugins";
|
|
||||||
|
|
||||||
export {SshInstance} from "./smartssh.classes.sshinstance";
|
export { SshInstance } from './smartssh.classes.sshinstance.js';
|
||||||
export {SshKey} from "./smartssh.classes.sshkey";
|
export { SshKey } from './smartssh.classes.sshkey.js';
|
||||||
export {SshDir} from "./smartssh.classes.sshdir";
|
export { SshDir } from './smartssh.classes.sshdir.js';
|
||||||
export {SshConfig} from "./smartssh.classes.sshconfig";
|
export { SshConfig } from './smartssh.classes.sshconfig.js';
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
import "typings-global"
|
import * as plugins from './smartssh.plugins.js';
|
||||||
import * as plugins from "./smartssh.plugins";
|
import { SshKey } from './smartssh.classes.sshkey.js';
|
||||||
import {SshKey} from "./smartssh.classes.sshkey";
|
|
||||||
|
|
||||||
export let sshKeyArrayFromDir = function(dirArg:string):SshKey[]{
|
export let sshKeyArrayFromDir = function (dirArg: string): SshKey[] {
|
||||||
let sshKeyArray = []; //TODO
|
let sshKeyArray = []; // TODO
|
||||||
return sshKeyArray;
|
return sshKeyArray;
|
||||||
}
|
};
|
||||||
|
@ -1,52 +1,60 @@
|
|||||||
import "typings-global";
|
import * as plugins from './smartssh.plugins.js';
|
||||||
import * as plugins from "./smartssh.plugins";
|
import * as helpers from './smartssh.classes.helpers.js';
|
||||||
import * as helpers from "./smartssh.classes.helpers";
|
import { SshKey } from './smartssh.classes.sshkey.js';
|
||||||
import {SshKey} from "./smartssh.classes.sshkey"
|
|
||||||
|
|
||||||
export class SshConfig {
|
export class SshConfig {
|
||||||
sshKeyArray:SshKey[];
|
private _sshKeyArray: SshKey[];
|
||||||
constructor(sshKeyArrayArg:SshKey[]){
|
constructor(sshKeyArrayArg: SshKey[]) {
|
||||||
this.sshKeyArray = sshKeyArrayArg;
|
this._sshKeyArray = sshKeyArrayArg;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* stores a config file
|
* stores a config file
|
||||||
*/
|
*/
|
||||||
store(dirPathArg:string){
|
store(dirPathArg: string) {
|
||||||
let done = plugins.q.defer();
|
let done = plugins.smartpromise.defer();
|
||||||
let configArray:configObject[];
|
let configArray: configObject[] = [];
|
||||||
let configString;
|
let configString;
|
||||||
for(let key in this.sshKeyArray){
|
for (let key in this._sshKeyArray) {
|
||||||
let sshKey = this.sshKeyArray[key];
|
let sshKey = this._sshKeyArray[key];
|
||||||
if(sshKey.host){
|
if (sshKey.host) {
|
||||||
configString = "Host " + sshKey.host + "\n" +
|
configString =
|
||||||
" HostName " + sshKey.host + "\n" +
|
'Host ' +
|
||||||
" IdentityFile ~/.ssh/" + sshKey.host + "\n"
|
sshKey.host +
|
||||||
}
|
'\n' +
|
||||||
configArray.push({
|
' HostName ' +
|
||||||
configString:configString,
|
sshKey.host +
|
||||||
authorized: sshKey.authorized,
|
'\n' +
|
||||||
sshKey: sshKey
|
' IdentityFile ~/.ssh/' +
|
||||||
});
|
sshKey.host +
|
||||||
}
|
'\n' +
|
||||||
let configFile:string = "";
|
' StrictHostKeyChecking no' +
|
||||||
for(let key in configArray){
|
'\n';
|
||||||
configFile = configFile + configArray[key].configString + "\n";
|
}
|
||||||
};
|
configArray.push({
|
||||||
plugins.smartfile.memory.toFsSync(configFile,dirPathArg);
|
configString: configString,
|
||||||
return done.promise;
|
authorized: sshKey.authorized,
|
||||||
|
sshKey: sshKey,
|
||||||
|
});
|
||||||
}
|
}
|
||||||
read(dirPathArg){
|
let configFile: string = '';
|
||||||
let done = plugins.q.defer();
|
for (let key in configArray) {
|
||||||
let configArray:configObject[];
|
configFile = configFile + configArray[key].configString + '\n';
|
||||||
|
|
||||||
return done.promise;
|
|
||||||
}
|
}
|
||||||
};
|
plugins.smartfile.memory.toFsSync(configFile, plugins.path.join(dirPathArg, 'config'));
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
read(dirPathArg) {
|
||||||
|
let done = plugins.smartpromise.defer();
|
||||||
|
let configArray: configObject[];
|
||||||
|
plugins.smartfile.fs.toStringSync(plugins.path.join(dirPathArg, 'config'));
|
||||||
|
|
||||||
|
return done.promise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export interface configObject {
|
export interface configObject {
|
||||||
configString:string;
|
configString: string;
|
||||||
authorized:boolean;
|
authorized: boolean;
|
||||||
sshKey:SshKey;
|
sshKey: SshKey;
|
||||||
};
|
}
|
||||||
|
|
||||||
|
@ -1,31 +1,47 @@
|
|||||||
import "typings-global";
|
import * as plugins from './smartssh.plugins.js';
|
||||||
import * as plugins from "./smartssh.plugins";
|
import * as helpers from './smartssh.classes.helpers.js';
|
||||||
import * as helpers from "./smartssh.classes.helpers";
|
import { SshInstance } from './smartssh.classes.sshinstance.js';
|
||||||
import {SshInstance} from "./smartssh.classes.sshinstance";
|
import { SshKey } from './smartssh.classes.sshkey.js';
|
||||||
import {SshKey} from "./smartssh.classes.sshkey";
|
import { SshConfig } from './smartssh.classes.sshconfig.js';
|
||||||
import {SshConfig} from "./smartssh.classes.sshconfig";
|
|
||||||
export class SshDir { // sshDir class -> NOT EXPORTED, ONLY FOR INTERNAL USE
|
export class SshDir {
|
||||||
path:string; // the path of the ssh directory
|
// sshDir class -> NOT EXPORTED, ONLY FOR INTERNAL USE
|
||||||
private sshKeyArray:SshKey[];
|
private _path: string; // the path of the ssh directory
|
||||||
private sshConfig:SshConfig;
|
private _sshKeyArray: SshKey[];
|
||||||
constructor(sshKeyArray:SshKey[],sshConfig:SshConfig,sshDirPathArg?:string){
|
private _sshConfig: SshConfig;
|
||||||
this.sshKeyArray = sshKeyArray;
|
constructor(sshKeyArray: SshKey[], sshConfig: SshConfig, sshDirPathArg?: string) {
|
||||||
if(sshDirPathArg){
|
this._sshKeyArray = sshKeyArray;
|
||||||
this.path = sshDirPathArg;
|
this._sshConfig = sshConfig;
|
||||||
} else {
|
if (sshDirPathArg) {
|
||||||
this.path = plugins.path.join(plugins.smartpath.get.home(),".ssh/");
|
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);
|
writeToDir(dirPathArg?: string) {
|
||||||
});
|
// syncs sshInstance to directory
|
||||||
this.sshConfig.store(this.path);
|
let path = this._path;
|
||||||
};
|
if (dirPathArg) path = dirPathArg;
|
||||||
readFromDir(){ // syncs sshInstance from directory
|
this._sshKeyArray.forEach((sshKeyArg) => {
|
||||||
|
sshKeyArg.store(path);
|
||||||
}
|
});
|
||||||
getKeys(){
|
this._sshConfig.store(path);
|
||||||
return helpers.sshKeyArrayFromDir(this.path);
|
}
|
||||||
}
|
|
||||||
}
|
/**
|
||||||
|
* TODO: implement reading of directories
|
||||||
|
*/
|
||||||
|
readFromDir(dirPathArg?: string) {
|
||||||
|
// syncs sshInstance from directory
|
||||||
|
let path = this._path;
|
||||||
|
if (dirPathArg) path = dirPathArg;
|
||||||
|
}
|
||||||
|
updateDirPath(dirPathArg: string) {
|
||||||
|
this._path = dirPathArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
getKeys() {
|
||||||
|
return helpers.sshKeyArrayFromDir(this._path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -1,103 +1,102 @@
|
|||||||
import "typings-global"
|
import * as plugins from './smartssh.plugins.js';
|
||||||
import * as plugins from "./smartssh.plugins";
|
import * as helpers from './smartssh.classes.helpers.js';
|
||||||
import * as helpers from "./smartssh.classes.helpers";
|
|
||||||
|
|
||||||
import {SshDir} from "./smartssh.classes.sshdir";
|
import { SshDir } from './smartssh.classes.sshdir.js';
|
||||||
import {SshConfig} from "./smartssh.classes.sshconfig";
|
import { SshConfig } from './smartssh.classes.sshconfig.js';
|
||||||
import {SshKey} from "./smartssh.classes.sshkey";
|
import { SshKey } from './smartssh.classes.sshkey.js';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SshInstance is the main class dealing with ssh management
|
||||||
|
*/
|
||||||
export class SshInstance {
|
export class SshInstance {
|
||||||
private _sshKeyArray:SshKey[]; //holds all ssh keys
|
private _sshKeyArray: SshKey[]; // holds all ssh keys
|
||||||
private _sshConfig:SshConfig; // sshConfig (e.g. represents ~/.ssh/config)
|
private _sshConfig: SshConfig; // sshConfig (e.g. represents ~/.ssh/config)
|
||||||
private _sshDir:SshDir; // points to sshDir class instance.
|
private _sshDir: SshDir; // points to sshDir class instance.
|
||||||
private _sshSync:boolean; // if set to true, the ssh dir will be kept in sync automatically
|
private _sshSync: boolean; // if set to true, the ssh dir will be kept in sync automatically
|
||||||
constructor(optionsArg:{sshDirPath?:string,sshSync?:boolean}={}){
|
constructor(optionsArg: { sshDirPath?: string; sshSync?: boolean } = {}) {
|
||||||
optionsArg ? void(0) : optionsArg = {};
|
optionsArg ? void 0 : (optionsArg = {});
|
||||||
this._sshKeyArray = [];
|
this._sshKeyArray = [];
|
||||||
this._sshConfig = new SshConfig(this._sshKeyArray);
|
this._sshConfig = new SshConfig(this._sshKeyArray);
|
||||||
this._sshDir = new SshDir(this._sshKeyArray,this._sshConfig,optionsArg.sshDirPath);
|
this._sshDir = new SshDir(this._sshKeyArray, this._sshConfig, optionsArg.sshDirPath);
|
||||||
this._sshSync = optionsArg.sshSync;
|
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
|
// 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');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
// non altering methods
|
||||||
* write SshInstance to disk
|
getKey(hostArg: string): SshKey {
|
||||||
*/
|
this._syncAuto('from');
|
||||||
writeToDisk(){
|
let filteredArray = this._sshKeyArray.filter(function (keyArg) {
|
||||||
this._sync("to");
|
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
|
||||||
* read ab SshInstance from disk
|
|
||||||
*/
|
/**
|
||||||
readFromDisk(){
|
* write SshInstance to disk
|
||||||
this._sync("from");
|
*/
|
||||||
|
writeToDisk(dirPathArg?: string) {
|
||||||
|
this._sync('to', dirPathArg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* read ab SshInstance from disk
|
||||||
|
*/
|
||||||
|
readFromDisk(dirPathArg?: string) {
|
||||||
|
this._sync('from', dirPathArg);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ===============================================================
|
||||||
|
========================= Private Methods ========================
|
||||||
|
================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* method to invoke SshInstance _sync automatically when sshSync is true
|
||||||
|
*/
|
||||||
|
private _syncAuto(directionArg: 'from' | 'to') {
|
||||||
|
if (this._sshSync) {
|
||||||
|
// if auto sync is not enabled, do nothing
|
||||||
|
this._sync(directionArg);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* ===============================================================
|
/**
|
||||||
========================= Private Methods ========================
|
* private method to sync SshInstance
|
||||||
================================================================*/
|
*/
|
||||||
|
private _sync(directionArg: 'from' | 'to', dirPathArg?: string) {
|
||||||
private _makeConfig (){
|
if (directionArg === 'from') {
|
||||||
|
this._sshDir.readFromDir(dirPathArg); // call sync method of sshDir class;
|
||||||
|
} else if (directionArg === 'to') {
|
||||||
|
this._sshDir.writeToDir(dirPathArg);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
/**
|
|
||||||
* 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'");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
@ -1,92 +1,106 @@
|
|||||||
import "typings-global";
|
import * as plugins from './smartssh.plugins.js';
|
||||||
import * as plugins from "./smartssh.plugins";
|
import * as helpers from './smartssh.classes.helpers.js';
|
||||||
import * as helpers from "./smartssh.classes.helpers";
|
|
||||||
|
|
||||||
export class SshKey {
|
export class SshKey {
|
||||||
private _privKey:string;
|
private _privKey: string;
|
||||||
private _pubKey:string;
|
private _pubKey: string;
|
||||||
private _hostVar:string;
|
private _hostVar: string;
|
||||||
private _authorized:boolean;
|
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
|
private _smarthshellInstance = new plugins.shelljs.Smartshell({
|
||||||
get privKey(){
|
executor: 'bash',
|
||||||
return this._privKey;
|
});
|
||||||
};
|
|
||||||
set privKey(privateKeyArg:string){
|
|
||||||
this._privKey = privateKeyArg;
|
|
||||||
};
|
|
||||||
|
|
||||||
// this.privKeyBase64
|
/**
|
||||||
get privKeyBase64(){
|
* the constructor for class SshKey
|
||||||
return plugins.base64.encode(this._privKey);
|
*/
|
||||||
}
|
constructor(
|
||||||
set privKeyBase64(privateKeyArg:string) {
|
optionsArg: { private?: string; public?: string; host?: string; authorized?: boolean } = {}
|
||||||
this._privKey = plugins.base64.decode(privateKeyArg);
|
) {
|
||||||
}
|
this._privKey = optionsArg.private;
|
||||||
|
this._pubKey = optionsArg.public;
|
||||||
|
this._hostVar = optionsArg.host;
|
||||||
|
this._authorized = optionsArg.authorized;
|
||||||
|
}
|
||||||
|
|
||||||
// this.pubKey
|
// this.host
|
||||||
get pubKey(){
|
get host() {
|
||||||
return this._pubKey;
|
return this._hostVar;
|
||||||
}
|
}
|
||||||
set pubKey(publicKeyArg:string){
|
set host(hostArg: string) {
|
||||||
this._pubKey = publicKeyArg;
|
this._hostVar = hostArg;
|
||||||
};
|
}
|
||||||
|
|
||||||
// this.pubKeyBase64
|
// this.privKey
|
||||||
get pubKeyBase64(){
|
get privKey() {
|
||||||
return plugins.base64.encode(this._pubKey);
|
return this._privKey;
|
||||||
}
|
}
|
||||||
set pubKeyBase64(publicKeyArg:string) {
|
set privKey(privateKeyArg: string) {
|
||||||
this._pubKey = plugins.base64.decode(publicKeyArg);
|
this._privKey = privateKeyArg;
|
||||||
}
|
}
|
||||||
|
|
||||||
get authorized(){
|
// this.privKeyBase64
|
||||||
return this._authorized;
|
get privKeyBase64() {
|
||||||
}
|
return plugins.smartstring.base64.encode(this._privKey);
|
||||||
set authorized(authorizedArg:boolean){
|
}
|
||||||
this._authorized = authorizedArg;
|
set privKeyBase64(privateKeyArg: string) {
|
||||||
}
|
this._privKey = plugins.smartstring.base64.decode(privateKeyArg);
|
||||||
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
|
// this.pubKey
|
||||||
read(filePathArg){
|
get pubKey() {
|
||||||
|
return this._pubKey;
|
||||||
|
}
|
||||||
|
set pubKey(publicKeyArg: string) {
|
||||||
|
this._pubKey = publicKeyArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
// this.pubKeyBase64
|
||||||
|
get pubKeyBase64() {
|
||||||
|
return plugins.smartstring.base64.encode(this._pubKey);
|
||||||
|
}
|
||||||
|
set pubKeyBase64(publicKeyArg: string) {
|
||||||
|
this._pubKey = plugins.smartstring.base64.decode(publicKeyArg);
|
||||||
|
}
|
||||||
|
|
||||||
|
get authorized() {
|
||||||
|
return this._authorized;
|
||||||
|
}
|
||||||
|
set authorized(authorizedArg: boolean) {
|
||||||
|
this._authorized = authorizedArg;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* returns wether there is a private, a public or both keys
|
||||||
|
*/
|
||||||
|
get type() {
|
||||||
|
if (this._privKey && this._pubKey) {
|
||||||
|
return 'duplex';
|
||||||
|
} else if (this._privKey) {
|
||||||
|
return 'private';
|
||||||
|
} else if (this._pubKey) {
|
||||||
|
return 'public';
|
||||||
}
|
}
|
||||||
store(dirPathArg:string){
|
}
|
||||||
plugins.fs.ensureDirSync(dirPathArg);
|
set type(someVlueArg: any) {
|
||||||
let fileNameBase = this.host;
|
console.log('the type of an SshKey connot be set. This value is autocomputed.');
|
||||||
if(this._privKey){
|
}
|
||||||
plugins.smartfile.memory.toFsSync(this._privKey,plugins.path.join(dirPathArg,fileNameBase));
|
|
||||||
};
|
// methods
|
||||||
if (this._pubKey){
|
read(filePathArg) {}
|
||||||
plugins.smartfile.memory.toFsSync(this._pubKey,plugins.path.join(dirPathArg,fileNameBase + ".pub"));
|
|
||||||
}
|
async store(dirPathArg: string) {
|
||||||
|
plugins.fs.ensureDirSync(dirPathArg);
|
||||||
|
let fileNameBase = this.host;
|
||||||
|
if (this._privKey) {
|
||||||
|
let filePath = plugins.path.join(dirPathArg, fileNameBase);
|
||||||
|
plugins.smartfile.memory.toFsSync(this._privKey, filePath);
|
||||||
|
await this._smarthshellInstance.exec(`chmod 0600 ${filePath}`);
|
||||||
}
|
}
|
||||||
|
if (this._pubKey) {
|
||||||
|
let filePath = plugins.path.join(dirPathArg, fileNameBase + '.pub');
|
||||||
|
plugins.smartfile.memory.toFsSync(this._pubKey, filePath);
|
||||||
|
await this._smarthshellInstance.exec(`chmod 0600 ${filePath}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let testKey = new SshKey();
|
|
@ -1,9 +1,10 @@
|
|||||||
import "typings-global"
|
import * as fs from 'fs-extra';
|
||||||
export import beautylog = require("beautylog");
|
import * as minimatch from 'minimatch';
|
||||||
export let base64 = require("js-base64").Base64;
|
import * as path from 'path';
|
||||||
export let fs = require("fs-extra");
|
import * as smartpromise from '@pushrocks/smartpromise';
|
||||||
export let minimatch = require("minimatch");
|
import * as shelljs from '@pushrocks/smartshell';
|
||||||
export import path = require("path");
|
import * as smartfile from '@pushrocks/smartfile';
|
||||||
export let q = require("q");
|
import * as smartpath from '@pushrocks/smartpath';
|
||||||
export import smartfile = require("smartfile");
|
import * as smartstring from '@pushrocks/smartstring';
|
||||||
export import smartpath = require("smartpath");
|
|
||||||
|
export { fs, minimatch, path, smartpromise, shelljs, smartfile, smartpath, smartstring };
|
||||||
|
10
tsconfig.json
Normal file
10
tsconfig.json
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"experimentalDecorators": true,
|
||||||
|
"useDefineForClassFields": false,
|
||||||
|
"target": "ES2022",
|
||||||
|
"module": "ES2022",
|
||||||
|
"moduleResolution": "nodenext",
|
||||||
|
"esModuleInterop": true
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user