root/wifi-ltsp/trunk/autorizaWifiGuardias.py @ 458
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()
|