def receive(self, text=None, bytes=None, **kwargs): try: if text: data = json.loads(text) if data[0] == 'ip': ip = data[1] self.ssh.set_missing_host_key_policy( paramiko.AutoAddPolicy()) try: data = ServerInfor.objects.get(ip=ip) port = data.credential.port method = data.credential.method username = data.credential.username if method == 'password': password = data.credential.password else: key = data.credential.key except ObjectDoesNotExist: self.message.reply_channel.send( { "text": json.dumps([ 'stdout', '\033[1;3;31mConnect to server! Server ip doesn\'t exist!\033[0m' ]) }, immediately=True) self.message.reply_channel.send({"accept": False}) try: if method == 'password': self.ssh.connect(ip, port=port, username=username, password=password, timeout=3) else: self.ssh.connect(ip, port=port, username=username, key_filename=key, timeout=3) except socket.timeout: self.message.reply_channel.send( { "text": json.dumps([ 'stdout', '\033[1;3;31mConnect to server time out\033[0m' ]) }, immediately=True) self.message.reply_channel.send({"accept": False}) return except Exception: self.message.reply_channel.send( { "text": json.dumps([ 'stdout', '\033[1;3;31mCan not connect to server\033[0m' ]) }, immediately=True) self.message.reply_channel.send({"accept": False}) return chan = self.ssh.invoke_shell( width=90, height=40, ) multiple_chan[self.message.reply_channel.name] = chan interactive_shell(chan, self.message.reply_channel.name) elif data[0] in ['stdin', 'stdout']: if multiple_chan.has_key(self.message.reply_channel.name): multiple_chan[self.message.reply_channel.name].send( json.loads(text)[1]) else: self.message.reply_channel.send( { "text": json.dumps([ 'stdout', '\033[1;3;31mSsh session is terminate or closed!\033[0m' ]) }, immediately=True) else: self.message.reply_channel.send( { "text": json.dumps([ 'stdout', '\033[1;3;31mUnknow command found!\033[0m' ]) }, immediately=True) elif bytes: if multiple_chan.has_key(self.message.reply_channel.name): multiple_chan[self.message.reply_channel.name].send( json.loads(bytes)[1]) except socket.error: if multiple_chan.has_key(self.message.reply_channel.name): multiple_chan[self.message.reply_channel.name].close() except Exception, e: import traceback print traceback.print_exc()
def receive(self, text=None, bytes=None, **kwargs): try: if text: data = json.loads(text) begin_time = time.time() if data[0] == 'ip': ip = data[1] width = data[2] height = data[3] self.ssh.set_missing_host_key_policy( paramiko.AutoAddPolicy()) try: data = ServerInfor.objects.get(ip=ip) port = data.credential.port method = data.credential.method username = data.credential.username audit_log = SshLog.objects.create( user=User.objects.get(username=self.message.user), server=data, channel=self.message.reply_channel.name, width=width, height=height) audit_log.save() if method == 'password': password = data.credential.password else: key = data.credential.key except ObjectDoesNotExist: self.message.reply_channel.send( { "text": json.dumps([ 'stdout', '\033[1;3;31mConnect to server! Server ip doesn\'t exist!\033[0m' ]) }, immediately=True) self.message.reply_channel.send({"accept": False}) try: if method == 'password': self.ssh.connect(ip, port=port, username=username, password=password, timeout=3) else: self.ssh.connect(ip, port=port, username=username, key_filename=key, timeout=3) except socket.timeout: self.message.reply_channel.send( { "text": json.dumps([ 'stdout', '\033[1;3;31mConnect to server time out\033[0m' ]) }, immediately=True) self.message.reply_channel.send({"accept": False}) return except Exception: self.message.reply_channel.send( { "text": json.dumps([ 'stdout', '\033[1;3;31mCan not connect to server\033[0m' ]) }, immediately=True) self.message.reply_channel.send({"accept": False}) return chan = self.ssh.invoke_shell( width=width, height=height, ) #open a new threading to handle ssh to avoid global variable bug t1 = SshTerminalThread(self.message, chan) t1.setDaemon = True t1.start() directory_date_time = now() log_name = os.path.join( '{0}-{1}-{2}'.format(directory_date_time.year, directory_date_time.month, directory_date_time.day), '{0}.json'.format(audit_log.log)) interactive_shell(chan, self.message.reply_channel.name, log_name=log_name, width=width, height=height) elif data[0] in ['stdin', 'stdout']: self.queue().publish(self.message.reply_channel.name, json.loads(text)[1]) elif data[0] == u'set_size': self.queue().publish(self.message.reply_channel.name, text) else: self.message.reply_channel.send( { "text": json.dumps([ 'stdout', '\033[1;3;31mUnknow command found!\033[0m' ]) }, immediately=True) elif bytes: self.queue().publish(self.message.reply_channel.name, json.loads(bytes)[1]) except socket.error: audit_log = SshLog.objects.get( user=User.objects.get(username=self.message.user), channel=self.message.reply_channel.name) audit_log.is_finished = True audit_log.end_time = now() audit_log.save() self.closessh() self.close() except Exception, e: import traceback print traceback.print_exc() self.closessh() self.close()
def receive(self,text=None, bytes=None, **kwargs): try: if text: data = json.loads(text) begin_time = time.time() if data[0] == 'ip': ip = data[1] self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) try: data = ServerInfor.objects.get(ip=ip) port = data.credential.port method = data.credential.method username = data.credential.username audit_log = SshLog.objects.create(user=User.objects.get(username=self.message.user),server=data,channel=self.message.reply_channel.name) audit_log.save() if method == 'password': password = data.credential.password else: key = data.credential.key except ObjectDoesNotExist: self.message.reply_channel.send({"text":json.dumps(['stdout','\033[1;3;31mConnect to server! Server ip doesn\'t exist!\033[0m'])},immediately=True) self.message.reply_channel.send({"accept":False}) try: if method == 'password': self.ssh.connect(ip, port=port, username=username, password=password, timeout=3) else: self.ssh.connect(ip, port=port, username=username, key_filename=key, timeout=3) except socket.timeout: self.message.reply_channel.send({"text":json.dumps(['stdout','\033[1;3;31mConnect to server time out\033[0m'])},immediately=True) self.message.reply_channel.send({"accept":False}) return except Exception: self.message.reply_channel.send({"text":json.dumps(['stdout','\033[1;3;31mCan not connect to server\033[0m'])},immediately=True) self.message.reply_channel.send({"accept":False}) return chan = self.ssh.invoke_shell(width=90, height=40,) multiple_chan[self.message.reply_channel.name] = chan directory_date_time = now() log_name = os.path.join('{0}-{1}-{2}'.format(directory_date_time.year,directory_date_time.month,directory_date_time.day),'{0}.json'.format(audit_log.log)) interactive_shell(chan,self.message.reply_channel.name,log_name=log_name) elif data[0] in ['stdin','stdout']: if multiple_chan.has_key(self.message.reply_channel.name): multiple_chan[self.message.reply_channel.name].send(json.loads(text)[1]) else: self.message.reply_channel.send({"text":json.dumps(['stdout','\033[1;3;31mSsh session is terminate or closed!\033[0m'])},immediately=True) elif data[0] == u'set_size': if multiple_chan.has_key(self.message.reply_channel.name): multiple_chan[self.message.reply_channel.name].resize_pty(width=data[3], height=data[4]) else: self.message.reply_channel.send({"text":json.dumps(['stdout','\033[1;3;31mUnknow command found!\033[0m'])},immediately=True) elif bytes: if multiple_chan.has_key(self.message.reply_channel.name): multiple_chan[self.message.reply_channel.name].send(json.loads(bytes)[1]) except socket.error: if multiple_chan.has_key(self.message.reply_channel.name): multiple_chan[self.message.reply_channel.name].close() audit_log=SshLog.objects.get(user=User.objects.get(username=self.message.user),channel=self.message.reply_channel.name) audit_log.is_finished = True audit_log.end_time = now() audit_log.save() except Exception,e: import traceback print traceback.print_exc()