Commencement ajout des nouvelles machines pour un membre
This commit is contained in:
parent
5403c62209
commit
0f07405c7d
@ -35,6 +35,7 @@ brie/lib/helpers.py
|
|||||||
brie/lib/ldap_helper.py
|
brie/lib/ldap_helper.py
|
||||||
brie/model/__init__.py
|
brie/model/__init__.py
|
||||||
brie/model/auth.py
|
brie/model/auth.py
|
||||||
|
brie/model/briedb.py
|
||||||
brie/model/camembert.py
|
brie/model/camembert.py
|
||||||
brie/model/ldap.py
|
brie/model/ldap.py
|
||||||
brie/public/favicon.ico
|
brie/public/favicon.ico
|
||||||
@ -44,17 +45,13 @@ brie/public/css/rooms.css
|
|||||||
brie/public/css/show.css
|
brie/public/css/show.css
|
||||||
brie/public/css/style.css
|
brie/public/css/style.css
|
||||||
brie/templates/__init__.py
|
brie/templates/__init__.py
|
||||||
brie/templates/__init__.pyc
|
|
||||||
brie/templates/index.html
|
brie/templates/index.html
|
||||||
brie/templates/login_widget.html
|
brie/templates/login_widget.html
|
||||||
brie/templates/administration/__init__.py
|
brie/templates/administration/__init__.py
|
||||||
brie/templates/administration/__init__.pyc
|
|
||||||
brie/templates/administration/index.html
|
brie/templates/administration/index.html
|
||||||
brie/templates/auth/__init__.py
|
brie/templates/auth/__init__.py
|
||||||
brie/templates/auth/__init__.pyc
|
|
||||||
brie/templates/auth/login.html
|
brie/templates/auth/login.html
|
||||||
brie/templates/edit/__init__.py
|
brie/templates/edit/__init__.py
|
||||||
brie/templates/edit/__init__.pyc
|
|
||||||
brie/templates/edit/error.html
|
brie/templates/edit/error.html
|
||||||
brie/templates/edit/import_from.html
|
brie/templates/edit/import_from.html
|
||||||
brie/templates/edit/member.html
|
brie/templates/edit/member.html
|
||||||
@ -75,10 +72,8 @@ brie/templates/models/login.html
|
|||||||
brie/templates/models/master.html
|
brie/templates/models/master.html
|
||||||
brie/templates/models/sidebars.html
|
brie/templates/models/sidebars.html
|
||||||
brie/templates/rooms/__init__.py
|
brie/templates/rooms/__init__.py
|
||||||
brie/templates/rooms/__init__.pyc
|
|
||||||
brie/templates/rooms/index.html
|
brie/templates/rooms/index.html
|
||||||
brie/templates/show/__init__.py
|
brie/templates/show/__init__.py
|
||||||
brie/templates/show/__init__.pyc
|
|
||||||
brie/templates/show/error.html
|
brie/templates/show/error.html
|
||||||
brie/templates/show/member.html
|
brie/templates/show/member.html
|
||||||
brie/templates/show/member_room_interface_views.html
|
brie/templates/show/member_room_interface_views.html
|
||||||
|
@ -14,26 +14,34 @@ from brie.controllers.auth import AuthenticatedBaseController, AuthenticatedRest
|
|||||||
|
|
||||||
from operator import itemgetter
|
from operator import itemgetter
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
|
||||||
#root = tg.config['application_root_module'].RootController
|
#root = tg.config['application_root_module'].RootController
|
||||||
|
|
||||||
""" Controller d'affichage de details de membres, chambres et interfaces """
|
""" Controller d'edition de details de membres, chambres"""
|
||||||
class EditController(AuthenticatedBaseController):
|
class EditController(AuthenticatedBaseController):
|
||||||
require_group = groups_enum.admin
|
require_group = groups_enum.admin
|
||||||
|
|
||||||
|
""" Controller show qu'on réutilise pour gérer l'affichage """
|
||||||
show = None
|
show = None
|
||||||
|
|
||||||
|
""" Controller fils wifi pour gérer le wifi """
|
||||||
wifi = None
|
wifi = None
|
||||||
|
|
||||||
|
""" Controller fils de gestion des machines """
|
||||||
|
machine = MachineController()
|
||||||
|
|
||||||
def __init__(self, new_show):
|
def __init__(self, new_show):
|
||||||
self.show = new_show
|
self.show = new_show
|
||||||
self.wifi = WifiRestController(new_show)
|
self.wifi = WifiRestController(new_show)
|
||||||
|
|
||||||
""" Affiche les détails du membre, de la chambre et de l'interface """
|
""" Affiche les détails éditables du membre et de la chambre """
|
||||||
@expose("brie.templates.edit.member")
|
@expose("brie.templates.edit.member")
|
||||||
def member(self, residence, uid):
|
def member(self, residence, uid):
|
||||||
return self.show.member(residence, uid)
|
return self.show.member(residence, uid)
|
||||||
#end def
|
#end def
|
||||||
|
|
||||||
|
""" Affiche les détails éditables de la chambre """
|
||||||
@expose("brie.templates.edit.room")
|
@expose("brie.templates.edit.room")
|
||||||
def room(self, residence, room_id):
|
def room(self, residence, room_id):
|
||||||
return self.show.room(residence, room_id)
|
return self.show.room(residence, room_id)
|
||||||
@ -41,21 +49,93 @@ class EditController(AuthenticatedBaseController):
|
|||||||
|
|
||||||
#end class
|
#end class
|
||||||
|
|
||||||
|
""" Controller de gestion des machines """
|
||||||
class MachineController(AuthenticatedBaseController):
|
class MachineController(AuthenticatedBaseController):
|
||||||
require_group = groups_enum.admin
|
require_group = groups_enum.admin
|
||||||
|
|
||||||
|
""" Controller fils d'ajout de machine """
|
||||||
|
add = MachineAddController()
|
||||||
|
|
||||||
|
""" Controller fils de suppression de machine """
|
||||||
|
delete = MachineDeleteController()
|
||||||
|
|
||||||
|
#end class
|
||||||
|
|
||||||
|
""" Controller de gestion des ajouts de machines.
|
||||||
|
Il est de type REST, i.e. il gère séparement les requêtes
|
||||||
|
get, post, put, delete
|
||||||
|
"""
|
||||||
|
class MachineAddController(AuthenticatedRestController):
|
||||||
|
require_group = groups_enum.admin
|
||||||
|
|
||||||
|
@expose()
|
||||||
|
""" Fonction de gestion de requete post sur le controller d'ajout """
|
||||||
|
def post(self, residence, member_uid, name, mac):
|
||||||
|
residence_dn = Residences.get_dn_by_name(self.user, residence)
|
||||||
|
|
||||||
|
#TODO : néttoyer mac (utiliser deux-points) et vérifier (regex)
|
||||||
|
# XX:XX:XX:XX:XX
|
||||||
|
|
||||||
|
# Vérification que le membre existe
|
||||||
|
member = Member.get_by_uid(self.user, residence_dn, member_uid)
|
||||||
|
if member is None:
|
||||||
|
#TODO : membre inexistant
|
||||||
|
|
||||||
|
# Vérification que le nom de machine n'existe pas déjà
|
||||||
|
# Note : on cherche sur toute la résidence (residence_dn)
|
||||||
|
machine = Machine.get_machine_by_name(self.user, residence_dn, name)
|
||||||
|
if machine is not None:
|
||||||
|
#TODO : erreur machine existe déjà
|
||||||
|
|
||||||
|
# Génération de l'id de la machine et recherche d'une ip libre
|
||||||
|
machine_id = uuid.uuid4()
|
||||||
|
ip = IpReservation.get_first_free(self.user, residence_dn)
|
||||||
|
|
||||||
|
# Attributs ldap de l'objet machine (regroupant dns et dhcp)
|
||||||
|
machine_top = Machine.entry_attr(machine_id)
|
||||||
|
|
||||||
|
# Attributs ldap des objets dhcp et dns, fils de l'objet machine
|
||||||
|
machine_dhcp = Machine.dhcp_attr(name, mac)
|
||||||
|
machine_dns = Machine.dns_attr(name, ip.cn.first())
|
||||||
|
|
||||||
|
# Construction du dn et ajout de l'objet machine
|
||||||
|
# en fils du membre (membre.dn)
|
||||||
|
machine_dn = "cn=" + machine_id + "," + member.dn
|
||||||
|
self.user.ldap_bind.add_entry(machine_dn, machine_top)
|
||||||
|
|
||||||
|
# Construction du dn et ajout de l'objet dhcp
|
||||||
|
# en fils de la machine (machine_dn)
|
||||||
|
dhcp_dn = "cn=" + name + "," + machine_dn
|
||||||
|
self.user.ldap_bind.add_entry(dhcp_dn, machine_dhcp)
|
||||||
|
|
||||||
|
# Construction du dn et ajout de l'objet dns
|
||||||
|
dns_dn = "dlzHostName=" + name + "," + machine_dn
|
||||||
|
self.user.ldap_bind.add_entry(dns_dn, machine_dns)
|
||||||
|
|
||||||
|
|
||||||
|
#end def
|
||||||
|
#end class
|
||||||
|
|
||||||
|
|
||||||
|
""" Controller REST de gestion des ajouts de machines. """
|
||||||
class MachineDeleteController(AuthenticatedRestController):
|
class MachineDeleteController(AuthenticatedRestController):
|
||||||
require_group = groups_enum.admin
|
require_group = groups_enum.admin
|
||||||
|
|
||||||
@expose()
|
@expose()
|
||||||
|
""" Gestion des requêtes post sur ce controller """
|
||||||
def post(self, residence, member_uid, machine_id):
|
def post(self, residence, member_uid, machine_id):
|
||||||
|
|
||||||
|
# Récupération du membre et de la machine
|
||||||
|
# Note : on cherche la machine seulement sur le membre (member.dn)
|
||||||
member = Member.get_by_uid(self.user, residence, member_uid)
|
member = Member.get_by_uid(self.user, residence, member_uid)
|
||||||
machine = Machine.get_machine_by_id(self.user, member.dn, machine_id)
|
machine = Machine.get_machine_by_id(self.user, member.dn, machine_id)
|
||||||
|
|
||||||
|
# Si la machine existe effectivement, on la supprime
|
||||||
if machine is not None:
|
if machine is not None:
|
||||||
self.user.ldap_bind.delete_entry_subtree(machine.dn)
|
self.user.ldap_bind.delete_entry_subtree(machine.dn)
|
||||||
#end if
|
#end if
|
||||||
|
|
||||||
|
# On redirige sur la page d'édition du membre
|
||||||
redirect("/edit/room/" + residence + "/" + member_uid)
|
redirect("/edit/room/" + residence + "/" + member_uid)
|
||||||
#end def
|
#end def
|
||||||
#end def
|
#end def
|
||||||
|
@ -233,5 +233,13 @@ class IpReservation:
|
|||||||
"x-taken" : description
|
"x-taken" : description
|
||||||
}
|
}
|
||||||
#end def
|
#end def
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_first_free(user_session, residence_dn):
|
||||||
|
results = user_session.ldap_bind.search_first(ldap_config.ip_reservation_base_dn + residence_dn, "(&(objectClass=auroreIpReservation)(!(x-taken=*)))")
|
||||||
|
|
||||||
|
return results
|
||||||
|
#end def
|
||||||
|
|
||||||
|
|
||||||
#end class
|
#end class
|
||||||
|
@ -1,130 +0,0 @@
|
|||||||
#
|
|
||||||
# Brie - Pylons development environment configuration
|
|
||||||
#
|
|
||||||
# The %(here)s variable will be replaced with the parent directory of this file
|
|
||||||
#
|
|
||||||
# This file is for deployment specific config options -- other configuration
|
|
||||||
# that is always required for the app is done in the config directory,
|
|
||||||
# and generally should not be modified by end users.
|
|
||||||
|
|
||||||
[DEFAULT]
|
|
||||||
debug = true
|
|
||||||
# Uncomment and replace with the address which should receive any error reports
|
|
||||||
#email_to = you@yourdomain.com
|
|
||||||
smtp_server = localhost
|
|
||||||
error_email_from = paste@localhost
|
|
||||||
|
|
||||||
[server:main]
|
|
||||||
use = egg:Paste#http
|
|
||||||
host = 0.0.0.0
|
|
||||||
port = 9001
|
|
||||||
|
|
||||||
[app:main]
|
|
||||||
use = egg:Brie
|
|
||||||
full_stack = true
|
|
||||||
#lang = ru
|
|
||||||
cache_dir = %(here)s/data
|
|
||||||
beaker.session.key = brie
|
|
||||||
beaker.session.secret = somesecret
|
|
||||||
|
|
||||||
# If you'd like to fine-tune the individual locations of the cache data dirs
|
|
||||||
# for the Cache data, or the Session saves, un-comment the desired settings
|
|
||||||
# here:
|
|
||||||
#beaker.cache.data_dir = %(here)s/data/cache
|
|
||||||
#beaker.session.data_dir = %(here)s/data/sessions
|
|
||||||
|
|
||||||
# pick the form for your database
|
|
||||||
# %(here) may include a ':' character on Windows environments; this can
|
|
||||||
# invalidate the URI when specifying a SQLite db via path name
|
|
||||||
#sqlalchemy.url=postgresql://camembert:CamembertDB%40Pacat@172.17.22.7:5432/camembert
|
|
||||||
sqlalchemy.url=postgresql://brie:brie@localhost/brie
|
|
||||||
# sqlalchemy.url=mysql://username:password@hostname:port/databasename
|
|
||||||
|
|
||||||
|
|
||||||
# If you have sqlite, here's a simple default to get you started
|
|
||||||
# in development
|
|
||||||
|
|
||||||
#sqlalchemy.url = sqlite:///%(here)s/devdata.db
|
|
||||||
#echo shouldn't be used together with the logging module.
|
|
||||||
#sqlalchemy.echo = false
|
|
||||||
#sqlalchemy.echo_pool = false
|
|
||||||
#sqlalchemy.pool_recycle = 3600
|
|
||||||
|
|
||||||
# if you are using Mako and want to be able to reload
|
|
||||||
# the mako template from disk during the development phase
|
|
||||||
# you should say 'true' here
|
|
||||||
# This option is only used for mako templating engine
|
|
||||||
# WARNING: if you want to deploy your application using a zipped egg
|
|
||||||
# (ie: if your application's setup.py defines zip-safe=True, then you
|
|
||||||
# MUST put "false" for the production environment because there will
|
|
||||||
# be no disk and real files to compare time with.
|
|
||||||
# On the contrary if your application defines zip-safe=False and is
|
|
||||||
# deployed in an unzipped manner, then you can leave this option to true
|
|
||||||
templating.mako.reloadfromdisk = true
|
|
||||||
|
|
||||||
# the compiled template dir is a directory that must be readable by your
|
|
||||||
# webserver. It will be used to store the resulting templates once compiled
|
|
||||||
# by the TemplateLookup system.
|
|
||||||
# During development you generally don't need this option since paste's HTTP
|
|
||||||
# server will have access to you development directories, but in production
|
|
||||||
# you'll most certainly want to have apache or nginx to write in a directory
|
|
||||||
# that does not contain any source code in any form for obvious security reasons.
|
|
||||||
#
|
|
||||||
#templating.mako.compiled_templates_dir = /some/dir/where/webserver/has/access
|
|
||||||
|
|
||||||
# WARNING: *THE LINE BELOW MUST BE UNCOMMENTED ON A PRODUCTION ENVIRONMENT*
|
|
||||||
# Debug mode will enable the interactive debugging tool, allowing ANYONE to
|
|
||||||
# execute malicious code after an exception is raised.
|
|
||||||
#set debug = false
|
|
||||||
|
|
||||||
# Logging configuration
|
|
||||||
# Add additional loggers, handlers, formatters here
|
|
||||||
# Uses python's logging config file format
|
|
||||||
# http://docs.python.org/lib/logging-config-fileformat.html
|
|
||||||
|
|
||||||
[loggers]
|
|
||||||
keys = root, brie, sqlalchemy, auth
|
|
||||||
|
|
||||||
[handlers]
|
|
||||||
keys = console
|
|
||||||
|
|
||||||
[formatters]
|
|
||||||
keys = generic
|
|
||||||
|
|
||||||
# If you create additional loggers, add them as a key to [loggers]
|
|
||||||
[logger_root]
|
|
||||||
level = INFO
|
|
||||||
handlers = console
|
|
||||||
|
|
||||||
[logger_brie]
|
|
||||||
level = DEBUG
|
|
||||||
handlers =
|
|
||||||
qualname = brie
|
|
||||||
|
|
||||||
[logger_sqlalchemy]
|
|
||||||
level = INFO
|
|
||||||
handlers =
|
|
||||||
qualname = sqlalchemy.engine
|
|
||||||
# "level = INFO" logs SQL queries.
|
|
||||||
# "level = DEBUG" logs SQL queries and results.
|
|
||||||
# "level = WARN" logs neither. (Recommended for production systems.)
|
|
||||||
|
|
||||||
|
|
||||||
# A logger for authentication, identification and authorization -- this is
|
|
||||||
# repoze.who and repoze.what:
|
|
||||||
[logger_auth]
|
|
||||||
level = WARN
|
|
||||||
handlers =
|
|
||||||
qualname = auth
|
|
||||||
|
|
||||||
# If you create additional handlers, add them as a key to [handlers]
|
|
||||||
[handler_console]
|
|
||||||
class = StreamHandler
|
|
||||||
args = (sys.stderr,)
|
|
||||||
level = NOTSET
|
|
||||||
formatter = generic
|
|
||||||
|
|
||||||
# If you create additional formatters, add them as a key to [formatters]
|
|
||||||
[formatter_generic]
|
|
||||||
format = %(asctime)s,%(msecs)03d %(levelname)-5.5s [%(name)s] %(message)s
|
|
||||||
datefmt = %H:%M:%S
|
|
Loading…
Reference in New Issue
Block a user