tigervnc/x11vnc

195 lines
5.5 KiB
Python

#!/usr/bin/python3
# This is wrapper for x0vncserver that translate most common x11vnc arguments
# to x0vncserver's arguments
import argparse
import socket
import os
import sys
def is_port_free(port):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind(('', port))
sock.close()
return True
except socket.error as e:
return False
def find_free_port(starting_port):
for port in range(starting_port, 6000):
if is_port_free(port):
return port
return None
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument('-help', '-h', action='help')
parser.add_argument('--version', '-V', action='store_true')
parser.add_argument('-storepasswd', nargs=2)
parser.add_argument('-display')
parser.add_argument('-auth')
parser.add_argument('-N', action='store_true')
parser.add_argument('-rfbport', type=int)
parser.add_argument('-autoport', type=int, default=5900)
parser.add_argument('-6', dest='yes6', action='store_true')
parser.add_argument('-no6', action='store_true')
#parser.add_argument('-once', action='store_true') # TODO: Add support to x0vncserver
parser.add_argument('-forever', '-many', action='store_true')
parser.add_argument('-viewonly', action='store_true')
#parser.add_argument('-shared', action='store_true') # TODO?
parser.add_argument('-alwaysshared', action='store_true')
parser.add_argument('-nevershared', action='store_true')
parser.add_argument('-dontdisconnect', action='store_true')
#parser.add_argument('-timeout', nargs=1, type=int) # TODO?
parser.add_argument('-clip')
parser.add_argument('-deferupdate', type=int)
parser.add_argument('-noshm', action='store_true')
#parser.add_argument('-allow', nargs=1) # TODO?
#parser.add_argument('-localhost') # TODO?
parser.add_argument('-rfbauth')
parser.add_argument('-nopw', action='store_true')
parser.add_argument('-unixpw')
# Accepted, but ignored arguments
ignored_arguments = ['-v', '-verbose', '-q', '-quiet']
parser.add_argument(*ignored_arguments, dest='ignored_argument', action='store_true')
print('Warning: x11vnc is deprecated in favor of x0vncserver.')
print(' This is a wrapper that maps the most common set of x11vnc')
print(' arguments to x0vncserver arguments.')
print()
print(' Use x0vncserver directly if you want encrypted connection.')
print()
args = parser.parse_args()
# Warnings
if args.ignored_argument:
print('Warning: x11vnc wrapper accepts but ignores following arguments:')
print(', '.join(ignored_arguments))
# vncpasswd
if args.storepasswd:
(password, passwdfile) = args.storepasswd
os.execlp('vncpasswd.arg', 'vncpasswd.arg', passwdfile, password)
# x0vncserver
new_args = ['x0vncserver']
default_security_type = 'None'
security_type = default_security_type
if args.version:
new_args.append('-version')
if args.display:
new_args.append('-display')
new_args.append(args.display)
if args.auth:
os.environ['XAUTHORITY'] = args.auth
if args.N:
display = args.display or os.environ['DISPLAY']
if not display:
print('No display set')
sys.exit(1)
port = int(display.split(':')[-1]) + 5900
if is_port_free(port):
new_args.append('-rfbport')
new_args.append(str(port))
else:
print('Port %d is already used'%port)
sys.exit(1)
if args.rfbport:
new_args.append('-rfbport')
new_args.append(str(args.rfbport))
else:
port = find_free_port(args.autoport)
new_args.append('-rfbport')
new_args.append(str(port))
if args.yes6:
new_args.append('-UseIPv6')
if args.no6:
new_args.append('-UseIPv6=0')
if args.forever:
# This is default in x0vncserver
pass
if args.viewonly:
new_args.append('-AcceptKeyEvents=0')
new_args.append('-AcceptPointerEvents=0')
new_args.append('-AcceptCutText=0')
new_args.append('-AcceptSetDesktopSize=0')
if args.alwaysshared:
new_args.append('-AlwaysShared')
if args.nevershared:
new_args.append('-NeverShared')
if args.dontdisconnect:
new_args.append('-DisconnectClients=0')
else:
new_args.append('-DisconnectClients')
if args.clip:
new_args.append('-Geometry')
new_args.append(args.clip)
if args.deferupdate:
new_args.append('-DeferUpdate')
new_args.append(str(args.deferupdate))
if args.noshm:
new_args.append('-UseSHM=0')
if args.rfbauth:
security_type = 'VncAuth'
new_args.append('-PasswordFile')
new_args.append(args.rfbauth)
if args.unixpw:
security_type = 'Plain'
new_args.append('-PlainUsers')
new_args.append(args.unixpw)
new_args.append('-SecurityTypes')
new_args.append(security_type)
if not args.nopw:
# Note: This is the same warning as the original x11vnc gives
if security_type == default_security_type:
print("""
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
#@ @#
#@ ** WARNING ** WARNING ** WARNING ** WARNING ** @#
#@ @#
#@ YOU ARE RUNNING X11VNC WITHOUT A PASSWORD!! @#
#@ @#
#@ This means anyone with network access to this computer @#
#@ may be able to view and control your desktop. @#
#@ @#
#@ >>> If you did not mean to do this Press CTRL-C now!! <<< @#
#@ @#
#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#
""")
os.execvp('x0vncserver', new_args)