refactor: separate the functions that connect container and first conect container
This commit is contained in:
		
							
								
								
									
										55
									
								
								src/remote-container.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								src/remote-container.ts
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,55 @@
 | 
			
		||||
import * as fs from 'fs';
 | 
			
		||||
import * as path from 'path';
 | 
			
		||||
import * as os from 'os';
 | 
			
		||||
import * as vscode from 'vscode';
 | 
			
		||||
const { NodeSSH } = require('node-ssh')
 | 
			
		||||
 | 
			
		||||
export default class RemoteContainer {
 | 
			
		||||
 | 
			
		||||
  async firstConnect(host: string, username: string, password: string, port: number): Promise<void> {
 | 
			
		||||
    // connect the host and add the public key to the remote authorized_keys
 | 
			
		||||
    const defaultPublicKeyPath = path.join(os.homedir(), '.ssh', 'id_rsa.pub');
 | 
			
		||||
    // TODO: if there is no public key, generate one
 | 
			
		||||
    const publicKey = fs.readFileSync(defaultPublicKeyPath, 'utf8');
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    // first connect to the remote host using password
 | 
			
		||||
    const ssh = new NodeSSH();
 | 
			
		||||
    try {
 | 
			
		||||
      await ssh.connect({
 | 
			
		||||
        host: host,
 | 
			
		||||
        username: username,
 | 
			
		||||
        password: password,
 | 
			
		||||
        port: port
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
      // add the public key to the remote authorized_keys
 | 
			
		||||
      await ssh.execCommand(`mkdir -p ~/.ssh && echo '${publicKey}' >> ~/.ssh/authorized_keys`);
 | 
			
		||||
      console.log('Public key added to remote authorized_keys');
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
      console.error('Error adding public key: ', error);
 | 
			
		||||
    } finally {
 | 
			
		||||
      await ssh.dispose();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // TODO: request change password
 | 
			
		||||
 | 
			
		||||
    // TODO: use remote.SSH.configFile
 | 
			
		||||
    const sshConfigPath = path.join(os.homedir(), '.ssh', 'config');
 | 
			
		||||
    // append the host to the local ssh config file 
 | 
			
		||||
    const sshConfigContent =
 | 
			
		||||
      `\nHost ${host}\n  HostName ${host}\n  Port ${port}\n  User ${username}\n  PreferredAuthentications publickey\n  IdentityFile ~/.ssh/id_rsa\n  `;
 | 
			
		||||
    // append the host to the local ssh config file
 | 
			
		||||
    fs.writeFileSync(sshConfigPath, sshConfigContent, { encoding: 'utf8', flag: 'a' });
 | 
			
		||||
    console.log('Host registered in local ssh config');
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  openRemoteFolder(host: string, path: string): void {
 | 
			
		||||
    const command = `code --remote ssh-remote+${host} ${path} --reuse-window`
 | 
			
		||||
    let terminal = vscode.window.activeTerminal || vscode.window.createTerminal(`Ext Terminal`);
 | 
			
		||||
    terminal.show(true);
 | 
			
		||||
    terminal.sendText(command);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user