1
0
mirror of https://github.com/Yubico/yubiadmin.git synced 2025-02-20 14:54:30 +01:00

Added freerad app with radtest.

This commit is contained in:
Dain Nilsson 2013-05-27 12:06:03 +02:00
parent 8f9fd30a7c
commit d3a499a554
7 changed files with 107 additions and 9 deletions

View File

@ -239,9 +239,6 @@ class CreateUserForm(Form):
super(CreateUserForm, self).__init__(**kwargs)
self.auth = auth
def load(self):
pass
def save(self):
self.auth.create_user(self.username.data, self.password.data)
self.auth.commit()

90
yubiadmin/apps/freerad.py Normal file
View File

@ -0,0 +1,90 @@
# Copyright (c) 2013 Yubico AB
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or
# without modification, are permitted provided that the following
# conditions are met:
#
# 1. Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following
# disclaimer in the documentation and/or other materials provided
# with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
# POSSIBILITY OF SUCH DAMAGE.
from yubiadmin.util.app import App, render
from yubiadmin.util.system import run
from wtforms import Form
from wtforms.fields import TextField, PasswordField
import os
__all__ = [
'app'
]
CLIENTS_CONFIG_FILE = '/etc/freeradius/clients.conf'
class RadTestForm(Form):
legend = 'RADIUS test'
username = TextField('Username')
password = PasswordField('Password')
class FreeRadius(App):
"""
FreeRADIUS
RADIUS Server
"""
name = 'freerad'
sections = ['general', 'clients']
@property
def disabled(self):
return not os.path.isdir('/etc/freeradius')
def general(self, request):
"""
General
"""
alerts = []
if 'username' in request.params:
username = request.params['username']
password = request.params.get('password', '')
cmd = 'radtest %s %s localhost 0 testing123' % (username, password)
status, output = run(cmd)
alert = {'title': cmd, 'message': '<pre>%s</pre>' % output}
if status == 0:
alert['type'] = 'success'
elif status == 1:
alert['type'] = 'warn'
else:
alert['type'] = 'error'
alert['message'] = 'There was an error running the command. ' \
'Exit code: %d' % status
alerts.append(alert)
return render('freerad/general', form=RadTestForm(), alerts=alerts)
def clients(self, request):
"""
RADIUS clients
"""
return ''
app = FreeRadius()

View File

@ -38,7 +38,7 @@ def inspect_app(app):
desc = desc.strip()
sections = [{
'name': section,
'title': getattr(app, section).__doc__.strip(),
'title': (getattr(app, section).__doc__ or section).strip(),
'advanced': bool(getattr(getattr(app, section), 'advanced', False))
} for section in app.sections]

View File

@ -31,6 +31,10 @@ caption {
white-space: pre-line;
}
span.message {
white-space: pre-line;
}
a {
color: #8bc53f;
}

View File

@ -26,7 +26,7 @@
<div class="alert alert-{{ alert.type }}">
<button type="button" class="close" data-dismiss="alert">&times;</button>
<strong>{{ alert.title }}</strong>
{{ alert.message }}
<span class="message">{{ alert.message }}</span>
</div>
{% endfor %}

View File

@ -0,0 +1,7 @@
{% from 'form.html' import form_fieldset %}
<form action="/freerad/general" method="post">
{{ form_fieldset(form) }}
<input type="submit" class="btn" value="Test" />
</form>

View File

@ -70,7 +70,7 @@ def render(tmpl, **kwargs):
def populate_forms(forms, data):
if not data:
for form in forms:
for form in filter(lambda x: hasattr(x, 'load'), forms):
form.load()
else:
errors = False
@ -78,7 +78,7 @@ def populate_forms(forms, data):
form.process(data)
errors = not form.validate() or errors
if not errors:
for form in forms:
for form in filter(lambda x: hasattr(x, 'save'), forms):
form.save()
@ -94,7 +94,7 @@ class App(object):
success_msg='Settings updated!', **kwargs):
alerts = []
if not request.params:
for form in forms:
for form in filter(lambda x: hasattr(x, 'load'), forms):
form.load()
else:
errors = False
@ -105,7 +105,7 @@ class App(object):
try:
if success_msg:
alerts = [{'type': 'success', 'title': success_msg}]
for form in forms:
for form in filter(lambda x: hasattr(x, 'save'), forms):
form.save()
except Exception as e:
alerts = [{'type': 'error', 'title': 'Error:',