Skip to content
This repository has been archived by the owner on Apr 26, 2024. It is now read-only.

Commit

Permalink
Remove Python 2.7 support. (#5425)
Browse files Browse the repository at this point in the history
  • Loading branch information
anoadragon453 committed Feb 10, 2020
2 parents 84e695f + 09e9a26 commit 8ea4191
Show file tree
Hide file tree
Showing 22 changed files with 104 additions and 130 deletions.
21 changes: 0 additions & 21 deletions .buildkite/docker-compose.py27.pg94.yaml

This file was deleted.

21 changes: 0 additions & 21 deletions .buildkite/docker-compose.py27.pg95.yaml

This file was deleted.

57 changes: 3 additions & 54 deletions .buildkite/pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,13 @@ steps:

- command:
- "python -m pip install tox"
- "tox -e py27,codecov"
label: ":python: 2.7 / SQLite"
- "tox -e py35-old,codecov"
label: ":python: 3.5 / SQLite / Old Deps"
env:
TRIAL_FLAGS: "-j 2"
plugins:
- docker#v3.0.1:
image: "python:2.7"
image: "python:3.5"
propagate-environment: true
retry:
automatic:
Expand Down Expand Up @@ -114,57 +114,6 @@ steps:
- exit_status: 2
limit: 2

- command:
- "python -m pip install tox"
- "tox -e py27-old,codecov"
label: ":python: 2.7 / SQLite / Old Deps"
env:
TRIAL_FLAGS: "-j 2"
plugins:
- docker#v3.0.1:
image: "python:2.7"
propagate-environment: true
retry:
automatic:
- exit_status: -1
limit: 2
- exit_status: 2
limit: 2

- label: ":python: 2.7 / :postgres: 9.4"
env:
TRIAL_FLAGS: "-j 4"
command:
- "bash -c 'python -m pip install tox && python -m tox -e py27-postgres,codecov'"
plugins:
- docker-compose#v2.1.0:
run: testenv
config:
- .buildkite/docker-compose.py27.pg94.yaml
retry:
automatic:
- exit_status: -1
limit: 2
- exit_status: 2
limit: 2

- label: ":python: 2.7 / :postgres: 9.5"
env:
TRIAL_FLAGS: "-j 4"
command:
- "bash -c 'python -m pip install tox && python -m tox -e py27-postgres,codecov'"
plugins:
- docker-compose#v2.1.0:
run: testenv
config:
- .buildkite/docker-compose.py27.pg95.yaml
retry:
automatic:
- exit_status: -1
limit: 2
- exit_status: 2
limit: 2

- label: ":python: 3.5 / :postgres: 9.4"
env:
TRIAL_FLAGS: "-j 4"
Expand Down
4 changes: 2 additions & 2 deletions .circleci/config.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
version: 2
jobs:
sytestpy2postgresmerged:
sytestpy3postgresmerged:
docker:
- image: matrixdotorg/sytest-synapse:dinsic
working_directory: /src
Expand All @@ -18,7 +18,7 @@ workflows:
version: 2
build:
jobs:
- sytestpy2postgresmerged:
- sytestpy3postgresmerged:
filters:
branches:
ignore: /develop|master|release-.*/
4 changes: 4 additions & 0 deletions .github/FUNDING.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# One username per supported platform and one custom link
patreon: matrixdotorg
liberapay: matrixdotorg
custom: https://paypal.me/matrixdotorg
1 change: 1 addition & 0 deletions changelog.d/5252.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add monthly active users to phonehome stats.
1 change: 1 addition & 0 deletions changelog.d/5325.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fix a bug where running synapse_port_db would cause the account validity feature to fail because it didn't set the type of the email_sent column to boolean.
1 change: 1 addition & 0 deletions changelog.d/5382.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add a sponsor button to the repo.
1 change: 1 addition & 0 deletions changelog.d/5386.misc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add a sponsor button to the repo.
1 change: 1 addition & 0 deletions changelog.d/5387.bugfix
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Warn about disabling email-based password resets when a reset occurs, and remove warning when someone attempts a phone-based reset.
1 change: 1 addition & 0 deletions changelog.d/5412.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Add --no-daemonize option to run synapse in the foreground, per issue #4130. Contributed by Soham Gumaste.
1 change: 1 addition & 0 deletions changelog.d/5425.removal
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Python 2.7 is no longer a supported platform. Synapse now requires Python 3.5+ to run.
1 change: 1 addition & 0 deletions scripts/synapse_port_db
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ BOOLEAN_COLUMNS = {
"group_roles": ["is_public"],
"local_group_membership": ["is_publicised", "is_admin"],
"e2e_room_keys": ["is_verified"],
"account_validity": ["email_sent"],
}


Expand Down
10 changes: 10 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,16 @@ def exec_file(path_segments):
include_package_data=True,
zip_safe=False,
long_description=long_description,
python_requires='~=3.5',
classifiers=[
'Development Status :: 5 - Production/Stable',
'Topic :: Communications :: Chat',
'License :: OSI Approved :: Apache Software License',
'Programming Language :: Python :: 3 :: Only',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
],
scripts=["synctl"] + glob.glob("scripts/*"),
cmdclass={'test': TestCommand},
)
7 changes: 7 additions & 0 deletions synapse/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,13 @@
""" This is a reference implementation of a Matrix home server.
"""

import sys

# Check that we're not running on an unsupported Python version.
if sys.version_info < (3, 5):
print("Synapse requires Python 3.5 or above.")
sys.exit(1)

try:
from twisted.internet import protocol
from twisted.internet.protocol import Factory
Expand Down
1 change: 1 addition & 0 deletions synapse/app/homeserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -540,6 +540,7 @@ def phone_stats_home():
stats["total_room_count"] = room_count

stats["daily_active_users"] = yield hs.get_datastore().count_daily_users()
stats["monthly_active_users"] = yield hs.get_datastore().count_monthly_users()
stats["daily_active_rooms"] = yield hs.get_datastore().count_daily_active_rooms()
stats["daily_messages"] = yield hs.get_datastore().count_daily_messages()

Expand Down
11 changes: 5 additions & 6 deletions synapse/config/emailconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,12 @@

# This file can't be called email.py because if it is, we cannot:
import email.utils
import logging
import os

import pkg_resources

from ._base import Config, ConfigError

logger = logging.getLogger(__name__)


class EmailConfig(Config):
def read_config(self, config):
Expand Down Expand Up @@ -85,10 +82,12 @@ def read_config(self, config):
self.email_password_reset_behaviour = (
"remote" if email_trust_identity_server_for_password_resets else "local"
)
self.password_resets_were_disabled_due_to_email_config = False
if self.email_password_reset_behaviour == "local" and email_config == {}:
logger.warn(
"User password resets have been disabled due to lack of email config"
)
# We cannot warn the user this has happened here
# Instead do so when a user attempts to reset their password
self.password_resets_were_disabled_due_to_email_config = True

self.email_password_reset_behaviour = "off"

# Get lifetime of a validation token in milliseconds
Expand Down
4 changes: 2 additions & 2 deletions synapse/python_dependencies.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@
"canonicaljson>=1.1.3",
"signedjson>=1.0.0",
"pynacl>=1.2.1",
"idna>=2",
"idna>=2.5",

# validating SSL certs for IP addresses requires service_identity 18.1.
"service_identity>=18.1.0",
Expand All @@ -65,7 +65,7 @@
"sortedcontainers>=1.4.4",
"psutil>=2.0.0",
"pymacaroons>=0.13.0",
"msgpack>=0.5.0",
"msgpack>=0.5.2",
"phonenumbers>=8.2.0",
"six>=1.12",
# prometheus_client 0.4.0 changed the format of counter metrics
Expand Down
19 changes: 15 additions & 4 deletions synapse/rest/client/v2_alpha/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,13 @@ def __init__(self, hs):
@defer.inlineCallbacks
def on_POST(self, request):
if self.config.email_password_reset_behaviour == "off":
raise SynapseError(400, "Password resets have been disabled on this server")
if self.config.password_resets_were_disabled_due_to_email_config:
logger.warn(
"User password resets have been disabled due to lack of email config"
)
raise SynapseError(
400, "Email-based password resets have been disabled on this server",
)

body = parse_json_object_from_request(request)

Expand Down Expand Up @@ -197,9 +203,6 @@ def __init__(self, hs):

@defer.inlineCallbacks
def on_POST(self, request):
if not self.config.email_password_reset_behaviour == "off":
raise SynapseError(400, "Password resets have been disabled on this server")

body = parse_json_object_from_request(request)

assert_params_in_dict(body, [
Expand Down Expand Up @@ -254,6 +257,14 @@ def on_GET(self, request, medium):
400,
"This medium is currently not supported for password resets",
)
if self.config.email_password_reset_behaviour == "off":
if self.config.password_resets_were_disabled_due_to_email_config:
logger.warn(
"User password resets have been disabled due to lack of email config"
)
raise SynapseError(
400, "Email-based password resets have been disabled on this server",
)

sid = parse_string(request, "sid")
client_secret = parse_string(request, "client_secret")
Expand Down
44 changes: 29 additions & 15 deletions synapse/storage/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -279,23 +279,37 @@ def count_daily_users(self):
"""
Counts the number of users who used this homeserver in the last 24 hours.
"""
yesterday = int(self._clock.time_msec()) - (1000 * 60 * 60 * 24)
return self.runInteraction("count_daily_users", self._count_users, yesterday,)

def _count_users(txn):
yesterday = int(self._clock.time_msec()) - (1000 * 60 * 60 * 24)

sql = """
SELECT COALESCE(count(*), 0) FROM (
SELECT user_id FROM user_ips
WHERE last_seen > ?
GROUP BY user_id
) u
"""

txn.execute(sql, (yesterday,))
count, = txn.fetchone()
return count
def count_monthly_users(self):
"""
Counts the number of users who used this homeserver in the last 30 days.
Note this method is intended for phonehome metrics only and is different
from the mau figure in synapse.storage.monthly_active_users which,
amongst other things, includes a 3 day grace period before a user counts.
"""
thirty_days_ago = int(self._clock.time_msec()) - (1000 * 60 * 60 * 24 * 30)
return self.runInteraction(
"count_monthly_users",
self._count_users,
thirty_days_ago,
)

return self.runInteraction("count_users", _count_users)
def _count_users(self, txn, time_from):
"""
Returns number of users seen in the past time_from period
"""
sql = """
SELECT COALESCE(count(*), 0) FROM (
SELECT user_id FROM user_ips
WHERE last_seen > ?
GROUP BY user_id
) u
"""
txn.execute(sql, (time_from,))
count, = txn.fetchone()
return count

def count_r30_users(self):
"""
Expand Down
19 changes: 16 additions & 3 deletions synctl
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,14 @@ def abort(message, colour=RED, stream=sys.stderr):
sys.exit(1)


def start(configfile):
def start(configfile, daemonize=True):
write("Starting ...")
args = SYNAPSE
args.extend(["--daemonize", "-c", configfile])

if daemonize:
args.extend(["--daemonize", "-c", configfile])
else:
args.extend(["-c", configfile])

try:
subprocess.check_call(args)
Expand Down Expand Up @@ -143,12 +147,21 @@ def main():
help="start or stop all the workers in the given directory"
" and the main synapse process",
)
parser.add_argument(
"--no-daemonize",
action="store_false",
help="Run synapse in the foreground for debugging. "
"Will work only if the daemonize option is not set in the config."
)

options = parser.parse_args()

if options.worker and options.all_processes:
write('Cannot use "--worker" with "--all-processes"', stream=sys.stderr)
sys.exit(1)
if options.no_daemonize and options.all_processes:
write('Cannot use "--no-daemonize" with "--all-processes"', stream=sys.stderr)
sys.exit(1)

configfile = options.configfile

Expand Down Expand Up @@ -276,7 +289,7 @@ def main():
# Check if synapse is already running
if os.path.exists(pidfile) and pid_running(int(open(pidfile).read())):
abort("synapse.app.homeserver already running")
start(configfile)
start(configfile, bool(options.no_daemonize))

for worker in workers:
env = os.environ.copy()
Expand Down
Loading

0 comments on commit 8ea4191

Please sign in to comment.