Index: wifi-ltsp/trunk/autorizaWifiGuardias.py
===================================================================
--- wifi-ltsp/trunk/autorizaWifiGuardias.py	(nonexistent)
+++ wifi-ltsp/trunk/autorizaWifiGuardias.py	(revision 114)
@@ -0,0 +1,250 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+# Project:     wifi-ltsp
+# Module:     autorizaWifiGuardias.py
+# Purpose:     se usará por el profesor de guardia, y se seleccionará
+#				el profesor con clase en ese grupo y ese momento para
+#				activar el wifi de los portátiles de los alumnos.
+# Language:    Python 2.5
+# Date:        07-Mar-2011.
+# Ver:        07-Mar-2011.
+# Author:    Francisco Mora Sánchez
+# Copyright:   2011 - Francisco Mora Sánchez <adminies.maestrojuancalero@edu.juntaextremadura.net>
+#
+# wifi-ltsp is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# autorizaWifiGuardias is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+# You should have received a copy of the GNU General Public License
+# along with wifi-ltsp. If not, see <http://www.gnu.org/licenses/>.
+
+""" Este programa muestra una lista con los profesores que tienen clase
+a la hora actual, cuando seleccionamos uno de ellos se ejecuta el módulo
+demonio configura_hostapd.py utilizando como parámetro el login del profesor
+seleccionado, que  tendrá clase con ese grupo a esa hora, aunque el profesor
+de guardia haya iniciado con su propio login. El módulo sólo se ejecuta
+si el usuario pertenece al grupo teachers. Para llevar a cabo la acción
+se necesita que el módulo configura_hostapd.py, que se ejecuta como root
+en el postlogin de gdm para cada usuario, tenga permisos de ejecución root
+llevándose a cabo esto utilizando el archivo /etc/sudoers, añadiendo una
+línea como:
+
+%teachers ALL=NOPASSWD: /usr/bin/configura_hostapd.py
+
+Procesa el archivo /wifi/horario.txt y genera un diccionario con los
+logins de profesores que tienen clase a la hora actual, adicionalmente
+consultamos ldap para confeccionar el nombre del profesor, con sus 
+nombres y apellidos, de forma que en la caja de selección aparecerán 
+los nombres completos en forma Apellidos, Nombre o bien el login
+del profesor. Tenemos que tener en cuenta que el archivo 
+/wifi/horario.txt ya existe en la ruta, ya que el script 
+configura_hostapd.py se ejecuta en el inicio y lo deja en el lugar 
+adecuado.
+
+Será responsabilidad de cada administrador o herramienta de gestión ldap
+que el atributo cn de cada objeto de la rama People, perteneciente a cada
+profesor, de ldap que sea un profesor, tenga el nombre en forma "humana".
+Tambien sería deseable que este atributo para los alumnos estuviese en
+esa forma.
+
+Francisco Mora Sánchez
+I.E.S. Maestro Juan Calero
+adminies.maestrojuancalero@edu.juntaextremadura.net
+
+"""
+
+import pygtk
+pygtk.require("2.0")
+import gtk
+import logging
+import subprocess
+import os
+import time
+import ldap
+
+LOG_FILENAME = "/tmp/autorizaWifiGuardias.log"
+
+profesores = {}
+
+def hora_actual(fecha):
+	"""Con esta funcion se obtiene la hora actual del sistema sin los : de forma
+	que la 08:45 se representarancomo la 0845"""
+	hora= fecha[11:13]+fecha[14:16]
+	h=int(hora)
+	if (h<int(0000) or h>int(2500)):
+		logging.getLogger().error("El formato de la hora del sistema no es el esperado")
+		return "9999"
+	else:
+		return hora
+
+def procesahorario(profesores):
+	"""con esta funcion generamos el diccionario de profesores con clase a la hora actual,
+	además buscamos en el directorio ldap los valores cn en la rama people que deben
+	contener los nombres completos de los profesores
+	"""
+	if not os.path.exists("/wifi/horario.txt"):
+		logging.getLogger().error("No hay fichero /wifi/horario.txt en el servidor de aula")
+		return ""
+	
+	try:
+		horario = open("/wifi/horario.txt","r")
+	except:
+		logging.getLogger().error("Problemas para leer el archivo /wifi/horario.txt")
+		return ""
+	
+	hora = hora_actual(time.asctime())
+	#hora = "1241"
+	while True:
+		linea = horario.readline()
+		if not linea:
+			break
+		else:
+			lineasplit = linea.split("|")
+			profesor = lineasplit[0]
+			if hora>lineasplit[2] and hora<lineasplit[3]:
+				if  not profesores.has_key(profesor):
+					#print "Profesor en horario",profesor," hora",hora
+					profesores[profesor] = profesor
+	horario.close()
+	#ahora procesaremos el diccionario buscando en ldap los cn
+	l = ldap.initialize("ldap://ldap")
+	
+	base_dn='ou=People,dc=instituto,dc=extremadura,dc=es'
+	#searchFilter = '(uid='+identificador+')'
+	searchScope = ldap.SCOPE_SUBTREE
+	retrieveAttributes = ['cn']
+	
+	for profesor in profesores.keys():
+		nombre = profesor
+		try:
+			searchFilter = '(uid='+profesor+')'
+			ldap_result_id = l.search(base_dn, searchScope, searchFilter, retrieveAttributes)
+			result_type, result_data = l.result(ldap_result_id, 0)
+			if len(result_data)==0:
+				logging.getLogger().error("No encontrado en ldap..."+profesor)
+			else:
+				resultado=result_data[0]
+		except:
+			logging.getLogger().error("Error buscando en ldap..."+profesor)
+			continue
+		
+		profesores[profesor] = resultado[1]['cn'][0]
+	
+def userIsTeacher(teachersGroup='teachers'):   
+    p1 = subprocess.Popen(["id", "-Gn"], stdout=subprocess.PIPE)
+    p2 = subprocess.Popen(["grep", teachersGroup], stdin=p1.stdout, stdout=subprocess.PIPE)
+    output = p2.communicate()[0]
+    return (output != '')	
+
+class AutorizaWifiGuardias(): 
+
+	def delete_event(self, widget, event, data=None):
+		print "delete event occurred"
+		#con false se cierra la ventana principal, con true no
+		return False
+		
+	def destroy(self, widget, data=None):
+		gtk.main_quit()
+
+	def create_model(self):
+		store = gtk.ListStore(str, str)
+		procesahorario(profesores)
+		for profesor in profesores.keys():
+			store.append([profesores[profesor], profesor])
+		return store
+		
+	def create_columns(self, treeView):
+		rendererText = gtk.CellRendererText()
+		column = gtk.TreeViewColumn("Nombre y Apellidos", rendererText, text=0)
+		column.set_sort_column_id(0)
+		treeView.append_column(column)
+		
+		rendererText = gtk.CellRendererText()
+		column = gtk.TreeViewColumn("Login del profesor", rendererText, text=1)
+		column.set_sort_column_id(1)
+		treeView.append_column(column)
+		
+	def on_activated(self, widget, row, col):
+		model = widget.get_model()
+		try:
+			p = subprocess.Popen(["/usr/bin/configura_hostapd.py", model[row][1]])
+		except OSError, e:
+			logging.getLogger().error("Hay problemas al ejecutar comando activación WIFI")
+			self.statusbar.push(0, 'Hay algún problema al activar WIFI')
+			return
+		self.statusbar.push(0, 'Activado WIFI profesor '+model[row][0])
+			
+	def win_close(self, widget, event, data):
+		dialog = gtk.MessageDialog(self.window, gtk.DIALOG_MODAL, gtk.MESSAGE_INFO, gtk.BUTTONS_YES_NO, "¿Quieres salir realmente?")
+		dialog.set_title("Atención")
+		response = dialog.run()
+		dialog.destroy()
+		if response == gtk.RESPONSE_YES:
+			return False
+		else:
+			return True
+
+	def no_profesor(self, widget):
+		logging.getLogger().error("Ejecutando programa usuario no profesor")
+		md = gtk.MessageDialog(self.window, gtk.DIALOG_DESTROY_WITH_PARENT, 
+				gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, "Sólo los profesores pueden ejecutar esta aplicación")
+		md.run()
+		md.destroy()
+
+	def __init__(self):
+		#super(AutorizaWifiGuardias, self).__init__()
+		self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
+		
+		if not userIsTeacher():
+			logging.getLogger().error("Ejecutando programa usuario no profesor")	
+			self.no_profesor(self)
+			self.window.connect('event-after', gtk.main_quit) 
+			
+		self.window.set_size_request(500, 600)
+		self.window.set_position(gtk.WIN_POS_CENTER)
+		
+		self.window.connect("destroy", self.destroy)
+		self.window.connect("delete-event", self.win_close, None)
+		self.window.set_title("Autorización WIFI profesores de guardia")
+		
+		self.vbox = gtk.VBox(False, 8)
+		
+		self.label = gtk.Label()
+		self.label.set_markup("<b>Haz doble click en profesor sustituido</b>")
+		self.vbox.pack_start(self.label, False, False, 0)
+		
+		self.sw = gtk.ScrolledWindow()
+		self.sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
+		self.sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
+		
+		self.vbox.pack_start(self.sw, True, True, 0)
+		
+		self.store = self.create_model()
+		
+		self.treeView = gtk.TreeView(self.store)
+		self.treeView.connect("row-activated", self.on_activated)
+		self.treeView.set_rules_hint(True)
+		self.sw.add(self.treeView)
+		
+		self.create_columns(self.treeView)
+		
+		self.statusbar = gtk.Statusbar()
+		self.vbox.pack_start(self.statusbar, False, False, 0)
+		
+		self.window.add(self.vbox)
+		self.window.show_all()
+
+def main():
+	logging.basicConfig(level=logging.DEBUG,
+		format='%(asctime)s %(levelname)-8s %(message)s',
+		datefmt='%a, %d %b %Y %H:%M:%S',
+		filename=LOG_FILENAME)
+		
+	AutorizaWifiGuardias()
+	gtk.main()
+
+main()

Property changes on: wifi-ltsp/trunk/autorizaWifiGuardias.py
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
