pandora/update.py

287 lines
12 KiB
Python
Raw Normal View History

#!/usr/bin/python
2016-02-18 10:49:26 +00:00
from __future__ import print_function
import os
2013-03-02 05:27:52 +00:00
base = os.path.normpath(os.path.abspath(os.path.dirname(__file__)))
os.chdir(base)
2013-03-02 05:27:52 +00:00
#using virtualenv's activate_this.py to reorder sys.path
activate_this = os.path.join(base, 'bin', 'activate_this.py')
2013-03-02 05:27:52 +00:00
if os.path.exists(activate_this):
execfile(activate_this, dict(__file__=activate_this))
import sys
2015-11-14 14:22:40 +00:00
import shutil
import subprocess
import urllib2
import json
from os.path import join, exists
def run(*cmd):
p = subprocess.Popen(cmd)
p.wait()
return p.returncode
def get(*cmd):
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, error = p.communicate()
return stdout
def get_json(url):
return json.loads(urllib2.urlopen(url).read())
def get_release():
2015-11-14 14:22:40 +00:00
if os.path.exists('.release'):
url = open('.release').read().strip()
else:
url = 'https://pan.do/json/release-stable.json'
try:
2015-11-14 14:22:40 +00:00
return get_json(url)
except:
2016-02-18 10:49:26 +00:00
print("Failed to load %s check your internet connection." % url)
sys.exit(1)
repos = {
"pandora": {
2015-11-14 14:22:40 +00:00
"url": "https://git.0x2620.org/pandora.git",
"path": ".",
},
"oxjs": {
2015-11-14 14:22:40 +00:00
"url": "https://git.0x2620.org/oxjs.git",
"path": "./static/oxjs",
},
"oxtimelines": {
2015-11-14 14:22:40 +00:00
"url": "https://git.0x2620.org/oxtimelines.git",
"path": "./src/oxtimelines",
},
"python-ox": {
2015-11-14 14:22:40 +00:00
"url": "https://git.0x2620.org/python-ox.git",
"path": "./src/python-ox",
}
}
def reload_notice(base):
2016-02-18 10:49:26 +00:00
print('\nPlease restart pan.do/ra to finish the update:\n\tsudo %s/ctl reload\n' % base)
2015-04-30 13:01:27 +00:00
def check_services(base):
services = "pandora pandora-tasks pandora-encoding pandora-cron pandora-websocketd".split()
for service in services:
2015-04-30 13:07:24 +00:00
cmd = ['service', service, 'status']
2015-11-16 13:21:43 +00:00
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.wait()
if p.returncode != 0:
2016-02-18 10:49:26 +00:00
print('Please install init script for "%s" service:' % service)
2016-03-08 07:48:35 +00:00
if os.path.exists('/etc/init') and not os.path.exists('/bin/systemctl'):
2016-02-18 10:49:26 +00:00
print('\tsudo cp %s/etc/init/%s.conf /etc/init/' % (base, service))
if os.path.exists('/bin/systemctl'):
print('\tsudo cp %s/etc/systemd/system/%s.service /etc/systemd/system/' % (base, service))
print('\tsudo systemctl daemon-reload')
2016-02-18 10:49:26 +00:00
print('\tsudo service %s start' % service)
print('')
2015-04-30 13:01:27 +00:00
def update_service(service):
print('Please install new init script for "%s" service:' % service)
if os.path.exists('/etc/init/%s.conf'%service):
print('\tsudo cp %s/etc/init/%s.conf /etc/init/' % (base, service))
if os.path.exists('/bin/systemctl'):
print('\tsudo cp %s/etc/systemd/system/%s.service /etc/systemd/system/' % (base, service))
print('\tsudo systemctl daemon-reload')
print('\tsudo service %s restart' % service)
2015-11-14 14:22:40 +00:00
def run_git(path, *args):
cmd = ['git'] + list(args)
env = {'GIT_DIR': '%s/.git' % path}
return subprocess.check_output(cmd, env=env).strip()
def get_version(path):
return run_git(path, 'rev-list', 'HEAD', '--count')
if __name__ == "__main__":
2013-04-30 17:17:48 +00:00
if len(sys.argv) == 2 and sys.argv[1] in ('database', 'db'):
os.chdir(join(base, 'pandora'))
2016-02-19 18:20:18 +00:00
print('\nRunning "./manage.py migrate"\n')
run('./manage.py', 'migrate', '--noinput')
run('./manage.py', 'sqlfindindex')
run('./manage.py', 'sync_itemsort')
reload_notice(base)
2013-05-29 12:41:13 +00:00
elif len(sys.argv) == 2 and sys.argv[1] == 'static':
os.chdir(join(base, 'pandora'))
run('./manage.py', 'update_static')
2013-05-30 11:17:48 +00:00
elif len(sys.argv) == 4 and sys.argv[1] == 'postupdate':
os.chdir(base)
2015-11-14 15:16:58 +00:00
old = sys.argv[2].strip()
new = sys.argv[3].strip()
2015-11-14 14:22:40 +00:00
if old.isdigit():
old = int(old)
if new.isdigit():
new = int(new)
2016-02-18 10:49:26 +00:00
print('Post Update from %s to %s' % (old, new))
2013-05-30 11:17:48 +00:00
if old < 3111:
2013-05-30 11:18:48 +00:00
run('bzr', 'resolved', 'pandora/monkey_patch', 'pandora/monkey_patch/migrations')
2013-05-30 11:17:48 +00:00
if os.path.exists('pandora/monkey_patch'):
run('rm', '-r', 'pandora/monkey_patch')
if old < 3448:
if os.path.exists('static/pandora'):
run('bzr', 'resolved', 'static/pandora')
2013-09-19 12:01:40 +00:00
if old < 3651:
if os.path.exists('src/django/.git'):
os.chdir(os.path.join(base, 'src/django'))
run('git', 'checkout', 'stable/1.4.x')
run('git', 'pull')
os.chdir(base)
if old < 3666:
run('./bin/pip', 'install', '-r', 'requirements.txt')
if old < 3770:
run('./bin/pip', 'install', '-r', 'requirements.txt')
if old < 4379:
run('./bin/pip', 'install', '-r', 'requirements.txt')
2014-11-26 20:03:27 +00:00
if old < 4549:
import pandora.settings
with open('pandora/local_settings.py', 'r') as f:
local_settings = f.read()
if not 'BROKER_URL' in local_settings:
broker_url = 'amqp://%s:%s@%s:%s/%s' % (
getattr(pandora.settings, 'BROKER_USER', 'pandora'),
getattr(pandora.settings, 'BROKER_PASSWORD', 'box'),
getattr(pandora.settings, 'BROKER_HOST', '127.0.0.1'),
getattr(pandora.settings, 'BROKER_PORT', 5672),
getattr(pandora.settings, 'BROKER_VHOST', '/pandora'),
)
local_settings = [
l for l in local_settings.split('\n') if not l.startswith('BROKER_')
] + [
'BROKER_URL = "%s"' % broker_url, ''
]
with open('pandora/local_settings.py', 'w') as f:
f.write('\n'.join(local_settings))
if old < 4947:
run('./bin/pip', 'install', 'tornado==4.1')
2015-04-30 13:01:27 +00:00
check_services(base)
2015-11-14 14:22:40 +00:00
if old < 5074:
for component in ('oxtimelines', 'python-ox'):
if not os.path.exists('./src/%s/.git' % component):
run('./bin/pip', 'install', '-e',
'git+https://git.0x2620.org/%s.git#egg=%s' % (component, component),
'--exists-action', 'w')
if not os.path.exists('./static/oxjs/.git'):
if os.path.exists('static/oxjs'):
shutil.move('static/oxjs', 'static/oxjs_bzr')
2016-02-12 08:32:24 +00:00
run('git', 'clone', '--depth', '1', 'https://git.0x2620.org/oxjs.git', 'static/oxjs')
2015-11-14 14:22:40 +00:00
run('./pandora/manage.py', 'update_static')
if os.path.exists('static/oxjs_bzr'):
shutil.rmtree('static/oxjs_bzr')
if os.path.exists('REPOSITORY_MOVED_TO_GIT'):
os.unlink('REPOSITORY_MOVED_TO_GIT')
if os.path.exists('.bzr'):
shutil.rmtree('.bzr')
run('git', 'checkout', 'update.py')
if old <= 5389:
2016-02-20 12:36:05 +00:00
for path in (
'lib/python2.7/site-packages/Django.egg-link',
2016-03-03 08:19:22 +00:00
'lib/python2.7/site-packages/django-extensions.egg-link',
'lib/python2.7/site-packages/django-devserver.egg-link'
2016-02-20 12:36:05 +00:00
):
if os.path.exists(path):
os.unlink(path)
2016-03-03 08:19:22 +00:00
for path in (
'src/django',
'src/django-devserver',
'src/django-extensions',
):
if os.path.exists(path):
shutil.rmtree(path)
if os.path.exists('contrib'):
shutil.rmtree('contrib')
run('./bin/pip', 'install', '-r', 'requirements.txt')
run('./pandora/manage.py', 'migrate', '--fake-initial', '--noinput')
update_service('pandora')
2016-03-04 07:20:44 +00:00
if old <= 5432:
import pandora.settings
run('./bin/pip', 'install', '-r', 'requirements.txt')
path = os.path.join(pandora.settings.GEOIP_PATH, 'GeoLite2-City.mmdb')
if not os.path.exists(path):
run('./pandora/manage.py', 'update_geoip')
if old <= 5443:
gunicorn_config = 'pandora/gunicorn_config.py'
if not os.path.exists(gunicorn_config):
shutil.copy('%s.in'%gunicorn_config, gunicorn_config)
if os.path.exists('/etc/init/pandora.conf'):
with open('/etc/init/pandora.conf') as fd:
data = fd.read()
if '0.0.0.0:2620' in data:
run('sed', '-i', 's/127.0.0.1:2620/0.0.0.0:2620/g', gunicorn_config)
if old > 5389:
update_service('pandora')
2016-03-17 09:47:08 +00:00
if old <= 5452:
run('./bin/pip', 'install', '-r', 'requirements.txt')
update_service('pandora-encoding')
update_service('pandora-tasks')
2016-10-04 22:00:03 +00:00
if old <= 5673:
run('./pandora/manage.py', 'rebuild_documentfind')
else:
if len(sys.argv) == 1:
release = get_release()
2013-04-18 13:32:28 +00:00
repos = release['repositories']
development = False
2012-11-14 17:52:26 +00:00
else:
release = {
'date': 'development'
}
development = True
os.chdir(base)
current = ''
new = ''
2017-02-16 13:38:29 +00:00
if development:
if get('git', 'symbolic-ref', 'HEAD').split('/')[-1] != 'master':
print('update only possible if you are on master branch')
sys.exit(1)
2013-07-03 21:14:11 +00:00
for repo in sorted(repos, key=lambda r: repos[r]['path']):
path = os.path.join(base, repos[repo]['path'])
if exists(path):
os.chdir(path)
2015-11-14 14:22:40 +00:00
revno = get_version(path)
2013-05-30 11:17:48 +00:00
if repo == 'pandora':
pandora_old_revno = revno
current += revno
url = repos[repo]['url']
if 'revision' in repos[repo]:
2015-11-14 14:22:40 +00:00
if revno != repos[repo]['revision']:
run('git', 'fetch')
run('git', 'checkout', repos[repo]['commit'])
else:
2016-02-18 10:49:26 +00:00
print('Checking', repo)
2016-02-20 06:46:53 +00:00
#run('git', 'checkout', 'master', '-q')
2015-11-14 14:22:40 +00:00
run('git', 'pull')
revno = get_version(path)
new += revno
2013-05-30 11:17:48 +00:00
if repo == 'pandora':
pandora_new_revno = revno
else:
os.chdir(os.path.dirname(path))
2015-11-14 14:22:40 +00:00
if 'revision' in repos[repo]:
run('git', 'clone', repos[repo]['url'])
2015-11-14 14:22:40 +00:00
run_git(path, 'checkout', repos[repo]['commit'])
else:
run('git', 'clone', '--depth', '1', repos[repo]['url'])
setup = os.path.join(base, repos[repo]['path'], 'setup.py')
if repo in ('python-ox', 'oxtimelines') and os.path.exists(setup):
os.chdir(os.path.dirname(setup))
run(os.path.join(base, 'bin', 'python'), 'setup.py', 'develop')
new += '+'
os.chdir(join(base, 'pandora'))
2013-10-22 20:03:42 +00:00
if pandora_old_revno != pandora_new_revno:
os.chdir(base)
run('./update.py', 'postupdate', pandora_old_revno, pandora_new_revno)
2013-10-28 11:11:58 +00:00
os.chdir(join(base, 'pandora'))
2016-02-20 12:26:14 +00:00
if current != new:
run('./manage.py', 'update_static')
2016-03-03 09:34:54 +00:00
run('./manage.py', 'compile_pyc', '-p', '.')
2016-02-20 12:26:14 +00:00
os.chdir(join(base, 'pandora'))
diff = get('./manage.py', 'sqldiff', '-a').strip()
if diff != '-- No differences':
2016-02-18 10:49:26 +00:00
print('Database has changed, please make a backup and run %s db' % sys.argv[0])
2014-10-12 15:10:33 +00:00
elif not development:
2016-02-18 10:49:26 +00:00
print('pan.do/ra is at the latest release,\nyou can run "%s dev" to update to the development version' % sys.argv[0])
2013-10-22 20:03:42 +00:00
elif current != new:
reload_notice(base)