Skip to content

Commit

Permalink
added push command
Browse files Browse the repository at this point in the history
  • Loading branch information
programmerbird committed Sep 21, 2010
1 parent fbeff74 commit 7df7f81
Show file tree
Hide file tree
Showing 15 changed files with 109 additions and 12 deletions.
5 changes: 4 additions & 1 deletion requirements.ini
@@ -1,2 +1,5 @@
Django==1.2.3
Fabric==0.9.2
paramiko==1.7.6
pycrypto==2.0.1
wsgiref==0.1.2

1 change: 1 addition & 0 deletions rockets/__init__.py
Expand Up @@ -9,6 +9,7 @@
from rocket import services as services
from rocket import models as models
from rocket import loaders as loaders
from rocket import conf as conf

def get_path():
import os
Expand Down
4 changes: 4 additions & 0 deletions rockets/bin/rocket2
Expand Up @@ -3,6 +3,10 @@
ROCKETDIR=$(pwd)
REQUIREMENTS="""
Django==1.2.3
Fabric==0.9.2
paramiko==1.7.6
pycrypto==2.0.1
wsgiref==0.1.2
-e git+http://github.com/ssimasanti/rockets.git#egg=Rockets
"""

Expand Down
7 changes: 7 additions & 0 deletions rockets/hostings/services.py
@@ -1,6 +1,7 @@
#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os
from rockets import services
from django import forms

Expand All @@ -16,7 +17,13 @@ def preset(self):

class UwsgiService(services.Service):
name = forms.CharField()
processes = forms.IntegerField(initial=4)
django_settings = forms.CharField(initial='settings_production')

def init(self, *args, **kwargs):
super(UwsgiService, self).init(*args, **kwargs)
self.values['secret'] = os.urandom(5).encode('hex')

def template(self):
return 'uwsgi'

Expand Down
@@ -0,0 +1,5 @@
cd /home/{{name}}/{{name}}.git
git config core.worktree /home/{{name}}/uwsgi/app{{secret}}

chmod +x /home/{{name}}/{{name}}.git/hooks/post-update

Expand Up @@ -16,7 +16,7 @@ DESC={{name}}
DAEMON=/etc/uwsgi/uwsgi26
PIDFILE=/var/run/uwsgi-{{name}}.pid
SOCKFILE=/tmp/uwsgi-{{name}}.sock
DAEMON_OPTS="--processes {{options.process}} --harakiri {{options.harakiri}} {{options.additional}} --disable-logging --master \
DAEMON_OPTS="--processes {{processes}} --harakiri 30 --disable-logging --master \
--pidfile /var/run/uwsgi-{{name}}.pid \
--daemonize /dev/null \
--socket /tmp/uwsgi-{{name}}.sock \
Expand All @@ -28,11 +28,11 @@ set -e
. /lib/lsb/init-functions

RUNUSER=$(id -nu)
if [ "$RUNUSER" = "{{user}}" ]
if [ "$RUNUSER" = "{{name}}" ]
then
SUDO=
else
SUDO="sudo -u {{user}}"
SUDO="sudo -u {{name}}"
fi

touch $PIDFILE
Expand Down
@@ -1,3 +1,7 @@
#!/usr/bin/env python
#-*- coding:utf-8 -*-


import os,sys

sys.path.append('/home/{{name}}/uwsgi/app{{secret}}/')
Expand Down
2 changes: 1 addition & 1 deletion rockets/rocket/fixtures/initial_data.json
@@ -1 +1 @@
[{"pk": "node", "model": "rocket.session", "fields": {"value": "localhost"}}, {"pk": 1, "model": "rocket.node", "fields": {"username": "root", "name": "localhost", "storage": "{}", "public_ip": "[\"127.0.0.1\"]", "private_ip": "[\"127.0.0.1\"]", "provider": null, "services": "[]", "os": "ubuntu"}}]
[{"pk": "node", "model": "rocket.session", "fields": {"value": "localhost"}}, {"pk": 1, "model": "rocket.node", "fields": {"username": "root", "name": "localhost", "storage": "{}", "port": 22, "public_ip": "[\"127.0.0.1\"]", "private_ip": "[\"127.0.0.1\"]", "provider": null, "services": "[]", "os": "ubuntu"}}]
4 changes: 3 additions & 1 deletion rockets/rocket/management/commands/add.py
Expand Up @@ -26,5 +26,7 @@ def handle(self, *args, **kwargs):
n.init(*app_args)
n.add(*app_args)
except KeyboardInterrupt:
self.stdout.write("\nSee ya :)\n")
self.stdout.write("\nGoodbye :)\n")
except Exception, e:
raise CommandError(unicode(e))

5 changes: 3 additions & 2 deletions rockets/rocket/management/commands/edit.py
Expand Up @@ -7,14 +7,13 @@
from rockets import loaders



class Command(BaseCommand):
def handle(self, *args, **kwargs):
if not args:
services = loaders.list_services()
services.sort()
for service in services:
self.stdout.write(service)
self.stdout.write("%s\n" % service)
else:
app_name = args[0]
app_args = args[1:]
Expand All @@ -26,6 +25,8 @@ def handle(self, *args, **kwargs):
n.node = models.Node.current()
n.load(*app_args)
n.edit(*app_args)
except KeyboardInterrupt:
self.stdout.write("\nGoodbye :)\n")
except Exception, e:
raise CommandError(unicode(e))

50 changes: 50 additions & 0 deletions rockets/rocket/management/commands/push.py
@@ -0,0 +1,50 @@
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import os
import json

from fabric.api import put, run, local, cd, settings, env, hide, show
from django.core.management.base import NoArgsCommand, BaseCommand, CommandError
from rockets import models
from rockets import loaders
from rockets import conf

class Command(BaseCommand):
def handle(self, *args, **kwargs):
node = models.Node.current()

public_ip = json.loads(node.public_ip or "[]")[0]
env.hosts = [public_ip]
env.user = user = node.username
env.port = port = node.port
env.bundle = bundle = models.Session.bundle()
env.secret = secret = os.urandom(5).encode('hex')
env.secret2 = secret2 = os.urandom(5).encode('hex')
env.host_string = '%(user)s@%(public_ip)s:%(port)s' % locals()

dump_path = os.path.join(conf.SERVER_DUMP_PATH, node.name)
script_path = os.path.join(conf.SERVER_DUMP_PATH, node.name, 'SCRIPTS')
bundle_path = '/tmp/rocket-%(bundle)s' % env
bundle_script_path = os.path.join(bundle_path, 'SCRIPTS')

scripts = [ x for x in os.listdir(script_path) if not x.endswith('~') ]
scripts.sort()
try:
with cd(dump_path):
local('tar czf /tmp/rocket-%(secret)s.tar.gz *' % locals(), capture=False)
put('/tmp/rocket-%(secret)s.tar.gz' % env, '/tmp/rocket-%(secret2)s.tar.gz' % env)
run('mkdir -p /tmp/rocket-%(bundle)s' % env, pty=True)
run('tar xzf /tmp/rocket-%(secret2)s.tar.gz --no-overwrite-dir --directory=/tmp/rocket-%(bundle)s' % env, pty=True)

if scripts:
run('chmod +x %(bundle_path)s/SCRIPTS/*' % locals())
for script in scripts:
run('%(bundle_path)s/SCRIPTS/%(script)s' % locals(), pty=True)
os.remove(os.path.join('SCRIPTS', script))
finally:
with hide('running', 'stdout', 'stderr'):
run('rm -rf /tmp/rocket-%(secret2)s.tar.gz' % locals())
run('rm -rf /tmp/rocket-%(bundle)s' % locals())
local('rm -rf /tmp/rocket-%(secret)s*' % locals())


5 changes: 3 additions & 2 deletions rockets/rocket/management/commands/remove.py
Expand Up @@ -7,14 +7,13 @@
from rockets import loaders



class Command(BaseCommand):
def handle(self, *args, **kwargs):
if not args:
services = loaders.list_services()
services.sort()
for service in services:
self.stdout.write(service)
self.stdout.write("%s\n" % service)
else:
app_name = args[0]
app_args = args[1:]
Expand All @@ -26,6 +25,8 @@ def handle(self, *args, **kwargs):
n.node = models.Node.current()
n.load(*app_args)
n.remove(*app_args)
except KeyboardInterrupt:
self.stdout.write("\nGoodbye :)\n")
except Exception, e:
raise CommandError(unicode(e))

13 changes: 12 additions & 1 deletion rockets/rocket/models.py
Expand Up @@ -69,6 +69,8 @@ class Node (models.Model):
provider = models.CharField(max_length=200, null=True, blank=True)
os = models.CharField(max_length=200, null=True, blank=True, default='ubuntu')
username = models.CharField(max_length=200, blank=True, default='root')
port = models.IntegerField(default=22)

services = models.TextField(blank=True, default='[]')
storage = models.TextField(blank=True, default='{}')

Expand Down Expand Up @@ -115,9 +117,18 @@ def get_service_storage(self, service, name):
if name not in services_storage:
service_storage = services_storage[name] = {}
else:
service_storage = services_storage[name] = {}
service_storage = services_storage[name]
return service_storage


def set_service_storage(self, service, name, values):
services_storage = self.get_services_storage(service)
if name not in services_storage:
service_storage = services_storage[name] = {}
else:
service_storage = services_storage[name]
services_storage[name] = values


def _manage_json_fields(self):
if hasattr(self, '_storage'):
Expand Down
10 changes: 9 additions & 1 deletion rockets/rocket/services.py
Expand Up @@ -12,7 +12,10 @@


SERVER_DUMP_PATH = getattr(settings, 'SERVER_DUMP_PATH', '/tmp')

class DuplicateServiceNameException(Exception):
def __unicode__(self):
return "Duplicate service name already existed"

class BaseService(forms.Form):

def __init__(self, *args, **kwargs):
Expand Down Expand Up @@ -42,6 +45,9 @@ def load(self, name, *args, **kwargs):
def init(self, name, *args, **kwargs):
self.name = name
self.values = self.node.get_service_storage(self.get_name(), name)
if self.values:
raise DuplicateServiceNameException

self.values['name'] = name

def edit(self, *args, **kwargs):
Expand Down Expand Up @@ -81,6 +87,7 @@ def confirm_save(self, *args, **kwargs):
if result in 'Yy':
break
self.console.edit_form(self)
self.node.set_service_storage(kind, name, self.values)
self.save()
self.console.write('%s saved.\n' % kind.title())

Expand Down Expand Up @@ -267,6 +274,7 @@ def load(self, name, *args, **kwargs):
def install(self):
for field in self:
setattr(self.node, field.name, self.values[field.name])
self.node.save()

def uninstall(self):
self.node.delete()
Expand Down

0 comments on commit 7df7f81

Please sign in to comment.