From 98c174de562514c8d07f4e0d6bd478e1c4c25086 Mon Sep 17 00:00:00 2001 From: Anna Date: Thu, 31 Aug 2017 00:52:20 +0300 Subject: [PATCH] initial --- rbmd/__init__.py | 0 rbmd/conf.json | 7 ++ rbmd/settings.py | 125 ++++++++++++++++++++++++++++ rbmd/static/images-logo.png | Bin 0 -> 26554 bytes rbmd/static/script.js | 147 +++++++++++++++++++++++++++++++++ rbmd/templates/rbmd/index.html | 115 ++++++++++++++++++++++++++ rbmd/urls.py | 24 ++++++ rbmd/views.py | 34 ++++++++ rbmd/wsgi.py | 16 ++++ 9 files changed, 468 insertions(+) create mode 100644 rbmd/__init__.py create mode 100644 rbmd/conf.json create mode 100644 rbmd/settings.py create mode 100644 rbmd/static/images-logo.png create mode 100644 rbmd/static/script.js create mode 100644 rbmd/templates/rbmd/index.html create mode 100644 rbmd/urls.py create mode 100644 rbmd/views.py create mode 100644 rbmd/wsgi.py diff --git a/rbmd/__init__.py b/rbmd/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/rbmd/conf.json b/rbmd/conf.json new file mode 100644 index 0000000..09026a0 --- /dev/null +++ b/rbmd/conf.json @@ -0,0 +1,7 @@ +{ + +"mount":"http://127.0.0.1:9076/mount", +"api": "http://127.0.0.1:9076/v1/", +"ws": "ws://php.difrex.ru/ws" + +} diff --git a/rbmd/settings.py b/rbmd/settings.py new file mode 100644 index 0000000..45f797b --- /dev/null +++ b/rbmd/settings.py @@ -0,0 +1,125 @@ +""" +Django settings for rbmd project. + +Generated by 'django-admin startproject' using Django 1.9.7. + +For more information on this file, see +https://docs.djangoproject.com/en/1.9/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.9/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = 'mpcqsg+e*wiw%^-x%1kv%pq-fi3@9hrp)n@+iz&q8&=)m3v_$z' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE_CLASSES = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'rbmd.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': ['templates'], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'rbmd.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.9/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/1.9/topics/i18n/ + +LANGUAGE_CODE = 'en-us' + +TIME_ZONE = 'UTC' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.9/howto/static-files/ + +STATIC_URL = '/static/' +#PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__)) +#STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') +STATICFILES_DIRS = [ + os.path.join(BASE_DIR, "rbmd/static"), ] diff --git a/rbmd/static/images-logo.png b/rbmd/static/images-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9ab86462f35c876bedfba841862cc598d424c81d GIT binary patch literal 26554 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 HtK$C)af7h< literal 0 HcmV?d00001 diff --git a/rbmd/static/script.js b/rbmd/static/script.js new file mode 100644 index 0000000..bc9e08c --- /dev/null +++ b/rbmd/static/script.js @@ -0,0 +1,147 @@ +$(function() { + $('#mountFormTrigger').click(function(event){ + $.ajax({ + url:"get_status.php", + success:function(data){ + var status = JSON.parse(data); + var htmlSelect = ''; +for (n in status["quorum"]) { htmlSelect += "";} + + $('#selectNode').html(htmlSelect); + console.log(htmlSelect);} + }) + }) + +}); + + + $('#mountFormTrigger').click(function(event){ + $.ajax({ + url:"get_status.php", + success:function(data){ + var status = JSON.parse(data); + var htmlSelect = ''; + for (n in status["quorum"]) { htmlSelect += "";} + $('#selectNode').html(htmlSelect); + console.log(htmlSelect);} + }) + }) + + +$(function() { + console.log( "ready!" ); +}); + + function resolve() { + $.ajax({ + url:"resolve.php", + data:{"node":deadNode}, + success:function(data){$('#details').css("display", "none");} + }) + } + + function unmount(a, b, c) { + var u = confirm(a + ": confirm unmount of " + b); + if (u == true) { + $.ajax({ + url:"unmount.php", + data:{"node":a, "mountpoint":b, "block":c}, + success:function(data){ + var res = JSON.parse(data); + message = "

" + res["state"] + "

"+ res["message"] +"

"; + $("#rspContainer").css("display", "block"); + $("#rsp").html(message) + if (res["state"] == 'OK'){$("#rspContainer").css("background-color", "#4CAF50" );} + else {$("#rspContainer").css("background-color", "#f44336" )} + } + }) + } + } + + function displayData(a){ + $("#status").html("

"+a.health+"

"); + if (a.health == 'deadly.') { + $('#showDeadlyDetails').css("display","block"); + $('#resolve').css("display","block"); + $("#mountFormTrigger").addClass("w3-disabled") + } else { + $('#showDeadlyDetails').css("display","none"); + $('#resolve').css("display","none"); + $("#mountFormTrigger").removeClass("w3-disabled") + $('#details').css("border", "0"); + } + $("#leader").text(a.leader); + $( "#statusContainer:contains('alive')" ).css("background-color", "#4CAF50" ); + $( "#statusContainer:contains('resizing')" ).css("background-color", "#ff9800" ); + $( "#statusContainer:contains('deadly')" ).css("background-color", "#f44336" );; + var node2 = {"quorum":[]}; + for (var node in a.quorum){ + node2.quorum.push(node) + }; + w3DisplayData("id01", node2); + $('.tablink').css('display', 'block'); + if (n != undefined && n != 'dead'){ + var t = new Date(a.quorum[n]["updated"] * 1000) + var up_formatted = t.getFullYear() + "/" + + (t.getMonth() + 1) + "/" + + t.getDate() + " " + + t.getHours() + ":" + + t.getMinutes() + ":" + + t.getSeconds(); + $("#name").html(n); + $("#ipv4").html(a.quorum[n]["ip"]["v4"].join("
")); + $("#ipv6").html(a.quorum[n]["ip"]["v6"].join("
")); + $("#updated").html(up_formatted); + if (a.quorum[n]["mounts"] != null) { + var mnt_block = ""; + for (i in a.quorum[n].mounts) { + var mnt = a.quorum[n].mounts[i]; + mnt_block += "unmount
Mountpoint: " + + mnt.mountpoint + "
Mountopts: " + + mnt.mountopts + "
Fstype: " + + mnt.fstype + + "
Pool: " + mnt.pool + + "
Image: " + mnt.image + + "
Block: " + mnt.block +"
"; + } + $("#mon").html(mnt_block); + } + else { $("#mon").html("")} + } + if (n =='dead') { + var t, up_formatted + if (a.deadlyreason["updated"] != 0) { + t = new Date(a.deadlyreason["updated"] * 1000) + up_formatted = t.getFullYear() + "/" + (t.getMonth() + 1) + "/" + t.getDate() + " " + t.getHours() + ":" + t.getMinutes() + ":" + t.getSeconds(); + } else { up_formatted=0 } + deadNode = a.deadlyreason["node"]; + $("#name").html(a.deadlyreason["node"]); + $("#ipv4").html(a.deadlyreason["ip"]["v4"].join("
")); + $("#ipv6").html(a.deadlyreason["ip"]["v6"].join("
")); + $("#updated").html(up_formatted); + if (a.deadlyreason["mounts"] != null) { + var mnt_block = ""; + for (i in a.deadlyreason.mounts) { + var mnt = a.deadlyreason.mounts[i]; + mnt_block += mnt.mountpoint + "
" + mnt.mountopts + "
" + mnt.fstype + "
" + mnt.pool + "
" + mnt.image + "

"; + } + $("#mon").html(mnt_block); + } else { $("#mon").html("") } + } + } +function openNode(evt, nodeName) { + var i, x, tablinks; + n = nodeName; + x = document.getElementsByClassName("node"); + tablinks = document.getElementsByClassName("tablink"); + if (n == 'dead') { + $('#details').css("border", "2px solid #f44336"); + if ($('#showDeadlyDetails').html() == "Show details") { + $('#details').css("display", "block"); + $('#showDeadlyDetails').text('Hide details'); + } else { + $('#details').css("display", "none"); + $('#showDeadlyDetails').text('Show details'); + } + } else {$('#details').css("border", "").css("display", "block") } +} diff --git a/rbmd/templates/rbmd/index.html b/rbmd/templates/rbmd/index.html new file mode 100644 index 0000000..879b3a1 --- /dev/null +++ b/rbmd/templates/rbmd/index.html @@ -0,0 +1,115 @@ +{% load staticfiles %} + + + + RBMD + + + + + + + + + + +
+Mount + +
+ +
+
+
+ × +

Mount

+
+
{% csrf_token %} +
+ +
+
+
+
+
+ +
+
+
+
+
+ +
+
+
+
+

Leader:

+

Nodes:

+ {% for node in nodes %} + + {% endfor %} +

Metrics:

+ {{ metrics }} +
+
+ +
+
+
Status...
+ +
+ + +{% if node %} +
+ × +
+
+
+{% endif %} + +
+
+
+ +{% if node %} + + +{% endif %} + + + diff --git a/rbmd/urls.py b/rbmd/urls.py new file mode 100644 index 0000000..4f79a34 --- /dev/null +++ b/rbmd/urls.py @@ -0,0 +1,24 @@ +"""rbmd URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.9/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.conf.urls import url, include + 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) +""" +from django.conf.urls import url +from django.contrib import admin +from . import views + +urlpatterns = [ + url(r'^admin/', admin.site.urls), + url(r'^$', views.panel), + url(r'^status$', views.get_status), +] diff --git a/rbmd/views.py b/rbmd/views.py new file mode 100644 index 0000000..6329bae --- /dev/null +++ b/rbmd/views.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.http import HttpResponse +from django.shortcuts import render +import json +import requests + +def get_metrics(): + with open('conf.json') as conf: + api = json.load(conf)["api"] + print api + #try: res = requests.get(api + metrics) + return api + +def panel(request): + with open('conf.json') as conf: + ws = json.load(conf)["ws"] + metrics = get_metrics() + return render(request, 'rbmd/index.html', {'ws' : ws, 'metrics' : metrics}) + + +def get_status(request): + with open('conf.json') as conf: + status = json.load(conf)["status"] + #try: res = requests.get(status) + return HttpResponse(status) + +def mount(): + pass + +def unmount(): + pass + diff --git a/rbmd/wsgi.py b/rbmd/wsgi.py new file mode 100644 index 0000000..4532479 --- /dev/null +++ b/rbmd/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for rbmd project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/1.9/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "rbmd.settings") + +application = get_wsgi_application()