Terminaaliproxy pythonilla

Ztane 26.11.04 17:06

Näyttää miten pythonin pty-moduulilla tehdään pseudoterminaali. Tarkoitukseni on tehdä koodista lopulta proxy, joka nappaa ansi escape secquencejen tapaisia terminaalidatasta ja tekee tällä jänniä juttuja, mm. käyttää puhesyntetisaattoria.

 Tekstiversio  Arvo: 3 (7 ääntä)  Äänestä: +  -
#!/usr/bin/python
# -*- coding: latin1 -*-
#
# Eli, ajettaessa saat bash-shellin auki, jossa kaikki a-kirjaimet
# ovat kirkkaan VIHREITÄ... Toimii Linux/SGI, python 2.1->
#
import pty
import os
import sys
import select
import atexit

# Palautetaan vanhat asetukset. atexit kutsuu
#
def recover_term_settings(settings):
        import termios, sys

        termios.tcdrain(fd);
        termios.tcsetattr(fd, termios.TCSANOW, settings)
        print "Bye!!!"


# poistetaan oikeasta terminaalista ICANON,
# ISIG ja ECHO!
#
def set_term_mode():
        import termios, sys

        fd = sys.stdin.fileno()
        term_settings = termios.tcgetattr(fd)
        new = termios.tcgetattr(fd)
        new[3] = (new[3] & ~termios.ECHO &
                ~termios.ISIG & ~termios.ICANON)

        termios.tcsetattr(fd, termios.TCSADRAIN, new)
        atexit.register(recover_term_settings, term_settings)

def filter(text):
        return text.replace('a', '\033[1;32ma\033[0m')

def do_work():
        while 1:
                input,output,error = select.select([0, fd], [], [0, fd])
                if len(error):
                        print "Error on select, exiting"
                        sys.exit(1)

                if 0 in input:
                        data = os.read(0, 1024)
                        os.write(fd, data)

                if fd in input:
                        data = os.read(fd, 1024)
                        data = filter(data)
                        os.write(1, data)

pid,fd = pty.fork()
if pid == 0:
        os.system("bash")
else:
        set_term_mode()
        try:
                do_work()
        except:
                pass
 

editoitu: 17:22 26.11.04
Ztane 17:20 26.11.04 
pikkvmyyn ansiosta koodi nyt tekee esimerkkinä ton täysin turhan a:n värityksen...
Ztane 17:37 26.11.04 
Ok... paransin koodii ja laitoin vanhojen asetuksien palautuksen atexitillä tapahtuvaksi
Ztane 16:27 27.11.04 
Heh, käytän tätä jo: irkkipalvelimellani irssi lähettää escapekoodeja, joitten sisältämä info lähetetään festivalille...