From 0ba3a12c24dbba256154a02d252c5a128dd480ba Mon Sep 17 00:00:00 2001 From: Andrew Date: Mon, 4 Nov 2013 22:55:07 +0000 Subject: [PATCH] Add basic app layout and Server/Channel basic endpoints. --- config.py | 11 ++++++ grumble/__init__.py | 15 +++++++++ grumble/api_v1.py | 81 +++++++++++++++++++++++++++++++++++++++++++++ run.py | 3 ++ 4 files changed, 110 insertions(+) create mode 100644 config.py create mode 100644 grumble/__init__.py create mode 100644 grumble/api_v1.py create mode 100644 run.py diff --git a/config.py b/config.py new file mode 100644 index 0000000..29a7000 --- /dev/null +++ b/config.py @@ -0,0 +1,11 @@ +import os +_basedir = os.path.abspath(os.path.dirname(__file__)) + +DEBUG = False + +ADMINS = frozenset(['youremail@yourdomain.com']) +SECRET_KEY = 'SecretKeyForSessionSigning' + +THREADS_PER_PAGE = 8 + +ICE_SECRET = 'test' \ No newline at end of file diff --git a/grumble/__init__.py b/grumble/__init__.py new file mode 100644 index 0000000..c5ef5b2 --- /dev/null +++ b/grumble/__init__.py @@ -0,0 +1,15 @@ +from flask import Flask +from flask.ext import restful + +from api_v1 import Server, ServerList, Channel, ChannelList + +app = Flask(__name__) +app.config.from_object('config') + +api_v1 = restful.Api(app) + +# Servers +api_v1.add_resource(ServerList, '/v1/servers/') +api_v1.add_resource(Server, '/v1/servers//') +api_v1.add_resource(ChannelList, '/v1/servers//channels/') +api_v1.add_resource(Channel, '/v1/servers//channels//') diff --git a/grumble/api_v1.py b/grumble/api_v1.py new file mode 100644 index 0000000..7beedf5 --- /dev/null +++ b/grumble/api_v1.py @@ -0,0 +1,81 @@ +from flask import current_app +from flask.ext import restful +from mumble.meta import Meta + + +class MumbleResource(restful.Resource): + + def _get_meta(self): + print current_app.config['ICE_SECRET'] + return Meta(current_app.config['ICE_SECRET']) + + def _get_server(self, server_id): + return self._get_meta().get_server(server_id) + + +class ServerList(MumbleResource): + def get(self): + servers = self._get_meta().get_all_servers() + return [{'id': srv.id, 'name': srv.get_all_conf()['registername'], 'port': srv.get_all_conf()['port'], 'running': srv.running} for srv in servers] + + def post(self): + new_port = max([int(x.get_all_conf()['port']) for x in self._get_meta().get_all_servers()]) + 1 + srv = self._get_meta().new_server() + srv.set_conf('port', str(new_port)) + return {'id': srv.id}, 201 + + +class Server(MumbleResource): + def get(self, server_id): + server = self._get_server(server_id) + if server is None: + return '', 404 + cfg = server.get_all_conf() + for k in ['certificate', 'key']: + cfg.pop(k) + return cfg + + def delete(self, server_id): + if self._get_server(server_id).delete(): + return '', 204 + return '', 500 + + def start(self, server_id): + if self._get_server(server_id).start(): + return '', 204 + return '', 500 + + def stop(self, server_id): + if self._get_server(server_id).stop(): + return '', 204 + return '', 500 + + +class Channel(MumbleResource): + + def get(self, server_id, channel_id): + server = self._get_server(server_id) + if server is None: + return '', 404 + channel = server.get_channel(channel_id) + if channel is None: + return '', 404 + return channel.serialize(), 200 + + +class ChannelList(MumbleResource): + + def get(self, server_id): + server = self._get_server(server_id) + if server is None: + return '', 404 + channels = [] + for channel in server.get_channels(): + raw = channel.serialize() + channels.append({ + 'id': raw['id'], + 'name': raw['name'], + 'parent': raw['parent'], + 'position': raw['position'], + }) + return channels \ No newline at end of file diff --git a/run.py b/run.py new file mode 100644 index 0000000..93dfd6c --- /dev/null +++ b/run.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python +from grumble import app +app.run(debug=True, host='0.0.0.0') \ No newline at end of file