dejsem.1.5/python/dejsem.pycharm/parms.py
author hh
Wed, 27 Nov 2019 09:50:16 +0100
changeset 0 676905a3b03c
permissions -rw-r--r--
--
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
hh
parents:
diff changeset
     1
#!/usr/bin/python3
hh
parents:
diff changeset
     2
# coding=utf8
hh
parents:
diff changeset
     3
hh
parents:
diff changeset
     4
import os, argparse, subprocess, socket
hh
parents:
diff changeset
     5
hh
parents:
diff changeset
     6
class Parms():
hh
parents:
diff changeset
     7
hh
parents:
diff changeset
     8
	positiv = ('1', 'Y', 'YES', 'ON')
hh
parents:
diff changeset
     9
	negativ = ('0', 'N', 'NO', 'OFF')
hh
parents:
diff changeset
    10
hh
parents:
diff changeset
    11
	@classmethod
hh
parents:
diff changeset
    12
	def setup(cls):
hh
parents:
diff changeset
    13
		cls.applName = "dejsem"
hh
parents:
diff changeset
    14
		cls.version = 1.00
hh
parents:
diff changeset
    15
hh
parents:
diff changeset
    16
		cls.defaultsFile = os.path.join("/etc/default", cls.applName)
hh
parents:
diff changeset
    17
		cls.parsedflts()
hh
parents:
diff changeset
    18
		cls.parsecmdl()
hh
parents:
diff changeset
    19
hh
parents:
diff changeset
    20
		cls.clientMode = False		# řídí chování při ABENDu: client po ABENDu sys.exit(), server pokračuje
hh
parents:
diff changeset
    21
hh
parents:
diff changeset
    22
		cls.debugLevel = cls.cmdl("debugLevel", int(cls.env("DEB", cls.dflt("DEB", 0))))
hh
parents:
diff changeset
    23
		cls.random_seed= int(cls.env('RS', 0))
hh
parents:
diff changeset
    24
hh
parents:
diff changeset
    25
		cls.action = cls.cmdl("action", cls.env("ACT", "")).upper()
hh
parents:
diff changeset
    26
		cls.clientMode = cls.action != "SRV"
hh
parents:
diff changeset
    27
hh
parents:
diff changeset
    28
		cls.ssl = True
hh
parents:
diff changeset
    29
hh
parents:
diff changeset
    30
		cls.sslchannel = int(cls.cmdl("sslchannel", cls.env("CHAN", cls.dflt("CHAN", 2))))
hh
parents:
diff changeset
    31
		cls.sslPath = cls.cmdl("sslPath", cls.env("SSLP", cls.dflt("SSLP", os.path.join("/usr/share", cls.applName, "ssl"))))
hh
parents:
diff changeset
    32
		cls.sslCAPath = os.path.join(cls.sslPath, "dejCA.crt")
hh
parents:
diff changeset
    33
		cls.sslCert = os.path.join(cls.sslPath, "{:02d}.pem".format(cls.sslchannel))
hh
parents:
diff changeset
    34
hh
parents:
diff changeset
    35
		cls.srvhost = cls.cmdl("srvhost", cls.env("HOST", cls.dflt("HOST", "dejsem.org")))
hh
parents:
diff changeset
    36
		cls.filedir = "files"
hh
parents:
diff changeset
    37
		cls.exposed = ".exposed_to_http"
hh
parents:
diff changeset
    38
		cls.clipfile = "clipboard"
hh
parents:
diff changeset
    39
		cls.histdir = "history"		# cliboard history dir
hh
parents:
diff changeset
    40
		cls.srv_wwwhomedir = os.path.join("/var/www/html", cls.applName)
hh
parents:
diff changeset
    41
		cls.srv_homedir = os.path.join("/usr/local/", cls.applName)
hh
parents:
diff changeset
    42
		cls.client_homedir = cls.env("HOME", os.path.join("/home", "{}".format(os.getlogin)))
hh
parents:
diff changeset
    43
		cls.client_appldir = os.path.join(cls.client_homedir, ".local/share", cls.applName)
hh
parents:
diff changeset
    44
		cls.client_histdir = os.path.join(cls.client_appldir, cls.histdir)
hh
parents:
diff changeset
    45
hh
parents:
diff changeset
    46
		cls.bindhost = cls.env("BINDHOST", cls.dflt("BINDHOST", cls.getbindhost()))
hh
parents:
diff changeset
    47
		# cls.bindhost = cls.env("BINDHOST", "")
hh
parents:
diff changeset
    48
		# cls.broadcast = cls.env("BROADCAST", cls.getbroadcast(cls.bindhost))
hh
parents:
diff changeset
    49
		cls.broadcast = cls.env("BROADCAST", "255.255.255.255")
hh
parents:
diff changeset
    50
		cls.baseport = int(cls.env("BASEPORT", cls.dflt("BASEPORT", 42000)))
hh
parents:
diff changeset
    51
		cls.udpport = 4242 if cls.applName == "dejsem" else 4224 
hh
parents:
diff changeset
    52
		cls.pullPeerIface = None
hh
parents:
diff changeset
    53
hh
parents:
diff changeset
    54
		cls.bufSize = 256 * 1024
hh
parents:
diff changeset
    55
		cls.connThreshold = 77
hh
parents:
diff changeset
    56
		cls.connTimeout = 0.01
hh
parents:
diff changeset
    57
		cls.blockTimeout = 20
hh
parents:
diff changeset
    58
		cls.accept_timeout = 60  	# seconds
hh
parents:
diff changeset
    59
		cls.long_run_accept_timeout = 60  	# seconds
hh
parents:
diff changeset
    60
		cls.peer_accept_timeout = 60  		# seconds
hh
parents:
diff changeset
    61
hh
parents:
diff changeset
    62
		cls.datapaths = cls.args["datapaths"]	# data paths from cmdline
hh
parents:
diff changeset
    63
		cls.orig = cls.cmdl("datapaths", list(cls.env("ORIG", "")))		# origin data path
hh
parents:
diff changeset
    64
		cls.dest = cls.env("DEST", "")		# destination data path from ENV
hh
parents:
diff changeset
    65
hh
parents:
diff changeset
    66
	@classmethod
hh
parents:
diff changeset
    67
	def parsecmdl(cls):
hh
parents:
diff changeset
    68
		parser = argparse.ArgumentParser(description='sdílení clipboardu a filů přes server, přenos filů peer-to-peer')
hh
parents:
diff changeset
    69
		cmds = parser.add_mutually_exclusive_group()
hh
parents:
diff changeset
    70
		cmds.add_argument('--push', dest='action',
hh
parents:
diff changeset
    71
			action='store_const', const='PUSHCLIP',
hh
parents:
diff changeset
    72
			help='copy from local clipboard to shared clipboard')
hh
parents:
diff changeset
    73
		cmds.add_argument('--pull', dest='action',
hh
parents:
diff changeset
    74
			action='store_const', const='PULLCLIP',
hh
parents:
diff changeset
    75
			help='copy from shared clipboard to local clipboard')
hh
parents:
diff changeset
    76
		cmds.add_argument('--pullhist', dest='action',
hh
parents:
diff changeset
    77
			action='store_const', const='PULLHIST',
hh
parents:
diff changeset
    78
			help='synchronize local clipboard history from shared clipboard')
hh
parents:
diff changeset
    79
		cmds.add_argument('--pushsrv', '--pushfile', '--puf', dest='action',
hh
parents:
diff changeset
    80
			action='store_const', const='PUSHFILE',
hh
parents:
diff changeset
    81
			help='copy local file to server')
hh
parents:
diff changeset
    82
		cmds.add_argument('--pullsrv', '--pullfile', '--plf', dest='action',
hh
parents:
diff changeset
    83
			action='store_const', const='PULLFILE',
hh
parents:
diff changeset
    84
			help='copy server file to local')
hh
parents:
diff changeset
    85
		cmds.add_argument('--pulllist', dest='action',
hh
parents:
diff changeset
    86
			action='store_const', const='PULLLIST',
hh
parents:
diff changeset
    87
			help='list files on server')
hh
parents:
diff changeset
    88
		cmds.add_argument('--pushpeer', '--pup', dest='action',
hh
parents:
diff changeset
    89
			action='store_const', const='PUSHPEER',
hh
parents:
diff changeset
    90
			help='copy from local file to LAN peer')
hh
parents:
diff changeset
    91
		cmds.add_argument('--pullpeer', '--plp', dest='action',
hh
parents:
diff changeset
    92
			action='store_const', const='PULLPEER',
hh
parents:
diff changeset
    93
			help='copy from LAN peer to local dir')
hh
parents:
diff changeset
    94
		options = parser.add_argument_group(title='options')
hh
parents:
diff changeset
    95
		options.add_argument('-d', dest='debugLevel', type=int,
hh
parents:
diff changeset
    96
			metavar='<debug level>', help='debug level 0-5, ENV DEB')
hh
parents:
diff changeset
    97
		options.add_argument('-s', dest='srvhost',
hh
parents:
diff changeset
    98
			metavar='<srvhost>', help='server domain name or ip, ENV HOST')
hh
parents:
diff changeset
    99
		options.add_argument('-c', dest='sslchannel', type=int,
hh
parents:
diff changeset
   100
			metavar='<channel#>', help='ssl channel NN, ENV CHAN')
hh
parents:
diff changeset
   101
		options.add_argument('-x', dest='sslPath',
hh
parents:
diff changeset
   102
			metavar='<sslhome>', help='ssl keys store directory, ENV SSL')
hh
parents:
diff changeset
   103
		options.add_argument('-i', dest='pullPeerIface',
hh
parents:
diff changeset
   104
			metavar='<iface>', help='copy from LAN peer via <iface>')
hh
parents:
diff changeset
   105
		parser.add_argument('datapaths', nargs='*', metavar='datapath')
hh
parents:
diff changeset
   106
		cls.args = vars(parser.parse_args())
hh
parents:
diff changeset
   107
hh
parents:
diff changeset
   108
	@classmethod
hh
parents:
diff changeset
   109
	def parsedflts(cls):
hh
parents:
diff changeset
   110
		cls.defaults = dict()
hh
parents:
diff changeset
   111
		with open(cls.defaultsFile) as df:
hh
parents:
diff changeset
   112
			for line in df:
hh
parents:
diff changeset
   113
				key, value = line.split('=')
hh
parents:
diff changeset
   114
				cls.defaults[key] = value[:-1]
hh
parents:
diff changeset
   115
hh
parents:
diff changeset
   116
	@classmethod
hh
parents:
diff changeset
   117
	def dflt(cls, key, wired):
hh
parents:
diff changeset
   118
		return cls.defaults[key] if key in cls.defaults else wired
hh
parents:
diff changeset
   119
hh
parents:
diff changeset
   120
	@classmethod
hh
parents:
diff changeset
   121
	def env(cls, key, default):
hh
parents:
diff changeset
   122
		return os.environ[key] if key in os.environ else default
hh
parents:
diff changeset
   123
hh
parents:
diff changeset
   124
	@classmethod
hh
parents:
diff changeset
   125
	def cmdl(cls, arg, default):
hh
parents:
diff changeset
   126
		return cls.args[arg] if (arg in cls.args and cls.args[arg]) else default
hh
parents:
diff changeset
   127
hh
parents:
diff changeset
   128
	@classmethod
hh
parents:
diff changeset
   129
	def getbindhost(cls):
hh
parents:
diff changeset
   130
		return socket.getfqdn()
hh
parents:
diff changeset
   131
hh
parents:
diff changeset
   132
		"""
hh
parents:
diff changeset
   133
		p = subprocess.Popen(["host", "-t", "A", socket.gethostname()], stdout=subprocess.PIPE)
hh
parents:
diff changeset
   134
		p.wait()
hh
parents:
diff changeset
   135
		if p.returncode == 0:
hh
parents:
diff changeset
   136
			return p.stdout.readlines()[0].decode().split()[3]
hh
parents:
diff changeset
   137
		else:
hh
parents:
diff changeset
   138
			return ''
hh
parents:
diff changeset
   139
		"""
hh
parents:
diff changeset
   140
hh
parents:
diff changeset
   141
	@classmethod
hh
parents:
diff changeset
   142
	def getbroadcast(cls, bindhost):
hh
parents:
diff changeset
   143
		return '255.255.255.255'
hh
parents:
diff changeset
   144
hh
parents:
diff changeset
   145
		"""zatím mimo použití, je to hodně nejasné
hh
parents:
diff changeset
   146
		p = subprocess.Popen(("ip", "-o", "addr", "list"), stdout=subprocess.PIPE)
hh
parents:
diff changeset
   147
		p.wait()
hh
parents:
diff changeset
   148
		if p.returncode == 0:
hh
parents:
diff changeset
   149
			return subprocess.check_output(("grep", bindhost), stdin=p.stdout).decode().split()[5]
hh
parents:
diff changeset
   150
		else:
hh
parents:
diff changeset
   151
			return '255.255.255.255'
hh
parents:
diff changeset
   152
		"""
hh
parents:
diff changeset
   153
hh
parents:
diff changeset
   154