From b29517bd013b82302b1a73072da8bfc39564dc1a Mon Sep 17 00:00:00 2001 From: Mark Haines Date: Thu, 30 Oct 2014 01:21:33 +0000 Subject: Add a request-id to each log line --- synapse/app/homeserver.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 6394bc27d1..4e74f4d14c 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -33,6 +33,7 @@ from synapse.api.urls import ( ) from synapse.config.homeserver import HomeServerConfig from synapse.crypto import context_factory +from synapse.util.logcontext import LoggingContext from daemonize import Daemonize import twisted.manhole.telnet @@ -240,7 +241,7 @@ def setup(): daemon = Daemonize( app="synapse-homeserver", pid=config.pid_file, - action=reactor.run, + action=run, auto_close_fds=False, verbose=True, logger=logger, @@ -250,6 +251,13 @@ def setup(): else: reactor.run() +def run(): + with LoggingContext("run") as context: + reactor.run() + +def main(): + with LoggingContext("main") as context: + setup() if __name__ == '__main__': - setup() + main() -- cgit 1.5.1 From 7a756e5d9d4c5a636d13b0959b72bc4d1518c5be Mon Sep 17 00:00:00 2001 From: Mark Haines Date: Thu, 30 Oct 2014 11:15:39 +0000 Subject: Remove unused 'context' variables to appease pyflakes --- synapse/app/homeserver.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 4e74f4d14c..17926be88c 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -252,11 +252,11 @@ def setup(): reactor.run() def run(): - with LoggingContext("run") as context: + with LoggingContext("run"): reactor.run() def main(): - with LoggingContext("main") as context: + with LoggingContext("main"): setup() if __name__ == '__main__': -- cgit 1.5.1 From af7ae048f8868a58dc1b82a17ca701f28624b065 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Mon, 3 Nov 2014 15:06:40 +0000 Subject: Add option to not bind to HTTPS port. This is useful if running behind an ssl load balancer --- demo/start.sh | 2 +- synapse/app/homeserver.py | 5 ++++- synapse/config/server.py | 3 +++ 3 files changed, 8 insertions(+), 2 deletions(-) (limited to 'synapse/app') diff --git a/demo/start.sh b/demo/start.sh index fc6cd6303f..0530f0a26e 100755 --- a/demo/start.sh +++ b/demo/start.sh @@ -32,7 +32,7 @@ for port in 8080 8081 8082; do -D --pid-file "$DIR/$port.pid" \ --manhole $((port + 1000)) \ --tls-dh-params-path "demo/demo.tls.dh" \ - $PARAMS + $PARAMS $SYNAPSE_PARAMS python -m synapse.app.homeserver \ --config-path "demo/etc/$port.config" \ diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 6394bc27d1..a20376b9d6 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -233,7 +233,10 @@ def setup(): f.namespace['hs'] = hs reactor.listenTCP(config.manhole, f, interface='127.0.0.1') - hs.start_listening(config.bind_port, config.unsecure_port) + bind_port = config.bind_port + if config.no_tls: + bind_port = None + hs.start_listening(bind_port, config.unsecure_port) if config.daemonize: print config.pid_file diff --git a/synapse/config/server.py b/synapse/config/server.py index 3afda12d5a..814a4c349b 100644 --- a/synapse/config/server.py +++ b/synapse/config/server.py @@ -30,6 +30,7 @@ class ServerConfig(Config): self.pid_file = self.abspath(args.pid_file) self.webclient = True self.manhole = args.manhole + self.no_tls = args.no_tls if not args.content_addr: host = args.server_name @@ -67,6 +68,8 @@ class ServerConfig(Config): server_group.add_argument("--content-addr", default=None, help="The host and scheme to use for the " "content repository") + server_group.add_argument("--no-tls", action='store_true', + help="Don't bind to the https port.") def read_signing_key(self, signing_key_path): signing_keys = self.read_file(signing_key_path, "signing_key") -- cgit 1.5.1 From dca3ba2f77a3530d78a951556ea8c6cfdc0463df Mon Sep 17 00:00:00 2001 From: Mark Haines Date: Tue, 4 Nov 2014 16:19:03 +0000 Subject: Determine webclient path by the python module it is contained in --- demo/start.sh | 2 +- synapse/app/homeserver.py | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) (limited to 'synapse/app') diff --git a/demo/start.sh b/demo/start.sh index fc6cd6303f..8b0cc84fe6 100755 --- a/demo/start.sh +++ b/demo/start.sh @@ -41,6 +41,6 @@ for port in 8080 8081 8082; do done echo "Starting webclient on port 8000..." -python "demo/webserver.py" -p 8000 -P "$DIR/webserver.pid" "webclient" +python "demo/webserver.py" -p 8000 -P "$DIR/webserver.pid" "syweb/webclient" cd "$CWD" diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 6394bc27d1..b3dae5da64 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -42,6 +42,7 @@ import os import re import sys import sqlite3 +import syweb logger = logging.getLogger(__name__) @@ -58,7 +59,9 @@ class SynapseHomeServer(HomeServer): return JsonResource() def build_resource_for_web_client(self): - return File("webclient") # TODO configurable? + syweb_path = os.path.dirname(syweb.__file__) + webclient_path = os.path.join(syweb_path, "webclient") + return File(webclient_path) # TODO configurable? def build_resource_for_content_repo(self): return ContentRepoResource( -- cgit 1.5.1 From e7c6d2c9d96124ce50940664bece4367dba0c972 Mon Sep 17 00:00:00 2001 From: Mark Haines Date: Thu, 13 Nov 2014 14:39:11 +0000 Subject: SYN-138: Rewrite synctl in python and include it in the python distribution --- setup.py | 1 + synapse/app/synctl.py | 66 +++++++++++++++++++++++++++++++++++++++++++++++++++ synctl | 35 --------------------------- 3 files changed, 67 insertions(+), 35 deletions(-) create mode 100755 synapse/app/synctl.py delete mode 100755 synctl (limited to 'synapse/app') diff --git a/setup.py b/setup.py index f5976cd762..7f46ce990f 100755 --- a/setup.py +++ b/setup.py @@ -55,6 +55,7 @@ setup( long_description=read("README.rst"), entry_points=""" [console_scripts] + synctl=synapse.app.synctl:main synapse-homeserver=synapse.app.homeserver:run """ ) diff --git a/synapse/app/synctl.py b/synapse/app/synctl.py new file mode 100755 index 0000000000..e85073b06b --- /dev/null +++ b/synapse/app/synctl.py @@ -0,0 +1,66 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +# Copyright 2014 OpenMarket Ltd +# +# Licensed 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. + +import sys +import os +import subprocess +import signal + +SYNAPSE = ["python", "-m", "synapse.app.homeserver"] + +CONFIGFILE="homeserver.yaml" +PIDFILE="homeserver.pid" + +GREEN="\x1b[1;32m" +NORMAL="\x1b[m" + +def start(): + if not os.path.exists(CONFIGFILE): + sys.stderr.write( + "No config file found\n" + "To generate a config file, run '%s -c %s --generate-config" + " --server-name='\n" % ( + " ".join(SYNAPSE), CONFIGFILE + ) + ) + sys.exit(1) + print "Starting ...", + args = SYNAPSE + args.extend(["--daemonize", "-c", CONFIGFILE, "--pid-file", PIDFILE]) + subprocess.check_call(args) + print GREEN + "started" + NORMAL + +def stop(): + if os.path.exists(PIDFILE): + pid = int(open(PIDFILE).read()) + os.kill(pid, signal.SIGTERM) + print GREEN + "stopped" + NORMAL + +def main(): + action = sys.argv[1] if sys.argv[1:] else "usage" + if action == "start": + start() + elif action == "stop": + stop() + elif action == "restart": + start() + stop() + else: + sys.stderr.write("Usage: %s [start|stop|restart]\n" % (sys.argv[0],)) + sys.exit(1) + +if __name__=='__main__': + main() diff --git a/synctl b/synctl deleted file mode 100755 index c227a9e1e4..0000000000 --- a/synctl +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -SYNAPSE="python -m synapse.app.homeserver" - -CONFIGFILE="homeserver.yaml" -PIDFILE="homeserver.pid" - -GREEN=$'\e[1;32m' -NORMAL=$'\e[m' - -set -e - -case "$1" in - start) - if [ ! -f "$CONFIGFILE" ]; then - echo "No config file found" - echo "To generate a config file, run '$SYNAPSE -c $CONFIGFILE --generate-config --server-name='" - exit 1 - fi - - echo -n "Starting ..." - $SYNAPSE --daemonize -c "$CONFIGFILE" --pid-file "$PIDFILE" - echo "${GREEN}started${NORMAL}" - ;; - stop) - echo -n "Stopping ..." - test -f $PIDFILE && kill `cat $PIDFILE` && echo "${GREEN}stopped${NORMAL}" - ;; - restart) - $0 stop && $0 start - ;; - *) - echo "Usage: $0 [start|stop|restart]" >&2 - exit 1 -esac -- cgit 1.5.1 From 26fc8789445c22f85467387bec7eeb6eccedc2c5 Mon Sep 17 00:00:00 2001 From: Mark Haines Date: Mon, 17 Nov 2014 19:16:15 +0000 Subject: Stop before starting when restarting --- synapse/app/synctl.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'synapse/app') diff --git a/synapse/app/synctl.py b/synapse/app/synctl.py index e85073b06b..abe055a64c 100755 --- a/synapse/app/synctl.py +++ b/synapse/app/synctl.py @@ -56,8 +56,8 @@ def main(): elif action == "stop": stop() elif action == "restart": - start() stop() + start() else: sys.stderr.write("Usage: %s [start|stop|restart]\n" % (sys.argv[0],)) sys.exit(1) -- cgit 1.5.1 From 95614e52204c6ffd8be62a4e4cab716c9a985473 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 18 Nov 2014 15:36:36 +0000 Subject: Fix auth to correctly handle initial creation of rooms --- synapse/api/auth.py | 24 ++++++++++++++++--- synapse/app/homeserver.py | 61 ++++++++++++++++++++++++++++------------------- 2 files changed, 58 insertions(+), 27 deletions(-) (limited to 'synapse/app') diff --git a/synapse/api/auth.py b/synapse/api/auth.py index 87f19a96d6..635571d2b6 100644 --- a/synapse/api/auth.py +++ b/synapse/api/auth.py @@ -21,7 +21,7 @@ from synapse.api.constants import Membership, JoinRules from synapse.api.errors import AuthError, StoreError, Codes, SynapseError from synapse.api.events.room import ( RoomMemberEvent, RoomPowerLevelsEvent, RoomRedactionEvent, - RoomJoinRulesEvent, RoomCreateEvent, + RoomJoinRulesEvent, RoomCreateEvent, RoomAliasesEvent, ) from synapse.util.logutils import log_function from syutil.base64util import encode_base64 @@ -63,6 +63,10 @@ class Auth(object): # FIXME return True + # FIXME: Temp hack + if event.type == RoomAliasesEvent.TYPE: + return True + if event.type == RoomMemberEvent.TYPE: allowed = self.is_membership_change_allowed(event) if allowed: @@ -144,6 +148,17 @@ class Auth(object): @log_function def is_membership_change_allowed(self, event): + membership = event.content["membership"] + + # Check if this is the room creator joining: + if len(event.prev_events) == 1 and Membership.JOIN == membership: + # Get room creation event: + key = (RoomCreateEvent.TYPE, "", ) + create = event.old_state_events.get(key) + if event.prev_events[0][0] == create.event_id: + if create.content["creator"] == event.state_key: + return True + target_user_id = event.state_key # get info about the caller @@ -159,8 +174,6 @@ class Auth(object): target_in_room = target and target.membership == Membership.JOIN - membership = event.content["membership"] - key = (RoomJoinRulesEvent.TYPE, "", ) join_rule_event = event.old_state_events.get(key) if join_rule_event: @@ -255,6 +268,11 @@ class Auth(object): level = power_level_event.content.get("users", {}).get(user_id) if not level: level = power_level_event.content.get("users_default", 0) + else: + key = (RoomCreateEvent.TYPE, "", ) + create_event = event.old_state_events.get(key) + if create_event.content["creator"] == user_id: + return 100 return level diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 85284a4919..53ca1f8f51 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -184,15 +184,7 @@ class SynapseHomeServer(HomeServer): logger.info("Synapse now listening on port %d", unsecure_port) -def setup(): - config = HomeServerConfig.load_config( - "Synapse Homeserver", - sys.argv[1:], - generate_section="Homeserver" - ) - - config.setup_logging() - +def setup(config, run_http=True): logger.info("Server hostname: %s", config.server_name) if re.search(":[0-9]+$", config.server_name): @@ -212,12 +204,13 @@ def setup(): content_addr=config.content_addr, ) - hs.register_servlets() + if run_http: + hs.register_servlets() - hs.create_resource_tree( - web_client=config.webclient, - redirect_root_to_web_client=True, - ) + hs.create_resource_tree( + web_client=config.webclient, + redirect_root_to_web_client=True, + ) db_name = hs.get_db_name() @@ -237,11 +230,18 @@ def setup(): f.namespace['hs'] = hs reactor.listenTCP(config.manhole, f, interface='127.0.0.1') - bind_port = config.bind_port - if config.no_tls: - bind_port = None - hs.start_listening(bind_port, config.unsecure_port) + if run_http: + bind_port = config.bind_port + if config.no_tls: + bind_port = None + hs.start_listening(bind_port, config.unsecure_port) + + hs.config = config + + return hs + +def run(config): if config.daemonize: print config.pid_file daemon = Daemonize( @@ -257,13 +257,26 @@ def setup(): else: reactor.run() -def run(): - with LoggingContext("run"): - reactor.run() -def main(): +def main(args, run_http=True): with LoggingContext("main"): - setup() + config = HomeServerConfig.load_config( + "Synapse Homeserver", + args, + generate_section="Homeserver" + ) + + config.setup_logging() + + hs = setup(config, run_http=run_http) + + def r(): + run(config) + hs.run = r + + return hs + if __name__ == '__main__': - main() + hs = main(sys.argv[1:]) + hs.run() -- cgit 1.5.1 From c6ea29d91610f2599ae3f729d9adcd82f6b71a46 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Tue, 18 Nov 2014 15:57:00 +0000 Subject: Revert accidental commit of bad file --- synapse/app/homeserver.py | 61 +++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 37 deletions(-) (limited to 'synapse/app') diff --git a/synapse/app/homeserver.py b/synapse/app/homeserver.py index 53ca1f8f51..85284a4919 100755 --- a/synapse/app/homeserver.py +++ b/synapse/app/homeserver.py @@ -184,7 +184,15 @@ class SynapseHomeServer(HomeServer): logger.info("Synapse now listening on port %d", unsecure_port) -def setup(config, run_http=True): +def setup(): + config = HomeServerConfig.load_config( + "Synapse Homeserver", + sys.argv[1:], + generate_section="Homeserver" + ) + + config.setup_logging() + logger.info("Server hostname: %s", config.server_name) if re.search(":[0-9]+$", config.server_name): @@ -204,13 +212,12 @@ def setup(config, run_http=True): content_addr=config.content_addr, ) - if run_http: - hs.register_servlets() + hs.register_servlets() - hs.create_resource_tree( - web_client=config.webclient, - redirect_root_to_web_client=True, - ) + hs.create_resource_tree( + web_client=config.webclient, + redirect_root_to_web_client=True, + ) db_name = hs.get_db_name() @@ -230,18 +237,11 @@ def setup(config, run_http=True): f.namespace['hs'] = hs reactor.listenTCP(config.manhole, f, interface='127.0.0.1') - if run_http: - bind_port = config.bind_port - if config.no_tls: - bind_port = None - hs.start_listening(bind_port, config.unsecure_port) - - hs.config = config - - return hs - + bind_port = config.bind_port + if config.no_tls: + bind_port = None + hs.start_listening(bind_port, config.unsecure_port) -def run(config): if config.daemonize: print config.pid_file daemon = Daemonize( @@ -257,26 +257,13 @@ def run(config): else: reactor.run() +def run(): + with LoggingContext("run"): + reactor.run() -def main(args, run_http=True): +def main(): with LoggingContext("main"): - config = HomeServerConfig.load_config( - "Synapse Homeserver", - args, - generate_section="Homeserver" - ) - - config.setup_logging() - - hs = setup(config, run_http=run_http) - - def r(): - run(config) - hs.run = r - - return hs - + setup() if __name__ == '__main__': - hs = main(sys.argv[1:]) - hs.run() + main() -- cgit 1.5.1