+++ /dev/null
-#!/usr/bin/python
-###############################################################################
-# #
-# IPFire.org - A linux based firewall #
-# Copyright (C) 2007 Michael Tremer & Christian Schmidt #
-# #
-# This program 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. #
-# #
-# This program 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 this program. If not, see <http://www.gnu.org/licenses/>. #
-# #
-###############################################################################
-
-import os
-import cgi
-from git import *
-
-def give_404():
- print "Status: 404 Not found"
- print "Pragma: no-cache"
- print "Cache-control: no-cache"
- print "Connection: close"
- print
- os._exit(0)
-
-def give_302():
- print "Status: 302 Moved"
- print "Location: /"
- print "Pragma: no-cache"
- print "Cache-control: no-cache"
- print "Connection: close"
- print
- print
- os._exit(0)
-
-class NotFoundError(Exception):
- pass
-
-class SourceObject:
- def __init__(self, path):
- self.path = path
-
- self.object_type = None
-
- # Init hashes
- self.hash_md5 = None
- self.hash_sha1 = None
-
- def hash(self):
- ## This is for python 2.4.
- #import md5
- #self.hash_md5 = md5.new(self.data()).hexdigest()
-
- import sha
- self.hash_sha1 = sha.new(self.data()).hexdigest()
-
- def data(self):
- return self.filedata
-
- def run(self):
- self.hash()
- self.showhttpheaders()
- print self.data()
-
- def showhttpheaders(self):
- print "Pragma: no-cache"
- print "Cache-control: no-cache"
- print "Connection: close"
- print "Content-type:" + self.mimetype()
- print "Content-length: %s" % len(self.data())
- if self.object_type:
- print "X-Object:" + self.object_type
- if self.hash_md5:
- print "X-MD5:" + self.hash_md5
- if self.hash_sha1:
- print "X-SHA1:" + self.hash_sha1
- print
- # An empty line ends the header
-
-class FileObject(SourceObject):
- def __init__(self, path, version, url="/srv/www/ipfire.org/source/"):
- SourceObject.__init__(self, path)
- self.url= os.path.join(url, "source-%s" % version)
- self.filepath = os.path.join(self.url, path)
- self.init_file()
-
- self.object_type = "FileObject"
-
- def init_file(self):
- try:
- f = open(self.filepath, "rb")
- except:
- raise NotFoundError
-
- self.filedata = f.read()
- f.close()
-
- def mimetype(self):
- default_mimetype = "text/plain"
- from mimetypes import guess_type
- return guess_type(self.filepath)[0] or default_mimetype
-
-class PatchObject(SourceObject):
- def __init__(self, path, url="/srv/git/patches.git"):
- SourceObject.__init__(self, path)
-
- self.object_type = "PatchObject"
-
- self.url = url
- self.init_repo()
-
- def init_repo(self):
- # init the repo
- self.repo = Repository(self.url)
-
- # head, tree & blob
- #self.head = self.repo.head()
- self.tree = self.repo.head.tree
-
- self.blob = self.set_blob()
-
- def set_blob(self):
- blob = None
-
- for directory in self.tree.keys():
- if isinstance(self.tree[directory], Blob):
- continue
- try:
- blob = self.tree[directory][path]
- if blob:
- break
- except KeyError:
- pass
-
- if not blob:
- raise NotFoundError
-
- blob._load()
- self.filedata = blob._contents
- return blob
-
- def mimetype(self):
- return "text/plain" #self.blob.mime_type
-
-# main()
-path = cgi.FieldStorage().getfirst('path')
-ver = cgi.FieldStorage().getfirst('ver')
-
-if not path:
- give_302()
-
-if not ver:
- ver = "3.x"
-
-
-# At first, we assume that the requested object is a plain file:
-try:
- object = FileObject(path=path, version=ver)
-except NotFoundError:
- # Second, we assume that the requestet object is in the patch repo:
- try:
- object = PatchObject(path=path)
- except NotFoundError:
- give_404()
- else:
- object.run()
-else:
- object.run()