aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/python/Twisted/py2/twisted/plugins
diff options
context:
space:
mode:
authorshmel1k <shmel1k@ydb.tech>2023-11-26 18:16:14 +0300
committershmel1k <shmel1k@ydb.tech>2023-11-26 18:43:30 +0300
commitb8cf9e88f4c5c64d9406af533d8948deb050d695 (patch)
tree218eb61fb3c3b96ec08b4d8cdfef383104a87d63 /contrib/python/Twisted/py2/twisted/plugins
parent523f645a83a0ec97a0332dbc3863bb354c92a328 (diff)
downloadydb-b8cf9e88f4c5c64d9406af533d8948deb050d695.tar.gz
add kikimr_configure
Diffstat (limited to 'contrib/python/Twisted/py2/twisted/plugins')
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/__init__.py19
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/cred_anonymous.py41
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/cred_file.py61
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/cred_memory.py70
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/cred_sshkeys.py53
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/cred_unix.py185
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_conch.py18
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_core.py18
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_ftp.py10
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_inet.py10
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_mail.py10
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_names.py10
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_news.py10
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_portforward.py10
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_reactors.py71
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_runner.py10
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_socks.py10
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_trial.py62
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_web.py11
-rw-r--r--contrib/python/Twisted/py2/twisted/plugins/twisted_words.py47
20 files changed, 736 insertions, 0 deletions
diff --git a/contrib/python/Twisted/py2/twisted/plugins/__init__.py b/contrib/python/Twisted/py2/twisted/plugins/__init__.py
new file mode 100644
index 0000000000..dd2d6aad02
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/__init__.py
@@ -0,0 +1,19 @@
+# -*- test-case-name: twisted.test.test_plugin -*-
+# Copyright (c) 2005 Divmod, Inc.
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+"""
+Plugins for services implemented in Twisted.
+
+Plugins go in directories on your PYTHONPATH named twisted/plugins:
+this is the only place where an __init__.py is necessary, thanks to
+the __path__ variable.
+
+@author: Jp Calderone
+@author: Glyph Lefkowitz
+"""
+
+from twisted.plugin import pluginPackagePaths
+__path__.extend(pluginPackagePaths(__name__))
+__all__ = [] # nothing to see here, move along, move along
diff --git a/contrib/python/Twisted/py2/twisted/plugins/cred_anonymous.py b/contrib/python/Twisted/py2/twisted/plugins/cred_anonymous.py
new file mode 100644
index 0000000000..8593518244
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/cred_anonymous.py
@@ -0,0 +1,41 @@
+# -*- test-case-name: twisted.test.test_strcred -*-
+#
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+"""
+Cred plugin for anonymous logins.
+"""
+
+from __future__ import absolute_import, division
+
+from zope.interface import implementer
+
+from twisted import plugin
+from twisted.cred.checkers import AllowAnonymousAccess
+from twisted.cred.strcred import ICheckerFactory
+from twisted.cred.credentials import IAnonymous
+
+
+anonymousCheckerFactoryHelp = """
+This allows anonymous authentication for servers that support it.
+"""
+
+
+@implementer(ICheckerFactory, plugin.IPlugin)
+class AnonymousCheckerFactory(object):
+ """
+ Generates checkers that will authenticate an anonymous request.
+ """
+ authType = 'anonymous'
+ authHelp = anonymousCheckerFactoryHelp
+ argStringFormat = 'No argstring required.'
+ credentialInterfaces = (IAnonymous,)
+
+
+ def generateChecker(self, argstring=''):
+ return AllowAnonymousAccess()
+
+
+
+theAnonymousCheckerFactory = AnonymousCheckerFactory()
diff --git a/contrib/python/Twisted/py2/twisted/plugins/cred_file.py b/contrib/python/Twisted/py2/twisted/plugins/cred_file.py
new file mode 100644
index 0000000000..66a5e334e2
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/cred_file.py
@@ -0,0 +1,61 @@
+# -*- test-case-name: twisted.test.test_strcred -*-
+#
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+"""
+Cred plugin for a file of the format 'username:password'.
+"""
+
+from __future__ import absolute_import, division
+
+import sys
+
+from zope.interface import implementer
+
+from twisted import plugin
+from twisted.cred.checkers import FilePasswordDB
+from twisted.cred.strcred import ICheckerFactory
+from twisted.cred.credentials import IUsernamePassword, IUsernameHashedPassword
+
+
+
+fileCheckerFactoryHelp = """
+This checker expects to receive the location of a file that
+conforms to the FilePasswordDB format. Each line in the file
+should be of the format 'username:password', in plain text.
+"""
+
+invalidFileWarning = 'Warning: not a valid file'
+
+
+@implementer(ICheckerFactory, plugin.IPlugin)
+class FileCheckerFactory(object):
+ """
+ A factory for instances of L{FilePasswordDB}.
+ """
+ authType = 'file'
+ authHelp = fileCheckerFactoryHelp
+ argStringFormat = 'Location of a FilePasswordDB-formatted file.'
+ # Explicitly defined here because FilePasswordDB doesn't do it for us
+ credentialInterfaces = (IUsernamePassword, IUsernameHashedPassword)
+
+ errorOutput = sys.stderr
+
+ def generateChecker(self, argstring):
+ """
+ This checker factory expects to get the location of a file.
+ The file should conform to the format required by
+ L{FilePasswordDB} (using defaults for all
+ initialization parameters).
+ """
+ from twisted.python.filepath import FilePath
+ if not argstring.strip():
+ raise ValueError('%r requires a filename' % self.authType)
+ elif not FilePath(argstring).isfile():
+ self.errorOutput.write('%s: %s\n' % (invalidFileWarning, argstring))
+ return FilePasswordDB(argstring)
+
+
+
+theFileCheckerFactory = FileCheckerFactory()
diff --git a/contrib/python/Twisted/py2/twisted/plugins/cred_memory.py b/contrib/python/Twisted/py2/twisted/plugins/cred_memory.py
new file mode 100644
index 0000000000..797963ca01
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/cred_memory.py
@@ -0,0 +1,70 @@
+# -*- test-case-name: twisted.test.test_strcred -*-
+#
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+"""
+Cred plugin for an in-memory user database.
+"""
+
+from __future__ import absolute_import, division
+
+from zope.interface import implementer
+
+from twisted import plugin
+from twisted.cred.strcred import ICheckerFactory
+from twisted.cred.checkers import InMemoryUsernamePasswordDatabaseDontUse
+from twisted.cred.credentials import IUsernamePassword, IUsernameHashedPassword
+
+
+
+inMemoryCheckerFactoryHelp = """
+A checker that uses an in-memory user database.
+
+This is only of use in one-off test programs or examples which
+don't want to focus too much on how credentials are verified. You
+really don't want to use this for anything else. It is a toy.
+"""
+
+
+
+@implementer(ICheckerFactory, plugin.IPlugin)
+class InMemoryCheckerFactory(object):
+ """
+ A factory for in-memory credentials checkers.
+
+ This is only of use in one-off test programs or examples which don't
+ want to focus too much on how credentials are verified.
+
+ You really don't want to use this for anything else. It is, at best, a
+ toy. If you need a simple credentials checker for a real application,
+ see L{cred_file.FileCheckerFactory}.
+ """
+ authType = 'memory'
+ authHelp = inMemoryCheckerFactoryHelp
+ argStringFormat = 'A colon-separated list (name:password:...)'
+ credentialInterfaces = (IUsernamePassword,
+ IUsernameHashedPassword)
+
+ def generateChecker(self, argstring):
+ """
+ This checker factory expects to get a list of
+ username:password pairs, with each pair also separated by a
+ colon. For example, the string 'alice:f:bob:g' would generate
+ two users, one named 'alice' and one named 'bob'.
+ """
+ checker = InMemoryUsernamePasswordDatabaseDontUse()
+ if argstring:
+ pieces = argstring.split(':')
+ if len(pieces) % 2:
+ from twisted.cred.strcred import InvalidAuthArgumentString
+ raise InvalidAuthArgumentString(
+ "argstring must be in format U:P:...")
+ for i in range(0, len(pieces), 2):
+ username, password = pieces[i], pieces[i+1]
+ checker.addUser(username, password)
+ return checker
+
+
+
+theInMemoryCheckerFactory = InMemoryCheckerFactory()
diff --git a/contrib/python/Twisted/py2/twisted/plugins/cred_sshkeys.py b/contrib/python/Twisted/py2/twisted/plugins/cred_sshkeys.py
new file mode 100644
index 0000000000..3d57f40862
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/cred_sshkeys.py
@@ -0,0 +1,53 @@
+# -*- test-case-name: twisted.test.test_strcred -*-
+#
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+"""
+Cred plugin for ssh key login.
+"""
+
+from __future__ import absolute_import, division
+
+from zope.interface import implementer
+
+from twisted import plugin
+from twisted.cred.strcred import ICheckerFactory
+
+
+sshKeyCheckerFactoryHelp = """
+This allows SSH public key authentication, based on public keys listed in
+authorized_keys and authorized_keys2 files in user .ssh/ directories.
+"""
+
+
+try:
+ from twisted.conch.checkers import (
+ SSHPublicKeyChecker, UNIXAuthorizedKeysFiles)
+
+ @implementer(ICheckerFactory, plugin.IPlugin)
+ class SSHKeyCheckerFactory(object):
+ """
+ Generates checkers that will authenticate a SSH public key
+ """
+ authType = 'sshkey'
+ authHelp = sshKeyCheckerFactoryHelp
+ argStringFormat = 'No argstring required.'
+ credentialInterfaces = SSHPublicKeyChecker.credentialInterfaces
+
+
+ def generateChecker(self, argstring=''):
+ """
+ This checker factory ignores the argument string. Everything
+ needed to authenticate users is pulled out of the public keys
+ listed in user .ssh/ directories.
+ """
+ return SSHPublicKeyChecker(UNIXAuthorizedKeysFiles())
+
+
+
+ theSSHKeyCheckerFactory = SSHKeyCheckerFactory()
+
+except ImportError:
+ # if checkers can't be imported, then there should be no SSH cred plugin
+ pass
diff --git a/contrib/python/Twisted/py2/twisted/plugins/cred_unix.py b/contrib/python/Twisted/py2/twisted/plugins/cred_unix.py
new file mode 100644
index 0000000000..7bab02b766
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/cred_unix.py
@@ -0,0 +1,185 @@
+# -*- test-case-name: twisted.test.test_strcred -*-
+#
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+"""
+Cred plugin for UNIX user accounts.
+"""
+
+from __future__ import absolute_import, division
+
+from zope.interface import implementer
+
+from twisted import plugin
+from twisted.cred.strcred import ICheckerFactory
+from twisted.cred.checkers import ICredentialsChecker
+from twisted.cred.credentials import IUsernamePassword
+from twisted.cred.error import UnauthorizedLogin
+from twisted.internet import defer
+from twisted.python.compat import StringType
+
+
+
+def verifyCryptedPassword(crypted, pw):
+ """
+ Use L{crypt.crypt} to Verify that an unencrypted
+ password matches the encrypted password.
+
+ @param crypted: The encrypted password, obtained from
+ the Unix password database or Unix shadow
+ password database.
+ @param pw: The unencrypted password.
+ @return: L{True} if there is successful match, else L{False}.
+ @rtype: L{bool}
+ """
+ try:
+ import crypt
+ except ImportError:
+ crypt = None
+
+ if crypt is None:
+ raise NotImplementedError("cred_unix not supported on this platform")
+ if not isinstance(pw, StringType):
+ pw = pw.decode('utf-8')
+ if not isinstance(crypted, StringType):
+ crypted = crypted.decode('utf-8')
+ return crypt.crypt(pw, crypted) == crypted
+
+
+
+@implementer(ICredentialsChecker)
+class UNIXChecker(object):
+ """
+ A credentials checker for a UNIX server. This will check that
+ an authenticating username/password is a valid user on the system.
+
+ Does not work on Windows.
+
+ Right now this supports Python's pwd and spwd modules, if they are
+ installed. It does not support PAM.
+ """
+ credentialInterfaces = (IUsernamePassword,)
+
+
+ def checkPwd(self, pwd, username, password):
+ """
+ Obtain the encrypted password for C{username} from the Unix password
+ database using L{pwd.getpwnam}, and see if it it matches it matches
+ C{password}.
+
+ @param pwd: Module which provides functions which
+ access to the Unix password database.
+ @type pwd: C{module}
+ @param username: The user to look up in the Unix password database.
+ @type username: L{unicode}/L{str} or L{bytes}
+ @param password: The password to compare.
+ @type username: L{unicode}/L{str} or L{bytes}
+ """
+ try:
+ if not isinstance(username, StringType):
+ username = username.decode('utf-8')
+ cryptedPass = pwd.getpwnam(username).pw_passwd
+ except KeyError:
+ return defer.fail(UnauthorizedLogin())
+ else:
+ if cryptedPass in ('*', 'x'):
+ # Allow checkSpwd to take over
+ return None
+ elif verifyCryptedPassword(cryptedPass, password):
+ return defer.succeed(username)
+
+
+ def checkSpwd(self, spwd, username, password):
+ """
+ Obtain the encrypted password for C{username} from the
+ Unix shadow password database using L{spwd.getspnam},
+ and see if it it matches it matches C{password}.
+
+ @param spwd: Module which provides functions which
+ access to the Unix shadow password database.
+ @type pwd: C{module}
+ @param username: The user to look up in the Unix password database.
+ @type username: L{unicode}/L{str} or L{bytes}
+ @param password: The password to compare.
+ @type username: L{unicode}/L{str} or L{bytes}
+ """
+ try:
+ if not isinstance(username, StringType):
+ username = username.decode('utf-8')
+ if getattr(spwd.struct_spwd, "sp_pwdp", None):
+ # Python 3
+ cryptedPass = spwd.getspnam(username).sp_pwdp
+ else:
+ # Python 2
+ cryptedPass = spwd.getspnam(username).sp_pwd
+ except KeyError:
+ return defer.fail(UnauthorizedLogin())
+ else:
+ if verifyCryptedPassword(cryptedPass, password):
+ return defer.succeed(username)
+
+
+ def requestAvatarId(self, credentials):
+ username, password = credentials.username, credentials.password
+
+ try:
+ import pwd
+ except ImportError:
+ pwd = None
+
+ if pwd is not None:
+ checked = self.checkPwd(pwd, username, password)
+ if checked is not None:
+ return checked
+
+ try:
+ import spwd
+ except ImportError:
+ spwd = None
+
+ if spwd is not None:
+ checked = self.checkSpwd(spwd, username, password)
+ if checked is not None:
+ return checked
+ # TODO: check_pam?
+ # TODO: check_shadow?
+ return defer.fail(UnauthorizedLogin())
+
+
+
+unixCheckerFactoryHelp = """
+This checker will attempt to use every resource available to
+authenticate against the list of users on the local UNIX system.
+(This does not support Windows servers for very obvious reasons.)
+
+Right now, this includes support for:
+
+ * Python's pwd module (which checks /etc/passwd)
+ * Python's spwd module (which checks /etc/shadow)
+
+Future versions may include support for PAM authentication.
+"""
+
+
+@implementer(ICheckerFactory, plugin.IPlugin)
+class UNIXCheckerFactory(object):
+ """
+ A factory for L{UNIXChecker}.
+ """
+ authType = 'unix'
+ authHelp = unixCheckerFactoryHelp
+ argStringFormat = 'No argstring required.'
+ credentialInterfaces = UNIXChecker.credentialInterfaces
+
+ def generateChecker(self, argstring):
+ """
+ This checker factory ignores the argument string. Everything
+ needed to generate a user database is pulled out of the local
+ UNIX environment.
+ """
+ return UNIXChecker()
+
+
+
+theUnixCheckerFactory = UNIXCheckerFactory()
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_conch.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_conch.py
new file mode 100644
index 0000000000..4b37e0b21f
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_conch.py
@@ -0,0 +1,18 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from twisted.application.service import ServiceMaker
+
+TwistedSSH = ServiceMaker(
+ "Twisted Conch Server",
+ "twisted.conch.tap",
+ "A Conch SSH service.",
+ "conch")
+
+TwistedManhole = ServiceMaker(
+ "Twisted Manhole (new)",
+ "twisted.conch.manhole_tap",
+ ("An interactive remote debugger service accessible via telnet "
+ "and ssh and providing syntax coloring and basic line editing "
+ "functionality."),
+ "manhole")
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_core.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_core.py
new file mode 100644
index 0000000000..3fb52f0c78
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_core.py
@@ -0,0 +1,18 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from __future__ import absolute_import, division
+
+from twisted.internet.endpoints import (
+ _SystemdParser, _TCP6ServerParser, _StandardIOParser,
+ _TLSClientEndpointParser)
+
+from twisted.protocols.haproxy._parser import (
+ HAProxyServerParser as _HAProxyServerParser
+)
+
+systemdEndpointParser = _SystemdParser()
+tcp6ServerEndpointParser = _TCP6ServerParser()
+stdioEndpointParser = _StandardIOParser()
+tlsClientEndpointParser = _TLSClientEndpointParser()
+_haProxyServerEndpointParser = _HAProxyServerParser()
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_ftp.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_ftp.py
new file mode 100644
index 0000000000..474a9c7cde
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_ftp.py
@@ -0,0 +1,10 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from twisted.application.service import ServiceMaker
+
+TwistedFTP = ServiceMaker(
+ "Twisted FTP",
+ "twisted.tap.ftp",
+ "An FTP server.",
+ "ftp")
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_inet.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_inet.py
new file mode 100644
index 0000000000..1196343bec
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_inet.py
@@ -0,0 +1,10 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from twisted.application.service import ServiceMaker
+
+TwistedINETD = ServiceMaker(
+ "Twisted INETD Server",
+ "twisted.runner.inetdtap",
+ "An inetd(8) replacement.",
+ "inetd")
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_mail.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_mail.py
new file mode 100644
index 0000000000..7e9a5bd57b
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_mail.py
@@ -0,0 +1,10 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from twisted.application.service import ServiceMaker
+
+TwistedMail = ServiceMaker(
+ "Twisted Mail",
+ "twisted.mail.tap",
+ "An email service",
+ "mail")
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_names.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_names.py
new file mode 100644
index 0000000000..7123bf00df
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_names.py
@@ -0,0 +1,10 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from twisted.application.service import ServiceMaker
+
+TwistedNames = ServiceMaker(
+ "Twisted DNS Server",
+ "twisted.names.tap",
+ "A domain name server.",
+ "dns")
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_news.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_news.py
new file mode 100644
index 0000000000..0fc88d8144
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_news.py
@@ -0,0 +1,10 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from twisted.application.service import ServiceMaker
+
+TwistedNews = ServiceMaker(
+ "Twisted News",
+ "twisted.news.tap",
+ "A news server.",
+ "news")
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_portforward.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_portforward.py
new file mode 100644
index 0000000000..1969434b75
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_portforward.py
@@ -0,0 +1,10 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from twisted.application.service import ServiceMaker
+
+TwistedPortForward = ServiceMaker(
+ "Twisted Port-Forwarding",
+ "twisted.tap.portforward",
+ "A simple port-forwarder.",
+ "portforward")
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_reactors.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_reactors.py
new file mode 100644
index 0000000000..ebb474ad7f
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_reactors.py
@@ -0,0 +1,71 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from __future__ import absolute_import, division
+
+from twisted.application.reactors import Reactor
+
+__all__ = []
+
+default = Reactor(
+ 'default', 'twisted.internet.default',
+ 'A reasonable default: poll(2) if available, otherwise select(2).')
+__all__.append('default')
+
+select = Reactor(
+ 'select', 'twisted.internet.selectreactor', 'select(2) based reactor.')
+__all__.append('select')
+
+poll = Reactor(
+ 'poll', 'twisted.internet.pollreactor', 'poll(2) based reactor.')
+__all__.append('poll')
+
+epoll = Reactor(
+ 'epoll', 'twisted.internet.epollreactor', 'epoll(4) based reactor.')
+__all__.append('epoll')
+
+kqueue = Reactor(
+ 'kqueue', 'twisted.internet.kqreactor', 'kqueue(2) based reactor.')
+__all__.append('kqueue')
+
+cf = Reactor(
+ 'cf' , 'twisted.internet.cfreactor',
+ 'CoreFoundation based reactor.')
+__all__.append('cf')
+
+asyncio = Reactor(
+ 'asyncio', 'twisted.internet.asyncioreactor',
+ 'asyncio based reactor')
+__all__.append('asyncio')
+
+wx = Reactor(
+ 'wx', 'twisted.internet.wxreactor', 'wxPython based reactor.')
+__all__.append('wx')
+
+gi = Reactor(
+ 'gi', 'twisted.internet.gireactor',
+ 'GObject Introspection based reactor.')
+__all__.append('gi')
+
+gtk3 = Reactor(
+ 'gtk3', 'twisted.internet.gtk3reactor', 'Gtk3 based reactor.')
+__all__.append('gtk3')
+
+gtk2 = Reactor(
+ 'gtk2', 'twisted.internet.gtk2reactor', 'Gtk2 based reactor.')
+__all__.append('gtk2')
+
+glib2 = Reactor(
+ 'glib2', 'twisted.internet.glib2reactor',
+ 'GLib2 based reactor.')
+__all__.append('glib2')
+
+win32er = Reactor(
+ 'win32', 'twisted.internet.win32eventreactor',
+ 'Win32 WaitForMultipleObjects based reactor.')
+__all__.append('win32er')
+
+iocp = Reactor(
+ 'iocp', 'twisted.internet.iocpreactor',
+ 'Win32 IO Completion Ports based reactor.')
+__all__.append('iocp')
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_runner.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_runner.py
new file mode 100644
index 0000000000..dc630281e2
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_runner.py
@@ -0,0 +1,10 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from twisted.application.service import ServiceMaker
+
+TwistedProcmon = ServiceMaker(
+ "Twisted Process Monitor",
+ "twisted.runner.procmontap",
+ ("A process watchdog / supervisor"),
+ "procmon")
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_socks.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_socks.py
new file mode 100644
index 0000000000..5a94f871ac
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_socks.py
@@ -0,0 +1,10 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from twisted.application.service import ServiceMaker
+
+TwistedSOCKS = ServiceMaker(
+ "Twisted SOCKS",
+ "twisted.tap.socks",
+ "A SOCKSv4 proxy service.",
+ "socks")
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_trial.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_trial.py
new file mode 100644
index 0000000000..06c2d06936
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_trial.py
@@ -0,0 +1,62 @@
+from __future__ import division, absolute_import
+
+from zope.interface import implementer
+
+from twisted.trial.itrial import IReporter
+from twisted.plugin import IPlugin
+
+
+
+@implementer(IPlugin, IReporter)
+class _Reporter(object):
+
+ def __init__(self, name, module, description, longOpt, shortOpt, klass):
+ self.name = name
+ self.module = module
+ self.description = description
+ self.longOpt = longOpt
+ self.shortOpt = shortOpt
+ self.klass = klass
+
+
+Tree = _Reporter("Tree Reporter",
+ "twisted.trial.reporter",
+ description="verbose color output (default reporter)",
+ longOpt="verbose",
+ shortOpt="v",
+ klass="TreeReporter")
+
+BlackAndWhite = _Reporter("Black-And-White Reporter",
+ "twisted.trial.reporter",
+ description="Colorless verbose output",
+ longOpt="bwverbose",
+ shortOpt="o",
+ klass="VerboseTextReporter")
+
+Minimal = _Reporter("Minimal Reporter",
+ "twisted.trial.reporter",
+ description="minimal summary output",
+ longOpt="summary",
+ shortOpt="s",
+ klass="MinimalReporter")
+
+Classic = _Reporter("Classic Reporter",
+ "twisted.trial.reporter",
+ description="terse text output",
+ longOpt="text",
+ shortOpt="t",
+ klass="TextReporter")
+
+Timing = _Reporter("Timing Reporter",
+ "twisted.trial.reporter",
+ description="Timing output",
+ longOpt="timing",
+ shortOpt=None,
+ klass="TimingTextReporter")
+
+Subunit = _Reporter("Subunit Reporter",
+ "twisted.trial.reporter",
+ description="subunit output",
+ longOpt="subunit",
+ shortOpt=None,
+ klass="SubunitReporter")
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_web.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_web.py
new file mode 100644
index 0000000000..c7655a6d07
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_web.py
@@ -0,0 +1,11 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from twisted.application.service import ServiceMaker
+
+TwistedWeb = ServiceMaker(
+ "Twisted Web",
+ "twisted.web.tap",
+ ("A general-purpose web server which can serve from a "
+ "filesystem or application resource."),
+ "web")
diff --git a/contrib/python/Twisted/py2/twisted/plugins/twisted_words.py b/contrib/python/Twisted/py2/twisted/plugins/twisted_words.py
new file mode 100644
index 0000000000..b8dd500e32
--- /dev/null
+++ b/contrib/python/Twisted/py2/twisted/plugins/twisted_words.py
@@ -0,0 +1,47 @@
+# Copyright (c) Twisted Matrix Laboratories.
+# See LICENSE for details.
+
+from zope.interface import provider
+
+from twisted.plugin import IPlugin
+
+from twisted.application.service import ServiceMaker
+from twisted.words import iwords
+
+
+NewTwistedWords = ServiceMaker(
+ "New Twisted Words",
+ "twisted.words.tap",
+ "A modern words server",
+ "words")
+
+TwistedXMPPRouter = ServiceMaker(
+ "XMPP Router",
+ "twisted.words.xmpproutertap",
+ "An XMPP Router server",
+ "xmpp-router")
+
+
+
+@provider(IPlugin, iwords.IProtocolPlugin)
+class RelayChatInterface(object):
+
+ name = 'irc'
+
+ def getFactory(cls, realm, portal):
+ from twisted.words import service
+ return service.IRCFactory(realm, portal)
+ getFactory = classmethod(getFactory)
+
+
+
+@provider(IPlugin, iwords.IProtocolPlugin)
+class PBChatInterface(object):
+
+ name = 'pb'
+
+ def getFactory(cls, realm, portal):
+ from twisted.spread import pb
+ return pb.PBServerFactory(portal, True)
+ getFactory = classmethod(getFactory)
+