⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 socketservers.py

📁 HADOOP 0.18.0安装源代码头文件
💻 PY
📖 第 1 页 / 共 2 页
字号:
#Licensed to the Apache Software Foundation (ASF) under one#or more contributor license agreements.  See the NOTICE file#distributed with this work for additional information#regarding copyright ownership.  The ASF licenses this file#to you under the Apache License, Version 2.0 (the#"License"); you may not use this file except in compliance#with the License.  You may obtain a copy of the License at#     http://www.apache.org/licenses/LICENSE-2.0#Unless required by applicable law or agreed to in writing, software#distributed under the License is distributed on an "AS IS" BASIS,#WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.#See the License for the specific language governing permissions and#limitations under the License.# Various socket server and helper classes.##import os, sys, socket, threading, pprint, re, xmlrpclib, time  from select import selectfrom SocketServer import ThreadingMixIn, ForkingMixInfrom BaseHTTPServer import BaseHTTPRequestHandler, HTTPServerfrom SimpleXMLRPCServer import SimpleXMLRPCRequestHandler, SimpleXMLRPCServerfrom SimpleHTTPServer import SimpleHTTPRequestHandlerfrom random import Randomfrom urlparse import urlparseFault = xmlrpclib.Faultfrom hodlib.Common.util import local_fqdnfrom hodlib.Common.logger import hodDummyLoggerclass hodHTTPHandler(BaseHTTPRequestHandler):  port = -1  def __init__(self, request, client_address, server, registerService):    self.registerService = registerService    BaseHTTPRequestHandler.__init__(self, request, client_address, server)    def log_message(self, *args):    """Forget logging for now."""        pass        def do_GET(self):    self.fullUrl = "http://%s:%s%s" % (self.server.server_address[0],                                       self.server.server_address[1],                                        self.path)        parsedUrl = urlparse(self.fullUrl)    self.writeHeaders()    self.writeData(parsedUrl)    def w(self, string):    self.wfile.write("%s\n" % string)    def writeHeaders(self):   self.send_response(200, 'OK')   self.send_header('Content-type', 'text/html')   self.end_headers()          def sendWrongPage(self, userJob):    self.w('<font class="alert">')    if userJob == False:      self.w('invalid URL specified')       elif re.match("^\d+$", userJob):      self.w('invalid URL specified, job <b>%s</b> does not exist' % userJob)    elif re.match("^\w+$", userJob):      self.w('invalid URL specified, user <b>%s</b> does not exist' % userJob)     self.w('</font>')      def getServiceHosts(self, serviceInfo):    hostInfo = { 'long' : {}, 'short' : {} }    for user in serviceInfo:      for job in serviceInfo[user]:        for host in serviceInfo[user][job]:          for serviceItem in serviceInfo[user][job][host]:            serviceName = serviceItem.keys()            serviceName = serviceName[0]            if isinstance(serviceItem[serviceName], str):              hostInfo['short'][self.getJobKey(user, job, host)] = True            hostInfo['long'][self.getJobKey(user, job, host)] = True        return hostInfo  def getJobInfo(self, job, serviceInfo):    jobInfo = {}        for user in serviceInfo.keys():      for someJob in serviceInfo[user].keys():        if job == someJob:          jobInfo[user] = { job : serviceInfo[user][job] }        return jobInfo    def getJobKey(self, user, job, host):    return "%s-%s-%s" % (user, job, host)    def writeData(self, parsedUrl):    options = parsedUrl[4]    serviceInfo = self.server.service.getServiceInfo()    users = serviceInfo.keys()    users.sort()    self.w("<html>")    self.w("<body>")    self.w("<head>")    self.writeCSS()    self.w("</head>")    self.w('<font class="header2">HOD Service Registry Information</font>')    if serviceInfo == {}:      self.w('<br><br><font class="header">&nbsp;&nbsp;No HOD clusters configured.</font>')    else:      if parsedUrl[2] == '/':        self.w('&nbsp;&nbsp;&nbsp;<table class="main">')        count = 0        for user in users:          self.writeUserData(user, options, serviceInfo, count)          count = count + 1      elif parsedUrl[2][1:] in serviceInfo:        self.w('&nbsp;&nbsp;&nbsp;<table class="main">')        self.writeUserData(parsedUrl[2][1:], options, serviceInfo, 0)      elif re.match("^\d+$", parsedUrl[2][1:]):        jobInfo = self.getJobInfo(parsedUrl[2][1:], serviceInfo)        if jobInfo.keys():          self.w('&nbsp;&nbsp;&nbsp;<table class="main">')          for user in jobInfo.keys():            self.writeUserData(user, options, jobInfo, 0)           else:          self.sendWrongPage(parsedUrl[2][1:])           self.w('&nbsp;&nbsp;&nbsp;<table class="main">')          count = 0          for user in users:            self.writeUserData(user, options, serviceInfo, count)            count = count + 1      elif re.match("^\w+$", parsedUrl[2][1:]):        self.sendWrongPage(parsedUrl[2][1:])         self.w('&nbsp;&nbsp;&nbsp;<table class="main">')        count = 0        for user in users:          self.writeUserData(user, options, serviceInfo, count)          count = count + 1              else:        self.sendWrongPage(False)         self.w('&nbsp;&nbsp;&nbsp;<table class="main">')        count = 0        for user in users:          self.writeUserData(user, options, serviceInfo, count)          count = count + 1    self.w('</table>')    self.w("</pre>")    self.w("</body>")    self.w("</html>")  def writeCSS(self):    self.w('<style type="text/css">')        self.w('table.main { border: 0px; padding: 1; background-color: #E1ECE0; width: 70%; margin: 10; }')    self.w('table.sub1 { background-color: #F1F1F1; padding: 0; }')    self.w('table.sub2 { background-color: #FFFFFF; padding: 0; }')    self.w('table.sub3 { border: 1px solid #EEEEEE; background-color: #FFFFFF; padding: 0; }')    self.w('td.header { border-bottom: 1px solid #CCCCCC; padding: 2;}')    self.w('td.service1 { border: 0px; background-color: #FFFFFF; padding: 2; width: 10%}')    self.w('td.service2 { border: 0px; background-color: #FFFFFF; padding: 2; width: 90%}')    self.w('td { vertical-align: top; padding: 0; }')    self.w('td.noborder { border-style: none; border-collapse: collapse; }')    self.w('tr.colored { background-color: #F1F1F1; }')    self.w('font { font-family: Helvetica, Arial, sans-serif; font-size: 10pt; color: #666666; }')    self.w('font.header { font-family: Helvetica, Arial, sans-serif;  font-size: 10pt; color: #333333; font-style: bold }')    self.w('font.header2 { font-family: Helvetica, Arial, sans-serif; font-size: 16pt; color: #333333; }')    self.w('font.sml { font-family: Helvetica, Arial, sans-serif; font-size: 8pt; color: #666666; }')    self.w('font.alert { font-family: Helvetica, Arial, sans-serif; font-size: 9pt; color: #FF7A22; }')    self.w('a { font-family: Helvetica, Arial, sans-serif; text-decoration:none; font-size: 10pt; color: #111111; }')    self.w('a:visited { font-family: Helvetica, Arial, sans-serif; color:#2D4628; text-decoration:none; font-size: 10pt; }')    self.w('a:hover { font-family: Helvetica, Arial, sans-serif; color:#00A033; text-decoration:none; font-size: 10pt; }')    self.w('a.small { font-family:  Helvetica, Arial, sans-serif; text-decoration:none; font-size: 8pt }')    self.w('a.small:hover { color:#822499; text-decoration:none; font-size: 8pt }')    self.w("</style>")  def writeUserData(self, user, options, serviceInfo, count):    hostInfo = self.getServiceHosts(serviceInfo)    hostKey = 'short'    if options == 'display=long':      hostKey = 'long'    if count == 0:      self.w('<tr>')      self.w('<td class="header" colspan="2">')      self.w('<font class="header">Active Users</font>')      self.w('</td>')      self.w('</tr>')    self.w('<tr>')    self.w('<td><font>%s</font></td>' % user)    self.w('<td>')    jobIDs = serviceInfo[user].keys()    jobIDs.sort()    for jobID in jobIDs:       self.w('<table class="sub1" width="100%">')      if count == 0:        self.w('<tr>')        self.w('<td class="header" colspan="2">')        self.w('<font class="header">PBS Job Identifiers</font>')        self.w('</td>')        self.w('</tr>')              self.w('<tr>')      self.w('<td><font>%s</font></td>' % jobID)      self.w('<td>')      hosts = serviceInfo[user][jobID].keys()      hosts.sort()      for host in hosts:        if hostInfo[hostKey].has_key(self.getJobKey(user, jobID, host)):          self.w('<table class="sub2" width="100%">')          if count == 0:            self.w('<tr>')            self.w('<td class="header" colspan="2">')            self.w('<font class="header">Hosts Running Services</font>')            self.w('</td>')            self.w('</tr>')            self.w('<tr>')          self.w('<td><font>%s</font></td>' % host)          self.w('<td>')          self.w('<table class="sub3" width="100%">')          self.w('<tr>')          self.w('<td colspan="2">')          self.w('<font class="header">Service Information</font>')          self.w('</td>')          self.w('</tr>')            for serviceItem in serviceInfo[user][jobID][host]:            serviceName = serviceItem.keys()            serviceName = serviceName[0]            if isinstance(serviceItem[serviceName], dict) and \              options == 'display=long':              self.w('<tr class="colored">')              self.w('<td><font>%s</font></td>' % serviceName)              self.w('<td>')              self.w('<table width="100%">')              for key in serviceItem[serviceName]:                self.w('<tr>')                self.w('<td class="service1"><font>%s</font></td>' % key)                self.w('<td class="service2"><font>%s</font></td>' % serviceItem[serviceName][key])                self.w('</tr>')              self.w('</table>')              self.w('</td>')              self.w('</tr>')            elif isinstance(serviceItem[serviceName], str):              self.w('<tr class="colored">')              self.w('<td><font class="service1">%s</font></td>' % serviceName)              self.w('<td>')              (host, port) = serviceItem[serviceName].split(':')              hostnameInfo = socket.gethostbyname_ex(host)              if serviceName.startswith('mapred'):                self.w('<a href="http://%s:%s">Hadoop Job Tracker</a>' % (hostnameInfo[0], port))              elif serviceName.startswith('hdfs'):                self.w('<a href="http://%s:%s">HDFS Name Node</a>&nbsp' % (hostnameInfo[0], port))              else:                self.w('<font class="service2">%s</font>' % serviceItem[serviceName])              self.w('</td>')              self.w('</tr>')          self.w('</table>')              self.w('</td>')          self.w('</tr>')          self.w('</table>')          count = count + 1      self.w('</td>')        self.w('</tr>')      self.w('</table>')      count = count + 1    self.w('</td>')    self.w('</tr>')#    self.w("<pre>")#    self.w(pprint.pformat(serviceInfo))#    self.w("</pre>")    class baseSocketServer:    def __init__(self, host, ports):        self.host = host        self.ports = ports        self.__stopForever = threading.Event()        self.__stopForever.clear()        self.__run = threading.Event()        self.__run.set()            self.server_address = ()        self.mThread = None            def server_bind(self):        """server_bind() method binds to a random range of ports."""        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)        if len(self.ports) > 1:            randomPort = Random(os.getpid())            portSequence = range(self.ports[0], self.ports[1])            maxTryCount = abs(self.ports[0] - self.ports[1])            tryCount = 0            while True:                somePort = randomPort.choice(portSequence)                self.server_address = (self.host, somePort)                try:                    self.socket.bind(self.server_address)                except socket.gaierror, errData:                    raise socket.gaierror, errData                except:                    tryCount = tryCount + 1                    if tryCount > maxTryCount:                        bindError = "bind failure for port range %s:%d" % (                            self.ports)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -