#!/usr/bin/env python

import os, stat, errno
import urllib
import datetime
import ConfigParser
import fuse

from fuse import Fuse

fuse.fuse_python_api = (0, 2)

class Stat_Fichero (fuse.Stat):
 def __init__(self):
  self.st_mode = 0
  self.st_ino = 0
  self.st_dev = 0
  self.st_nlink = 0
  self.st_uid = 0
  self.st_gid = 0
  self.st_size = 0
  self.st_atime = 0
  self.st_mtime = 0
  self.st_ctime = 0

class Web ():
 def __init__ (self,url):
  self.url = url

 def html (self):
  self.datos = urllib.urlopen(self.url).read()
  return self.datos

class WebFS(Fuse):

 def getattr(self, path):
  st = Stat_Fichero()
  if path == '/':
   st.st_mode = stat.S_IFDIR | 0755
   st.st_nlink = 2
  elif path in rutas:
   st.st_mode = stat.S_IFREG | 0444
   st.st_nlink = 1
   st.st_size = len(rutas[path].html())
  else:
   return -errno.ENOENT
  return st

 def readdir(self, path, offset):
  lista  = ['.', '..'] + rutas.keys()
  print lista
  for path in  lista:
   yield fuse.Direntry(path)

 def open(self, path, flags):
  if not (path in rutas.keys()):
   return -errno.ENOENT
 
  accmode = os.O_RDONLY | os.O_WRONLY | os.O_RDWR
  if (flags & accmode) != os.O_RDONLY:
   return -errno.EACCES

 def read(self, path, size, offset):
  if not (path in rutas.keys()):
   return -errno.ENOENT

  datos = rutas[path].html()

  slen = len(datos)
 
  if offset < slen:
   if offset + size > slen:
    size = slen - offset
   buf = datos[offset:offset+size]

  else:
   buf = ''

  return buf

def main(rutas):
 uso="""
Sistema de ficheros para webs

""" + Fuse.fusage
 server = WebFS(version="%prog " + fuse.__version__,
      usage=uso,
      dash_s_do='setsingle')

 c = ConfigParser.ConfigParser()

 f = open("/home/josemaria/.urls.ini")
 c.readfp(f)
 
 for fichero,url in c.items('URLS'):
  rutas["/"+fichero]= Web(url)
 
 f.close()

 server.parse(errex=1)
 server.main()

rutas = {}

if __name__ == '__main__':
 main(rutas)
