📄 mpd.py
字号:
if self.exiting: break 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): 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] == '-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 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 try: (k1,self.conSock.realUsername) = kv1.split('=',1) except: errorMsg = 'failed to split first kv pair on "=": %s' % line try: (k2,secretword) = kv2.split('=',1) except: errorMsg = 'failed to split second kv pair on "=": %s' % line if k1 != 'realusername': errorMsg = 'first key is not realusername' if k2 != 'secretword': errorMsg = 'second key is not secretword' if 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'}) except: pass self.streamHandler.del_handler(self.conSock) self.conSock.close() self.conSock = 0 return self.streamHandler.set_handler(self.conSock,self.handle_console_input) self.conSock.beingChallenged = 1 self.conSock.name = 'console' randNum = randrange(1,10000) randVal = sock.secretword + str(randNum) self.conSock.expectedResponse = md5new(randVal).digest() self.conSock.send_dict_msg({'cmd' : 'con_challenge', 'randnum' : randNum }) self.conSock.realUsername = mpd_get_my_username() self.streamHandler.set_handler(self.conSock,self.handle_console_input) self.conSock.name = 'console' else: return ## postpone it; hope the other one frees up soon def handle_console_input(self,sock): msg = self.conSock.recv_dict_msg() if not msg: mpd_print(0000, 'console has disappeared; closing it') self.streamHandler.del_handler(self.conSock) self.conSock.close() self.conSock = 0 return if not msg.has_key('cmd'): 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' }) except: pass self.streamHandler.del_handler(self.conSock) self.conSock.close() self.conSock = 0 return if self.conSock.beingChallenged and msg['cmd'] != 'con_challenge_response': mpd_print(1, 'console did not respond to con_challenge; msg=:%s:' % msg) try: # try to let console know self.conSock.send_dict_msg({ 'cmd':'expected_con_challenge_response' }) except: pass self.streamHandler.del_handler(self.conSock) self.conSock.close() self.conSock = 0 return if msg['cmd'] == 'con_challenge_response': self.conSock.beingChallenged = 0 self.conSock.realUsername = msg['realusername'] if not msg.has_key('response'): try: # try to let console know self.conSock.send_dict_msg({ 'cmd':'missing_response_in_msg' }) except: pass self.streamHandler.del_handler(self.conSock) self.conSock.close() self.conSock = 0 return elif msg['response'] != self.conSock.expectedResponse: try: # try to let console know self.conSock.send_dict_msg({ 'cmd':'invalid_response' }) except: pass self.streamHandler.del_handler(self.conSock) self.conSock.close() self.conSock = 0 return self.conSock.send_dict_msg({ 'cmd':'valid_response' }) elif msg['cmd'] == 'mpdrun':
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -