Skip to content
Snippets Groups Projects
setup_euler.py 1.67 KiB
Newer Older
  • Learn to ignore specific revisions
  • #! /usr/bin/env python
    # Copyright © 2019 Uwe Schitt <uwe.schmitt@id.ethz.ch>
    import pexpect
    import sys
    import time
    import pdb
    from pexpect.exceptions import TIMEOUT
    
    credentials = [line.split() for line in open("credentials.txt")]
    
    
    EULER = "euler.ethz.ch"
    
    
    def open_conn(cmd):
        print(cmd)
        conn = pexpect.spawn(cmd, echo=True, encoding="utf-8")
        conn.logfile = sys.stdout
        return conn
    
    
    def auth_pw(conn, password):
        conn.expect("password:")
        conn.sendline(password)
    
    
    def accept_license_agreements(user, password):
    
        ssh_conn = open_conn(f"ssh {user}@{EULER}")
        auth_pw(ssh_conn, password)
        try:
            ssh_conn.expect("to exit: ", timeout=1)
            ssh_conn.sendline("Yes")
            time.sleep(.5)
        except TIMEOUT:
            pass
    
        ssh_conn.close()
    
    
    def create_ssh_folders(user, password):
    
        ssh_conn = open_conn(f"ssh {user}@{EULER} 'mkdir -p .ssh; ls -al .ssh'")
        auth_pw(ssh_conn, password)
        ssh_conn.expect(pexpect.EOF)
        ssh_conn.close()
    
    
    def deploy_ssh_keys(user, password):
    
        ssh_conn = open_conn(f"scp id_rsa.pub {user}@{EULER}:.ssh/authorized_keys")
        auth_pw(ssh_conn, password)
        ssh_conn.expect(pexpect.EOF)
        ssh_conn.close()
    
    
    def check_passwordless_login(user):
        ssh_conn = open_conn(f"ssh -i id_rsa {user}@{EULER}")
        try:
            ssh_conn.expect("password: ", timeout=1)
        except TIMEOUT:
            return True
        else:
            return False
        finally:
            ssh_conn.close()
    
    
    flags = []
    for user, password in credentials:
        accept_license_agreements(user, password)
        create_ssh_folders(user, password)
        deploy_ssh_keys(user, password)
        ok = check_passwordless_login(user)
        flags.append(ok)
    
    assert all(flags)