diff --git a/Brie/Brie.egg-info/SOURCES.txt b/Brie/Brie.egg-info/SOURCES.txt index 7678f28..e27d883 100644 --- a/Brie/Brie.egg-info/SOURCES.txt +++ b/Brie/Brie.egg-info/SOURCES.txt @@ -35,6 +35,7 @@ brie/lib/helpers.py brie/lib/ldap_helper.py brie/model/__init__.py brie/model/auth.py +brie/model/briedb.py brie/model/camembert.py brie/model/ldap.py brie/public/favicon.ico @@ -44,17 +45,13 @@ brie/public/css/rooms.css brie/public/css/show.css brie/public/css/style.css brie/templates/__init__.py -brie/templates/__init__.pyc brie/templates/index.html brie/templates/login_widget.html brie/templates/administration/__init__.py -brie/templates/administration/__init__.pyc brie/templates/administration/index.html brie/templates/auth/__init__.py -brie/templates/auth/__init__.pyc brie/templates/auth/login.html brie/templates/edit/__init__.py -brie/templates/edit/__init__.pyc brie/templates/edit/error.html brie/templates/edit/import_from.html brie/templates/edit/member.html @@ -75,10 +72,8 @@ brie/templates/models/login.html brie/templates/models/master.html brie/templates/models/sidebars.html brie/templates/rooms/__init__.py -brie/templates/rooms/__init__.pyc brie/templates/rooms/index.html brie/templates/show/__init__.py -brie/templates/show/__init__.pyc brie/templates/show/error.html brie/templates/show/member.html brie/templates/show/member_room_interface_views.html diff --git a/Brie/brie/controllers/edit.py b/Brie/brie/controllers/edit.py index def0574..5189ae4 100644 --- a/Brie/brie/controllers/edit.py +++ b/Brie/brie/controllers/edit.py @@ -14,26 +14,34 @@ from brie.controllers.auth import AuthenticatedBaseController, AuthenticatedRest from operator import itemgetter +import uuid #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): require_group = groups_enum.admin + """ Controller show qu'on réutilise pour gérer l'affichage """ show = None + + """ Controller fils wifi pour gérer le wifi """ wifi = None + """ Controller fils de gestion des machines """ + machine = MachineController() + def __init__(self, new_show): self.show = 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") def member(self, residence, uid): return self.show.member(residence, uid) #end def - + + """ Affiche les détails éditables de la chambre """ @expose("brie.templates.edit.room") def room(self, residence, room_id): return self.show.room(residence, room_id) @@ -41,21 +49,93 @@ class EditController(AuthenticatedBaseController): #end class +""" Controller de gestion des machines """ class MachineController(AuthenticatedBaseController): 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): require_group = groups_enum.admin @expose() + """ Gestion des requêtes post sur ce controller """ 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) 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: self.user.ldap_bind.delete_entry_subtree(machine.dn) #end if + # On redirige sur la page d'édition du membre redirect("/edit/room/" + residence + "/" + member_uid) #end def #end def diff --git a/Brie/brie/model/ldap.py b/Brie/brie/model/ldap.py index 10f29bd..c750e4c 100644 --- a/Brie/brie/model/ldap.py +++ b/Brie/brie/model/ldap.py @@ -233,5 +233,13 @@ class IpReservation: "x-taken" : description } #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 diff --git a/Brie/development.ini b/Brie/development.ini deleted file mode 100644 index 48da770..0000000 --- a/Brie/development.ini +++ /dev/null @@ -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