X-Git-Url: https://git.openstreetmap.org./osqa.git/blobdiff_plain/a529bba0262296c3057ada4f364616509f96af65..bd8ed9ee60f805f234d83d5b02fd9613a5b52b7b:/forum_modules/updater/base.py?ds=sidebyside diff --git a/forum_modules/updater/base.py b/forum_modules/updater/base.py index 7635b60..3ccf97d 100644 --- a/forum_modules/updater/base.py +++ b/forum_modules/updater/base.py @@ -1,11 +1,27 @@ +import os +import sys +import bz2 +import urllib2, urllib +import binascii import string import random import re - import urllib2 +import settings +import datetime +import logging + +from xml.dom.minidom import parse, parseString from forum.models import Question, User -from forum.settings import APP_URL +from forum.settings import APP_URL, SVN_REVISION, APP_TITLE, APP_DESCRIPTION +from django import VERSION as DJANGO_VERSION +from django.utils import simplejson +from django.utils.html import escape +from django.utils.encoding import smart_unicode +from django.conf import settings as django_settings +from django.utils.translation import ugettext as _ + def generate_installation_key(): gen = lambda length: "".join( [random.choice(string.digits+string.letters) for i in xrange(length)]) @@ -21,6 +37,18 @@ def get_site_views(): return views +# Gets the active users count since the last visit +def get_active_users(): + users_count = 0 + + try: + if settings.LATEST_UPDATE_DATETIME: + users_count = User.objects.filter(last_login__gt=settings.LATEST_UPDATE_DATETIME).count() + except: + pass + + return users_count + def get_server_name(): url = '%s/' % APP_URL @@ -45,4 +73,99 @@ def get_admin_emails(): for user in User.objects.filter(is_superuser=True): emails.append(user.email) - return emails \ No newline at end of file + return emails + +def check_for_updates(): + # Get the SVN Revision + try: + svn_revision = int(SVN_REVISION.replace('SVN-', '')) + except ValueError: + # Here we'll have to find another way of getting the SVN revision + svn_revision = 0 + + admin_emails_xml = '' + for email in get_admin_emails(): + admin_emails_xml += '' % email + admin_emails_xml += '' + + statistics = """ + + + + + + + + + + + + + %(emails)s + """ % { + 'site_key' : settings.SITE_KEY, + 'app_url' : APP_URL, + 'app_title' : escape(APP_TITLE.value), + 'app_description' : escape(APP_DESCRIPTION.value), + 'svn_revision' : svn_revision, + 'site_views' : get_site_views(), + 'server_name' : get_server_name(), + 'active_users' : get_active_users(), + 'python_version' : ''.join(sys.version.splitlines()), + 'django_version' : str(DJANGO_VERSION), + 'database' : django_settings.DATABASE_ENGINE, + 'os' : str(os.uname()), + 'emails' : admin_emails_xml, + } + + # Compress the statistics XML dump + statistics_compressed = bz2.compress(statistics) + + # Pass the compressed statistics to the update server + post_data = { + 'statistics' : binascii.b2a_base64(statistics_compressed), + } + data = urllib.urlencode(post_data) + + # We simulate some browser, otherwise the server can return 403 response + user_agent = 'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-us) AppleWebKit/531.21.8 (KHTML, like Gecko) Version/4.0.4 Safari/5' + headers={ 'User-Agent' : user_agent,} + + try: + check_request = urllib2.Request('%s%s' % (settings.UPDATE_SERVER_URL, '/site_check/'), data, headers=headers) + check_response = urllib2.urlopen(check_request) + content = check_response.read() + except urllib2.HTTPError, error: + content = error.read() + except: + return _("Wasn't able to check to the update server.") + + # Read the messages from the Update Server + try: + messages_xml_url = '%s%s' % (settings.UPDATE_SERVER_URL, '/messages/xml/') + messages_request = urllib2.Request(messages_xml_url, headers=headers) + messages_response = urllib2.urlopen(messages_request) + messages_xml = messages_response.read() + except: + return _("Wasn't able to retreive the update messages.") + + # Store the messages XML in a Setting object + settings.UPDATE_MESSAGES_XML.set_value(messages_xml) + + messages_dom = parseString(messages_xml) + messages_count = len(messages_dom.getElementsByTagName('message')) + + # Set the latest update datetime to now. + now = datetime.datetime.now() + settings.LATEST_UPDATE_DATETIME.set_value(now) + + return _('%d update messages have been downloaded.') % messages_count + +def update_trigger(): + # Trigger the update process + now = datetime.datetime.now() + if (now - settings.LATEST_UPDATE_DATETIME) > datetime.timedelta(days=1): + update_status = check_for_updates() + + logging.error(smart_unicode("Update process has been triggered: %s" % update_status)) + settings.LATEST_UPDATE_DATETIME.set_value(now)