diff options
-rw-r--r-- | .bumpversion.cfg | 2 | ||||
-rw-r--r-- | CONTRIBUTING.md | 9 | ||||
-rw-r--r-- | README.md | 7 | ||||
-rw-r--r-- | omaha_server/omaha/builder.py | 4 | ||||
-rw-r--r-- | omaha_server/omaha/core.py | 8 | ||||
-rw-r--r-- | omaha_server/omaha/migrations/0027_auto_20160713_0755.py | 17 | ||||
-rw-r--r-- | omaha_server/omaha/migrations/0029_merge.py | 16 | ||||
-rw-r--r-- | omaha_server/omaha/parser.py | 6 | ||||
-rw-r--r-- | omaha_server/omaha/request.xsd | 14 | ||||
-rw-r--r-- | omaha_server/omaha/response.xsd | 2 | ||||
-rw-r--r-- | omaha_server/omaha/static/statistics/js/live_charts.js | 20 | ||||
-rw-r--r-- | omaha_server/omaha/statistics.py | 4 | ||||
-rw-r--r-- | omaha_server/omaha/tests/fixtures.py | 10 | ||||
-rw-r--r-- | omaha_server/omaha/utils.py | 13 | ||||
-rw-r--r-- | omaha_server/omaha_server/middlewares.py | 73 | ||||
-rw-r--r-- | omaha_server/omaha_server/settings.py | 11 | ||||
-rw-r--r-- | omaha_server/omaha_server/settings_dev.py | 15 | ||||
-rw-r--r-- | omaha_server/omaha_server/settings_local.py | 4 | ||||
-rw-r--r-- | omaha_server/omaha_server/settings_prod.py | 2 | ||||
-rw-r--r-- | pavement.py | 2 | ||||
-rw-r--r-- | requirements/base.txt | 5 |
21 files changed, 197 insertions, 47 deletions
diff --git a/.bumpversion.cfg b/.bumpversion.cfg index 170d17e..5621104 100644 --- a/.bumpversion.cfg +++ b/.bumpversion.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.3.9 +current_version = 0.4.1 tag = True commit = True diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..4e455a0 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,9 @@ +#Contributing to Omaha-server + +Omaha-server is an open source project and Crystalnix as the owner welcomes everyone who would like to help us by posting issues, updating documentation, submitting pull requests, providing feedback in comments, and any other activities. + +In general, we stick to [Contributing to Open Source on GitHub](https://guides.github.com/activities/contributing-to-open-source/) with one modification which is important for us: + +* **Pull requests.** Please, post your pull requests to the “dev” branch instead of “master”. We’re using the “master” branch only for stable changes. + +Please, don’t forget about [PEP 8](https://www.python.org/dev/peps/pep-0008/) (Style Guide for Python Code) and unit-tests, it’ll increase the chance that your pull request will be accepted. @@ -227,6 +227,7 @@ app: | OMAHA_URL_PREFIX | no trailing slash! | | | SENTRY_STACKTRACE_API_KEY | Auth API token | | | OMAHA_ONLY_HTTPS | HTTPS-only | False | +| CUP_REQUEST_VALIDATION | | False | - [uWSGI Options](http://uwsgi-docs.readthedocs.org/en/latest/Options.html) & [Environment variables](http://uwsgi-docs.readthedocs.org/en/latest/Configuration.html#environment-variables) - [Sentry](https://github.com/getsentry/sentry) @@ -261,6 +262,12 @@ $ ebs-deploy deploy -e omaha-server-dev 3. Finally, in the case if you want to redirect all HTTP traffic to HTTPS, you can add `OMAHA_ONLY_HTTPS: true` to environment variables in the *environment* section. *Warning:* Please, don't activate the redirection of HTTP to HTTPS if you don't enable HTTPS. It will lead to that an Omaha server won't be accessible. +#### Enable Client Update Protocol v2 + +1. Use [Omaha eckeytool](https://github.com/google/omaha/tree/master/omaha/tools/eckeytool) to generate private.pem key and cup_ecdsa_pubkey.{KEYID}.h files. +2. Add cup_ecdsa_pubkey.{KEYID}.h to Omaha source directory /path/to/omaha/omaha/net/, set CupEcdsaRequestImpl::kCupProductionPublicKey in /path/to/omaha/omaha/net/cup_ecdsa_request.cc to new key and build Omaha client. +3. Add private.pem keyid and path to omaha CUP_PEM_KEYS dictionary. + ## Links - Presentation: [omaha-server High Fidelity, High Velocity Deployments in the Cloud](http://slides.com/andreylisin/omaha-server/#/) diff --git a/omaha_server/omaha/builder.py b/omaha_server/omaha/builder.py index 323898b..8e26a91 100644 --- a/omaha_server/omaha/builder.py +++ b/omaha_server/omaha/builder.py @@ -31,8 +31,8 @@ from cacheops import cached_as from omaha import tasks from omaha.models import Version from omaha.parser import parse_request +from omaha import parser from omaha.statistics import is_user_active -from omaha.settings import DEFAULT_CHANNEL from omaha.core import (Response, App, Updatecheck_negative, Manifest, Updatecheck_positive, Packages, Package, Actions, Action, Event, Data) @@ -133,7 +133,7 @@ def on_app(apps_list, app, os, userid): app_id = app.get('appid') version = app.get('version') platform = os.get('platform') - channel = app.get('tag') or DEFAULT_CHANNEL + channel = parser.get_channel(app) ping = bool(app.findall('ping')) events = reduce(on_event, app.findall('event'), []) build_app = partial(App, app_id, status='ok', ping=ping, events=events) diff --git a/omaha_server/omaha/core.py b/omaha_server/omaha/core.py index d5a6870..f252501 100644 --- a/omaha_server/omaha/core.py +++ b/omaha_server/omaha/core.py @@ -24,7 +24,7 @@ from datetime import datetime from lxml.builder import E -from omaha.utils import get_sec_since_midnight +from omaha.utils import get_sec_since_midnight, get_days_since_20070101 __all__ = [ @@ -35,10 +35,12 @@ __all__ = [ def Response(apps_list, protocol='3.0', date=None, server='prod'): - elapsed_seconds = get_sec_since_midnight(date or datetime.utcnow()) + date = date or datetime.utcnow() + elapsed_seconds = get_sec_since_midnight(date) + elapsed_days = get_days_since_20070101(date) resp = E.response( dict(protocol=protocol, server=server), - E.daystart(elapsed_seconds=str(elapsed_seconds)), + E.daystart(elapsed_seconds=str(elapsed_seconds), elapsed_days=str(elapsed_days)), ) list(map(resp.append, apps_list)) return resp diff --git a/omaha_server/omaha/migrations/0027_auto_20160713_0755.py b/omaha_server/omaha/migrations/0027_auto_20160713_0755.py new file mode 100644 index 0000000..9cd07ca --- /dev/null +++ b/omaha_server/omaha/migrations/0027_auto_20160713_0755.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6 on 2016-07-07 07:20 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('omaha', '0026_grant_permission_django_site'), + ] + + operations = [ + migrations.RunSQL('DROP TABLE IF EXISTS httplog_entry;', reverse_sql=migrations.RunSQL.noop), + ] + diff --git a/omaha_server/omaha/migrations/0029_merge.py b/omaha_server/omaha/migrations/0029_merge.py new file mode 100644 index 0000000..27e815a --- /dev/null +++ b/omaha_server/omaha/migrations/0029_merge.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.6 on 2016-08-09 09:14 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('omaha', '0027_auto_20160713_0755'), + ('omaha', '0028_auto_20160707_0825'), + ] + + operations = [ + ] diff --git a/omaha_server/omaha/parser.py b/omaha_server/omaha/parser.py index f2a8436..625423b 100644 --- a/omaha_server/omaha/parser.py +++ b/omaha_server/omaha/parser.py @@ -21,7 +21,7 @@ the License. import os from lxml import etree, objectify - +from omaha.settings import DEFAULT_CHANNEL __all__ = ['parser', 'parse_request'] @@ -79,3 +79,7 @@ def parse_request(request): '{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}' """ return objectify.fromstring(request, parser) + + +def get_channel(app): + return app.get('tag') or app.get('ap') or DEFAULT_CHANNEL diff --git a/omaha_server/omaha/request.xsd b/omaha_server/omaha/request.xsd index e9cdeed..d4b9375 100644 --- a/omaha_server/omaha/request.xsd +++ b/omaha_server/omaha/request.xsd @@ -50,6 +50,9 @@ <xs:attribute name='testsource' type='xs:NCName' use="optional"/> <xs:attribute name='dedup' type='xs:NCName' use="optional"/> <xs:attribute name='updaterchannel' type='xs:NCName' use="optional"/> + <xs:attribute name='shell_version' type='xs:string' use="optional"/> + <xs:attribute name='periodoverridesec' type='xs:integer' use="optional"/> + <xs:attribute name='dlpref' type='xs:string' use="optional"/> </xs:complexType> </xs:element> <xs:element name="hw"> @@ -90,7 +93,12 @@ <xs:attribute name='experiments' use='optional' type="xs:string"/> <xs:attribute name='iid' use='optional' type="GuidType"/> <xs:attribute name='installage' use='optional' type='xs:integer'/> + <xs:attribute name='installdate' use='optional' type='xs:integer'/> <xs:attribute name='tag' use='optional' type='xs:string'/> + <xs:attribute name='cohort' use='optional' type='xs:string'/> + <xs:attribute name='cohorthint' use='optional' type='xs:string'/> + <xs:attribute name='cohortname' use='optional' type='xs:string'/> + <xs:anyAttribute namespace="##any" processContents="skip"/> </xs:complexType> </xs:element> <xs:element name='updatecheck'> @@ -108,6 +116,7 @@ <xs:attribute name="extracode1" use="optional" type="xs:integer"/> <xs:attribute name="download_time_ms" use="optional" type="xs:integer"/> <xs:attribute name="downloaded" use="optional" type="xs:integer"/> + <xs:attribute name="downloader" use="optional" type="xs:string"/> <xs:attribute name="total" use="optional" type="xs:integer"/> <xs:attribute name="update_check_time_ms" use="optional" type="xs:integer"/> <xs:attribute name="install_time_ms" use="optional" type="xs:integer"/> @@ -117,6 +126,8 @@ <xs:attribute name="time_since_download_start_ms" use="optional" type="xs:integer"/> <xs:attribute name="nextversion" use="optional" type="xs:integer"/> <xs:attribute name="previousversion" use="optional" type="xs:integer"/> + <xs:attribute name="url" use="optional" type="xs:string"/> + <xs:attribute name="is_bundled" use="optional" type="xs:integer"/> </xs:complexType> </xs:element> <xs:element name='ping'> @@ -124,6 +135,9 @@ <xs:attribute name='active' use='optional' type='xs:integer' default="0"/> <xs:attribute name='r' use='optional' type='xs:integer' default="0"/> <xs:attribute name='a' use='optional' type='xs:integer' default="0"/> + <xs:attribute name='rd' use='optional' type='xs:integer' default="-2"/> + <xs:attribute name='ad' use='optional' type='xs:integer' default="-2"/> + <xs:attribute name='ping_freshness' use='optional' type='xs:string' default="0"/> </xs:complexType> </xs:element> <xs:element name="data" type="DataType"/> diff --git a/omaha_server/omaha/response.xsd b/omaha_server/omaha/response.xsd index a81cbfe..72ece40 100644 --- a/omaha_server/omaha/response.xsd +++ b/omaha_server/omaha/response.xsd @@ -18,7 +18,7 @@ <xs:element name="daystart"> <xs:complexType> <xs:attribute name="elapsed_seconds" use="required" type="xs:positiveInteger"/> - <xs:attribute name="elapsed_days" use="optional" type="xs:nonPositiveInteger" default="0"/> + <xs:attribute name="elapsed_days" use="required" type="xs:positiveInteger"/> </xs:complexType> </xs:element> <xs:element name='app'> diff --git a/omaha_server/omaha/static/statistics/js/live_charts.js b/omaha_server/omaha/static/statistics/js/live_charts.js index 31263b4..18f6da5 100644 --- a/omaha_server/omaha/static/statistics/js/live_charts.js +++ b/omaha_server/omaha/static/statistics/js/live_charts.js @@ -28,20 +28,29 @@ function getVersions(data){ function getData(data){ - return getVersions(data).map(function(d){ + var result = getVersions(data).map(function(d){ return { key: d, values: data[d] } }); + + if (result.length) { + result.map(function(x){ + x.values.pop(); + }); + } + return result; } function getHours(data){ if (Object.keys(data).length) { - return data[Object.keys(data)[0]].map(function (d) { - return new Date(d[0]) + var res = data[Object.keys(data)[0]].map(function (d) { + return new Date(d[0]); }); + res.pop(); + return res; } else return []; } @@ -70,7 +79,10 @@ function makePlatformGraph(chartName, chartDataName, data, platform){ .y(function(d) { return d[1] }) .useInteractiveGuideline(true) .showControls(false); - + chart.interactiveLayer.tooltip.headerFormatter(function(d) { + var top_limit = moment(d, 'MMMM DD hh:mm a').add(1, 'h'); + return d + ' - ' + top_limit.format('hh:mm A'); + }); chart.xAxis.showMaxMin(false) .tickValues(hours.filter(function(d, i){ return !(i % tickSize); diff --git a/omaha_server/omaha/statistics.py b/omaha_server/omaha/statistics.py index cd20e4c..bb730de 100644 --- a/omaha_server/omaha/statistics.py +++ b/omaha_server/omaha/statistics.py @@ -30,7 +30,7 @@ from bitmapist import setup_redis, mark_event, unmark_event, WeekEvents, MonthEv import pytz from omaha.utils import get_id, is_new_install, valuedispatch, redis -from omaha.settings import DEFAULT_CHANNEL +from omaha import parser from omaha.models import ACTIVE_USERS_DICT_CHOICES, Request, AppRequest, Os, Hw, Event, Version, Channel from sparkle.models import SparkleVersion @@ -52,7 +52,7 @@ def add_app_statistics(userid, platform, app, now=None): now = timezone.now() appid = app.get('appid') version = app.get('version') - channel = app.get('tag') or DEFAULT_CHANNEL + channel = parser.get_channel(app) events = app.findall('event') err_events = filter(lambda x: x.get('eventresult') not in ['1', '2', '3'], events) if err_events: diff --git a/omaha_server/omaha/tests/fixtures.py b/omaha_server/omaha/tests/fixtures.py index 4be086e..4efdfe5 100644 --- a/omaha_server/omaha/tests/fixtures.py +++ b/omaha_server/omaha/tests/fixtures.py @@ -97,7 +97,7 @@ request_data = b"""<?xml version="1.0" encoding="UTF-8"?> response_update_check_negative = b"""<?xml version="1.0" encoding="UTF-8"?> <response protocol="3.0" server="prod"> - <daystart elapsed_seconds="56508"/> + <daystart elapsed_seconds="56508" elapsed_days="2557"/> <app appid="{430FD4D0-B729-4F61-AA34-91526481799D}" status="ok"> <updatecheck status="noupdate"/> <ping status="ok"/> @@ -110,7 +110,7 @@ response_update_check_negative = b"""<?xml version="1.0" encoding="UTF-8"?> response_update_check_positive = b"""<?xml version="1.0" encoding="UTF-8"?> <response protocol="3.0" server="prod"> - <daystart elapsed_seconds="56508"/> + <daystart elapsed_seconds="56508" elapsed_days="2557"/> <app appid="{430FD4D0-B729-4F61-AA34-91526481799D}" status="ok"> <updatecheck status="noupdate"/> <ping status="ok"/> @@ -136,7 +136,7 @@ response_update_check_positive = b"""<?xml version="1.0" encoding="UTF-8"?> response_event = b"""<?xml version="1.0" encoding="UTF-8"?> <response protocol="3.0" server="prod"> - <daystart elapsed_seconds="56754"/> + <daystart elapsed_seconds="56754" elapsed_days="2557"/> <app appid="{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}" status="ok"> <event status="ok"/> <event status="ok"/> @@ -146,7 +146,7 @@ response_event = b"""<?xml version="1.0" encoding="UTF-8"?> response_data_doc = b"""<?xml version="1.0" encoding="UTF-8"?> <response protocol="3.0" server="prod"> - <daystart elapsed_seconds="56754"/> + <daystart elapsed_seconds="56754" elapsed_days="2557"/> <app appid="{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}" status="ok"> <data index="verboselogging" name="install" status="ok"> app-specific values here @@ -157,7 +157,7 @@ response_data_doc = b"""<?xml version="1.0" encoding="UTF-8"?> response_data = b"""<?xml version="1.0" encoding="UTF-8"?> <response protocol="3.0" server="prod"> - <daystart elapsed_seconds="56754"/> + <daystart elapsed_seconds="56754" elapsed_days="2557"/> <app status="ok" appid="{430FD4D0-B729-4F61-AA34-91526481799D}"> <data status="ok" index="verboselogging" name="install">app-specific values here</data> <data status="ok" name="untrusted"/> diff --git a/omaha_server/omaha/utils.py b/omaha_server/omaha/utils.py index 5be380d..bb164cf 100644 --- a/omaha_server/omaha/utils.py +++ b/omaha_server/omaha/utils.py @@ -47,6 +47,19 @@ def get_sec_since_midnight(date): return delta.seconds +def get_days_since_20070101(date): + """ + Return days since 2007-01-01 + + >>> from datetime import datetime + >>> get_days_since_20070101(datetime(year=2016, month=3, day=4)) + 3350 + """ + date_20070101 = datetime.datetime(year=2007, month=1, day=1, tzinfo=date.tzinfo) + delta = date - date_20070101 + return delta.days + + def get_id(uuid): """ >>> get_id('{8C65E04C-0383-4AE2-893F-4EC7C58F70DC}') diff --git a/omaha_server/omaha_server/middlewares.py b/omaha_server/omaha_server/middlewares.py index 3cda3f2..d26e6f3 100644 --- a/omaha_server/omaha_server/middlewares.py +++ b/omaha_server/omaha_server/middlewares.py @@ -1,6 +1,19 @@ +import logging +from hashlib import sha256 + +from django.conf import settings +from django.http import HttpResponse from django.utils import timezone import pytz +from ecdsa import SigningKey +from ecdsa.util import sigencode_der + +logger = logging.getLogger(__name__) + + +class CUP2Exception(Exception): + pass class TimezoneMiddleware(object): @@ -9,4 +22,62 @@ class TimezoneMiddleware(object): if tzname: timezone.activate(pytz.timezone(tzname)) else: - timezone.deactivate()
\ No newline at end of file + timezone.deactivate() + + +class CUP2Middleware(object): + """Support CUP2 protocol of Omaha Client. + """ + + def __init__(self): + self.sk = {} + # Loading signature keys to memory + for keyid, private_key in settings.CUP_PEM_KEYS.iteritems(): + self.sk[keyid] = SigningKey.from_pem(open(private_key).read()) + + def process_request(self, request): + if getattr(settings, 'CUP_REQUEST_VALIDATION', False) and self.is_cup2_request(request): + try: + self.validate_cup2_request(request) + except Exception as e: + logger.error('%s: %s\nrequest:\n%s\n\n%s\n' % (e.__class__.__name__, e.message, + request.META, request.body)) + msg = b'<?xml version="1.0" encoding="utf-8"?><data><message>Bad Request</message></data>' + return HttpResponse(msg, status=400, content_type="text/html; charset=utf-8") + + def process_response(self, request, response): + if getattr(settings, 'CUP_REQUEST_VALIDATION', False) and self.is_cup2_request(request) and response.status_code // 100 == 2: + self.sign_cup2_response(request, response) + + return response + + @staticmethod + def is_cup2_request(request): + """Detects CUP2 request by passed cup2key parameter. + """ + return request.GET.get('cup2key') is not None + + def validate_cup2_request(self, request): + cup2key = request.GET.get('cup2key') + cup2hreq = request.GET.get('cup2hreq') + + keyid, k = cup2key.split(':') + if keyid not in self.sk.keys(): + raise CUP2Exception('There is no key with id %s' % keyid) + + request_hash = sha256(request.body).hexdigest() + if cup2hreq and request_hash != cup2hreq: + raise CUP2Exception('Bad request hash\n"%s" != "%s"' % (request_hash, cup2hreq)) + + def sign_cup2_response(self, request, response): + cup2key = request.GET.get('cup2key') + + request_hash = sha256(request.body).digest() + response_hash = sha256(response.content).digest() + + keyid, k = cup2key.split(':') + # hash( hash(request) | hash(response) | cup2key ) + message = sha256(request_hash + response_hash + cup2key.encode()).digest() + signature = self.sk[keyid].sign(message, hashfunc=sha256, sigencode=sigencode_der, k=int(k)) + + response['ETag'] = '%s:%s' % (signature.encode('hex'), request_hash.encode('hex')) diff --git a/omaha_server/omaha_server/settings.py b/omaha_server/omaha_server/settings.py index ed6d9f1..7209fd4 100644 --- a/omaha_server/omaha_server/settings.py +++ b/omaha_server/omaha_server/settings.py @@ -51,7 +51,7 @@ TEMPLATES = [ }, ] -APP_VERSION = "0.3.9" +APP_VERSION = "0.4.1" SUIT_CONFIG = { 'ADMIN_NAME': 'Omaha Server [{}]'.format(APP_VERSION), @@ -135,6 +135,7 @@ if IS_PRIVATE: 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'omaha_server.middlewares.TimezoneMiddleware', + 'omaha_server.middlewares.CUP2Middleware', ) + MIDDLEWARE_CLASSES ROOT_URLCONF = 'omaha_server.urls' @@ -308,3 +309,11 @@ REST_FRAMEWORK = { # django_select2 AUTO_RENDER_SELECT2_STATICS = False + +# Client Update Protocol + +CUP_REQUEST_VALIDATION = os.environ.get('CUP_REQUEST_VALIDATION', False) + +CUP_PEM_KEYS = { + # 'keyid': 'private_key_path', +} diff --git a/omaha_server/omaha_server/settings_dev.py b/omaha_server/omaha_server/settings_dev.py index c7df3de..99f652c 100644 --- a/omaha_server/omaha_server/settings_dev.py +++ b/omaha_server/omaha_server/settings_dev.py @@ -2,18 +2,3 @@ from .settings_prod import * - -INSTALLED_APPS += ( - 'httplog', -) - -MIDDLEWARE_CLASSES += ( - 'httplog.middleware.RequestResponseLoggingMiddleware', -) - -HTTPLOG_URLNAMES = ['update', 'sparkle_appcast', 'crash'] -HTTPLOG_APPS = ['omaha', 'crash', 'sparkle'] - -SUIT_CONFIG['MENU'] = SUIT_CONFIG['MENU'] + ( - {'app': 'httplog', 'label': 'httplog', 'icon': 'icon-search'}, -) diff --git a/omaha_server/omaha_server/settings_local.py b/omaha_server/omaha_server/settings_local.py index c65c9c6..9993558 100644 --- a/omaha_server/omaha_server/settings_local.py +++ b/omaha_server/omaha_server/settings_local.py @@ -16,16 +16,12 @@ SITE_ID = 1 INSTALLED_APPS += ( 'debug_toolbar', 'debug_panel', - 'httplog', ) MIDDLEWARE_CLASSES += ( 'debug_panel.middleware.DebugPanelMiddleware', - 'httplog.middleware.RequestResponseLoggingMiddleware', ) -HTTPLOG_URLNAMES = ['update', 'sparkle_appcast'] - # # Debug Toolbar # diff --git a/omaha_server/omaha_server/settings_prod.py b/omaha_server/omaha_server/settings_prod.py index a6b9ce6..1f2859e 100644 --- a/omaha_server/omaha_server/settings_prod.py +++ b/omaha_server/omaha_server/settings_prod.py @@ -39,7 +39,7 @@ SENTRY_STACKTRACE_API_KEY = os.environ.get('SENTRY_STACKTRACE_API_KEY') if RAVEN_DSN_STACKTRACE: f = furl(RAVEN_DSN_STACKTRACE) - SENTRY_STACKTRACE_DOMAIN = f.host + SENTRY_STACKTRACE_DOMAIN = f.netloc project_id = f.path.segments[0] if SENTRY_STACKTRACE_API_KEY: SENTRY_STACKTRACE_ORG_SLUG = get_sentry_organization_slug(SENTRY_STACKTRACE_DOMAIN, SENTRY_STACKTRACE_API_KEY) diff --git a/pavement.py b/pavement.py index 5b459c2..e63f951 100644 --- a/pavement.py +++ b/pavement.py @@ -82,8 +82,6 @@ def loaddata(): @task def migrate(): - sh('./manage.py migrate sites --noinput', cwd='omaha_server') - sh('./manage.py migrate auth --noinput', cwd='omaha_server') sh('./manage.py migrate --noinput', cwd='omaha_server') diff --git a/requirements/base.txt b/requirements/base.txt index a99974c..3f02a54 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -31,7 +31,4 @@ django-bootstrap3==7.0.1 protobuf==3.0.0a3 protobuf-to-dict==0.1.0 django-dynamic-preferences==0.8.1 - -# Only dev -#django-httplog==0.2.3 -https://github.com/Crystalnix/django-httplog/archive/6ed2a8a4e3d606443492998cbac93a71f4cee7d1.zip +ecdsa==0.13 |