#!/usr/bin/python3
# coding=utf8

# hal.hh.cz
#	/usr/local/bin/dejsem.py
#	/usr/local/dejsem/ssl
#
# FVWM shotcuts	Ctrl-Alt-B	Ctrl-Alt-C	Ctrl-Alt-V
# Key B	   A   CM  Exec ACT=PUSHCLIP CHAN=N dejsem.py	 # copy local  --> shared clipboard
# Key C	   A   CM  Exec ACT=PUSHCLIP CHAN=N dejsem.py	 # copy local  --> shared clipboard
# Key V	   A   CM  Exec ACT=PULLCLIP CHAN=N dejsem.py	 # copy shared --> local  clipboard
#
# server side
#	● akceptuje cmd-connection na základním portu kanálu a přijímá z ní příkazy
#	● po provedení příkazu
#		PULLCLIP
#		PULLHIST
#		PUSHCLIP
#		GETPEER
#		SETPEER
#		EXPOSE
#		EXPOSEUP
#		FREE
#		LONGTASK 
#	  se connection uzavře
#	● po provedení příkazu
#		PULLFILE
#		PUSHFILE
#		PULLLIST
#		MOVE
#		DELETE
#		CREATDIR
#		RECKON
#	  zůstává connection otevřená a pokračuje čtením dalšího příkazu, protože tyto příkazy mohou být dávkové
# timeouts
#	conn_TO				connection retry wait TO - wait before next connect try (try <connThreshold> times)
#	block_TO			blocking net operations TO
#	long_run_accept_TO	accept TO on ports binded dynamicaly for long duration operations
#	peer_accept_TO		accept TO waiting for connection from peer when receiving peer files (PULLPEER)

import sys, os, random, time, signal

def stop(sign, frame):
	for pid in pids:
		os.kill(pid, signal.SIGTERM)

pids = set()	# seznam subthreads pro účely mimořádného ukončení

if __name__ == '__main__':
	from parms import Parms
	Parms.setup()
	random.seed(Parms.random_seed) if Parms.random_seed else random.seed()

	from d import D
	D.t0 = time.time()
	d = D(Parms.applName)
	d.log("{}, ver. {:.2f}".format(sys.argv[0], Parms.version), sev=1)

	if Parms.action == 'SRV':
		from server import Server
		pid = os.fork()
		if not pid:		# child
			from meter import Meter
			Meter(d).run()
			sys.exit(0)
		else:			# parent
			pids.add(pid)
			d.log("Meter spawned in process {}".format(pid), sev=1)
		for chan in range(1, 99):
			if "{:02d}".format(chan) in os.listdir(Parms.srv_homedir):
				pid = os.fork()
				if not pid:		# child
					Server(d, chan)
					sys.exit(0)
				else:			# parent
					pids.add(pid)
					d.log("server node SSL {:02d} started in process {}".format(chan, pid), sev=4)
		d.log("all server nodes spawned", sev=1)
		signal.signal(signal.SIGINT, stop)
		signal.signal(signal.SIGTERM, stop)
		signal.pthread_sigmask(signal.SIG_UNBLOCK, {signal.SIGINT, signal.SIGTERM})
		signal.pause()
		d.log("KeyboardInterrupt")
	else:
		from client import Client
		Client(d)