def __init__(self, default_action=False, auth=None, useHttpHeader=False, httpLoginUrl=False, **kwargs): self.auth = auth if auth: assert IAuth.providedBy(auth) self.useHttpHeader = useHttpHeader if httpLoginUrl: self.httpLoginUrl = httpLoginUrl elif auth is not None: self.httpLoginUrl = auth.getLoginUrl() else: self.httpLoginUrl = None self.config = dict( (a, default_action) for a in self.knownActions ) for act in self.knownActions: if act in kwargs: self.config[act] = kwargs[act] del kwargs[act] self.sessions = SessionManager() if kwargs: raise ValueError("unknown authorization action(s) " + ", ".join(kwargs.keys()))
def __init__(self, default_action=False, auth=None, useHttpHeader=False, httpLoginUrl=False, view=True, **kwargs): self.auth = auth if auth: assert IAuth.providedBy(auth) self.useHttpHeader = useHttpHeader self.httpLoginUrl = httpLoginUrl self.config = dict((a, default_action) for a in self.knownActions) self.config['view'] = view for act in self.knownActions: if act in kwargs: self.config[act] = kwargs[act] del kwargs[act] self.sessions = SessionManager() if kwargs: raise ValueError("unknown authorization action(s) " + ", ".join(kwargs.keys()))
def __init__(self, default_action=False, auth=None, useHttpHeader=False, httpLoginUrl=False, sessionHandler=None, **kwargs): self.auth = auth if auth: assert IAuth.providedBy(auth) self.useHttpHeader = useHttpHeader self.httpLoginUrl = httpLoginUrl self.config = dict((a, default_action) for a in self.knownActions) for act in self.knownActions: if act in kwargs: self.config[act] = kwargs[act] del kwargs[act] self.sessions = get_session_manager() if kwargs: raise ValueError("unknown authorization action(s) " + ", ".join(kwargs.keys())) self.sessionHandler = sessionHandler if sessionHandler is not None \ else BuildbotSession(useHttpHeader=useHttpHeader) assert ISessionHandler.providedBy(self.sessionHandler)
def __init__(self, default_action=False, auth=None, **kwargs): self.auth = auth if auth: assert IAuth.providedBy(auth) self.config = dict((a, default_action) for a in self.knownActions) for act in self.knownActions: if act in kwargs: self.config[act] = kwargs[act] del kwargs[act] if kwargs: raise ValueError("unknown authorization action(s) " + ", ".join(kwargs.keys()))
def __init__(self, default_action=False, auth=None, **kwargs): self.auth = auth if auth: assert IAuth.providedBy(auth) self.config = dict( (a, default_action) for a in self.knownActions ) for act in self.knownActions: if act in kwargs: self.config[act] = kwargs[act] del kwargs[act] if kwargs: raise ValueError("unknown authorization action(s) " + ", ".join(kwargs.keys()))
def __init__( self, http_port=None, distrib_port=None, allowForce=False, public_html="public_html", site=None, numbuilds=20, num_events=200, num_events_max=None, auth=None, order_console_by_time=False, changecommentlink=None, revlink=None, ): """Run a web server that provides Buildbot status. @type http_port: int or L{twisted.application.strports} string @param http_port: a strports specification describing which port the buildbot should use for its web server, with the Waterfall display as the root page. For backwards compatibility this can also be an int. Use 'tcp:8000' to listen on that port, or 'tcp:12345:interface=127.0.0.1' if you only want local processes to connect to it (perhaps because you are using an HTTP reverse proxy to make the buildbot available to the outside world, and do not want to make the raw port visible). @type distrib_port: int or L{twisted.application.strports} string @param distrib_port: Use this if you want to publish the Waterfall page using web.distrib instead. The most common case is to provide a string that is an absolute pathname to the unix socket on which the publisher should listen (C{os.path.expanduser(~/.twistd-web-pb)} will match the default settings of a standard twisted.web 'personal web server'). Another possibility is to pass an integer, which means the publisher should listen on a TCP socket, allowing the web server to be on a different machine entirely. Both forms are provided for backwards compatibility; the preferred form is a strports specification like 'unix:/home/buildbot/.twistd-web-pb'. Providing a non-absolute pathname will probably confuse the strports parser. @param allowForce: boolean, if True then the webserver will allow visitors to trigger and cancel builds @param public_html: the path to the public_html directory for this display, either absolute or relative to the basedir. The default is 'public_html', which selects BASEDIR/public_html. @type site: None or L{twisted.web.server.Site} @param site: Use this if you want to define your own object instead of using the default.` @type numbuilds: int @param numbuilds: Default number of entries in lists at the /one_line_per_build and /builders/FOO URLs. This default can be overriden both programatically --- by passing the equally named argument to constructors of OneLinePerBuildOneBuilder and OneLinePerBuild --- and via the UI, by tacking ?numbuilds=xy onto the URL. @type num_events: int @param num_events: Default number of events to show in the waterfall. @type num_events_max: int @param num_events_max: The maximum number of events that are allowed to be shown in the waterfall. The default value of C{None} will disable this check @type auth: a L{status.web.auth.IAuth} or C{None} @param auth: an object that performs authentication to restrict access to the C{allowForce} features. Ignored if C{allowForce} is not C{True}. If C{auth} is C{None}, people can force or stop builds without auth. @type order_console_by_time: bool @param order_console_by_time: Whether to order changes (commits) in the console view according to the time they were created (for VCS like Git) or according to their integer revision numbers (for VCS like SVN). @type changecommentlink: tuple (2 strings) or C{None} @param changecommentlink: a regular expression and replacement string that is applied to all change comments. The first element represents what to search for and the second yields an url (the <a href=""></a> is added outside this) I.e. for Trac: (r'#(\d+)', r'http://buildbot.net/trac/ticket/\1') @type revlink: string or C{None} @param revlink: a replacement string that is applied to all revisions and will, if set, create a link to the result of the replacement. Use %s to insert the revision id in the url. I.e. for Buildbot on github: ('http://github.com/djmitche/buildbot/tree/%s') (The revision id will be URL encoded before inserted in the replacement string) """ service.MultiService.__init__(self) if type(http_port) is int: http_port = "tcp:%d" % http_port self.http_port = http_port if distrib_port is not None: if type(distrib_port) is int: distrib_port = "tcp:%d" % distrib_port if distrib_port[0] in "/~.": # pathnames distrib_port = "unix:%s" % distrib_port self.distrib_port = distrib_port self.allowForce = allowForce self.num_events = num_events if num_events_max: assert num_events_max >= num_events self.num_events_max = num_events_max self.public_html = public_html if self.allowForce and auth: assert IAuth.providedBy(auth) self.auth = auth else: if auth: log.msg("Warning: Ignoring authentication. allowForce must be" " set to True use this") self.auth = None self.orderConsoleByTime = order_console_by_time # If we were given a site object, go ahead and use it. if site: self.site = site else: # this will be replaced once we've been attached to a parent (and # thus have a basedir and can reference BASEDIR) root = static.Data("placeholder", "text/plain") self.site = server.Site(root) self.childrenToBeAdded = {} self.setupUsualPages(numbuilds=numbuilds, num_events=num_events, num_events_max=num_events_max) # the following items are accessed by HtmlResource when it renders # each page. self.site.buildbot_service = self # Set up the jinja templating engine. if hasattr(sys, "frozen"): assert False, "Frozen config not supported with jinja (yet)" default_loader = jinja2.PackageLoader("buildbot.status.web", "templates") root = os.path.join(os.getcwd(), "templates") loader = jinja2.ChoiceLoader([jinja2.FileSystemLoader(root), default_loader]) self.templates = jinja2.Environment( loader=loader, extensions=["jinja2.ext.i18n"], trim_blocks=True, undefined=webbase.AlmostStrictUndefined ) self.templates.filters["email"] = webbase.emailfilter self.templates.filters["user"] = webbase.userfilter self.templates.filters["shortrev"] = webbase.shortrevfilter(revlink, self.templates) self.templates.filters["revlink"] = webbase.revlinkfilter(revlink, self.templates) if changecommentlink: regex, replace = changecommentlink self.templates.filters["changecomment"] = webbase.addlinkfilter(regex, replace) else: self.templates.filters["changecomment"] = jinja2.escape # keep track of cached connections so we can break them when we shut # down. See ticket #102 for more details. self.channels = weakref.WeakKeyDictionary() if self.http_port is not None: s = strports.service(self.http_port, self.site) s.setServiceParent(self) if self.distrib_port is not None: f = pb.PBServerFactory(distrib.ResourcePublisher(self.site)) s = strports.service(self.distrib_port, f) s.setServiceParent(self)
def __init__(self, http_port=None, distrib_port=None, allowForce=False, public_html="public_html", site=None, numbuilds=20, num_events=200, num_events_max=None, auth=None, order_console_by_time=False): """Run a web server that provides Buildbot status. @type http_port: int or L{twisted.application.strports} string @param http_port: a strports specification describing which port the buildbot should use for its web server, with the Waterfall display as the root page. For backwards compatibility this can also be an int. Use 'tcp:8000' to listen on that port, or 'tcp:12345:interface=127.0.0.1' if you only want local processes to connect to it (perhaps because you are using an HTTP reverse proxy to make the buildbot available to the outside world, and do not want to make the raw port visible). @type distrib_port: int or L{twisted.application.strports} string @param distrib_port: Use this if you want to publish the Waterfall page using web.distrib instead. The most common case is to provide a string that is an absolute pathname to the unix socket on which the publisher should listen (C{os.path.expanduser(~/.twistd-web-pb)} will match the default settings of a standard twisted.web 'personal web server'). Another possibility is to pass an integer, which means the publisher should listen on a TCP socket, allowing the web server to be on a different machine entirely. Both forms are provided for backwards compatibility; the preferred form is a strports specification like 'unix:/home/buildbot/.twistd-web-pb'. Providing a non-absolute pathname will probably confuse the strports parser. @param allowForce: boolean, if True then the webserver will allow visitors to trigger and cancel builds @param public_html: the path to the public_html directory for this display, either absolute or relative to the basedir. The default is 'public_html', which selects BASEDIR/public_html. @type site: None or L{twisted.web.server.Site} @param site: Use this if you want to define your own object instead of using the default.` @type numbuilds: int @param numbuilds: Default number of entries in lists at the /one_line_per_build and /builders/FOO URLs. This default can be overriden both programatically --- by passing the equally named argument to constructors of OneLinePerBuildOneBuilder and OneLinePerBuild --- and via the UI, by tacking ?numbuilds=xy onto the URL. @type num_events: int @param num_events: Defaualt number of events to show in the waterfall. @type num_events_max: int @param num_events_max: The maximum number of events that are allowed to be shown in the waterfall. The default value of C{None} will disable this check @type auth: a L{status.web.auth.IAuth} or C{None} @param auth: an object that performs authentication to restrict access to the C{allowForce} features. Ignored if C{allowForce} is not C{True}. If C{auth} is C{None}, people can force or stop builds without auth. @type order_console_by_time: bool @param order_console_by_time: Whether to order changes (commits) in the console view according to the time they were created (for VCS like Git) or according to their integer revision numbers (for VCS like SVN). """ service.MultiService.__init__(self) if type(http_port) is int: http_port = "tcp:%d" % http_port self.http_port = http_port if distrib_port is not None: if type(distrib_port) is int: distrib_port = "tcp:%d" % distrib_port if distrib_port[0] in "/~.": # pathnames distrib_port = "unix:%s" % distrib_port self.distrib_port = distrib_port self.allowForce = allowForce self.num_events = num_events if num_events_max: assert num_events_max >= num_events self.num_events_max = num_events_max self.public_html = public_html if self.allowForce and auth: assert IAuth.providedBy(auth) self.auth = auth else: if auth: log.msg("Warning: Ignoring authentication. allowForce must be" " set to True use this") self.auth = None self.orderConsoleByTime = order_console_by_time # If we were given a site object, go ahead and use it. if site: self.site = site else: # this will be replaced once we've been attached to a parent (and # thus have a basedir and can reference BASEDIR) root = static.Data("placeholder", "text/plain") self.site = server.Site(root) self.childrenToBeAdded = {} self.setupUsualPages(numbuilds=numbuilds, num_events=num_events, num_events_max=num_events_max) # the following items are accessed by HtmlResource when it renders # each page. self.site.buildbot_service = self self.header = HEADER self.head_elements = HEAD_ELEMENTS[:] self.body_attrs = BODY_ATTRS.copy() self.footer = FOOTER self.template_values = {} # keep track of cached connections so we can break them when we shut # down. See ticket #102 for more details. self.channels = weakref.WeakKeyDictionary() if self.http_port is not None: s = strports.service(self.http_port, self.site) s.setServiceParent(self) if self.distrib_port is not None: f = pb.PBServerFactory(distrib.ResourcePublisher(self.site)) s = strports.service(self.distrib_port, f) s.setServiceParent(self)