mirror of
https://github.com/mozilla-services/syncserver
synced 2024-10-30 09:20:32 +00:00
Initial commit; refactored from server-full2 codebase
This commit is contained in:
commit
d0d47fae3b
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@ -0,0 +1,8 @@
|
||||
*.pyc
|
||||
*.mako.py
|
||||
local
|
||||
*.egg-info
|
||||
*.swp
|
||||
\.coverage
|
||||
*~
|
||||
nosetests.xml
|
3
MANIFEST.in
Normal file
3
MANIFEST.in
Normal file
@ -0,0 +1,3 @@
|
||||
syncserver.ini
|
||||
syncserver.wsgi
|
||||
syncserver/tests.ini
|
37
Makefile
Normal file
37
Makefile
Normal file
@ -0,0 +1,37 @@
|
||||
VIRTUALENV = virtualenv
|
||||
PYTHON = local/bin/python
|
||||
NOSE = local/bin/nosetests -s
|
||||
FLAKE8 = local/bin/flake8
|
||||
PIP = local/bin/pip
|
||||
PIP_CACHE = /tmp/pip-cache.${USER}
|
||||
BUILD_TMP = /tmp/syncstorage-build.${USER}
|
||||
PYPI = https://pypi.python.org/simple
|
||||
INSTALL = $(PIP) install -U -i $(PYPI)
|
||||
|
||||
.PHONY: all build test serve clean
|
||||
|
||||
all: build test
|
||||
|
||||
build:
|
||||
$(VIRTUALENV) --no-site-packages --distribute ./local
|
||||
$(INSTALL) --upgrade Distribute
|
||||
$(INSTALL) pip
|
||||
$(INSTALL) nose
|
||||
$(INSTALL) flake8
|
||||
$(INSTALL) -r requirements.txt
|
||||
$(PYTHON) ./setup.py develop
|
||||
|
||||
test:
|
||||
# Basic syntax and sanity checks.
|
||||
$(FLAKE8) ./syncserver
|
||||
# Testcases from the bundled apps.
|
||||
$(NOSE) syncstorage.tests
|
||||
$(NOSE) tokenserver.tests
|
||||
# Live tests against a running server.
|
||||
./local/bin/pserve syncserver/tests.ini & SERVER_PID=$$! ; sleep 2 ; ./local/bin/python -m syncstorage.tests.functional.test_storage --use-token-server http://localhost:5000/token/1.0/sync/1.5 ; kill $$SERVER_PID
|
||||
|
||||
serve:
|
||||
./local/bin/pserve ./syncserver.ini
|
||||
|
||||
clean:
|
||||
rm -rf ./local
|
73
README.rst
Normal file
73
README.rst
Normal file
@ -0,0 +1,73 @@
|
||||
Run-Your-Own Firefox Sync Server
|
||||
================================
|
||||
|
||||
This is an all-in-one package for running a self-hosted Firefox Sync server.
|
||||
If bundles the "tokenserver" project for authentication and the "syncstorage"
|
||||
project for storage, produce a single stand-alone webapp.
|
||||
|
||||
Complete installation instructions are available at:
|
||||
|
||||
https://docs.services.mozilla.com/howtos/run-sync-1.5.html
|
||||
|
||||
|
||||
Quickstart
|
||||
----------
|
||||
|
||||
The Sync Server software runs using **python 2.6** or later, and the build
|
||||
process requires **make** and **virtualenv**. You will need to have the
|
||||
following packages (or similar, depending on your operating system) installed:
|
||||
|
||||
- python2.7
|
||||
- python2.7-dev
|
||||
- python-virtualenv
|
||||
- make
|
||||
|
||||
Take a checkout of this repository, then run "make build" to pull in the
|
||||
necessary python package dependencies::
|
||||
|
||||
$ git clone https://github.com/mozilla-services/syncserver
|
||||
$ cd syncserver
|
||||
$ make build
|
||||
|
||||
To sanity-check that things got installed correctly, do the following::
|
||||
|
||||
$ make test
|
||||
|
||||
Now you can run the server::
|
||||
|
||||
$ make serve
|
||||
|
||||
This should start a server on http://localhost:5000/.
|
||||
|
||||
Now go into Firefox's `about:config` page, search for a setting named
|
||||
"tokenServerURI", and change it to point to your server::
|
||||
|
||||
services.sync.tokenServerURI: http://localhost:5000/token/1.0/sync/1.5
|
||||
|
||||
Firefox should now sync against your local server rather than the default
|
||||
Mozilla-hosted servers.
|
||||
|
||||
For more details on setting up a stable deployment, see:
|
||||
|
||||
https://docs.services.mozilla.com/howtos/run-sync-1.5.html
|
||||
|
||||
|
||||
Customization
|
||||
-------------
|
||||
|
||||
All customization of the server can be done by editing the file
|
||||
"syncserver.ini", which contains lots of comments to help you on
|
||||
your way. Things you might like to change include:
|
||||
|
||||
* The client-visible hostname for your server. Edit the "public_url"
|
||||
key under the [syncstorage] section.
|
||||
|
||||
* The database in which to store sync data. Edit the "sqluri" setting
|
||||
under the [syncstorage] section.
|
||||
|
||||
|
||||
Questions, Feedback
|
||||
-------------------
|
||||
|
||||
- IRC channel: #sync. See http://irc.mozilla.org/
|
||||
- Mailing list: https://mail.mozilla.org/admin/services-dev
|
60
requirements.txt
Normal file
60
requirements.txt
Normal file
@ -0,0 +1,60 @@
|
||||
beautifulsoup4==4.3.2
|
||||
cef==0.5
|
||||
Chameleon==2.14
|
||||
chardet==2.2.1
|
||||
circus==0.10
|
||||
cornice==0.16.2
|
||||
coverage==3.7.1
|
||||
docutils==0.11
|
||||
flake8==2.1.0
|
||||
gevent==1.0
|
||||
greenlet==0.4.1
|
||||
hawkauthlib==0.1.1
|
||||
Jinja2==2.7.1
|
||||
Mako==0.9.1
|
||||
MarkupSafe==0.18
|
||||
mccabe==0.2.1
|
||||
metlog-py==0.10
|
||||
ordereddict==1.1
|
||||
Paste==1.7.5.1
|
||||
PasteDeploy==1.5.2
|
||||
PasteScript==1.7.5
|
||||
pep8==1.4.6
|
||||
powerhose==0.7
|
||||
protobuf==2.5
|
||||
psutil==1.2.1
|
||||
PyBrowserID==0.9.1
|
||||
pyflakes==0.7.3
|
||||
Pygments==1.6
|
||||
PyMySQL==0.6.1
|
||||
pymysql_sa==1.0
|
||||
pyramid==1.4.3
|
||||
pyramid_debugtoolbar==1.0.9
|
||||
pyramid-hawkauth==0.1.0
|
||||
pyramid_jinja2==1.9
|
||||
repoze.lru==0.6
|
||||
requests==2.1
|
||||
simplejson==3.3.2
|
||||
six==1.5.2
|
||||
Sphinx==1.2
|
||||
SQLAlchemy==0.9.1
|
||||
tokenlib==0.3.1
|
||||
translationstring==1.1
|
||||
umemcache==1.6.3
|
||||
unittest2==0.5.1
|
||||
uWSGI==1.9.20
|
||||
venusian==1.0a8
|
||||
waitress==0.8.8
|
||||
WebOb==1.3.1
|
||||
WebTest==2.0.11
|
||||
wsgi_intercept==0.6
|
||||
wsgiref==0.1.2
|
||||
zope.component==4.1.0
|
||||
zope.deprecation==4.1.0
|
||||
zope.event==4.0.2
|
||||
zope.interface==4.0.5
|
||||
https://argparse.googlecode.com/files/argparse-1.2.1.tar.gz
|
||||
http://github.com/mozilla-services/mozservices/archive/master.zip
|
||||
https://github.com/mozilla-services/wimms/archive/master.zip
|
||||
https://github.com/mozilla-services/tokenserver/archive/master.zip
|
||||
http://github.com/mozilla-services/server-syncstorage/archive/master.zip
|
16
setup.py
Normal file
16
setup.py
Normal file
@ -0,0 +1,16 @@
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
from setuptools import setup
|
||||
|
||||
entry_points = """
|
||||
[paste.app_factory]
|
||||
main = syncserver:main
|
||||
"""
|
||||
|
||||
setup(
|
||||
name='syncserver',
|
||||
version="1.5",
|
||||
packages=['syncserver'],
|
||||
entry_points=entry_points
|
||||
)
|
17
syncserver.ini
Normal file
17
syncserver.ini
Normal file
@ -0,0 +1,17 @@
|
||||
[server:main]
|
||||
use = egg:Paste#http
|
||||
host = 0.0.0.0
|
||||
port = 5000
|
||||
|
||||
[app:main]
|
||||
use = egg:syncserver
|
||||
|
||||
[syncserver]
|
||||
# This must be edited to point to the public URL of your server.
|
||||
public_url = http://localhost:5000/
|
||||
|
||||
# This defines the database in which to store all server data.
|
||||
#sqluri = sqlite:////tmp/syncserver.db
|
||||
|
||||
# This is a secret key used for signing authentication tokens.
|
||||
#secret = INSERT_SECRET_KEY_HERE
|
40
syncserver.wsgi
Normal file
40
syncserver.wsgi
Normal file
@ -0,0 +1,40 @@
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
import os
|
||||
import sys
|
||||
import site
|
||||
from logging.config import fileConfig
|
||||
from ConfigParser import NoSectionError
|
||||
|
||||
# detecting if virtualenv was used in this dir
|
||||
_CURDIR = os.path.dirname(os.path.abspath(__file__))
|
||||
_PY_VER = sys.version.split()[0][:3]
|
||||
_SITE_PKG = os.path.join(_CURDIR, 'lib', 'python' + _PY_VER, 'site-packages')
|
||||
|
||||
# adding virtualenv's site-package and ordering paths
|
||||
saved = sys.path[:]
|
||||
|
||||
if os.path.exists(_SITE_PKG):
|
||||
site.addsitedir(_SITE_PKG)
|
||||
|
||||
for path in sys.path:
|
||||
if path not in saved:
|
||||
saved.insert(0, path)
|
||||
|
||||
sys.path[:] = saved
|
||||
|
||||
# setting up the egg cache to a place where apache can write
|
||||
os.environ['PYTHON_EGG_CACHE'] = '/tmp/python-eggs'
|
||||
|
||||
# setting up logging
|
||||
ini_file = os.path.join(_CURDIR, 'syncserver.ini')
|
||||
try:
|
||||
fileConfig(ini_file)
|
||||
except NoSectionError:
|
||||
pass
|
||||
|
||||
# running the app using Paste
|
||||
from paste.deploy import loadapp
|
||||
application = loadapp('config:%s'% ini_file)
|
92
syncserver/__init__.py
Normal file
92
syncserver/__init__.py
Normal file
@ -0,0 +1,92 @@
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
||||
# You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
import os
|
||||
from pyramid.response import Response
|
||||
import mozsvc.config
|
||||
|
||||
|
||||
def includeme(config):
|
||||
"""Install SyncServer application into the given Pyramid configurator."""
|
||||
# Set the umask so that files are created with secure permissions.
|
||||
# Necessary for e.g. created-on-demand sqlite database files.
|
||||
os.umask(0077)
|
||||
|
||||
# Sanity-check the deployment settings and provide sensible defaults.
|
||||
settings = config.registry.settings
|
||||
public_url = settings.get("syncserver.public_url")
|
||||
if public_url is None:
|
||||
raise RuntimeError("you much configure syncserver.public_url")
|
||||
secret = settings.get("syncserver.secret")
|
||||
if secret is None:
|
||||
secret = os.urandom(32).encode("hex")
|
||||
sqluri = settings.get("syncserver.sqluri")
|
||||
if sqluri is None:
|
||||
sqluri = "sqlite:///:memory:"
|
||||
|
||||
# Configure app-specific defaults based on top-level configuration.
|
||||
settings.pop("config", None)
|
||||
if "tokenserver.backend" not in settings:
|
||||
# Default to sql node-assignment backend
|
||||
settings["tokenserver.backend"] =\
|
||||
"tokenserver.assignment.sqlnode.SQLNodeAssignment"
|
||||
settings["tokenserver.sqluri"] = sqluri
|
||||
if "tokenserver.applications" not in settings:
|
||||
# Default to just the sync-1.5 application
|
||||
settings["tokenserver.applications"] = "sync-1.5"
|
||||
if "tokenserver.secrets.backend" not in settings:
|
||||
# Default to a single fixed signing secret
|
||||
settings["tokenserver.secrets.backend"] = "mozsvc.secrets.FixedSecrets"
|
||||
settings["tokenserver.secrets.secrets"] = [secret]
|
||||
if "hawkauth.secrets.backend" not in settings:
|
||||
# Default to the same secrets backend as the tokenserver
|
||||
for key in settings.keys():
|
||||
if key.startswith("tokenserver.secrets."):
|
||||
newkey = "hawkauth" + key[len("tokenserver"):]
|
||||
settings[newkey] = settings[key]
|
||||
if "storage.backend" not in settings:
|
||||
# Default to sql syncstorage backend
|
||||
settings["storage.backend"] = "syncstorage.storage.sql.SQLStorage"
|
||||
settings["storage.sqluri"] = sqluri
|
||||
settings["storage.create_tables"] = True
|
||||
if "browserid.backend" not in settings:
|
||||
# Default to remote verifier, with public_url as only audience
|
||||
settings["browserid.backend"] = "tokenserver.verifiers.RemoteVerifier"
|
||||
settings["browserid.audiences"] = public_url
|
||||
if "metlog.backend" not in settings:
|
||||
# Default to logging to stdout
|
||||
settings["metlog.backend"] = "mozsvc.metrics.MetlogPlugin"
|
||||
settings["metlog.enabled"] = True
|
||||
settings["metlog.sender_class"] = "metlog.senders.StdOutSender"
|
||||
if "cef.use" not in settings:
|
||||
# Default to no CEF logging
|
||||
settings["cef.use"] = False
|
||||
|
||||
# Include the relevant sub-packages.
|
||||
config.include("syncstorage", route_prefix="/storage")
|
||||
config.include("tokenserver", route_prefix="/token")
|
||||
|
||||
# Add a top-level "it works!" view.
|
||||
def itworks(request):
|
||||
return Response("it works!")
|
||||
|
||||
config.add_route('itworks', '/')
|
||||
config.add_view(itworks, route_name='itworks')
|
||||
|
||||
|
||||
def get_configurator(global_config, **settings):
|
||||
"""Load a SyncStorge configurator object from deployment settings."""
|
||||
config = mozsvc.config.get_configurator(global_config, **settings)
|
||||
config.begin()
|
||||
try:
|
||||
config.include(includeme)
|
||||
finally:
|
||||
config.end()
|
||||
return config
|
||||
|
||||
|
||||
def main(global_config, **settings):
|
||||
"""Load a SyncStorage WSGI app from deployment settings."""
|
||||
config = get_configurator(global_config, **settings)
|
||||
return config.make_wsgi_app()
|
17
syncserver/tests.ini
Normal file
17
syncserver/tests.ini
Normal file
@ -0,0 +1,17 @@
|
||||
[server:main]
|
||||
use = egg:Paste#http
|
||||
host = 0.0.0.0
|
||||
port = 5000
|
||||
|
||||
[app:main]
|
||||
use = egg:SyncServer
|
||||
|
||||
[syncserver]
|
||||
# This must be edited to point to the public URL of your server.
|
||||
public_url = http://localhost:5000/
|
||||
|
||||
# This defines the database in which to store all server data.
|
||||
#sqluri = sqlite:////tmp/syncserver.db
|
||||
|
||||
# This is a secret key used for signing authentication tokens.
|
||||
#secret = INSERT_SECRET_KEY_HERE
|
Loading…
Reference in New Issue
Block a user