📄 mpd.py
字号:
mpdtid = Thread(target=self.runmainloop) mpdtid.start() # signals must be handled in main thread; thus we permit timeout of join while mpdtid.isAlive(): mpdtid.join(2) # come out sometimes and handle signals if self.exiting: break if self.conSock: msgToSend = { 'cmd' : 'restarting_mpd' } self.conSock.msgToSend.send_dict_msg(msgToSend) self.streamHandler.del_handler(self.conSock) self.conSock.close() self.conSock = 0 def runmainloop(self): # Main Loop while 1: if self.spawnQ and not self.spawnInProgress: self.ring.rhsSock.send_dict_msg(self.spawnQ[0]) self.spawnQ = self.spawnQ[1:] self.spawnInProgress = 1 continue rv = self.streamHandler.handle_active_streams(timeout=8.0) if rv[0] < 0: if type(rv[1]) == ClassType and rv[1] == KeyboardInterrupt: # ^C sys.exit(-1) if self.exiting: break if rv[0] == 0: if self.pulse_cntr == 0 and self.ring.rhsSock: self.ring.rhsSock.send_dict_msg({'cmd':'pulse'}) self.pulse_cntr += 1 if self.pulse_cntr >= 3: if self.ring.rhsSock: # rhs must have disappeared self.streamHandler.del_handler(self.ring.rhsSock) self.ring.rhsSock.close() self.ring.rhsSock = 0 if self.ring.lhsSock: self.streamHandler.del_handler(self.ring.lhsSock) self.ring.lhsSock.close() self.ring.lhsSock = 0 mpd_print(1,'no pulse_ack from rhs; re-entering ring') rc = self.ring.reenter_ring(lhsHandler=self.handle_lhs_input, rhsHandler=self.handle_rhs_input, ntries=16) if rc == 0: mpd_print(1,'back in ring') else: mpd_print(1,'failed to reenter ring') sys.exit(-1) self.pulse_cntr = 0 mpd_close_zc() # only does something if we have zc def usage(self): print __doc__ print "This version of mpd is", mpd_version() sys.exit(-1) def cleanup(self): try: mpd_print(0, "CLEANING UP" ) if syslog_module_available: syslog.syslog(syslog.LOG_INFO,"mpd ending mpdid=%s (inside cleanup)" % \ (self.myId) ) syslog.closelog() if self.conListenSock: # only del if I created os.unlink(self.conListenSock.conFilename) except: pass def get_parms_from_cmdline(self): global mpd_dbg_level argidx = 1 while argidx < len(sys.argv): if sys.argv[argidx] == '--help': self.usage() argidx += 1 elif sys.argv[argidx] == '-h': if len(sys.argv) < 3: self.usage() self.parmdb[('cmdline','MPD_ENTRY_IFHN')] = sys.argv[argidx+1] argidx += 2 elif sys.argv[argidx].startswith('--host'): try: entryHost = sys.argv[argidx].split('=',1)[1] except: print 'failed to parse --host option' self.usage() self.parmdb[('cmdline','MPD_ENTRY_IFHN')] = entryHost argidx += 1 elif sys.argv[argidx] == '-p': if argidx >= (len(sys.argv)-1): print 'missing arg for -p' sys.exit(-1) if not sys.argv[argidx+1].isdigit(): print 'invalid port %s ; must be numeric' % (sys.argv[argidx+1]) sys.exit(-1) self.parmdb[('cmdline','MPD_ENTRY_PORT')] = int(sys.argv[argidx+1]) argidx += 2 elif sys.argv[argidx].startswith('--port'): try: entryPort = sys.argv[argidx].split('=',1)[1] except: print 'failed to parse --port option' self.usage() if not entryPort.isdigit(): print 'invalid port %s ; must be numeric' % (entryPort) sys.exit(-1) self.parmdb[('cmdline','MPD_ENTRY_PORT')] = int(entryPort) argidx += 1 elif sys.argv[argidx].startswith('--ncpus'): try: NCPUs = sys.argv[argidx].split('=',1)[1] except: print 'failed to parse --ncpus option' self.usage() if not NCPUs.isdigit(): print 'invalid ncpus %s ; must be numeric' % (NCPUs) sys.exit(-1) self.parmdb[('cmdline','MPD_NCPUS')] = int(NCPUs) argidx += 1 elif sys.argv[argidx].startswith('--pid'): try: splitPid = sys.argv[argidx].split('=') except: print 'failed to parse --pid option' self.usage() if len(splitPid) == 1 or not splitPid[1]: pidFilename = '/var/run/mpd.pid' else: pidFilename = splitPid[1] self.parmdb[('cmdline','MPD_PID_FILENAME')] = pidFilename argidx += 1 elif sys.argv[argidx].startswith('--ifhn'): try: ifhn = sys.argv[argidx].split('=',1)[1] except: print 'failed to parse --ifhn option' self.usage() try: hostinfo = socket.gethostbyname_ex(ifhn) ifhn = hostinfo[2][0] except: print 'mpd failed: gethostbyname_ex failed for %s' % (ifhn) sys.exit(-1) self.parmdb[('cmdline','MPD_MY_IFHN')] = ifhn argidx += 1 elif sys.argv[argidx] == '-l': if argidx >= (len(sys.argv)-1): print 'missing arg for -l' sys.exit(-1) if not sys.argv[argidx+1].isdigit(): print 'invalid listenport %s ; must be numeric' % (sys.argv[argidx+1]) sys.exit(-1) self.parmdb[('cmdline','MPD_LISTEN_PORT')] = int(sys.argv[argidx+1]) argidx += 2 elif sys.argv[argidx].startswith('--listenport'): try: myListenPort = sys.argv[argidx].split('=',1)[1] except: print 'failed to parse --listenport option' self.usage() if not myListenPort.isdigit(): print 'invalid listenport %s ; must be numeric' % (myListenPort) sys.exit(-1) self.parmdb[('cmdline','MPD_LISTEN_PORT')] = int(myListenPort) argidx += 1 elif sys.argv[argidx] == '-hp': if argidx >= (len(sys.argv)-1): print 'missing arg for -hp' sys.exit(-1) try: (entryIfhn,entryPort) = sys.argv[argidx+1].split('_') except: print 'invalid entry host: %s' % (sys.argv[argidx+1]) sys.exit(-1) if not entryPort.isdigit(): print 'invalid port %s ; must be numeric' % (sys.argv[argidx+1]) sys.exit(-1) self.parmdb[('cmdline','MPD_ENTRY_IFHN')] = entryIfhn self.parmdb[('cmdline','MPD_ENTRY_PORT')] = int(entryPort) argidx += 2 elif sys.argv[argidx] == '-t' or sys.argv[argidx] == '--trace': self.parmdb[('cmdline','MPD_TRACE_FLAG')] = 1 argidx += 1 elif sys.argv[argidx] == '--debug': mpd_set_dbg_level(1) argidx += 1 elif sys.argv[argidx] == '-n' or sys.argv[argidx] == '--noconsole': self.parmdb[('cmdline','MPD_CONSOLE_FLAG')] = 0 argidx += 1 elif sys.argv[argidx] == '-e' or sys.argv[argidx] == '--echo': self.parmdb[('cmdline','MPD_ECHO_PORT_FLAG')] = 1 argidx += 1 elif sys.argv[argidx] == '-d' or sys.argv[argidx] == '--daemon': self.parmdb[('cmdline','MPD_DAEMON_FLAG')] = 1 argidx += 1 elif sys.argv[argidx] == '-b' or sys.argv[argidx] == '--bulletproof': self.parmdb[('cmdline','MPD_BULLETPROOF_FLAG')] = 1 argidx += 1 elif sys.argv[argidx] == '-zc': if argidx >= (len(sys.argv)-1): print 'missing arg for -zc' sys.exit(-1) if not sys.argv[argidx+1].isdigit(): print 'invalid arg for -zc %s ; must be numeric' % (sys.argv[argidx+1]) sys.exit(-1) intarg = int(sys.argv[argidx+1]) if intarg < 1: print 'invalid arg for -zc %s ; must be >= 1' % (sys.argv[argidx+1]) sys.exit(-1) self.parmdb[('cmdline','MPD_ZC')] = intarg argidx += 2 else: print 'unrecognized arg: %s' % (sys.argv[argidx]) sys.exit(-1) if (self.parmdb['MPD_ENTRY_IFHN'] and not self.parmdb['MPD_ENTRY_PORT']) \ or (self.parmdb['MPD_ENTRY_PORT'] and not self.parmdb['MPD_ENTRY_IFHN']): print 'host and port must be specified together' sys.exit(-1) def handle_console_connection(self,sock): if not self.conSock: (self.conSock,newConnAddr) = sock.accept() if hasattr(socket,'AF_UNIX') and sock.family == socket.AF_UNIX: line = self.conSock.recv_char_msg().rstrip() if not line: # caller went away (perhaps another mpd seeing if I am here) self.streamHandler.del_handler(self.conSock) self.conSock.close() self.conSock = 0 return errorMsg = '' try: (kv1,kv2) = line.split(' ',1) # 'realusername=xxx secretword=yyy' except: errorMsg = 'failed to split this msg on " ": %s' % line if not errorMsg: try: (k1,self.conSock.realUsername) = kv1.split('=',1) except: errorMsg = 'failed to split first kv pair on "=": %s' % line if not errorMsg: try: (k2,secretword) = kv2.split('=',1) except: errorMsg = 'failed to split second kv pair on "=": %s' % line if not errorMsg and k1 != 'realusername': errorMsg = 'first key is not realusername' if not errorMsg and k2 != 'secretword': errorMsg = 'second key is not secretword' if not errorMsg and os.getuid() == 0 and secretword != self.parmdb['MPD_SECRETWORD']: errorMsg = 'invalid secretword to root mpd' if errorMsg: try: self.conSock.send_dict_msg({'error_msg': errorMsg}) except: pass self.streamHandler.del_handler(self.conSock) self.conSock.close() self.conSock = 0 return self.conSock.beingChallenged = 0 else: msg = self.conSock.recv_dict_msg() if not msg: # caller went away (perhaps another mpd seeing if I am here) self.streamHandler.del_handler(self.conSock) self.conSock.close() self.conSock = 0 return if not msg.has_key('cmd') or msg['cmd'] != 'con_init': mpd_print(1, 'console sent bad msg :%s:' % (msg) ) try: # try to let console know self.conSock.send_dict_msg({'cmd':'invalid_msg_received_from_you'})
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -