Skip to content

Commit

Permalink
add new host in ssh (#98)
Browse files Browse the repository at this point in the history
  • Loading branch information
yungezz authored Mar 19, 2018
1 parent 3e5de39 commit 16c7358
Show file tree
Hide file tree
Showing 6 changed files with 95 additions and 53 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

## Features

- Auto completion. Auto completion Ansible directives, modules and plugins from Ansible doc, Auto completion for variables.
- Auto completion. Auto completion Ansible directives, modules and plugins from Ansible doc, Auto completion for variables. Disable auto completion by setting `ansible.autocompletion` to `false`.
- Code snippets. Press `Ctrl + Space`, Ansible playbook code snippets will show up.
- Syntax highlighting.
- Code navigation by Symbols, press `Ctrl + Shift + O`.
Expand Down
7 changes: 3 additions & 4 deletions src/ansibleCompletionItemProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,11 +31,10 @@ export class AnsibleCompletionItemProvider implements vscode.CompletionItemProvi

private enableAutoCompletion(document: vscode.TextDocument): boolean {
if (!utilities.getCodeConfiguration('ansible', 'autocompletion')) {
if (document.getText().indexOf('# ansible-configured') === 0) {
return true;
if (document.getText().indexOf('# ansible-configured') === -1) {
return false;
}
}

return false;
return true;
}
}
10 changes: 9 additions & 1 deletion src/cloudShellRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,12 @@ export class CloudShellRunner extends BaseRunner {
constructor(outputChannel: vscode.OutputChannel) {

super(outputChannel);

vscode.window.onDidCloseTerminal((terminal) => {
if (terminal === this.terminal) {
this.terminal = null;
}
})
}

protected runPlaybookInternal(playbook: string): void {
Expand Down Expand Up @@ -77,7 +83,6 @@ export class CloudShellRunner extends BaseRunner {
var terminal = await openCloudConsole(accountApi, OSes.Linux, [playbook], this._outputChannel, tempFile);

if (terminal) {

let count: number = 30;
while (count--) {
if (await fsExtra.exists(tempFile)) {
Expand Down Expand Up @@ -131,4 +136,7 @@ export class CloudShellRunner extends BaseRunner {
return Promise.resolve(null);
}

protected onDidCloseTerminal(terminal) {

}
}
4 changes: 0 additions & 4 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,6 @@ export function activate(context: vscode.ExtensionContext) {
sshRunner.runPlaybook(playbook ? playbook.fsPath : null);
}));

// context.subscriptions.push(vscode.commands.registerCommand('vscode-ansible.deployment-templates', (playbook) => {
// deploymentTemplate.displayDeploymentTemplateMenu();
// }));

context.subscriptions.push(vscode.window.onDidCloseTerminal((closedTerminal: vscode.Terminal) => {
TerminalExecutor.onDidCloseTerminal(closedTerminal);
}));
Expand Down
93 changes: 58 additions & 35 deletions src/sshRunner.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ import { TelemetryClient } from './telemetryClient';
import * as path from 'path';
import * as fs from 'fs-extra';
import { openSSHConsole } from './SSHConsole';
import * as os from 'os';

const addNewHost = 'Add New Host';
const browseThePC = 'Browse the PC..';

export class SSHRunner extends TerminalBaseRunner {
constructor(outputChannel: vscode.OutputChannel) {
Expand Down Expand Up @@ -42,10 +46,6 @@ export class SSHRunner extends TerminalBaseRunner {
// get ssh config
getSSHServer().then((server) => {
if (server === undefined || server === null) {
this._outputChannel.append('\nInvalid SSH server.');
this._outputChannel.show();

vscode.window.showErrorMessage('Invalid SSH server.');
return;
}

Expand Down Expand Up @@ -85,6 +85,48 @@ export class SSHRunner extends TerminalBaseRunner {

export type Hosts = { [key: string]: SSHServer };

export async function addSSHServer(): Promise<SSHServer> {

let server = <SSHServer>{};
var host = await vscode.window.showInputBox({ value: 'host', prompt: 'SSH host', placeHolder: 'host', password: false });
if (host) {
var port = await vscode.window.showInputBox({ value: '22', prompt: 'SSH port', placeHolder: 'port', password: false });
if (port) {
var user = await vscode.window.showInputBox({ value: 'username', prompt: 'SSH username', placeHolder: 'username', password: false });
if (user) {
var password = await vscode.window.showInputBox({ value: '', prompt: 'SSH password', placeHolder: 'password', password: true });
server.host = host;
server.port = +port;
server.user = user;

if (password && password != '') {
server.password = password;
utilities.updateSSHConfig(server);
return server;
} else {
var defaultPath = path.join(os.homedir(), '.ssh', 'id_rsa');
var items = [defaultPath, browseThePC];

var pick = await vscode.window.showQuickPick(items);

if (pick && pick === browseThePC) {
var result = await vscode.window.showOpenDialog({
canSelectFiles: true,
canSelectFolders: false, canSelectMany: false
});
if (result && result.length === 1) {
server.key = result[0].fsPath;
utilities.updateSSHConfig(server);
return server;
}
}
}
}
}
}
return null;
}

export async function getSSHServer(): Promise<SSHServer> {
let servers = utilities.getSSHConfig();
let server = <SSHServer>{};
Expand All @@ -94,39 +136,20 @@ export async function getSSHServer(): Promise<SSHServer> {
for (let host of servers) {
hosts[host.host] = host;
}
let host = await vscode.window.showQuickPick(Object.keys(hosts));
return server = hosts[host];
} else {
var host = await vscode.window.showInputBox({ value: 'host', prompt: 'ssh host', placeHolder: 'host', password: false });
if (host) {
var port = await vscode.window.showInputBox({ value: '22', prompt: 'ssh port', placeHolder: 'port', password: false });
if (port) {
var user = await vscode.window.showInputBox({ value: 'username', prompt: 'ssh username', placeHolder: 'username', password: false });
if (user) {
var password = await vscode.window.showInputBox({ value: '', prompt: 'ssh password', placeHolder: 'password', password: true });
server.host = host;
server.port = +port;
server.user = user;

if (password && password != '') {
server.password = password;

utilities.updateSSHConfig(server);
return server;
} else {
var key = await vscode.window.showInputBox({ value: '', prompt: 'ssh key file', placeHolder: 'ssh private key file', password: false });
if (key && key != '') {
server.key = key;

utilities.updateSSHConfig(server);
return server;
}
}
}
}
var quickPickList = Object.keys(hosts);
quickPickList.push(addNewHost);

let choice = await vscode.window.showQuickPick(quickPickList);

if (choice === addNewHost) {
let server = await addSSHServer();
return server;
} else {
return hosts[choice];
}
return null;
} else {
return await addSSHServer();
}
}


32 changes: 24 additions & 8 deletions src/utilities.ts
Original file line number Diff line number Diff line change
Expand Up @@ -217,14 +217,30 @@ export function copyFileRemote(source: string, dest: string, sshServer: SSHServe
return false;
}

scp.scp(source, {
host: sshServer.host,
port: sshServer.port,
username: sshServer.user,
password: sshServer.password,
privateKey: sshServer.key ? sshServer.key : '',
path: dest
}, (err) => {
var client: {};

if (sshServer.password) {
client = {
host: sshServer.host,
port: sshServer.port,
username: sshServer.user,
password: sshServer.password,
path: dest
};
} else if (sshServer.key) {
if (!fsExtra.existsSync(sshServer.key)) {
vscode.window.showErrorMessage('File not exists: ' + sshServer.key);
}
client = {
host: sshServer.host,
port: sshServer.port,
username: sshServer.user,
privateKey: String(fsExtra.readFileSync(sshServer.key)),
path: dest
};
}

scp.scp(source, client, (err) => {
if (err) {
vscode.window.showErrorMessage('Failed to copy file ' + source + ' to ' + sshServer.host + ': ' + err);
}
Expand Down

0 comments on commit 16c7358

Please sign in to comment.