xref: /third_party/python/Tools/demo/rpythond.py (revision 7db96d56)
17db96d56Sopenharmony_ci#!/usr/bin/env python3
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ci"""
47db96d56Sopenharmony_ciRemote python server.
57db96d56Sopenharmony_ciExecute Python commands remotely and send output back.
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ciWARNING: This version has a gaping security hole -- it accepts requests
87db96d56Sopenharmony_cifrom any host on the internet!
97db96d56Sopenharmony_ci"""
107db96d56Sopenharmony_ci
117db96d56Sopenharmony_ciimport sys
127db96d56Sopenharmony_cifrom socket import socket, AF_INET, SOCK_STREAM
137db96d56Sopenharmony_ciimport io
147db96d56Sopenharmony_ciimport traceback
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_ciPORT = 4127
177db96d56Sopenharmony_ciBUFSIZE = 1024
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_cidef main():
207db96d56Sopenharmony_ci    if len(sys.argv) > 1:
217db96d56Sopenharmony_ci        port = int(sys.argv[1])
227db96d56Sopenharmony_ci    else:
237db96d56Sopenharmony_ci        port = PORT
247db96d56Sopenharmony_ci    s = socket(AF_INET, SOCK_STREAM)
257db96d56Sopenharmony_ci    s.bind(('', port))
267db96d56Sopenharmony_ci    s.listen(1)
277db96d56Sopenharmony_ci    while True:
287db96d56Sopenharmony_ci        conn, (remotehost, remoteport) = s.accept()
297db96d56Sopenharmony_ci        with conn:
307db96d56Sopenharmony_ci            print('connection from', remotehost, remoteport)
317db96d56Sopenharmony_ci            request = b''
327db96d56Sopenharmony_ci            while True:
337db96d56Sopenharmony_ci                data = conn.recv(BUFSIZE)
347db96d56Sopenharmony_ci                if not data:
357db96d56Sopenharmony_ci                    break
367db96d56Sopenharmony_ci                request += data
377db96d56Sopenharmony_ci            reply = execute(request.decode())
387db96d56Sopenharmony_ci            conn.send(reply.encode())
397db96d56Sopenharmony_ci
407db96d56Sopenharmony_cidef execute(request):
417db96d56Sopenharmony_ci    stdout = sys.stdout
427db96d56Sopenharmony_ci    stderr = sys.stderr
437db96d56Sopenharmony_ci    sys.stdout = sys.stderr = fakefile = io.StringIO()
447db96d56Sopenharmony_ci    try:
457db96d56Sopenharmony_ci        try:
467db96d56Sopenharmony_ci            exec(request, {}, {})
477db96d56Sopenharmony_ci        except:
487db96d56Sopenharmony_ci            print()
497db96d56Sopenharmony_ci            traceback.print_exc(100)
507db96d56Sopenharmony_ci    finally:
517db96d56Sopenharmony_ci        sys.stderr = stderr
527db96d56Sopenharmony_ci        sys.stdout = stdout
537db96d56Sopenharmony_ci    return fakefile.getvalue()
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_citry:
567db96d56Sopenharmony_ci    main()
577db96d56Sopenharmony_ciexcept KeyboardInterrupt:
587db96d56Sopenharmony_ci    pass
59