#!/usr/bin/env python3 import sys import os import pty import empty import yaml_ut import dbg sec = 1.5 def b_to_s( b ): try: s = b.decode() except: return None return s def dic_new(): d = {} path = os.path.expandvars( "$HOME/.ezpass" ) if os.path.exists( path ): d = yaml_ut.load_fn( path, {} ) def save(): yaml_ut.save( d, path ) def get( k ): return d.get( k ) def put( k, v ): if k in d: return d[ k ] = v save() return empty.new( locals() ) dic = dic_new() def buf_new(): e = empty.new() e.bf = '' e.tmrs = [] def put( s ): if s.endswith( '\n' ): e.bf = '' return e.bf += s def key_in( s ): if e.bf.endswith( ' password: ' ): dic.put( e.bf, s ) def get(): return e.bf def read( fd ): b = os.read( fd, 1024 ) s = b_to_s( b ) if s: put( s ) return b return empty.add( e, locals() ) buf = buf_new() def ibuf_new(): e = empty.new() e.bf = '' def put( s ): if s == '\r': buf.key_in( e.bf ) e.bf = '' return e.bf += s if e.bf == '\t': return dic.get( buf.get() ) return None def read( fd ): b = os.read( fd, 1024 ) s = b_to_s( b ) if s: s = put( s ) if s: s += '\r' b = s.encode() return b return empty.add( e, locals() ) ibuf = ibuf_new() argv = sys.argv[ 1 : ] if not argv: argv = [ 'bash' ] pty.spawn( argv, buf.read, ibuf.read ) # EOF