117 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			117 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| # Author: Bandie Canis
 | |
| # License: 2-Clause BSD License
 | |
| 
 | |
| import sys, ssl, socket, os, getopt
 | |
| import configparser
 | |
| 
 | |
| 
 | |
| host = None
 | |
| port = 0
 | |
| cafile = None
 | |
| certfile = None
 | |
| keyfile = None
 | |
| exitcode = 1
 | |
| 
 | |
| def init(conf):
 | |
| 
 | |
|   if(conf == None):
 | |
|     if(os.name == 'nt'):
 | |
|       CONFIG = "ding.win.cfg"
 | |
|     else:
 | |
|       CONFIG = "ding.cfg"
 | |
|   else:
 | |
|     CONFIG = conf
 | |
| 
 | |
|   cfg = configparser.ConfigParser()
 | |
|   try:
 | |
|     cfg.read(CONFIG)
 | |
| 
 | |
|     global host, port, cafile, certfile, keyfile
 | |
|     host = cfg.get("Client", "host")
 | |
|     port = int(cfg.get("Client", "port"))
 | |
| 
 | |
|     cafile = cfg.get("Client", "cafile")
 | |
|     certfile = cfg.get("Client", "certfile")
 | |
|     keyfile = cfg.get("Client", "keyfile")
 | |
|   except configparser.NoSectionError:
 | |
|     print("No suitable config found. Expecting some config in", CONFIG, file=sys.stderr)
 | |
|     quit(3)
 | |
| 
 | |
| 
 | |
| def send(conn, cmd):
 | |
| 
 | |
|   conn.connect((host, port))
 | |
|   buf = conn.recv(1024)
 | |
|   if(buf == b"OK 1337\n"):
 | |
|     conn.sendall(cmd)
 | |
|     buf = conn.recv(1024)
 | |
|     if(buf == b"OK CMD"):
 | |
|       exitcode = 0
 | |
|     elif(buf == b"ERR NO_CMD"):
 | |
|       print("Error. Server said: The command isn't set on the server.", file=sys.stderr)
 | |
|       exitcode = 1
 | |
|     elif(buf == b"ERR CMD_ERR"):
 | |
|       print("Error. Server said: The command doesn't work because the file doesn't exist on the server.", file=sys.stderr)
 | |
|       exitcode = 2
 | |
|     elif(buf == b"ERR PW"):
 | |
|       print("Error. Password required. The password was wrong.", file=sys.stderr)
 | |
|       exitcode = 4
 | |
|     elif(b"OK PW" in buf):
 | |
|       bufr=str(buf.decode('utf-8'))
 | |
|       print("Password accepted. Timeout:", bufr.replace("OK PW ",""), "seconds.")
 | |
| 
 | |
|   else:
 | |
|     conn.sendall(b"NO.")
 | |
|     print("The server seems to be crazy. Nothing sent.", file=sys.stderr)
 | |
| 
 | |
|   conn.close()
 | |
|   quit(exitcode)
 | |
| 
 | |
| 
 | |
| def main(arg):
 | |
|   try:
 | |
|     context = ssl.SSLContext(ssl.PROTOCOL_TLS)
 | |
|     context.verify_mode = ssl.CERT_REQUIRED
 | |
|     context.load_verify_locations(cafile)
 | |
|     context.load_cert_chain(certfile=certfile, keyfile=keyfile)
 | |
|   except FileNotFoundError as e:
 | |
|     print(e)
 | |
|     print("Please check your paths in the config file. (Have you forgotten to generate the Certificates?)", sep="", file=sys.stderr)
 | |
|     quit(2)
 | |
| 
 | |
|   if(":" in host):
 | |
|     conn = context.wrap_socket(socket.socket(family=socket.AF_INET6))
 | |
|   else:
 | |
|     conn = context.wrap_socket(socket.socket(family=socket.AF_INET))
 | |
| 
 | |
| 
 | |
|   try:
 | |
|     send(conn, bytes(arg[0], sys.stdin.encoding))
 | |
|   except IndexError:
 | |
|     print(sys.argv[0], ": Missing argument.\nSyntax: ", sys.argv[0], " <COMMAND>", file=sys.stderr)
 | |
|   except ConnectionRefusedError:
 | |
|     print("Connection refused.", file=sys.stderr)
 | |
|     quit(1)
 | |
|   except ssl.SSLError:
 | |
|     print("Wrong certificate.", file=sys.stderr);
 | |
|     quit(3)
 | |
| 
 | |
| 
 | |
| 
 | |
| if(__name__ == "__main__"):
 | |
|   try:
 | |
|     conf = None
 | |
|     opts, args = getopt.getopt(sys.argv[1:], "c:")
 | |
|     for o, a in opts:
 | |
|       if o == "-c":
 | |
|         conf = a
 | |
|     init(conf)
 | |
|     main(args)
 | |
|   except getopt.GetoptError as e:
 | |
|     print("Error using options. Allowed options:\n-c [FILE] - Config file\n")
 | |
|     quit(2)
 | |
| 
 | |
|   quit(exitcode)
 |