Proyecto

General

Perfil

#!/usr/bin/python
# -*- coding: utf-8 -*-
# Project: wifi-ltsp
# Module: configura_hostapd.py
# Purpose: genera un archivo hostapc.accept para dar acceso a internet a los alumnos.
# Language: Python 2.5
# Date: 07-Feb-2011.
# Ver: 07-Feb-2011.
# Author: Isabel Aparicio Pérez
# Copyright: 2011 - Isabel Aparicio Pérez <prog5pe@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.
# Script2 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 genera el archivo hostapd.access necesario para que en el momento del logueo del
profesor se de acceso a internet a los alumnos que tienen clase en esa hora con ese profesor. Para ello
tenemos que recoger el dia de la semana y la hora actual que tiene el servidor de aula y con el dia actual
buscar en el servidor nfs el fichero del dia de la semana que corresponde con el dia concreto. El fichero
descargado del servidor nfs se almacena en el servidor de aula en la ruta /wifi con el nombre horario.txt.
Tambien controlamos el usuario que esta logueado en ese preciso momento en el servidor. A partir del usuario
logueado, de la hora del sistema y del fichero descargado del servidor nfs se genera el fichero hostapd.access
con las mac de los alumnos correspondientes.

Isabel Aparicio Pérez
Consejería de Educacion.
prog5pe@edu.juntaextremadura.net

"""

import time
import urllib
import os
import sys
from parsehostapd import parsehostapd
import socket
import logging
import subprocess
from shutil import copy

LOG_FILENAME= "/var/log/configura-hostapd.log"
fecha=[]
ip=[]
dia_semana={"Mon":"lunes.txt","Tue":"martes.txt","Wed":"miercoles.txt","Thu":"jueves.txt","Fri":"viernes.txt"}


def dia_actual():
"""con esta funcion se obtiene la fecha actual que tiene el servidor de aula"""
hoy = time.asctime()
return hoy

def fichero_semana(fecha1):
"""Con esta funcion se obtiene la parte de la fecha actual que corresponde con el dia de la semana"""
dia= fecha1[0:3]
if dia not in ["Mon","Tue","Wed","Thu","Fri"]:
logging.getLogger().error("El formato de la fecha del sistema no es el esperado")
return ""
else:
fichero=dia_semana[dia]
return fichero

def hora_actual(fecha1):
"""Con esta funcion se obtiene la hora actual del sistema sin los : de forma que la 08:45 se representaran
como la 0845"""
hora= fecha1[11:13]+fecha1[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 descargar_fichero(fichero):
"""funcion que se encarga de descargar el fichero del dia de la semana correspondiente al dia actual del
servidor nfs y colocarlo en la ubicacion correcta en el servidor de terminales con el nombre de horario.txt"""
archivo="http://servidor/wifi/"+fichero
print archivo
destino="/wifi/horario.txt"
destino2="/wifi"
if not os.path.exists(destino2):
logging.getLogger().debug("La ruta destino no existe y hay que crearla")
try:
os.makedirs(destino2)
except OSError:
logging.getLogger().error("Hay algun error a la hora de crear el directorio /wifi en el servidor de aula")
try:
urllib.urlretrieve(archivo, destino)
except:
logging.getLogger().error("No hay acceso al servidor para encontrar el fichero de horario")
return ""
return destino


def devuelve_usuario():
"""con esta funcion recogemos el usuario que esta logueado en ese momento en el ordenador, seguira intentandolo
hasta que se loguee antes"""
resultado = sys.argv[1]
return resultado
def crea_hostapd(destino,resultado,hora):
"""con esta funcion generamos el fichero hostapd con las mac correspondientes a los alumnos a los que se
les va a dar acceso a internet y lo colocamos en la ruta correcta."""
if not os.path.exists(destino):
logging.getLogger().error("Hay un error el el fichero horario.txt en el servidor de aula")
return ""
else:
copy("/etc/hostapd/hostapd.accept","/etc/hostapd/hostapd.accept.bak")
f=open(destino,"r")
if not os.path.exists("/etc/hostapd"):
try:
os.makedirs("/etc/hostapd")
except IOError:
logging.getLogger().error("Ha habido algun error a la hora de crear el directorio /etc/hostapd")
return ""
if not os.access("/etc/hostapd", os.W_OK):
logging.getLogger().error("No tiene permisos de escritura sobre el directorio /etc/hostapd")
return ""
else:
g=open("/etc/hostapd/hostapd.accept","w")
esta_en_horario=False
while True:
dato=f.readline()
if not dato:
break
else:
lin=dato.split("|")
if lin[0]==resultado:
if hora>lin[2] and hora<lin[3]:
g.write(lin[1])
g.write("\n")
esta_en_horario=True
f.close()
g.close()

#si un profesor de guardia hace login, se autorizan automáticamente los
#alumnos que hubiera autorizado el profesor anterior:
if not esta_en_horario:
copy("/etc/hostapd/hostapd.accept.bak","/etc/hostapd/hostapd.accept")

return g

def inicia_hostapd():
subprocess.Popen(["invoke-rc.d","hostapd","start"])

def userIsTeacher(user_name):
p1 = subprocess.Popen(["id", "-Gn",user_name], stdout=subprocess.PIPE)
p2 = subprocess.Popen(["grep", 'teachers'], stdin=p1.stdout, stdout=subprocess.PIPE)
output = p2.communicate()[0]
return (output != '')

if __name__ == '__main__':
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)s %(levelname)-8s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S',
filename=LOG_FILENAME)
dia_hoy=""
hora=""
user=""
fich=""
hos=""
res=""
f=""

dia_hoy=dia_actual()
hora=hora_actual(dia_hoy)
fich=fichero_semana(dia_hoy)
f=descargar_fichero(fich)
if f!="":
user=devuelve_usuario()
if userIsTeacher(user):
hos=crea_hostapd(f,user,hora)
else: #login de un alumno
subprocess.Popen(["invoke-rc.d","hostapd","stop"]).wait()
sys.exit(0)
if hos=="":
logging.getLogger().error("Error al generar las mac autorizadas")


#Aquí metemos ahora la reconfiguración de hostapd.conf con la parte
#hecha por Francisco Mora
hostapdconf="/etc/hostapd/hostapd.conf"

canaloptimo = parsehostapd.selectbestchannel(True)

ssid = socket.gethostname()
pos = ssid.find(".")
if pos > -1:
ssid = ssid[:pos]
pos = ssid.find("-pro")
if pos > -1:
ssid = ssid[:pos]
try:
#Abre el archivo para lectura de datos
archivoLectura = open(hostapdconf,"r")
lineas = archivoLectura.readlines()
archivoLectura.close()
except (RuntimeError, TypeError, NameError, IOError):
logging.getLogger().error("Error en la ubicacion o nombre del archivo")
sys.exit(0) #salimos con 0 para no fastidiar gdm
#Modifica la cadena del channel y ssid
encontradoChannel = False
encontradoSsid = False
for numlinea in range(0, len(lineas)):
linea = lineas[numlinea]
#comprobamos si estamos en channel o en ssid
if linea[:7] == "channel":
encontradoChannel = True
lineas[numlinea] = "channel="+str(canaloptimo)+"\n"
if linea[:4] == "ssid":
encontradoSsid = True
lineas[numlinea] = "ssid="+ssid+"\n"
if not encontradoChannel:
lineas.append("channel="+str(canaloptimo)+"\n")
if not encontradoSsid:
lineas.append("ssid="+ssid+"\n")
#Abre el archivo para escritura de datos
archivoEscritura = open(hostapdconf,"w")
archivoEscritura.writelines(lineas)
archivoEscritura.close()
logging.getLogger().debug('Establecido el canal %s con ESSID %s' % (canaloptimo,ssid))



res=inicia_hostapd()

(1-1/3)