Proyecto

General

Perfil

114 pkom
#!/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

116 pkom
LOG_FILENAME = "autorizaWifiGuardias.log"
114 pkom
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:
115 pkom
p = subprocess.Popen(["/usr/bin/sudo", "/usr/bin/configura_hostapd.py", model[row][1]])
114 pkom
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',
116 pkom
filename=LOG_FILENAME,
filemode='w')
114 pkom
AutorizaWifiGuardias()
gtk.main()

main()