def flvrec(filename, host='localhost', port=5900, framerate=12, keyframe=120, preferred_encoding=(0, ), pwdfile=None, blocksize=32, clipping=None, cmdline=None, debug=0, verbose=1): fp = file(filename, 'wb') if pwdfile: pwdcache = PWDFile(pwdfile) else: pwdcache = PWDCache('%s:%d' % (host, port)) writer = FLVWriter(fp, framerate=framerate, debug=debug) sink = FLVVideoSink(writer, blocksize=blocksize, framerate=framerate, keyframe=keyframe, clipping=clipping, debug=debug) client = RFBNetworkClient(host, port, sink, timeout=500 / framerate, pwdcache=pwdcache, preferred_encoding=preferred_encoding, debug=debug) if verbose: print >> sys.stderr, 'start recording' pid = 0 if cmdline: pid = os.fork() if pid == 0: os.setpgrp() os.execvp('sh', ['sh', '-c', cmdline]) sys.exit(1) retval = 0 try: def sigint_handler(sig, frame): raise KeyboardInterrupt signal.signal(signal.SIGINT, sigint_handler) client.open() try: while 1: client.idle() finally: client.close() except KeyboardInterrupt: pass except socket.error, e: print >> sys.stderr, 'Socket error:', e retval = 1
def flvrec(filename, host='localhost', port=5900, framerate=12, keyframe=120, preferred_encoding=(0,), pwdfile=None, blocksize=32, clipping=None, cmdline=None, debug=0, verbose=1, time_per_piece=None): fp = file(filename, 'wb') if pwdfile: pwdcache = PWDFile(pwdfile) else: pwdcache = PWDCache('%s:%d' % (host,port)) writer = FLVWriter(fp, framerate=framerate, debug=debug) sink = FLVVideoSink(writer, blocksize=blocksize, framerate=framerate, keyframe=keyframe, clipping=clipping, debug=debug) client = RFBNetworkClient(host, port, sink, timeout=500/framerate, pwdcache=pwdcache, preferred_encoding=preferred_encoding, debug=debug) if verbose: print >>sys.stderr, 'start recording' pid = 0 if cmdline: pid = os.fork() if pid == 0: os.setpgrp() os.execvp('sh', ['sh', '-c', cmdline]) sys.exit(1) retval = 0 starttime = datetime.datetime.now() try: def sigint_handler(sig, frame): raise KeyboardInterrupt signal.signal(signal.SIGINT, sigint_handler) client.open() try: while 1: if datetime.datetime.now() > starttime + datetime.timedelta(minutes=time_per_piece): starttime = datetime.datetime.now() fp = file('out%s.flv' % time.strftime('%Y%m%d%H%M'), 'wb') writer = FLVWriter(fp, framerate=framerate, debug=debug) sink.replace_writer(writer) client.idle() finally: client.close() except KeyboardInterrupt: pass except socket.error, e: print >>sys.stderr, 'Socket error:', e retval = 1
def run(self): self.fp = file(self.filename, 'wb') self.writer = FLVWriter(self.fp, framerate = self.framerate, logger = self.logger) self.sink = FLVVideoSink( self.writer, blocksize = self.blocksize, framerate = self.framerate, keyframe = self.keyframe, clipping = self.clipping, logger = self.logger ) self.client = RFBNetworkClient( self.host, self.port, self.sink, timeout = 500 / self.framerate, pwdcache = self.pwdcache, preferred_encoding = self.preferred_encoding, logger = self.logger ) self.logger.info('[vnc2flv] Start recording') try: self.client.open() self.is_recording = True while self.keep_recording: try: self.client.idle() except RFBError as e: self.logger.error("[vnc2flv] RFB error: %s"%unicode(e)) sleep(1) self.is_recording = False except socket.error as e: self.is_recording = False tb = traceback.format_exc() self.logger.error("[vnc2flv] Socket traceback: %s"%unicode(tb)) self.stop() raise Exception("[vnc2flv] Socket error: %s"%unicode(e))
def client_from_config(config): password = config.get('password') filename = config.get('filename') host = config.get('host') port = config.get('port') output_path = config.get('output_path') framerate = config.get('framerate') keyframe = config.get('keyframe') preferred_encoding = config.get('preferred_encoding') blocksize = config.get('blocksize') clipping = config.get('clipping') debug = config.get('debug') pwdcache = MemoryPWD(password) try: os.makedirs(output_path) except OSError as exc: if exc.errno == errno.EEXIST and os.path.isdir(output_path): pass else: raise fp = open(os.path.join(output_path, filename), 'wb') writer = FLVWriter(fp, framerate=framerate, debug=debug) sink = FLVVideoSink(writer, blocksize=blocksize, framerate=framerate, keyframe=keyframe, clipping=clipping, debug=debug) client = RFBNetworkClient(host, port, sink, timeout=500 / framerate, pwdcache=pwdcache, preferred_encoding=preferred_encoding, debug=debug) return fp, writer, client
class FlvRec(threading.Thread): """Record a vnc session to a flv file """ def __init__(self, filename, host = 'localhost', port = 5900, framerate = 12, keyframe = 120, preferred_encoding = (0,), pwdfile = None, blocksize = 32, clipping = None, logger_level = 'INFO', logger_log_dir = False, logger_name = 'CastroRedux'): super(FlvRec, self).__init__() self.filename = filename self.host = host self.port = port self.framerate = framerate self.keyframe = keyframe self.preferred_encoding = preferred_encoding self.pwdfile = pwdfile self.blocksize = blocksize self.clipping = clipping self.logger_name = logger_name self.logger_level = logger_level self.logger_log_dir = logger_log_dir self.pwdcache = PWDFile(self.pwdfile) self.is_recording = False self.keep_recording = True self.configure_logger() def configure_logger(self): #Logger self.logger = logging.getLogger(self.logger_name) #File logger if self.logger_log_dir: fh = logging.FileHandler(os.path.join( self.logger_log_dir, '%s-CastroRedux.log'%self.logger_name )) self.logger.addHandler(fh) #Stream logger self.logger.addHandler(logging.StreamHandler()) #Set level self.logger.setLevel(self.logger_level) def run(self): self.fp = file(self.filename, 'wb') self.writer = FLVWriter(self.fp, framerate = self.framerate, logger = self.logger) self.sink = FLVVideoSink( self.writer, blocksize = self.blocksize, framerate = self.framerate, keyframe = self.keyframe, clipping = self.clipping, logger = self.logger ) self.client = RFBNetworkClient( self.host, self.port, self.sink, timeout = 500 / self.framerate, pwdcache = self.pwdcache, preferred_encoding = self.preferred_encoding, logger = self.logger ) self.logger.info('[vnc2flv] Start recording') try: self.client.open() self.is_recording = True while self.keep_recording: try: self.client.idle() except RFBError as e: self.logger.error("[vnc2flv] RFB error: %s"%unicode(e)) sleep(1) self.is_recording = False except socket.error as e: self.is_recording = False tb = traceback.format_exc() self.logger.error("[vnc2flv] Socket traceback: %s"%unicode(tb)) self.stop() raise Exception("[vnc2flv] Socket error: %s"%unicode(e)) def stop(self): self.logger.info('[vnc2flv] Stop recording...') self.keep_recording = False #Wait until the recording is over for i in range(10): if self.is_recording: sleep(1) else: break self.client.close() self.writer.close() self.fp.close()