#!/usr/local/bin/python
# -*- coding: utf-8 -*-

from pyparsing import *
import string
import os
import os.path
import stat
import pwd
import grp

class ParserDSL:

 def __init__(self):

  letras_ruta = alphanums+"/"+"-"+"_"

  # TOKENS
  ficheros = Literal("ficheros").suppress()
  ruta = Word("/",letras_ruta)
  permiso = Word(nums)
  propietario = Word(alphas,alphanums)
  grupo = Word(alphas,alphanums)
  comillas = Literal('"').suppress()
  dospuntos = Literal(':').suppress()

  comprobar_grupo = CaselessLiteral("grupo") + comillas + grupo + comillas
  comprobar_propietario = CaselessLiteral("propietario") + comillas + propietario + comillas
  comprobar_permisos = CaselessLiteral("permisos") + comillas + permiso + comillas

  comprobar_ficheros = ficheros + comillas + ruta  + comillas + dospuntos
  accion = Group( OneOrMore(Group(comprobar_grupo | comprobar_propietario | comprobar_permisos)) )

  expr = Group(comprobar_ficheros + OneOrMore( accion  )).setParseAction( self.Comprueba )
  self.programa = OneOrMore( expr ) + StringEnd()

 def Comprueba(s,l,toks):

  fichero = toks[0][0]
  cmds=  dict(toks[0][1].asList())

  # Convertimos a Octal
  cmds['permisos'] = oct(int(cmds['permisos'],8))
 
  if os.path.exists(fichero):
   fichero_stats = os.stat(fichero)
   print "[Ruta %s]:" % (fichero)
   modo = fichero_stats[stat.ST_MODE]
   datos = { 'permisos': oct(modo & 0777),
    'propietario' : pwd.getpwuid(fichero_stats[stat.ST_UID])[0],
    'grupo' : grp.getgrgid(fichero_stats[stat.ST_GID])[0] }
 
   for comando in cmds.keys():
    if (datos[comando] != cmds[comando]):
     print "\t%s fichero: «%s» => esperados «%s»" % (comando,datos[comando],cmds[comando])
  else:
   print "ERROR: el fichero %s no existe" % (fichero)

  print ""

 def Ejecuta(self, fichero):
  self.programa.parseFile(fichero)

p = ParserDSL()
p.Ejecuta("permisos")
