Browse Source

Merge pull request #24 from k3oni/master

update dev from master
windows^2
Florian N 12 years ago
parent
commit
c1bbe8e0e0
  1. 8
      README.md
  2. 61
      main/views.py
  3. 3
      pydash/settings.py
  4. 2
      pydash/urls.py
  5. 16
      static/css/dashboard.css
  6. 5
      static/css/style.css
  7. 41
      static/js/dashboard.js
  8. 60
      templates/main.html
  9. 129
      usage/views.py

8
README.md

@ -1,7 +1,11 @@
pyDash - v1.4
pyDash - v1.4.4 [![Follow @hostechs](https://dev.twitter.com/sites/default/files/images_documentation/bird_blue_32.png)](https://twitter.com/hostechs) [![View Profile](https://dlc1-s.licdn.com/sites/default/files/InBug-30px-R.png)](http://www.linkedin.com/in/hostechs/)
======
A small web monitoring dashboard for your linux pc/server writen in Python and Django + Chart.js.
[![Flattr this](http://api.flattr.com/button/flattr-badge-large.png)](http://flattr.com/thing/2630601/k3onipydash-on-GitHub "Flattr this")
A small web-based monitoring dashboard for your linux pc/server writen in Python and Django + Chart.js.
The dashboard is built using only Python libraries available in the main Python distribution, trying to create a small list of dependencies without the need of installing many packages or libraries.

61
main/views.py

@ -70,25 +70,31 @@ def get_ipaddress():
"""
Get the IP Address
"""
data = []
try:
pipe = os.popen(" ip addr | grep -A3 'LOWER_UP' | awk '{printf \"%s,\",$2}'|awk -F,, '{print $0}'")
data = pipe.read().strip().split(',,')
pipe.close()
eth = os.popen("ip addr | grep LOWER_UP | awk '{print $2}'")
iface = eth.read().strip().replace(':','').split('\n')
eth.close()
del iface[0]
for i in iface:
pipe = os.popen("ip addr show " + i + "| awk '{if ($2 == \"forever\"){!$2} else {print $2}}'")
data1 = pipe.read().strip().split('\n')
pipe.close()
if len(data1) == 2:
data1.append('unavailable', 'unavailable')
if len(data1) == 3:
data1.append('unavailable')
data1[0] = i
data.append(data1)
ips = {'interface': iface, 'itfip': data}
data = ips
except Exception,err:
data = str(err)
data = [n for n in data if not n.startswith(('lo', '127'))]
data = [i.split(',', 4) for i in data]
itf = []
for e in data:
itf.append(e[0].strip(':'))
ips = {'interface': itf, 'itfip': data}
data = ips
except Exception,err:
data = str(err)
return data
def get_cpus():
@ -123,14 +129,14 @@ def get_users():
data = pipe.read().strip().split('\n')
pipe.close()
data = [i.split(None, 3) for i in data]
if data == [""]:
data = None
else:
data = [i.split(None, 3) for i in data]
except Exception, err:
data = str(err)
if data[0] == []:
data = [['No', 'data', 'available']]
return data
def get_traffic(request):
@ -242,7 +248,7 @@ def get_mem():
percent = (100 - ((freemem * 100) / allmem))
usage = (allmem - freemem)
mem_usage = {'usage': usage, 'percent': percent}
mem_usage = {'usage': usage, 'free': freemem, 'percent': percent}
data = mem_usage
@ -308,20 +314,13 @@ def get_netstat():
except Exception, err:
data = str(err)
if data[0] == []:
data = [['No', 'data', 'available']]
return data
@login_required(login_url='/login/')
def getall(request):
return render_to_response('main.html', {'gethostname': get_platform()['hostname'],
'getplatform': get_platform()['osname'],
'getkernel': get_platform()['kernel'],
'getcpus': get_cpus(),
'time_refresh': time_refresh,
return render_to_response('main.html', {'time_refresh': time_refresh,
'time_refresh_long': time_refresh_long,
'time_refresh_net': time_refresh_net,
'version': version

3
pydash/settings.py

@ -19,7 +19,6 @@ BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '1)$crmowu-23tz@i2-d=7tb3t+1u&(pm!lnjyuarki^72h!3af'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
@ -36,7 +35,7 @@ TIME_JS_REFRESH = 30000
TIME_JS_REFRESH_LONG = 120000
TIME_JS_REFRESH_NET = 2000
VERSION = 1.4
VERSION = "1.4.4"
ALLOWED_HOSTS = ['*']

2
pydash/urls.py

@ -24,6 +24,8 @@ urlpatterns = patterns('',
url(r'^info/proc/$', 'usage.views.getproc', name='getproc'),
url(r'^info/getdiskio/$', 'usage.views.getdiskio', name='getdiskio'),
url(r'^info/loadaverage/$', 'usage.views.loadaverage', name='loadaverage'),
url(r'^info/platform/([\w\-\.]+)/$', 'usage.views.platform', name='platform'),
url(r'^info/getcpus/([\w\-\.]+)/$', 'usage.views.getcpus', name='getcpus'),
url(r'^info/getnetstat/$', 'usage.views.getnetstat', name='getnetstat')
)

16
static/css/dashboard.css

@ -403,3 +403,19 @@ h6.bigstats {
padding: 0 0.3em;
border-style: solid;
}
.memf {
border-color: rgb(43,214,66);
margin: 0.5em;
border-style: solid;
border-width: 0 0 0 1em;
padding: 0 0.3em;
border-style: solid;
}
.memu {
border-color: rgb(249,134,33);
margin: 0.5em;
border-style: solid;
border-width: 0 0 0 1em;
padding: 0 0.3em;
border-style: solid;
}

5
static/css/style.css

@ -410,12 +410,8 @@ textarea {
.widget-content {
padding: 20px 15px 15px;
background: #FFF;
border: 1px solid #D5D5D5;
-moz-border-radius: 5px;
-webkit-border-radius: 5px;
border-radius: 5px;
@ -423,7 +419,6 @@ textarea {
.widget-header+.widget-content {
border-top: none;
-webkit-border-top-left-radius: 0;
-webkit-border-top-right-radius: 0;
-moz-border-radius-topleft: 0;

41
static/js/dashboard.js

@ -103,6 +103,21 @@ var dashboard = {};
dashboard.getUptime = function() {
get_os_data('/info/uptime/', "#get-uptime");
}
dashboard.getOSname = function() {
get_os_data('/info/platform/osname/', "#get-osname");
}
dashboard.getHostname = function() {
get_os_data('/info/platform/hostname/', "#get-hostname");
}
dashboard.getKernel = function() {
get_os_data('/info/platform/kernel/', "#get-kernel");
}
dashboard.getCPUcount = function() {
get_os_data('/info/getcpus/count/', "#get-cpucount");
}
dashboard.getCPUtype = function() {
get_os_data('/info/getcpus/type/', "#get-cputype");
}
dashboard.getDisk = function() {
$.getJSON('/info/getdisk/', function(data) {
destroy_dataTable("get_disk");
@ -137,11 +152,15 @@ dashboard.getUsers = function() {
aoColumns: [
{ sTitle: "USER" },
{ sTitle: "TTY" },
{ sTitle: "LOOGED IN FROM" }
{ sTitle: "LOOGED IN FROM",
sDefaultContent: "unavailable" }
],
bPaginate: false,
bFilter: true,
sDom: "lrtip",
aaSorting: [
[0, "desc"]
],
bPaginate: true,
sPaginationType: "two_button",
bFilter: false,
bAutoWidth: false,
bInfo: false
}).fadeIn();
@ -215,8 +234,9 @@ dashboard.getIps = function() {
aoColumns: [
{ sTitle: "INTERFACE" },
{ sTitle: "MAC ADDRESS" },
{ sTitle: "IPv4 ADDRESS" },
{ sTitle: "IPv6 ADDRESS" }
{ sTitle: "IP ADDRESS" },
{ sTitle: "IP ADDRESS",
sDefaultContent: "unavailable" }
],
bPaginate: false,
bFilter: true,
@ -230,3 +250,12 @@ dashboard.getIps = function() {
});
}
//Expand-Contract div/table
$(document).ready(function() {
$(".widget-content").show();
$(".widget-header").click(function()
{
$(this).next(".widget-content").slideToggle(500);
$("i",this).toggleClass("icon-minus icon-plus");
});
});

60
templates/main.html

@ -2,7 +2,7 @@
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="apple-mobile-web-app-capable" content="yes">
<title>{% block title %}PyDash v{{ version }}{% endblock %}</title>
<link href="{% static "css/bootstrap.min.css" %}" rel="stylesheet">
@ -61,22 +61,20 @@
<div class="span3">
<div class="widget widget-table action-table">
<div class="widget-header"> <i class="icon-info-sign"></i>
<h3>General Info</h3>
<div class="widget-header"> <i class="icon-dashboard"></i>
<h3>General Info</h3><i class="icon-minus"></i>
<div id="refresh-os">
</div>
</div>
<!-- /widget-header -->
<div class="widget-content">
<br>
<div style="text-align:center;">
<b>OS:</b> <span class=""></span>{{ getplatform }}<br>
<b>OS:</b> <span class="" id="get-osname"></span><br>
<b>Uptime:</b> <span class="" id="get-uptime"></span> Hours<br>
<b>Hostname:</b> <span class=""></span>{{ gethostname }}<br>
<b>Kernel:</b> <span class=""></span>{{ getkernel }}<br>
<b>CPU(s):</b> <span class=""></span>{{ getcpus.cpus }} x {{ getcpus.type }}
<b>Hostname:</b> <span class="" id="get-hostname"></span><br>
<b>Kernel:</b> <span class="" id="get-kernel"></span><br>
<b>CPU(s):</b> <span class="" id="get-cpucount"></span> x <span class="" id="get-cputype"></span>
<br><br>
</div>
</div>
@ -87,8 +85,8 @@
<div class="span3">
<div class="widget widget-table action-table">
<div class="widget-header"> <i class="icon-info-sign"></i>
<h3>CPU Usage %</h3>
<div class="widget-header"> <i class="icon-check"></i>
<h3>CPU Usage %</h3><i class="icon-minus"></i>
<div id="refresh-cpu">
</div>
</div>
@ -108,16 +106,19 @@
<div class="span6">
<div class="widget widget-nopad">
<div class="widget-header">
<i class="icon-list-alt"></i>
<h3>Memory Usage</h3>
<div class="widget-header"> <i class="icon-list-alt"></i>
<h3>Memory Usage</h3><i class="icon-minus"></i>
<div id="refresh-ram">
</div>
</div>
<!-- /widget-header -->
<div class="widget-content">
<p></p>
<canvas id="memoryChart" width="560" height="200"></canvas>
<canvas id="memoryChart" width="560" height="200"></canvas>
<div>
<span class="memf">{% trans "Free" %}</span>
<span class="memu">{% trans "Used" %}</span>
</div>
</div>
<!-- /widget-content -->
@ -130,7 +131,7 @@
<div class="span6">
<div class="widget widget-table action-table">
<div class="widget-header"> <i class="icon-hdd"></i>
<h3>Disk Usage</h3>
<h3>Disk Usage</h3><i class="icon-minus"></i>
<div id="refresh-df">
</div>
</div>
@ -146,7 +147,7 @@
<div class="span6">
<div class="widget widget-table action-table">
<div class="widget-header"> <i class="icon-bolt"></i>
<h3>Load Average</h3>
<h3>Load Average</h3><i class="icon-minus"></i>
<div id="refresh-load">
</div>
</div>
@ -167,8 +168,8 @@
<div class="row">
<div class="span6">
<div class="widget widget-table action-table">
<div class="widget-header"> <i class="icon-monitor"></i>
<h3>IP Adresses</h3>
<div class="widget-header"> <i class="icon-level-up"></i>
<h3>IP Adresses</h3><i class="icon-minus"></i>
<div id="refresh-ip">
</div>
</div>
@ -185,8 +186,8 @@
<div class="span3">
<div class="widget">
<div class="widget-header"> <i class="icon-monitor"></i>
<h3>Internet Traffic</h3>
<div class="widget-header"> <i class="icon-exchange"></i>
<h3>Internet Traffic</h3><i class="icon-minus"></i>
<div id="refresh-ispeed">
</div>
</div>
@ -207,8 +208,8 @@
<div class="span3">
<div class="widget">
<div class="widget-header"> <i class="icon-monitor"></i>
<h3>Disk Reads/Writes</h3>
<div class="widget-header"> <i class="icon-angle-up"></i>
<h3>Disk Reads/Writes</h3><i class="icon-minus"></i>
<div id="refresh-diskio">
</div>
</div>
@ -233,7 +234,7 @@
<div class="span6">
<div class="widget widget-table action-table">
<div class="widget-header"> <i class="icon-group"></i>
<h3>Online</h3>
<h3>Online</h3><i class="icon-minus"></i>
<div id="refresh-online">
</div>
</div>
@ -250,7 +251,7 @@
<div class="span6">
<div class="widget widget-table action-table">
<div class="widget-header"> <i class="icon-angle-down"></i>
<h3>Netstat</h3>
<h3>Netstat</h3><i class="icon-minus"></i>
<div id="refresh-netstat">
</div>
</div>
@ -270,8 +271,8 @@
<div class="row">
<div class="span12">
<div class="widget">
<div class="widget-header"> <i class="icon-dashboard"></i>
<h3> Processes </h3>
<div class="widget-header"> <i class="icon-list-alt"></i>
<h3> Processes </h3><i class="icon-minus"></i>
<div id="refresh-ps">
</div>
</div>
@ -407,7 +408,12 @@ $(function pageLoad() {
cpuu_usage();
traffic_usage();
disk_io();
dashboard.getOSname();
dashboard.getUptime();
dashboard.getHostname();
dashboard.getKernel();
dashboard.getCPUcount();
dashboard.getCPUtype();
dashboard.getDisk();
dashboard.getUsers();
dashboard.getNetstat();

129
usage/views.py

@ -49,6 +49,67 @@ def getnetstat(request):
response['Content-Type'] = "text/javascript"
response.write(data)
return response
@login_required(login_url='/login/')
def platform(request, name):
"""
Return the hostname
"""
getplatform = get_platform()
hostname = getplatform['hostname']
osname = getplatform['osname']
kernel = getplatform['kernel']
if name == 'hostname':
try:
data = hostname
except Exception:
data = None
if name == 'osname':
try:
data = osname
except Exception:
data = None
if name == 'kernel':
try:
data = kernel
except Exception:
data = None
data = json.dumps(data)
response = HttpResponse()
response['Content-Type'] = "text/javascript"
response.write(data)
return response
@login_required(login_url='/login/')
def getcpus(request, name):
"""
Return the CPU number and type/model
"""
getcpus = get_cpus()
cputype = getcpus['type']
cpucount = getcpus['cpus']
if name == 'type':
try:
data = cputype
except Exception:
data = None
if name == 'count':
try:
data = cpucount
except Exception:
data = None
data = json.dumps(data)
response = HttpResponse()
response['Content-Type'] = "text/javascript"
response.write(data)
return response
@login_required(login_url='/login/')
@ -168,7 +229,9 @@ def memusage(request):
"""
Return Memory Usage in % and numeric
"""
datasets = []
datasets_free = []
datasets_used = []
cookie_memory = {}
try:
mem_usage = get_mem()
@ -181,26 +244,40 @@ def memusage(request):
cookies = None
if not cookies:
datasets.append(0)
datasets_free.append(0)
datasets_used.append(0)
else:
datasets = eval(cookies)
if len(datasets) > 10:
while datasets:
del datasets[0]
if len(datasets) == 10:
datasets = json.loads(cookies)
datasets_free = datasets[0]
datasets_used = datasets[1]
if len(datasets_free) > 10:
while datasets_free:
del datasets_free[0]
if len(datasets_free) == 10:
break
if len(datasets) <= 9:
datasets.append(int(mem_usage['usage']))
if len(datasets) == 10:
datasets.append(int(mem_usage['usage']))
del datasets[0]
if len(datasets_used) > 10:
while datasets_used:
del datasets_used[0]
if len(datasets_used) == 10:
break
if len(datasets_free) <= 9:
datasets_free.append(int(mem_usage['free']))
if len(datasets_free) == 10:
datasets_free.append(int(mem_usage['free']))
del datasets_free[0]
if len(datasets_used) <= 9:
datasets_used.append(int(mem_usage['usage']))
if len(datasets_used) == 10:
datasets_used.append(int(mem_usage['usage']))
del datasets_used[0]
# Some fix division by 0 Chart.js
if len(datasets) == 10:
if sum(datasets) == 0:
datasets[9] += 0.1
if sum(datasets) / 10 == datasets[0]:
datasets[9] += 0.1
if len(datasets_free) == 10:
if sum(datasets_free) == 0:
datasets_free[9] += 0.1
if sum(datasets_free) / 10 == datasets_free[0]:
datasets_free[9] += 0.1
memory = {
'labels': [""] * 10,
@ -210,15 +287,23 @@ def memusage(request):
"strokeColor": "rgba(249,134,33,1)",
"pointColor": "rgba(249,134,33,1)",
"pointStrokeColor": "#fff",
"data": datasets
"data": datasets_used
},
{
"fillColor": "rgba(43,214,66,0.5)",
"strokeColor": "rgba(43,214,66,1)",
"pointColor": "rgba(43,214,66,1)",
"pointStrokeColor": "#fff",
"data": datasets_free
}
]
}
cookie_memory = [datasets_free, datasets_used]
data = json.dumps(memory)
response = HttpResponse()
response['Content-Type'] = "text/javascript"
response.cookies['memory_usage'] = datasets
response.cookies['memory_usage'] = cookie_memory
response.write(data)
return response
@ -242,7 +327,7 @@ def loadaverage(request):
if not cookies:
datasets.append(0)
else:
datasets = eval(cookies)
datasets = json.loads(cookies)
if len(datasets) > 10:
while datasets:
del datasets[0]
@ -314,7 +399,7 @@ def gettraffic(request):
datasets_out.append(0)
datasets_out_o.append(0)
else:
datasets = eval(cookies)
datasets = json.loads(cookies)
datasets_in = datasets[0]
datasets_out = datasets[1]
datasets_in_i = datasets[2]
@ -437,7 +522,7 @@ def getdiskio(request):
datasets_out.append(0)
datasets_out_o.append(0)
else:
datasets = eval(cookies)
datasets = json.loads(cookies)
datasets_in = datasets[0]
datasets_out = datasets[1]
datasets_in_i = datasets[2]

Loading…
Cancel
Save