dejsem.1.5/python/dejsem.pycharm/parms.py
changeset 0 676905a3b03c
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dejsem.1.5/python/dejsem.pycharm/parms.py	Wed Nov 27 09:50:16 2019 +0100
@@ -0,0 +1,154 @@
+#!/usr/bin/python3
+# coding=utf8
+
+import os, argparse, subprocess, socket
+
+class Parms():
+
+	positiv = ('1', 'Y', 'YES', 'ON')
+	negativ = ('0', 'N', 'NO', 'OFF')
+
+	@classmethod
+	def setup(cls):
+		cls.applName = "dejsem"
+		cls.version = 1.00
+
+		cls.defaultsFile = os.path.join("/etc/default", cls.applName)
+		cls.parsedflts()
+		cls.parsecmdl()
+
+		cls.clientMode = False		# řídí chování při ABENDu: client po ABENDu sys.exit(), server pokračuje
+
+		cls.debugLevel = cls.cmdl("debugLevel", int(cls.env("DEB", cls.dflt("DEB", 0))))
+		cls.random_seed= int(cls.env('RS', 0))
+
+		cls.action = cls.cmdl("action", cls.env("ACT", "")).upper()
+		cls.clientMode = cls.action != "SRV"
+
+		cls.ssl = True
+
+		cls.sslchannel = int(cls.cmdl("sslchannel", cls.env("CHAN", cls.dflt("CHAN", 2))))
+		cls.sslPath = cls.cmdl("sslPath", cls.env("SSLP", cls.dflt("SSLP", os.path.join("/usr/share", cls.applName, "ssl"))))
+		cls.sslCAPath = os.path.join(cls.sslPath, "dejCA.crt")
+		cls.sslCert = os.path.join(cls.sslPath, "{:02d}.pem".format(cls.sslchannel))
+
+		cls.srvhost = cls.cmdl("srvhost", cls.env("HOST", cls.dflt("HOST", "dejsem.org")))
+		cls.filedir = "files"
+		cls.exposed = ".exposed_to_http"
+		cls.clipfile = "clipboard"
+		cls.histdir = "history"		# cliboard history dir
+		cls.srv_wwwhomedir = os.path.join("/var/www/html", cls.applName)
+		cls.srv_homedir = os.path.join("/usr/local/", cls.applName)
+		cls.client_homedir = cls.env("HOME", os.path.join("/home", "{}".format(os.getlogin)))
+		cls.client_appldir = os.path.join(cls.client_homedir, ".local/share", cls.applName)
+		cls.client_histdir = os.path.join(cls.client_appldir, cls.histdir)
+
+		cls.bindhost = cls.env("BINDHOST", cls.dflt("BINDHOST", cls.getbindhost()))
+		# cls.bindhost = cls.env("BINDHOST", "")
+		# cls.broadcast = cls.env("BROADCAST", cls.getbroadcast(cls.bindhost))
+		cls.broadcast = cls.env("BROADCAST", "255.255.255.255")
+		cls.baseport = int(cls.env("BASEPORT", cls.dflt("BASEPORT", 42000)))
+		cls.udpport = 4242 if cls.applName == "dejsem" else 4224 
+		cls.pullPeerIface = None
+
+		cls.bufSize = 256 * 1024
+		cls.connThreshold = 77
+		cls.connTimeout = 0.01
+		cls.blockTimeout = 20
+		cls.accept_timeout = 60  	# seconds
+		cls.long_run_accept_timeout = 60  	# seconds
+		cls.peer_accept_timeout = 60  		# seconds
+
+		cls.datapaths = cls.args["datapaths"]	# data paths from cmdline
+		cls.orig = cls.cmdl("datapaths", list(cls.env("ORIG", "")))		# origin data path
+		cls.dest = cls.env("DEST", "")		# destination data path from ENV
+
+	@classmethod
+	def parsecmdl(cls):
+		parser = argparse.ArgumentParser(description='sdílení clipboardu a filů přes server, přenos filů peer-to-peer')
+		cmds = parser.add_mutually_exclusive_group()
+		cmds.add_argument('--push', dest='action',
+			action='store_const', const='PUSHCLIP',
+			help='copy from local clipboard to shared clipboard')
+		cmds.add_argument('--pull', dest='action',
+			action='store_const', const='PULLCLIP',
+			help='copy from shared clipboard to local clipboard')
+		cmds.add_argument('--pullhist', dest='action',
+			action='store_const', const='PULLHIST',
+			help='synchronize local clipboard history from shared clipboard')
+		cmds.add_argument('--pushsrv', '--pushfile', '--puf', dest='action',
+			action='store_const', const='PUSHFILE',
+			help='copy local file to server')
+		cmds.add_argument('--pullsrv', '--pullfile', '--plf', dest='action',
+			action='store_const', const='PULLFILE',
+			help='copy server file to local')
+		cmds.add_argument('--pulllist', dest='action',
+			action='store_const', const='PULLLIST',
+			help='list files on server')
+		cmds.add_argument('--pushpeer', '--pup', dest='action',
+			action='store_const', const='PUSHPEER',
+			help='copy from local file to LAN peer')
+		cmds.add_argument('--pullpeer', '--plp', dest='action',
+			action='store_const', const='PULLPEER',
+			help='copy from LAN peer to local dir')
+		options = parser.add_argument_group(title='options')
+		options.add_argument('-d', dest='debugLevel', type=int,
+			metavar='<debug level>', help='debug level 0-5, ENV DEB')
+		options.add_argument('-s', dest='srvhost',
+			metavar='<srvhost>', help='server domain name or ip, ENV HOST')
+		options.add_argument('-c', dest='sslchannel', type=int,
+			metavar='<channel#>', help='ssl channel NN, ENV CHAN')
+		options.add_argument('-x', dest='sslPath',
+			metavar='<sslhome>', help='ssl keys store directory, ENV SSL')
+		options.add_argument('-i', dest='pullPeerIface',
+			metavar='<iface>', help='copy from LAN peer via <iface>')
+		parser.add_argument('datapaths', nargs='*', metavar='datapath')
+		cls.args = vars(parser.parse_args())
+
+	@classmethod
+	def parsedflts(cls):
+		cls.defaults = dict()
+		with open(cls.defaultsFile) as df:
+			for line in df:
+				key, value = line.split('=')
+				cls.defaults[key] = value[:-1]
+
+	@classmethod
+	def dflt(cls, key, wired):
+		return cls.defaults[key] if key in cls.defaults else wired
+
+	@classmethod
+	def env(cls, key, default):
+		return os.environ[key] if key in os.environ else default
+
+	@classmethod
+	def cmdl(cls, arg, default):
+		return cls.args[arg] if (arg in cls.args and cls.args[arg]) else default
+
+	@classmethod
+	def getbindhost(cls):
+		return socket.getfqdn()
+
+		"""
+		p = subprocess.Popen(["host", "-t", "A", socket.gethostname()], stdout=subprocess.PIPE)
+		p.wait()
+		if p.returncode == 0:
+			return p.stdout.readlines()[0].decode().split()[3]
+		else:
+			return ''
+		"""
+
+	@classmethod
+	def getbroadcast(cls, bindhost):
+		return '255.255.255.255'
+
+		"""zatím mimo použití, je to hodně nejasné
+		p = subprocess.Popen(("ip", "-o", "addr", "list"), stdout=subprocess.PIPE)
+		p.wait()
+		if p.returncode == 0:
+			return subprocess.check_output(("grep", bindhost), stdin=p.stdout).decode().split()[5]
+		else:
+			return '255.255.255.255'
+		"""
+
+