[Et-mgmt-commits-list] [SCM] virt-factory branch, master now at 38c41af4ae9a7718bd982ac8dc24ac2593598c8f

Máirín Duffy duffy at redhat.com
Wed Jun 6 16:18:15 UTC 2007


Hello,

This is an automated email from the git hooks/update script, it was
generated because a ref change was pushed to the repository.

Updating branch, master,
       via  38c41af4ae9a7718bd982ac8dc24ac2593598c8f (commit)
      from  4c53d869c32be040edb8006ff5ddaa5dc9dcb60c (commit)

- Log -----------------------------------------------------------------
commit 38c41af4ae9a7718bd982ac8dc24ac2593598c8f
Author: Máirín Duffy <duffy at spira.boston.redhat.com>
Date:   Wed Jun 6 12:15:03 2007 -0400

    adding website
-----------------------------------------------------------------------

Diffstat:
 website/about.html                                 |   16 +
 website/communicate.html                           |   18 +
 website/communicate.php                            |   51 ++
 website/components.html                            |   26 +
 website/components.php                             |   45 +
 website/css/style.css                              |  184 ++++
 website/css/style.css~                             |  183 ++++
 website/docs/ump-install-setup.html                |  148 ++++
 website/documentation.html                         |    9 +
 website/documentation.php                          |   44 +
 website/download.html                              |   37 +
 website/download.php                               |   49 ++
 website/faq.html                                   |  120 +++
 website/faq.php                                    |   48 +
 website/feed.php                                   |   31 +
 website/footer.html                                |    3 +
 website/img/current-page.png                       |  Bin
 website/img/logo-cobbler.png                       |  Bin
 website/img/logo-cobblerpng                        |  Bin
 website/img/logo-surfr.png                         |  Bin
 website/img/logo-ump.png                           |  Bin
 website/img/rss_entries.png                        |  Bin
 website/img/screenshot.png                         |  Bin
 website/img/screenshot_full.png                    |  Bin
 website/img/up-arrow.gif                           |  Bin
 website/index.html                                 |  115 +++
 website/index.php                                  |   44 +
 website/magpierss/extlib/Snoopy.class.inc          |  900 ++++++++++++++++++++
 website/magpierss/rss_cache.inc                    |  200 +++++
 website/magpierss/rss_fetch.inc                    |  458 ++++++++++
 website/magpierss/rss_parse.inc                    |  605 +++++++++++++
 website/magpierss/rss_utils.inc                    |   67 ++
 website/nav.html                                   |    7 +
 website/nav.php                                    |   96 +++
 .../busrpc/__init__.py => website/news-feed.php    |    0 
 website/news.html                                  |    1 +
 website/news.php                                   |   70 ++
 website/rss-aggregator.php                         |   73 ++
 website/rss-parser.php                             |  221 +++++
 website/top.html                                   |    3 +
 website/ump-install-setup.php                      |   44 +
 41 files changed, 3916 insertions(+), 0 deletions(-)

diff --git a/website/about.html b/website/about.html
new file mode 100644
index 0000000..ae56b02
--- /dev/null
+++ b/website/about.html
@@ -0,0 +1,16 @@
+<h2>About UMP</h2>
+<h3>Introducing the next generation of systems management</h3>
+
+<a href="img/screenshot_full.png"><img src="img/screenshot.png" style="float: left; margin-right: 10px;" /></a>
+
+<p>There are many systems management tools out there, including many great free and open source tools. These tools are numerous and disparate, however, making it a complex and time-consuming process to select which tools ot use and how to connect the pieces together.</p>
+
+<p>By introducing a set of free and open source tools that adhere to the rules of a common and open platform, the Update & Management Platform (UMP) will make it simpler for system administrators to choose and implement whichever management tools they desire.</p>
+
+<p>Read more about <a href="components.php">our approach to system management</a> and let us know what you think.</p>
+
+<h3>Free to use, developed openly</h3>
+
+<p>Use UMP freely to get your system update and management tasks done. Get involved with the UMP developers or become an UMP developer in UMP's open development community to get your system update and management tasks done <strong>better</strong>.</p>
+
+<p>Your feedback is valuable to us. Let us know which UMP features are most valuable to you, which ones are not, and which ones you'd like to see. Become an UMP developer and help us reach our vision. Either way, we'd love to hear from you.</p>
diff --git a/website/communicate.html b/website/communicate.html
new file mode 100644
index 0000000..e35cc2e
--- /dev/null
+++ b/website/communicate.html
@@ -0,0 +1,18 @@
+<h3>Mailing List</h3>
+
+<p>Send comments, questions, patches, and suggestions to the <a href="https://www.redhat.com/mailman/listinfo/et-mgmt-tools">et-mgmt-tools mailing list</a>. You can send mail even if you aren't a list member. This is a community project, so if you feel like contributing, download the source, check it out, and join the list.</p>
+
+<ul>
+<li>Mailing List Signup Form: <a href="https://www.redhat.com/mailman/listinfo/et-mgmt-tools">https://www.redhat.com/mailman/listinfo/et-mgmt-tools</a></li>
+<li>Mailling List Archives: <a href="https://www.redhat.com/archives/et-mgmt-tools/">https://www.redhat.com/archives/et-mgmt-tools/</a></li>
+<li>gmane.org RSS feed of et-mgmt-tools: <a href="http://blog.gmane.org/gmane.linux.redhat.et-mgmt-tools"><img src="img/rss_entries.png" alt="rss entries" style="vertical-align: middle;"></a></li>
+</ul>
+<h3>Internet Relay Chat (IRC)</h3>
+<p>There are a couple of UMP-related IRC channels on <strong><a href="http://www.freenode.net/">irc.freenode.net</a></strong>:</p>
+<ul>
+<li><strong>#ump</strong> - for general UMP discussion.</li>
+<li><strong>#cobbler</strong> - for discussion of <a href="components.php">cobbler</a>.</li>
+</ul>
+
+<p> If no one seems to be responding to your requests in IRC, feel free to ask your questions on the mailing list. (It's quite common for IRC users to 'idle' their nicks in a channel so they can catch up on any conversation they missed later on.)</p>
+<p class="note"><strong>Note:</strong> irc.freenode.net has an IRC 'nick' (nickname, the name you go by in chat) registration system. Some irc.freenode.net channels require that you identify with the server every time you log in. This identification is also required for private messages on the network (no, they're not ignoring you; you probably just haven't identified with the registration system!) For more information, please consult <a href="http://freenode.net/faq.shtml#contents-userregistration">the Freenode Frequently-Asked Questions page on user registration</a>.</p>
diff --git a/website/communicate.php b/website/communicate.php
new file mode 100755
index 0000000..2c4371f
--- /dev/null
+++ b/website/communicate.php
@@ -0,0 +1,51 @@
+<?php
+  $current_page = 'communicate';
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="description" content="" />
+<meta name="keywords" content="" />
+<title>UMP: Update and Management Platform</title>
+
+  <link rel="stylesheet" href="css/style.css" type="text/css" media="all" />
+</head>
+
+<body>
+<div id="wrap">
+<?php 
+  include("top.html"); 
+?>
+
+<div id="main">
+ <div id="sidebar">
+<?php 
+  include("nav.php"); 
+?>
+<?php 
+  include("feed.php"); 
+?>
+ </div>
+
+<div id="content">
+
+<h2>Communicate</h2>
+
+<?php
+  include('communicate.html');
+?>
+
+</div>
+</div>
+<div id="footer">
+<?php 
+  include("footer.html"); 
+?>
+</div>
+</div>
+</body>
+</html>
diff --git a/website/components.html b/website/components.html
new file mode 100644
index 0000000..46abf54
--- /dev/null
+++ b/website/components.html
@@ -0,0 +1,26 @@
+<h2>Components</h2>
+
+<h3>The 'Component' Philosophy</h3>
+<p>UMP is a <strong>platform</strong> upon which different tools may be developedi and can then communicate with each other. This is because we understand that by nature system administration involves hetereogenous environments and a one-size-fits-all, monolithic approach to management tools does not work well in these environments.</p>
+<p>Our goal is for this platform to be easily extensible, so that if it doesn't quite meet your needs in some way, you can easily add on whatever functionality you need to get your job done.</p>
+<p>UMP is of course in the very early stages of development, so some of the components listed here may not be complete or even started yet. Check back on this page to check on their progress!</p>
+
+<h3>The Components</h3>
+
+<h4>Cobbler</h4>
+<img src="img/logo-cobbler.png" />
+<p>Cobbler is a <strong>Linux provisioning configuration tool</strong> that enables administrators to rapidly set up environments for (simultaneously) provisioning PXE, installing virtualized images, and re-provisioning existing machines. Set up of a PXE server, once a very manual process, is now greatly simplified. Cobbler also enables integrating virtualization into a PXE provisioning infrastructure and provides some interesting options to reinstall running machines as well.</p>
+<ul>
+<li><a href="http://cobbler.et.redhat.com/">Cobbler website</a></li>
+<li><a href="http://git.et.redhat.com/?p=virt-factory.git;a=tree">Cobbler git repository</a></li>
+<li>Discuss cobbler on the <a href="http://www.redhat.com/mailman/listinfo/et-mgmt-tools">et-mgmt-tools at redhat.com mailing list</a>.</li>
+</ul>
+
+<h4>surfr</h4>
+<img src="img/logo-surfr.png" />
+<p>surfr will be a <strong>software channel management tool</strong>. The goal of surfr is to make it easier to create repos, add software to them, mirror existing ones, and to merge them together. It will also support virtual repositories, which allow systems to recieve controlled access to multiple repositories through a single (as visible to yum) repository.</p>
+<ul>
+<li><a href="http://et.redhat.com/page/Surfr_Wiki">surfr on the et.redhat.com wiki</a></li>
+<li><a href="http://git.et.redhat.com/?p=surfr.git;a=summary">surfr git repository</a></li>
+<li>Discuss surfr on the <a href="http://www.redhat.com/mailman/listinfo/et-mgmt-tools">et-mgmt-tools at redhat.com mailing list</a>.</li>
+</ul>
diff --git a/website/components.php b/website/components.php
new file mode 100755
index 0000000..235f519
--- /dev/null
+++ b/website/components.php
@@ -0,0 +1,45 @@
+<?php
+  $current_page = 'components';
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="description" content="" />
+<meta name="keywords" content="" />
+<title>UMP: Update and Management Platform</title>
+
+  <link rel="stylesheet" href="css/style.css" type="text/css" media="all" />
+</head>
+
+<body>
+<div id="wrap">
+<?php 
+  include("top.html"); 
+?>
+
+<div id="main">
+ <div id="sidebar">
+<?php 
+  include("nav.php"); 
+?>
+ </div>
+
+<div id="content">
+<?php 
+  include("components.html"); 
+?>
+</div>
+
+</div>
+
+<div id="footer">
+<?php 
+  include("footer.html"); 
+?>
+</div>
+</div>
+</body>
+</html>
diff --git a/website/css/style.css b/website/css/style.css
new file mode 100644
index 0000000..1d43324
--- /dev/null
+++ b/website/css/style.css
@@ -0,0 +1,184 @@
+body, html {
+  background-color: black;
+  margin: 0;
+  padding: 0;
+}
+
+body {
+  min-width: 750px;
+}
+
+img {
+  border: none;
+}
+
+/* site-wide font specifications */
+
+body, ul, li, p, h1, h2, h3 {
+  font-family: "Liberation Sans", "Helvetica", "Luxi Sans", "Bitstream Vera Sans", sans-serif;
+  color: white;
+}
+
+ul {
+  list-style-type: square;
+}
+
+#sidebar {
+  height: auto;
+  float: left;
+}
+
+#sidebar p, #sidebar h2 {
+  margin-left: 24px;
+}
+
+ul#nav {
+  text-transform: uppercase;
+  letter-spacing: -.05em;
+  list-style-type: none;
+  font-family: "URW Gothic", "Liberation Sans", "Helvetica", "Luxi Sans", "Bitstream Vera Sans", sans-serif;
+}
+
+ul#nav li a {
+  color: #59cbe1;
+  text-decoration: none;
+}
+
+ul#nav li#active {
+  list-style-image: url('../img/current-page.png');
+}
+
+ul#nav li#active a, ul#nav li#active a:link, ul#nav li#active a:visited {
+  color: white;
+}
+
+div#feed {
+  width: 160px;
+  font-size: small;
+  margin-top: 28px;
+  margin-bottom: 50px;
+  border-top: 1px solid #444;
+  padding-top: 5px;
+}
+
+div#feed ul {
+  font-size: x-small;
+}
+
+
+#wrap {
+  min-width: 750px;
+  margin: 0px 3%;
+  padding-top: 12px;
+}
+
+div#main {
+  background-color: #212121;
+  border-top: 1px solid #59cbe1;
+  border-bottom: 1px solid #59cbe1;
+  overflow: auto;
+  padding: 20px 0px;
+}
+
+div#content {
+  width: 70%;
+  float: right;
+  padding: 0px 24px;
+}
+
+div#content h1 {
+  font-size: x-large;
+  font-weight: normal;
+}
+
+div#content h2 {
+  font-size: medium;
+  font-weight: 900;
+  text-transform: uppercase;
+}
+
+div#content h3 {
+  color: #59cbe1;
+}
+
+
+div#content p {
+  font-size: small;
+  color: #ccc;
+}
+
+a:link {
+  color: #59cbe1;
+}
+
+a:hover {
+  color: white;
+}
+
+a:visited {
+  color: #99d9e8;
+}
+
+
+#content p.metadata {
+  font-size: x-small;
+  color: white;
+}
+
+dt {
+  font-weight: 900;
+  margin-bottom: 1em;
+}
+
+dd {
+  color: #ccc;
+  margin-bottom: 2em;
+}
+
+.back-to-top {
+  background: url('../img/up-arrow.gif') left no-repeat;
+  padding-left: 20px;
+  font-size: small;
+}
+
+blockquote {
+  border-top: 1px solid #ccc;
+  border-bottom: 1px solid #ccc;
+  background: #444;
+  padding: 2px 4px;
+}
+
+p.note, p.tip {
+  margin: 16px 8px;
+  padding: 8px 12px;
+  color: white !important;
+  background-color: #666;
+  -moz-border-radius: 10px;
+}
+
+p.note strong, p.tip strong {
+  font-size: 120%;
+}
+
+tt {
+  font-size: 130%;
+  font-weight: 700;
+}
+
+#faq, #toc {
+  border-top: 1px solid #ccc;
+  border-bottom: 1px solid #ccc;
+  background: #444;
+  padding-top: 12px;
+  padding-bottom: 16px;
+  padding-left: 30px;
+}
+
+#footer {
+  width: 100%;
+  font-size: x-small;
+  color: #aaa;
+  text-align: center;
+  padding-top: 16px;
+  padding-bottom: 16px;
+}
diff --git a/website/css/style.css~ b/website/css/style.css~
new file mode 100644
index 0000000..f1e9b08
--- /dev/null
+++ b/website/css/style.css~
@@ -0,0 +1,183 @@
+body, html {
+  background-color: black;
+  margin: 0;
+  padding: 0;
+}
+
+body {
+  min-width: 750px;
+}
+
+img {
+  border: none;
+}
+
+/* site-wide font specifications */
+
+body, ul, li, p, h1, h2, h3 {
+  font-family: "Liberation Sans", "Helvetica", "Luxi Sans", "Bitstream Vera Sans", sans-serif;
+  color: white;
+}
+
+ul {
+  list-style-type: square;
+}
+
+#sidebar {
+  height: auto;
+  float: left;
+}
+
+#sidebar p, #sidebar h2 {
+  margin-left: 24px;
+}
+
+ul#nav {
+  text-transform: uppercase;
+  letter-spacing: -.05em;
+  list-style-type: none;
+  font-family: "URW Gothic", "Liberation Sans", "Helvetica", "Luxi Sans", "Bitstream Vera Sans", sans-serif;
+}
+
+ul#nav li a {
+  color: #59cbe1;
+  text-decoration: none;
+}
+
+ul#nav li#active {
+  list-style-image: url('../img/current-page.png');
+}
+
+ul#nav li#active a, ul#nav li#active a:link, ul#nav li#active a:visited {
+  color: white;
+}
+
+div#feed {
+  width: 160px;
+  font-size: small;
+  margin-top: 28px;
+  margin-bottom: 50px;
+  border-top: 1px solid #444;
+  padding-top: 5px;
+}
+
+div#feed ul {
+  font-size: x-small;
+}
+
+
+#wrap {
+  min-width: 750px;
+  margin: 0px 3%;
+  padding-top: 12px;
+}
+
+div#main {
+  background-color: #212121;
+  border-top: 1px solid #59cbe1;
+  border-bottom: 1px solid #59cbe1;
+  overflow: auto;
+  padding: 20px 0px;
+}
+
+div#content {
+  width: 70%;
+  float: right;
+  padding: 0px 24px;
+}
+
+div#content h1 {
+  font-size: x-large;
+  font-weight: normal;
+}
+
+div#content h2 {
+  font-size: medium;
+  font-weight: 900;
+  text-transform: uppercase;
+}
+
+div#content h3 {
+  color: #59cbe1;
+}
+
+
+div#content p {
+  font-size: small;
+  color: #ccc;
+}
+
+a:link {
+  color: #59cbe1;
+}
+
+a:hover {
+  color: white;
+}
+
+a:visited {
+  color: #99d9e8;
+}
+
+
+#content p.metadata {
+  font-size: x-small;
+  color: white;
+}
+
+dt {
+  font-weight: 900;
+  margin-bottom: 1em;
+}
+
+dd {
+  color: #ccc;
+  margin-bottom: 2em;
+}
+
+.back-to-top {
+  background: url('../img/up-arrow.gif') left no-repeat;
+  padding-left: 20px;
+  font-size: small;
+}
+
+blockquote {
+  border-top: 1px solid #ccc;
+  border-bottom: 1px solid #ccc;
+  background: #444;
+  padding: 2px 4px;
+}
+
+p.note, p.tip {
+  margin: 16px 8px;
+  padding: 8px 12px;
+  color: white !important;
+  background-color: #666;
+  -moz-border-radius: 10px;
+}
+
+p.note strong, p.tip strong {
+  font-size: 120%;
+}
+
+tt {
+  font-size: 130%;
+}
+
+#faq, #toc {
+  border-top: 1px solid #ccc;
+  border-bottom: 1px solid #ccc;
+  background: #444;
+  padding-top: 12px;
+  padding-bottom: 16px;
+  padding-left: 30px;
+}
+
+#footer {
+  width: 100%;
+  font-size: x-small;
+  color: #aaa;
+  text-align: center;
+  padding-top: 16px;
+  padding-bottom: 16px;
+}
diff --git a/website/docs/ump-install-setup.html b/website/docs/ump-install-setup.html
new file mode 100644
index 0000000..15d2758
--- /dev/null
+++ b/website/docs/ump-install-setup.html
@@ -0,0 +1,148 @@
+<a name="toc">
+<h2>Update & Management Platform (UMP) Installation & Setup Guide</h2>
+</a>
+<p>A printer-friendly version of this guide is available:<br /> <a href="http://spira.boston.redhat.com/projects/nextgen/vf_website/docs/ump-install-setup.html">Update & Management Platform (UMP) Installation & Setup Guide: Printer-Friendly Version</a>.</p>
+<h3>Table of Contents</h3>
+<ul id="toc">
+<li><a href="#about">About this Document</a></li>
+<li><a href="#requirements">Before You Start: Requirements</a></li>
+<li><a href="#getrpms">Getting the RPMs</a></li>
+<li><a href="#installmgmtserver">Installing the Management Server</a></li>
+<li><a href="#loggingin">Logging In</a></li>
+<li><a href="#addphyssystem">Registering Physical Systems to the Server</a></li>
+<li><a href="#viewprofiles">Viewing Imported Profiles</a></li>
+<li><a href="#deploymanageguests">Deploying and Managing Virtual Guest Systems</a></li>
+<li><a href="#createprofile">Creating Profiles</a></li>
+<li><a href="#schemadbupgrade">Upgrading the Database and Schema</a></li>
+<li><a href="#additionalnotes">Additional Notes</a></li>
+</ul>
+
+<a name="about">
+<h3>About this Document</h3>
+</a>
+<p>This document explains how to install and set up a basic installation of Update & Management Platform (UMP).
+</p>
+<p><a href="#toc" class="back-to-top">Back to top</a></p>
+
+<a name="requirements">
+<h3>Before You Start: Requirements</h3>
+</a>
+<h4>For the UMP Management Server:</h4>
+<p>Currently you will need a system running Fedora Core 6 to most easily install and setup an UMP management server. We recommend using a 32-bit system.</p>
+<p class="note">You may also install an UMP management server using our <a href="download.php">source tarballs or our git code respository</a>. Using these methods you may install the server on a Fedora Core 6, Fedora Core 7, or Red Hat Enterprise Linux 5 system (32-bit x86 or 64-bit x86_64.) However, these instructions currently refer to using a yum repository which currently only supports Fedora Core 6 x86.</p>
+<p>You will also need access to one of the <a href="http://mirrors.fedoraproject.org/publiclist/Fedora/6/<">Fedora Core 6 public rsync mirrors</a> or a DVD ISO of Fedora Core 6, Fedora 7, or Red Hat Enterprise Linux 5 to enable the server to provision new guest systems.</p>
+<h4>For systems registering to the UMP Management Server:</h4>
+<p>You will need at least one additional system to register to the UMP management server. Currently UMP supports client systems running Fedora Core 6, Fedora 7, or Red Hat Enterprise Linux 5 on 32-bit x86 or 64-bit x86_64 hardware.</p>
+<p><a href="#toc" class="back-to-top">Back to top</a></p>
+
+<a name="getrpms">
+<h3>Getting the RPMs</h3>
+</a>
+<p>Prebuilt RPMs are available for Fedora Core 6. You may configure your system to use this repository by running the following command:</p>
+<blockquote>wget http://virt-factory.et.redhat.com/download/repo/virt-factory.repo --output-document=/etc/yum.repos.d/virt-factory.repo</blockquote>
+<p>We will install specific packages from this repository in the steps that follow.</p>
+<p><a href="#toc" class="back-to-top">Back to top</a></p>
+
+<a name="installmgmtserver">
+<h3>Installing the Management Server</h3>
+</a>
+<h4>Installing the Management Server Package</h4>
+<p>Run the following command on the system you would like to setup as an UMP management server:</p>
+<blockquote>yum install virt-factory-server</blockquote>
+<h4>Setting Up Mirrors For Virtual Guest Deployment</h4>
+<p>As root, edit the <tt>/etc/virt-factory/settings</tt> file to include the address of a public rsync mirror for Fedora Core 6, or otherwise change the path to point to where you have a DVD or the DVD ISO mounted. This path settings will allow UMP to import a distribution mirror for use in installing virtual systems.</p>
+
+<p class="note"><strong>Note:</strong> A list of current public mirrors of Fedora Core 6, including rsync mirrors, is available here: <a href="http://mirrors.fedoraproject.org/publiclist/Fedora/6/">http://mirrors.fedoraproject.org/publiclist/Fedora/6/</a>.<br /><br />We recommend that you import Fedora Core 6 as this is the operating system we provide pre-built profiles for. If you import something else, you will need to create a profile for it before you can deploy a virtual guest using it.</p>
+</p>
+<p class="tip"><strong>Tip:</strong> You might find the following redhat.com Knowledgebase article helpful in mounting a Fedora DVD ISO: <a href="http://kbase.redhat.com/faq/FAQ_80_4633.shtm">Article #4633 - How do I view the contents of a .iso file?</a></p>
+<h4>Configuring Management Server IP Address</h4>
+<p>In <tt>/etc/virt-factory/settings</tt>, you should also configure the server address ("this_server") at this time. Do not leave it as 127.0.0.1 - replace that value with your server's IP address.</p>
+<h4>Starting Management Server Services</h4>
+<p>Now we're ready to start the puppetmaster service:</p>
+<blockquote>sudo /sbin/service puppetmaster start</blockquote>
+<p>You will probably also want to change the parameters for the puppetmaster, apache, and virt-factory services so they start automatically when the system starts.</p>
+<p class="tip"><strong>Tip:</strong> You might find the following redhat.com Knowledgebase article helpful in configuring these services for automatic startup on boot: <a href="http://kbase.redhat.com/faq/FAQ_43_4407.shtm">Article #4407 - What is an initscript service and how do I start and stop it?</a></p>
+<p>Now, start the virt-factory service:</p>
+<blockquote>sudo vf_server import</blockquote>
+<p class="tip"><strong>Tip:</strong> The import operation will take a while for the rsync to complete.</p>
+<p>Finally, make sure ntpd is running on your server. This service is required for system provisioning, as the kickstarts use ntpdate to perform an initial time sync for provisioned systems.</p>
+<h4>Importing Profiles</h4>
+<p>Now you'll want to import some profiles to deploy to machines. To do this, you'll first of course need to find some profile files. We have some samples profiles available at: <a href="http://virt-factory.et.redhat.com/download/profiles">http://virt-factory.et.redhat.com/download/profiles</a>.</p>
+<p>We recommend that you download all of our sample profiles for starters. You can make your own profiles later if you want. For each profile you wish to deploy, run:</p>
+<blockquote>sudo vf_import <em>/path/to/profile.tar.gz</em></blockquote>
+<h4>Set Up the UMP Management Server Web Interface</h4>
+<p>You'll need to install and start the web interface on the UMP management server using the following commands:</p>
+<blockquote>sudo yum install virt-factory-wui</blockquote>
+<blockquote>sudo /sbin/service virt-factory-wui start</blockquote>
+<p>You will be able to access the web interface by visiting <tt>http://www.example.com/vf/</tt>, where <tt>www.example.com</tt> is your server's actual IP address or domain name.</p>
+<p class="tip"><strong>Tip:</strong> You may also wish to configure the web interface to start automatically on reboot.</p>
+<h4>Management Server Security Configuration</h4>
+<h5>Firewall</h5>
+<p>If you're running iptables you will need to open up access to the ports required for HTTP/HTTPS, the xmlrpc ports for virt-factory-server and cobbler, and the puppetmaster port. <tt>/usr/bin/vf_config_firewall</tt> will open up these ports, although without any local host-specific restrictions.</p>
+<h5>SELinux</h5>
+<p>SELinux has a known interference problem with Mongrel, which we use to power the web interface, so in the meantime, SELinux needs to be put into permissive mode. We are currently looking into making this work better with SELinux.</p>
+<p class="tip"><strong>Tip:</strong> The following redhat.com Knowledgebase article has more information on configuring SELinux permissive mode: <a href="http://kbase.redhat.com/faq/FAQ_93_5143.shtm">Article #5143 - How do I enable enforcing or permissive mode for SELinux?</a></p>
+<p><a href="#toc" class="back-to-top">Back to top</a></p>
+<a name="loggingin">
+<h3>Logging In</h3>
+</a>
+<p>The default username and password for the UMP Management Server web interface are the following:</p>
+<ul>
+<li><strong>Username:</strong> admin</li>
+<li><strong>Password:</strong> fedora</li>
+</ul>
+<p>You'll want to change this in the user options after you log into the web interface. (Later we may support fancier authentication schemes.)</p> 
+<p><a href="#toc" class="back-to-top">Back to top</a></p>
+<a name="addphyssystem">
+<h3>Registering Virtual Host Systems to the Server</h3>
+</a>
+<p>You'll want to add some systems that can serve as virtual hosts. Consider these machines part of your "machine farm". There are two ways to do this, all of which should be available in the fairly minimalistic web interface.</p>
+<h4>Registering Virtual Host Systems via PXE Provisioning</h4>
+<p>The easiest way to register a physical host system to the UMP management server is to use the "add a machine for PXE" item in the web interface. Type in a MAC address in the web form, and select a profile for the system to run after it PXE boots. Most likely, you'll want to pick the "Container" profile (available from our <a href="download.php">download page</a>), because that profile means "This machine is going to run managed virtual guests". In fact, when assigning profiles to machines, always pick the "Container" profile. It will keep things simple.</p>
+<p>To make PXE work, your dhcp server will need to specify that the address of the virt-factory management server is the "next-server" for that particular machine.</p>
+<h4>Registering Virtual Host Systems using a Registration Token on an pre-installed System</h4>
+<p>If you do not have access to your dhcp server to setup PXE, another option you have for registering virtual host systems is the registration token feature of UMP. This will involve installing client software and running a registration script on an already-installed system. This system must be running <a href="#requirements">one of the operating systems required for an UMP-registered system</a>. Also, you'll need to make sure that the system is running a xen kernel so you may deploy virtual guest system on it.</p>
+<p class="tip">To check if your system is running a xen kernel, run <tt>uname -a</tt>. In the output of that command, check to make sure the kernel has the string 'xen' in it. If not, you'll need to reboot the system into a xen kernel before attempting to provision guests on it.</p>
+<p>Generate a registration token with the "Machines/Create Registration Token" option in the web interface and specify that you want it to be a registration token for the "Container" profile you imported earlier. Then, on an existing installed system run the following commands (where 'www.example.com' is the IP address or hostname of your UMP management server):</p>
+<blockquote>yum install virt-factory-nodes<br />
+   vf_register --serverurl=http://www.example.com:5150 --token=tokenvalue<br />
+   /sbin/service start vf-node-server
+</blockquote>
+<p>Now that system show up as managed in the UMP management server web interface. You are now ready (assuming you just configured it as a "Container" machine, to deploy virtualized systems running specific profiles.</p>
+<p><a href="#toc" class="back-to-top">Back to top</a></p>
+<a name="viewprofiles">
+<h3>Viewing Imported Profiles</h3>
+</a>
+<p>Click on the "Profiles" item in the web interface navbar and then choose the option to list profiles. Here you will see all of the various profiles you've imported that are available for deploying systems. You should already see the container profile you have used earlier, plus some additional ones. If you write your own, or download them from others, you can run <tt>vf_import</tt> on the management server as listed above to see them appear here.</p>
+<p><a href="#toc" class="back-to-top">Back to top</a></p>
+<a name="deploymanageguests">
+<h3>Deploying and Managing Virtual Guest Systems</h3>
+</a>
+<p>Under the "Deployments" item in the web interface navbar, choose the "Add" item. Pick a system to host the virtual guest and choose which profile you would like to deploy onto the guest. The guest system will begin installing and will appear in the "creating" state until its installation is finished.</p>
+<p>Go back to the deployment list and you can verify the system's state is shown to be in the "creating" state. An install from a local mirror will probably take 10-30 minutes approximately, depending on the profile used and machine/network speeds.</p>
+<p>When finished, the guest will be listed as being in the "created" state.</p>
+<p>Once an install is complete, you can click the "edit" link in the list tab to perform basic virtual system management operations on the deployment. You can pause and unpause the machine, start it, and shut it down.</p>
+<p class="note"><strong>Note:</strong> Virtual machine migrations aren't yet supported, but they will be in a future release.</p>
+<p><a href="#toc" class="back-to-top">Back to top</a></p>
+<a name="createprofile">
+<h3>Creating Profiles</h3>
+</a>
+<p>We have made some sample profiles available on our <a href="download.php">download page</a>.</p>
+<p>You may wish to refer to the <a href="http://et.redhat.com/page/VF_Profile_Format">UMP Profile Format</a> documentation. Follow the same format (XML file + puppet files and manifests) to create your own profiles for how your servers should run and be set up. Our Test1 profile is as minimalistic as it gets, and it's possible to create much more tailored profiles, including ones that set up web servers, application servers, and so forth - and keep them configured - using puppet.</p>
+<p><a href="#toc" class="back-to-top">Back to top</a></p>
+<a name="schemadbupgrade">
+<h3>Upgrading the Database and Schema</h3>
+</a>
+<p>Schema upgrades are supported if the upgraded distribution contains the vf_upgrade_db script. In order to upgrade the database to the latest package update, all you need to do to is run the upgrade script with no arguments:</p>
+<blockquote>vf_upgrade_db</blockquote>
+<p>Running this command will apply any required sql upgrade scripts for one or more version upgrades. If no upgrade is required, running vf_upgrade_db will have no effect.</p>
+<blockquote>vf_upgrade_db -qp</blockquote>
+<p>In order to query the loaded(database) schema version, run:</p>
+<blockquote>vf_upgrade_db -qd</blockquote>
+<p>Please see the <a href="http://et.redhat.com/page/Schema_Upgrades">Schema Upgrades page</a> on our wiki for more details on the internal workings of the upgrade functionality.</p>
+<p><a href="#toc" class="back-to-top">Back to top</a></p>
+<a name="additionalnotes">
+<h3>Additional Notes</h3>
+</a>
+<p>If you have corrections or clarifications for this page, please share them with <a href="mailto:et-mgmt-tools at redhat.com">et-mgmt-tools at redhat.com</a>.</p>
+<p><a href="#toc" class="back-to-top">Back to top</a></p>
diff --git a/website/documentation.html b/website/documentation.html
new file mode 100644
index 0000000..8bf858a
--- /dev/null
+++ b/website/documentation.html
@@ -0,0 +1,9 @@
+<h2>Documentation</h2>
+
+<h3>Available Documents</h3>
+
+<p>The following documentation and guides are available for UMP:</p>
+
+<ul>
+<li><a href="ump-install-setup.php">UMP Installation & Setup Guide</a></li>
+</ul>
diff --git a/website/documentation.php b/website/documentation.php
new file mode 100755
index 0000000..63ba719
--- /dev/null
+++ b/website/documentation.php
@@ -0,0 +1,44 @@
+<?php
+  $current_page = 'documentation';
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="description" content="" />
+<meta name="keywords" content="" />
+<title>UMP: Update and Management Platform</title>
+
+  <link rel="stylesheet" href="css/style.css" type="text/css" media="all" />
+</head>
+
+<body>
+<div id="wrap">
+<?php 
+  include("top.html"); 
+?>
+
+<div id="main">
+ <div id="sidebar">
+<?php 
+  include("nav.php"); 
+?>
+ </div>
+
+<div id="content">
+<?php 
+  include("documentation.html"); 
+?>
+
+</div>
+</div>
+<div id="footer">
+<?php 
+  include("footer.html"); 
+?>
+</div>
+</div>
+</body>
+</html>
diff --git a/website/download.html b/website/download.html
new file mode 100644
index 0000000..bd3d0f1
--- /dev/null
+++ b/website/download.html
@@ -0,0 +1,37 @@
+<p>UMP is licensed under the <a href="http://www.gnu.org/copyleft/gpl.html">General Public License (GPL)</a>.</p>
+
+<h3>Download UMP Management Server Software</h3>
+
+<h4>Latest Source</h4>
+<p>The latest source code (Python and Ruby-on-Rails) is available through git:</p>
+
+<blockquote>
+git clone git://et.redhat.com/virt-factory
+</blockquote>
+
+<h4>Pre-packaged Release via the UMP Repository</h4>
+<p>Prebuilt RPMs are available for Fedora Core 6. You may configure your system to use this repository by running the following command:</p>
+
+<blockquote>
+wget http://virt-factory.et.redhat.com/download/repo/virt-factory.repo --output-document=/etc/yum.repos.d/virt-factory.repo
+</blockquote>
+
+<p>After running the above command, follow the installation instructions in our install guide to install from this repository.
+</p>
+
+<h4>Prepackaged Release via Source Tarball</h4>
+
+<p>Source tarballs are available for the latest stable release at the following location:</p>
+<ul>
+<li> <a href="http://virt-factory.et.redhat.com/download/src/">http://virt-factory.et.redhat.com/download/src/</a></li>
+</ul>
+<h3>Installing UMP</h3>
+<p>You'll probably want to read the <a href="ump-install-setup">installation and setup guide</a>. Also see the rest of the <a href="http://et.redhat.com/page/Virt-Factory_Wiki">UMP wiki</a> for descriptions of ongoing work, what's not finished yet, and future plans.</p>
+
+<h3>Downloading System Profiles</h3>
+<p>In order to provision systems using UMP, you'll need to load system profiles into the UMP Management Server to determine the configuration of deployed clients. We've provided some sample profiles for you to start with below. Have you come up with a good profile? Please feel free to <a href="communicate.php">share it with us</a>!</p>
+<ul>
+<li><a href="http://virt-factory.et.redhat.com/download/profiles/container.tar.gz">Container Profile</a> - a generic profile for virtual host systems.</li>
+<li><a href="http://virt-factory.et.redhat.com/download/profiles/test1.tar.gz">test1 Profile</a> - a sample profile for an x86-based virtual guest.</li>
+<li><a href="http://virt-factory.et.redhat.com/download/profiles/test1-x86_64.tar.gz">test1-x86_64 Profile</a> - a sample profile for a x86_64 virtual guest system.</li>
+</ul>
diff --git a/website/download.php b/website/download.php
new file mode 100755
index 0000000..f33b7d6
--- /dev/null
+++ b/website/download.php
@@ -0,0 +1,49 @@
+<?php
+  $current_page = 'download';
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="description" content="" />
+<meta name="keywords" content="" />
+<title>UMP: Update and Management Platform</title>
+
+  <link rel="stylesheet" href="css/style.css" type="text/css" media="all" />
+</head>
+
+<body>
+<div id="wrap">
+<?php 
+  include("top.html"); 
+?>
+
+<div id="main">
+
+<div id="sidebar">
+<?php 
+  include("nav.php"); 
+?>
+</div>
+
+<div id="content">
+
+<h2>Download</h2>
+
+<?php
+  include('download.html');
+?>
+
+</div>
+</div>
+<div id="footer">
+<?php 
+  include("footer.html"); 
+?>
+</div>
+</div>
+</body>
+</html>
diff --git a/website/faq.html b/website/faq.html
new file mode 100644
index 0000000..ccb1c3c
--- /dev/null
+++ b/website/faq.html
@@ -0,0 +1,120 @@
+<a name="questions">
+<h3>Questions</h3>
+</a>
+<ul id="faq">
+<li><a href="#whatis">What is UMP?</a></li>
+<li><a href="#requiments">What do I need to run UMP?</a></li>
+<li><a href="stability">How stable is UMP?</a></li>
+<li><a href="#architecture">What kind of architecture does UMP have?</a></li>
+<li><a href="#targetuser">Who is the target user of UMP?</a></li>
+<li><a href="#virtualization">How does UMP work with virtualization?</a></li>
+<li><a href="#appliances">How does UMP work with appliances?</a></li>
+<li><a href="#puppet">How does UMP use puppet?</a></li>
+<li><a href="#deployment">How are systems deployed using UMP?</a></li>
+<li><a href="#monitoring">What about monitoring?</a></li>
+<li><a href="#roadmap">What about the future roadmap?</a></li>
+<li><a href="#profile-build">How do I build profiles (appliances)?</a></li>
+<li><a href="#contribute">How can I contribute?</a></li>
+</ul>
+
+<h3>Answers</h3>
+
+<a name="whatis">
+<dt>What is UMP?</dt>
+</a>
+ <dd>UMP is a set of free and open source system management tools. The UMP platform is a free and open source platform upon which management tools can be built.
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+<a name="requirements">
+<dt>What do I need to run UMP?</dt>
+</a>
+ <dd>UMP is currently supported on Fedora Core 6. Fedora 7 and Red Hat Enterprise Linux 5 support will be released shortly.
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+<a name="stability">
+<dt>How stable is UMP?</dt>
+</a>
+ <dd>UMP is currently an alpha-level project with a fast-paced rate of development.
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+<a name="architecture">
+<dt>What kind of architecture does UMP have?</dt>
+</a>
+ <dd>UMP provides a central server for managing physical systems (including virtual hosts) and virtual guests. The server exposes an XMLRPC API that is used by the web user interface, and can also be used by custom scripts. On 'managed' systems, a special "node daemon" is installed, which is used to communicate with the central server over secure XMLRPC.
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+
+<a name="targetuser">
+<dt>Who is the target user of UMP?</dt>
+</a>
+ <dd>We are currently targeting developers who want to be involved in new systems management technology as well as system administrators wishing to run a large number of virtual systems that have a key interest in virtualization and system recipes / appliance concepts.
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+
+<a name="virtualization">
+<dt>How does UMP work with virtualization?</dt>
+</a>
+ <dd>Virtualization plays a core role in UMP and is heavily integrated. The software takes care of the nuts and bolts and can entirely manage your virtualization, though logging into virtualization via xm and virsh is still supported.
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+
+<a name="appliances">
+<dt>How does UMP work with appliances?</dt>
+</a>
+ <dd>Appliances can be defined purely as metadata ('profiles') rather than binary blobs. The metadata describes the required virtual machine 9number of processors, memory etc.), the base system installation (as a kickstart file), and the appliance's 'personality' as a puppet manifest. this makes it possible to distribute appliances easily, and allows endusers to adapt appliances to their needs while still being able to consume appliance updates.
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+
+<a name="puppet">
+<dt>How does UMP use puppet?</dt>
+</a>
+ <dd>Puppet is a core feature of our system recipes. Puppet is used to specify what a particular virtual or bare metal machine should have installed and how it is configured. However, since the puppet information is contained within the profile, it's not required that users of profiles have to understand Puppet. Authors of profiles definitely do though. We'll be working on more tools later, though cft is a great starting point.
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+
+<a name="deployment">
+<dt>How are systems deployed using UMP?</dt>
+</a>
+ <dd>UMP uses cobbler as an internal library for provisioning. This means that if you have a datacenter and get new machines "off the truck", you'll be able to walk up to a machine and pick a "profile" for that machine to run, and provision it on the spot from a PXE menu. Virtualization management is there too. However, UMP takes over a cobbler server completely, so no knowledge of Cobbler or cobbler commands is required. In fact, you can't run UMP on your existing cobbler server. Sorry :)
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+
+<a name="monitoring">
+<dt>What about monitoring?</dt>
+</a>
+ <dd>We'll be looking at adding some basic monitoring for our virt needs in a future release, although we're not trying to write any new monitoring frameworks at this point. The first release does not include monitoring, but you are more than welcome to specify monitoring setup in profiles that you deploy.
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+
+<a name="roadmap">
+<dt>What about the future roadmap?</dt>
+</a>
+<dd>We want to break down the walls that currently control server deployment. We would like to be able to support tagging servers and deploying amongst arbitrary criteria, such that one would be able to say "I want 10 web servers on this network and they can run on any boxes with FOO and BAR capabilities". We also want to be more aware of storage configurations and support migrations. Eventually this can lead to more automated network policy management and SLA's -- but that's a ways off. There's lots of info on the Wiki here: <a href="http://et.redhat.com/page/VF_Roadmap">Roadmap</a>.
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+
+<a name="profile-build">
+<dt>How do I build profiles (appliances)?</dt>
+</a>
+ <dd>Appliances are very simple. They are a tar.gz file in a certain format, with an xml manifest file, and directories for puppet files and manifests. We have documentation on the format (<a href="http://et.redhat.com/page/VF_Profile_Format">VF Profile Format</a>) and installation of downloaded profiles is covered in the install guide. (<a hre="http://et.redhat.com/page/VF_Install_and_Setup_Guide">VF Install and Setup Guide</a>).
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
+
+<a name="contribute">
+<dt>How can I contribute?</dt></a>
+ <dd>Everyone is welcome. Share your ideas on the mailing list, ask questions, contribute patches. If you have ideas about appliance deployment and virtualization management, by all means, share them.
+ <br />
+ <a href="#questions" class="back-to-top">Back to top</a>
+</dd>
diff --git a/website/faq.php b/website/faq.php
new file mode 100755
index 0000000..c7a1528
--- /dev/null
+++ b/website/faq.php
@@ -0,0 +1,48 @@
+<?php
+  $current_page = 'faq';
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="description" content="" />
+<meta name="keywords" content="" />
+<title>UMP: Update and Management Platform</title>
+
+  <link rel="stylesheet" href="css/style.css" type="text/css" media="all" />
+</head>
+
+<body>
+<div id="wrap">
+<?php 
+  include("top.html"); 
+?>
+
+<div id="main">
+<div id="sidebar">
+<?php 
+  include("nav.php"); 
+?>
+</div>
+
+<div id="content">
+
+<h2>Frequently-Asked Questions</h2>
+
+<?php
+  include('faq.html');
+?>
+
+</div>
+</div>
+<div id="footer">
+<?php 
+  include("footer.html"); 
+?>
+</div>
+</div>
+</body>
+</html>
diff --git a/website/feed.php b/website/feed.php
new file mode 100755
index 0000000..a92f985
--- /dev/null
+++ b/website/feed.php
@@ -0,0 +1,31 @@
+<div id="feed">
+<p>Below are the latest 3 message subjects from the <a href="https://www.redhat.com/mailman/listinfo/et-mgmt-tools">et-mgmt-tools list</a>:</p>
+<ul>
+<?php
+
+require_once('magpierss/rss_fetch.inc');
+
+$url = 'http://rss.gmane.org/gmane.linux.redhat.et-mgmt-tools';
+$rss = fetch_rss($url);
+
+	for ($i = 0; $i < 3; $i++) 
+	{
+		$item_array = $rss->items;
+                $item = $item_array[$i];
+		$href = $item['link'];
+		$title = $item['title'];
+		$body = $item['description'];
+		$author = $item['dc']['creator'];
+		$raw_timestamp = $item['dc']['date'];
+		$unixtime = strtotime($raw_timestamp);
+		$timestamp = date('g:i A T j F Y', $unixtime);
+
+		echo "<li><a href=$href>$title</a></li>";
+	}
+	
+
+?>
+</ul>
+<p>
+[ <a href="https://www.redhat.com/archives/et-mgmt-tools/">View More ...</a> ]</p>
+</div>
diff --git a/website/footer.html b/website/footer.html
new file mode 100644
index 0000000..f5d06cc
--- /dev/null
+++ b/website/footer.html
@@ -0,0 +1,3 @@
+<p>Copyright © 2007 Red Hat, Inc. and others. 
+A project from the <a href="http://et.redhat.com/">Red Hat Emerging Technologies Group</a>.<br />
+Website design is <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-Share Alike 3.0</a>.
diff --git a/website/img/current-page.png b/website/img/current-page.png
new file mode 100644
index 0000000..0dc6ca1
Binary files /dev/null and b/website/img/current-page.png differ
diff --git a/website/img/logo-cobbler.png b/website/img/logo-cobbler.png
new file mode 100644
index 0000000..f8fe53c
Binary files /dev/null and b/website/img/logo-cobbler.png differ
diff --git a/website/img/logo-cobblerpng b/website/img/logo-cobblerpng
new file mode 100644
index 0000000..93ec100
Binary files /dev/null and b/website/img/logo-cobblerpng differ
diff --git a/website/img/logo-surfr.png b/website/img/logo-surfr.png
new file mode 100644
index 0000000..ff9a1d8
Binary files /dev/null and b/website/img/logo-surfr.png differ
diff --git a/website/img/logo-ump.png b/website/img/logo-ump.png
new file mode 100644
index 0000000..3998e14
Binary files /dev/null and b/website/img/logo-ump.png differ
diff --git a/website/img/rss_entries.png b/website/img/rss_entries.png
new file mode 100644
index 0000000..373df52
Binary files /dev/null and b/website/img/rss_entries.png differ
diff --git a/website/img/screenshot.png b/website/img/screenshot.png
new file mode 100644
index 0000000..6cbaf0b
Binary files /dev/null and b/website/img/screenshot.png differ
diff --git a/website/img/screenshot_full.png b/website/img/screenshot_full.png
new file mode 100644
index 0000000..b6ef574
Binary files /dev/null and b/website/img/screenshot_full.png differ
diff --git a/website/img/up-arrow.gif b/website/img/up-arrow.gif
new file mode 100644
index 0000000..6f6ffcd
Binary files /dev/null and b/website/img/up-arrow.gif differ
diff --git a/website/index.html b/website/index.html
new file mode 100644
index 0000000..5638630
--- /dev/null
+++ b/website/index.html
@@ -0,0 +1,115 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="description" content="" />
+<meta name="keywords" content="" />
+<!--
+<link rel="alternate" type="application/rss+xml" title="RSS feed" href="??" />
+<link rel="stylesheet" type="text/css" href="/css/print.css" media="print" />
+-->
+<title>UMP: Update and Management Platform</title>
+
+<!--
+  <link rel="stylesheet" href="/css/home.css" type="text/css" media="all" />
+-->
+
+<style type="text/css">
+
+body {
+  background-color: black;
+}
+
+img {
+  border: none;
+}
+
+/* site-wide font specifications */
+
+body, ul, li, p, h1, h2, h3 {
+  font-family: "Liberation Sans", "Helvetica", "Luxi Sans", "Bitstream Vera Sans", sans-serif; 
+  color: white;
+}
+
+ul#nav {
+  text-transform: uppercase;
+  letter-spacing: -.05em;
+  list-style-type: none;
+  font-family: "URW Gothic", "Liberation Sans", "Helvetica", "Luxi Sans", "Bitstream Vera Sans", sans-serif;
+  float: left;
+  margin-right: 32px;
+  margin-bottom: 100%;
+}
+
+ul#nav li a {
+  color: #59cbe1;
+  text-decoration: none;
+}
+
+ul#nav li#active {
+  list-style-image: url('img/current-page.png');
+}
+
+div#main {
+  background-color: #212121;
+  padding: 20px 0px;
+  margin: 0px 3%;
+  border-top: 1px solid #59cbe1;
+  border-bottom: 1px solid #59cbe1;
+}
+
+div#content {
+  width: 80%;
+}
+
+div#content h2 {
+  font-size: medium;
+  font-weight: 900;
+}
+
+div#content p {
+  font-size: small;
+  color: #ccc;
+}
+
+</style>
+
+</head>
+
+<body>
+
+<h1 id="masthead">
+<a href="/"><img src="img/logo-ump.png" alt="UMP: Update and Management Platform" /></a>
+</h1>
+
+<div id="main">
+
+ <ul id="nav">
+   <li id="active">About</li>
+   <li><a href="#">News</a></li>
+   <li><a href="#">Download</a></li>
+   <li><a href="#">FAQ</a></li>
+   <li><a href="#">Communicate</a></li>
+ </ul>
+
+<div id="content">
+
+<h2>Introducing the next generation of systems management</h2>
+
+<p>There are many systems management tools out there, including many great free and open source tools. These tools are numerous and disparate, however, making it a complex and time-consuming process to select which tools ot use and how to connect the pieces together.</p>
+
+<p>By introducing a free and open source platform upon which management tools can be built and adhere to, the Update & Management Platform (UMP) will make it simpler for system administrators to choose and implement whichever management tools they desire.</p>
+
+<h2>Free to use, developed openly</h2>
+
+<p>Use UMP freely to get your system update and management tasks done. Get involved with the UMP developers or become an UMP developer in UMP's open development community to get your system update and management tasks done <strong>better</strong>.</p>
+
+<p>Your feedback is valuable to us. Let us know which UMP features are most valuable to you, which ones are not, and which ones you'd like to see. Become an UMP developer and help us reach our vision. Either way, we'd love to hear from you.</p>
+
+</div>
+
+</div>
+
+</body>
+</html>
diff --git a/website/index.php b/website/index.php
new file mode 100755
index 0000000..f3d34d5
--- /dev/null
+++ b/website/index.php
@@ -0,0 +1,44 @@
+<?php
+  $current_page = 'about';
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="description" content="" />
+<meta name="keywords" content="" />
+<title>UMP: Update and Management Platform</title>
+
+  <link rel="stylesheet" href="css/style.css" type="text/css" media="all" />
+</head>
+
+<body>
+<div id="wrap">
+<?php 
+  include("top.html"); 
+?>
+
+<div id="main">
+ <div id="sidebar">
+<?php 
+  include("nav.php"); 
+?>
+ </div>
+
+<div id="content">
+<?php 
+  include("about.html"); 
+?>
+
+</div>
+</div>
+<div id="footer">
+<?php 
+  include("footer.html"); 
+?>
+</div>
+</div>
+</body>
+</html>
diff --git a/website/magpierss/extlib/Snoopy.class.inc b/website/magpierss/extlib/Snoopy.class.inc
new file mode 100644
index 0000000..3ddecba
--- /dev/null
+++ b/website/magpierss/extlib/Snoopy.class.inc
@@ -0,0 +1,900 @@
+<?php
+
+/*************************************************
+
+Snoopy - the PHP net client
+Author: Monte Ohrt <monte at ispi.net>
+Copyright (c): 1999-2000 ispi, all rights reserved
+Version: 1.0
+
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+You may contact the author of Snoopy by e-mail at:
+monte at ispi.net
+
+Or, write to:
+Monte Ohrt
+CTO, ispi
+237 S. 70th suite 220
+Lincoln, NE 68510
+
+The latest version of Snoopy can be obtained from:
+http://snoopy.sourceforge.com
+
+*************************************************/
+
+class Snoopy
+{
+	/**** Public variables ****/
+	
+	/* user definable vars */
+
+	var $host			=	"www.php.net";		// host name we are connecting to
+	var $port			=	80;					// port we are connecting to
+	var $proxy_host		=	"";					// proxy host to use
+	var $proxy_port		=	"";					// proxy port to use
+	var $agent			=	"Snoopy v1.0";		// agent we masquerade as
+	var	$referer		=	"";					// referer info to pass
+	var $cookies		=	array();			// array of cookies to pass
+												// $cookies["username"]="joe";
+	var	$rawheaders		=	array();			// array of raw headers to send
+												// $rawheaders["Content-type"]="text/html";
+
+	var $maxredirs		=	5;					// http redirection depth maximum. 0 = disallow
+	var $lastredirectaddr	=	"";				// contains address of last redirected address
+	var	$offsiteok		=	true;				// allows redirection off-site
+	var $maxframes		=	0;					// frame content depth maximum. 0 = disallow
+	var $expandlinks	=	true;				// expand links to fully qualified URLs.
+												// this only applies to fetchlinks()
+												// or submitlinks()
+	var $passcookies	=	true;				// pass set cookies back through redirects
+												// NOTE: this currently does not respect
+												// dates, domains or paths.
+	
+	var	$user			=	"";					// user for http authentication
+	var	$pass			=	"";					// password for http authentication
+	
+	// http accept types
+	var $accept			=	"image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, */*";
+	
+	var $results		=	"";					// where the content is put
+		
+	var $error			=	"";					// error messages sent here
+	var	$response_code	=	"";					// response code returned from server
+	var	$headers		=	array();			// headers returned from server sent here
+	var	$maxlength		=	500000;				// max return data length (body)
+	var $read_timeout	=	0;					// timeout on read operations, in seconds
+												// supported only since PHP 4 Beta 4
+												// set to 0 to disallow timeouts
+	var $timed_out		=	false;				// if a read operation timed out
+	var	$status			=	0;					// http request status
+	
+	var	$curl_path		=	"/usr/bin/curl";
+												// Snoopy will use cURL for fetching
+												// SSL content if a full system path to
+												// the cURL binary is supplied here.
+												// set to false if you do not have
+												// cURL installed. See http://curl.haxx.se
+												// for details on installing cURL.
+												// Snoopy does *not* use the cURL
+												// library functions built into php,
+												// as these functions are not stable
+												// as of this Snoopy release.
+	
+	// send Accept-encoding: gzip?
+	var $use_gzip		= true;	
+	
+	/**** Private variables ****/	
+	
+	var	$_maxlinelen	=	4096;				// max line length (headers)
+	
+	var $_httpmethod	=	"GET";				// default http request method
+	var $_httpversion	=	"HTTP/1.0";			// default http request version
+	var $_submit_method	=	"POST";				// default submit method
+	var $_submit_type	=	"application/x-www-form-urlencoded";	// default submit type
+	var $_mime_boundary	=   "";					// MIME boundary for multipart/form-data submit type
+	var $_redirectaddr	=	false;				// will be set if page fetched is a redirect
+	var $_redirectdepth	=	0;					// increments on an http redirect
+	var $_frameurls		= 	array();			// frame src urls
+	var $_framedepth	=	0;					// increments on frame depth
+	
+	var $_isproxy		=	false;				// set if using a proxy server
+	var $_fp_timeout	=	30;					// timeout for socket connection
+
+/*======================================================================*\
+	Function:	fetch
+	Purpose:	fetch the contents of a web page
+				(and possibly other protocols in the
+				future like ftp, nntp, gopher, etc.)
+	Input:		$URI	the location of the page to fetch
+	Output:		$this->results	the output text from the fetch
+\*======================================================================*/
+
+	function fetch($URI)
+	{
+	
+		//preg_match("|^([^:]+)://([^:/]+)(:[\d]+)*(.*)|",$URI,$URI_PARTS);
+		$URI_PARTS = parse_url($URI);
+		if (!empty($URI_PARTS["user"]))
+			$this->user = $URI_PARTS["user"];
+		if (!empty($URI_PARTS["pass"]))
+			$this->pass = $URI_PARTS["pass"];
+				
+		switch($URI_PARTS["scheme"])
+		{
+			case "http":
+				$this->host = $URI_PARTS["host"];
+				if(!empty($URI_PARTS["port"]))
+					$this->port = $URI_PARTS["port"];
+				if($this->_connect($fp))
+				{
+					if($this->_isproxy)
+					{
+						// using proxy, send entire URI
+						$this->_httprequest($URI,$fp,$URI,$this->_httpmethod);
+					}
+					else
+					{
+						$path = $URI_PARTS["path"].(isset($URI_PARTS["query"]) ? "?".$URI_PARTS["query"] : "");
+						// no proxy, send only the path
+						$this->_httprequest($path, $fp, $URI, $this->_httpmethod);
+					}
+					
+					$this->_disconnect($fp);
+
+					if($this->_redirectaddr)
+					{
+						/* url was redirected, check if we've hit the max depth */
+						if($this->maxredirs > $this->_redirectdepth)
+						{
+							// only follow redirect if it's on this site, or offsiteok is true
+							if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
+							{
+								/* follow the redirect */
+								$this->_redirectdepth++;
+								$this->lastredirectaddr=$this->_redirectaddr;
+								$this->fetch($this->_redirectaddr);
+							}
+						}
+					}
+
+					if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
+					{
+						$frameurls = $this->_frameurls;
+						$this->_frameurls = array();
+						
+						while(list(,$frameurl) = each($frameurls))
+						{
+							if($this->_framedepth < $this->maxframes)
+							{
+								$this->fetch($frameurl);
+								$this->_framedepth++;
+							}
+							else
+								break;
+						}
+					}					
+				}
+				else
+				{
+					return false;
+				}
+				return true;					
+				break;
+			case "https":
+				if(!$this->curl_path || (!is_executable($this->curl_path))) {
+					$this->error = "Bad curl ($this->curl_path), can't fetch HTTPS \n";
+					return false;
+				}
+				$this->host = $URI_PARTS["host"];
+				if(!empty($URI_PARTS["port"]))
+					$this->port = $URI_PARTS["port"];
+				if($this->_isproxy)
+				{
+					// using proxy, send entire URI
+					$this->_httpsrequest($URI,$URI,$this->_httpmethod);
+				}
+				else
+				{
+					$path = $URI_PARTS["path"].($URI_PARTS["query"] ? "?".$URI_PARTS["query"] : "");
+					// no proxy, send only the path
+					$this->_httpsrequest($path, $URI, $this->_httpmethod);
+				}
+
+				if($this->_redirectaddr)
+				{
+					/* url was redirected, check if we've hit the max depth */
+					if($this->maxredirs > $this->_redirectdepth)
+					{
+						// only follow redirect if it's on this site, or offsiteok is true
+						if(preg_match("|^http://".preg_quote($this->host)."|i",$this->_redirectaddr) || $this->offsiteok)
+						{
+							/* follow the redirect */
+							$this->_redirectdepth++;
+							$this->lastredirectaddr=$this->_redirectaddr;
+							$this->fetch($this->_redirectaddr);
+						}
+					}
+				}
+
+				if($this->_framedepth < $this->maxframes && count($this->_frameurls) > 0)
+				{
+					$frameurls = $this->_frameurls;
+					$this->_frameurls = array();
+
+					while(list(,$frameurl) = each($frameurls))
+					{
+						if($this->_framedepth < $this->maxframes)
+						{
+							$this->fetch($frameurl);
+							$this->_framedepth++;
+						}
+						else
+							break;
+					}
+				}					
+				return true;					
+				break;
+			default:
+				// not a valid protocol
+				$this->error	=	'Invalid protocol "'.$URI_PARTS["scheme"].'"\n';
+				return false;
+				break;
+		}		
+		return true;
+	}
+
+
+
+/*======================================================================*\
+	Private functions
+\*======================================================================*/
+	
+	
+/*======================================================================*\
+	Function:	_striplinks
+	Purpose:	strip the hyperlinks from an html document
+	Input:		$document	document to strip.
+	Output:		$match		an array of the links
+\*======================================================================*/
+
+	function _striplinks($document)
+	{	
+		preg_match_all("'<\s*a\s+.*href\s*=\s*			# find <a href=
+						([\"\'])?					# find single or double quote
+						(?(1) (.*?)\\1 | ([^\s\>]+))		# if quote found, match up to next matching
+													# quote, otherwise match up to next space
+						'isx",$document,$links);
+						
+
+		// catenate the non-empty matches from the conditional subpattern
+
+		while(list($key,$val) = each($links[2]))
+		{
+			if(!empty($val))
+				$match[] = $val;
+		}				
+		
+		while(list($key,$val) = each($links[3]))
+		{
+			if(!empty($val))
+				$match[] = $val;
+		}		
+		
+		// return the links
+		return $match;
+	}
+
+/*======================================================================*\
+	Function:	_stripform
+	Purpose:	strip the form elements from an html document
+	Input:		$document	document to strip.
+	Output:		$match		an array of the links
+\*======================================================================*/
+
+	function _stripform($document)
+	{	
+		preg_match_all("'<\/?(FORM|INPUT|SELECT|TEXTAREA|(OPTION))[^<>]*>(?(2)(.*(?=<\/?(option|select)[^<>]*>[\r\n]*)|(?=[\r\n]*))|(?=[\r\n]*))'Usi",$document,$elements);
+		
+		// catenate the matches
+		$match = implode("\r\n",$elements[0]);
+				
+		// return the links
+		return $match;
+	}
+
+	
+	
+/*======================================================================*\
+	Function:	_striptext
+	Purpose:	strip the text from an html document
+	Input:		$document	document to strip.
+	Output:		$text		the resulting text
+\*======================================================================*/
+
+	function _striptext($document)
+	{
+		
+		// I didn't use preg eval (//e) since that is only available in PHP 4.0.
+		// so, list your entities one by one here. I included some of the
+		// more common ones.
+								
+		$search = array("'<script[^>]*?>.*?</script>'si",	// strip out javascript
+						"'<[\/\!]*?[^<>]*?>'si",			// strip out html tags
+						"'([\r\n])[\s]+'",					// strip out white space
+						"'&(quote|#34);'i",					// replace html entities
+						"'&(amp|#38);'i",
+						"'&(lt|#60);'i",
+						"'&(gt|#62);'i",
+						"'&(nbsp|#160);'i",
+						"'&(iexcl|#161);'i",
+						"'&(cent|#162);'i",
+						"'&(pound|#163);'i",
+						"'&(copy|#169);'i"
+						);				
+		$replace = array(	"",
+							"",
+							"\\1",
+							"\"",
+							"&",
+							"<",
+							">",
+							" ",
+							chr(161),
+							chr(162),
+							chr(163),
+							chr(169));
+					
+		$text = preg_replace($search,$replace,$document);
+								
+		return $text;
+	}
+
+/*======================================================================*\
+	Function:	_expandlinks
+	Purpose:	expand each link into a fully qualified URL
+	Input:		$links			the links to qualify
+				$URI			the full URI to get the base from
+	Output:		$expandedLinks	the expanded links
+\*======================================================================*/
+
+	function _expandlinks($links,$URI)
+	{
+		
+		preg_match("/^[^\?]+/",$URI,$match);
+
+		$match = preg_replace("|/[^\/\.]+\.[^\/\.]+$|","",$match[0]);
+				
+		$search = array( 	"|^http://".preg_quote($this->host)."|i",
+							"|^(?!http://)(\/)?(?!mailto:)|i",
+							"|/\./|",
+							"|/[^\/]+/\.\./|"
+						);
+						
+		$replace = array(	"",
+							$match."/",
+							"/",
+							"/"
+						);			
+				
+		$expandedLinks = preg_replace($search,$replace,$links);
+
+		return $expandedLinks;
+	}
+
+/*======================================================================*\
+	Function:	_httprequest
+	Purpose:	go get the http data from the server
+	Input:		$url		the url to fetch
+				$fp			the current open file pointer
+				$URI		the full URI
+				$body		body contents to send if any (POST)
+	Output:		
+\*======================================================================*/
+	
+	function _httprequest($url,$fp,$URI,$http_method,$content_type="",$body="")
+	{
+		if($this->passcookies && $this->_redirectaddr)
+			$this->setcookies();
+			
+		$URI_PARTS = parse_url($URI);
+		if(empty($url))
+			$url = "/";
+		$headers = $http_method." ".$url." ".$this->_httpversion."\r\n";		
+		if(!empty($this->agent))
+			$headers .= "User-Agent: ".$this->agent."\r\n";
+		if(!empty($this->host) && !isset($this->rawheaders['Host']))
+			$headers .= "Host: ".$this->host."\r\n";
+		if(!empty($this->accept))
+			$headers .= "Accept: ".$this->accept."\r\n";
+		
+		if($this->use_gzip) {
+			// make sure PHP was built with --with-zlib
+			// and we can handle gzipp'ed data
+			if ( function_exists(gzinflate) ) {
+			   $headers .= "Accept-encoding: gzip\r\n";
+			}
+			else {
+			   trigger_error(
+			   	"use_gzip is on, but PHP was built without zlib support.".
+				"  Requesting file(s) without gzip encoding.", 
+				E_USER_NOTICE);
+			}
+		}
+		
+		if(!empty($this->referer))
+			$headers .= "Referer: ".$this->referer."\r\n";
+		if(!empty($this->cookies))
+		{			
+			if(!is_array($this->cookies))
+				$this->cookies = (array)$this->cookies;
+	
+			reset($this->cookies);
+			if ( count($this->cookies) > 0 ) {
+				$cookie_headers .= 'Cookie: ';
+				foreach ( $this->cookies as $cookieKey => $cookieVal ) {
+				$cookie_headers .= $cookieKey."=".urlencode($cookieVal)."; ";
+				}
+				$headers .= substr($cookie_headers,0,-2) . "\r\n";
+			} 
+		}
+		if(!empty($this->rawheaders))
+		{
+			if(!is_array($this->rawheaders))
+				$this->rawheaders = (array)$this->rawheaders;
+			while(list($headerKey,$headerVal) = each($this->rawheaders))
+				$headers .= $headerKey.": ".$headerVal."\r\n";
+		}
+		if(!empty($content_type)) {
+			$headers .= "Content-type: $content_type";
+			if ($content_type == "multipart/form-data")
+				$headers .= "; boundary=".$this->_mime_boundary;
+			$headers .= "\r\n";
+		}
+		if(!empty($body))	
+			$headers .= "Content-length: ".strlen($body)."\r\n";
+		if(!empty($this->user) || !empty($this->pass))	
+			$headers .= "Authorization: BASIC ".base64_encode($this->user.":".$this->pass)."\r\n";
+
+		$headers .= "\r\n";
+		
+		// set the read timeout if needed
+		if ($this->read_timeout > 0)
+			socket_set_timeout($fp, $this->read_timeout);
+		$this->timed_out = false;
+		
+		fwrite($fp,$headers.$body,strlen($headers.$body));
+		
+		$this->_redirectaddr = false;
+		unset($this->headers);
+		
+		// content was returned gzip encoded?
+		$is_gzipped = false;
+						
+		while($currentHeader = fgets($fp,$this->_maxlinelen))
+		{
+			if ($this->read_timeout > 0 && $this->_check_timeout($fp))
+			{
+				$this->status=-100;
+				return false;
+			}
+				
+		//	if($currentHeader == "\r\n")
+			if(preg_match("/^\r?\n$/", $currentHeader) )
+			      break;
+						
+			// if a header begins with Location: or URI:, set the redirect
+			if(preg_match("/^(Location:|URI:)/i",$currentHeader))
+			{
+				// get URL portion of the redirect
+				preg_match("/^(Location:|URI:)\s+(.*)/",chop($currentHeader),$matches);
+				// look for :// in the Location header to see if hostname is included
+				if(!preg_match("|\:\/\/|",$matches[2]))
+				{
+					// no host in the path, so prepend
+					$this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port;
+					// eliminate double slash
+					if(!preg_match("|^/|",$matches[2]))
+							$this->_redirectaddr .= "/".$matches[2];
+					else
+							$this->_redirectaddr .= $matches[2];
+				}
+				else
+					$this->_redirectaddr = $matches[2];
+			}
+		
+			if(preg_match("|^HTTP/|",$currentHeader))
+			{
+                if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$currentHeader, $status))
+				{
+					$this->status= $status[1];
+                }				
+				$this->response_code = $currentHeader;
+			}
+			
+			if (preg_match("/Content-Encoding: gzip/", $currentHeader) ) {
+				$is_gzipped = true;
+			}
+			
+			$this->headers[] = $currentHeader;
+		}
+
+		# $results = fread($fp, $this->maxlength);
+		$results = "";
+		while ( $data = fread($fp, $this->maxlength) ) {
+		    $results .= $data;
+		    if (
+		        strlen($results) > $this->maxlength ) {
+		        break;
+		    }
+		}
+		
+		// gunzip
+		if ( $is_gzipped ) {
+			// per http://www.php.net/manual/en/function.gzencode.php
+			$results = substr($results, 10);
+			$results = gzinflate($results);
+		}
+		
+		if ($this->read_timeout > 0 && $this->_check_timeout($fp))
+		{
+			$this->status=-100;
+			return false;
+		}
+		
+		// check if there is a a redirect meta tag
+		
+		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]+URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
+		{
+			$this->_redirectaddr = $this->_expandlinks($match[1],$URI);	
+		}
+
+		// have we hit our frame depth and is there frame src to fetch?
+		if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match))
+		{
+			$this->results[] = $results;
+			for($x=0; $x<count($match[1]); $x++)
+				$this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host);
+		}
+		// have we already fetched framed content?
+		elseif(is_array($this->results))
+			$this->results[] = $results;
+		// no framed content
+		else
+			$this->results = $results;
+		
+		return true;
+	}
+
+/*======================================================================*\
+	Function:	_httpsrequest
+	Purpose:	go get the https data from the server using curl
+	Input:		$url		the url to fetch
+				$URI		the full URI
+				$body		body contents to send if any (POST)
+	Output:		
+\*======================================================================*/
+	
+	function _httpsrequest($url,$URI,$http_method,$content_type="",$body="")
+	{
+		if($this->passcookies && $this->_redirectaddr)
+			$this->setcookies();
+
+		$headers = array();		
+					
+		$URI_PARTS = parse_url($URI);
+		if(empty($url))
+			$url = "/";
+		// GET ... header not needed for curl
+		//$headers[] = $http_method." ".$url." ".$this->_httpversion;		
+		if(!empty($this->agent))
+			$headers[] = "User-Agent: ".$this->agent;
+		if(!empty($this->host))
+			$headers[] = "Host: ".$this->host;
+		if(!empty($this->accept))
+			$headers[] = "Accept: ".$this->accept;
+		if(!empty($this->referer))
+			$headers[] = "Referer: ".$this->referer;
+		if(!empty($this->cookies))
+		{			
+			if(!is_array($this->cookies))
+				$this->cookies = (array)$this->cookies;
+	
+			reset($this->cookies);
+			if ( count($this->cookies) > 0 ) {
+				$cookie_str = 'Cookie: ';
+				foreach ( $this->cookies as $cookieKey => $cookieVal ) {
+				$cookie_str .= $cookieKey."=".urlencode($cookieVal)."; ";
+				}
+				$headers[] = substr($cookie_str,0,-2);
+			}
+		}
+		if(!empty($this->rawheaders))
+		{
+			if(!is_array($this->rawheaders))
+				$this->rawheaders = (array)$this->rawheaders;
+			while(list($headerKey,$headerVal) = each($this->rawheaders))
+				$headers[] = $headerKey.": ".$headerVal;
+		}
+		if(!empty($content_type)) {
+			if ($content_type == "multipart/form-data")
+				$headers[] = "Content-type: $content_type; boundary=".$this->_mime_boundary;
+			else
+				$headers[] = "Content-type: $content_type";
+		}
+		if(!empty($body))	
+			$headers[] = "Content-length: ".strlen($body);
+		if(!empty($this->user) || !empty($this->pass))	
+			$headers[] = "Authorization: BASIC ".base64_encode($this->user.":".$this->pass);
+			
+		for($curr_header = 0; $curr_header < count($headers); $curr_header++) {
+			$cmdline_params .= " -H \"".$headers[$curr_header]."\"";
+		}
+			  	                         
+		if(!empty($body))
+			$cmdline_params .= " -d \"$body\"";
+		
+		if($this->read_timeout > 0)
+			$cmdline_params .= " -m ".$this->read_timeout;
+		
+		$headerfile = uniqid(time());
+		
+		# accept self-signed certs
+		$cmdline_params .= " -k"; 
+		exec($this->curl_path." -D \"/tmp/$headerfile\"".escapeshellcmd($cmdline_params)." ".escapeshellcmd($URI),$results,$return);
+		
+		if($return)
+		{
+			$this->error = "Error: cURL could not retrieve the document, error $return.";
+			return false;
+		}
+			
+			
+		$results = implode("\r\n",$results);
+		
+		$result_headers = file("/tmp/$headerfile");
+						
+		$this->_redirectaddr = false;
+		unset($this->headers);
+						
+		for($currentHeader = 0; $currentHeader < count($result_headers); $currentHeader++)
+		{
+			
+			// if a header begins with Location: or URI:, set the redirect
+			if(preg_match("/^(Location: |URI: )/i",$result_headers[$currentHeader]))
+			{
+				// get URL portion of the redirect
+				preg_match("/^(Location: |URI:)(.*)/",chop($result_headers[$currentHeader]),$matches);
+				// look for :// in the Location header to see if hostname is included
+				if(!preg_match("|\:\/\/|",$matches[2]))
+				{
+					// no host in the path, so prepend
+					$this->_redirectaddr = $URI_PARTS["scheme"]."://".$this->host.":".$this->port;
+					// eliminate double slash
+					if(!preg_match("|^/|",$matches[2]))
+							$this->_redirectaddr .= "/".$matches[2];
+					else
+							$this->_redirectaddr .= $matches[2];
+				}
+				else
+					$this->_redirectaddr = $matches[2];
+			}
+		
+			if(preg_match("|^HTTP/|",$result_headers[$currentHeader]))
+			{
+			    $this->response_code = $result_headers[$currentHeader];
+			    if(preg_match("|^HTTP/[^\s]*\s(.*?)\s|",$this->response_code, $match))
+			    {
+				$this->status= $match[1];
+                	    }
+			}
+			$this->headers[] = $result_headers[$currentHeader];
+		}
+
+		// check if there is a a redirect meta tag
+		
+		if(preg_match("'<meta[\s]*http-equiv[^>]*?content[\s]*=[\s]*[\"\']?\d+;[\s]+URL[\s]*=[\s]*([^\"\']*?)[\"\']?>'i",$results,$match))
+		{
+			$this->_redirectaddr = $this->_expandlinks($match[1],$URI);	
+		}
+
+		// have we hit our frame depth and is there frame src to fetch?
+		if(($this->_framedepth < $this->maxframes) && preg_match_all("'<frame\s+.*src[\s]*=[\'\"]?([^\'\"\>]+)'i",$results,$match))
+		{
+			$this->results[] = $results;
+			for($x=0; $x<count($match[1]); $x++)
+				$this->_frameurls[] = $this->_expandlinks($match[1][$x],$URI_PARTS["scheme"]."://".$this->host);
+		}
+		// have we already fetched framed content?
+		elseif(is_array($this->results))
+			$this->results[] = $results;
+		// no framed content
+		else
+			$this->results = $results;
+
+		unlink("/tmp/$headerfile");
+		
+		return true;
+	}
+
+/*======================================================================*\
+	Function:	setcookies()
+	Purpose:	set cookies for a redirection
+\*======================================================================*/
+	
+	function setcookies()
+	{
+		for($x=0; $x<count($this->headers); $x++)
+		{
+		if(preg_match("/^set-cookie:[\s]+([^=]+)=([^;]+)/i", $this->headers[$x],$match))
+			$this->cookies[$match[1]] = $match[2];
+		}
+	}
+
+	
+/*======================================================================*\
+	Function:	_check_timeout
+	Purpose:	checks whether timeout has occurred
+	Input:		$fp	file pointer
+\*======================================================================*/
+
+	function _check_timeout($fp)
+	{
+		if ($this->read_timeout > 0) {
+			$fp_status = socket_get_status($fp);
+			if ($fp_status["timed_out"]) {
+				$this->timed_out = true;
+				return true;
+			}
+		}
+		return false;
+	}
+
+/*======================================================================*\
+	Function:	_connect
+	Purpose:	make a socket connection
+	Input:		$fp	file pointer
+\*======================================================================*/
+	
+	function _connect(&$fp)
+	{
+		if(!empty($this->proxy_host) && !empty($this->proxy_port))
+			{
+				$this->_isproxy = true;
+				$host = $this->proxy_host;
+				$port = $this->proxy_port;
+			}
+		else
+		{
+			$host = $this->host;
+			$port = $this->port;
+		}
+	
+		$this->status = 0;
+		
+		if($fp = fsockopen(
+					$host,
+					$port,
+					$errno,
+					$errstr,
+					$this->_fp_timeout
+					))
+		{
+			// socket connection succeeded
+
+			return true;
+		}
+		else
+		{
+			// socket connection failed
+			$this->status = $errno;
+			switch($errno)
+			{
+				case -3:
+					$this->error="socket creation failed (-3)";
+				case -4:
+					$this->error="dns lookup failure (-4)";
+				case -5:
+					$this->error="connection refused or timed out (-5)";
+				default:
+					$this->error="connection failed (".$errno.")";
+			}
+			return false;
+		}
+	}
+/*======================================================================*\
+	Function:	_disconnect
+	Purpose:	disconnect a socket connection
+	Input:		$fp	file pointer
+\*======================================================================*/
+	
+	function _disconnect($fp)
+	{
+		return(fclose($fp));
+	}
+
+	
+/*======================================================================*\
+	Function:	_prepare_post_body
+	Purpose:	Prepare post body according to encoding type
+	Input:		$formvars  - form variables
+				$formfiles - form upload files
+	Output:		post body
+\*======================================================================*/
+	
+	function _prepare_post_body($formvars, $formfiles)
+	{
+		settype($formvars, "array");
+		settype($formfiles, "array");
+
+		if (count($formvars) == 0 && count($formfiles) == 0)
+			return;
+		
+		switch ($this->_submit_type) {
+			case "application/x-www-form-urlencoded":
+				reset($formvars);
+				while(list($key,$val) = each($formvars)) {
+					if (is_array($val) || is_object($val)) {
+						while (list($cur_key, $cur_val) = each($val)) {
+							$postdata .= urlencode($key)."[]=".urlencode($cur_val)."&";
+						}
+					} else
+						$postdata .= urlencode($key)."=".urlencode($val)."&";
+				}
+				break;
+
+			case "multipart/form-data":
+				$this->_mime_boundary = "Snoopy".md5(uniqid(microtime()));
+				
+				reset($formvars);
+				while(list($key,$val) = each($formvars)) {
+					if (is_array($val) || is_object($val)) {
+						while (list($cur_key, $cur_val) = each($val)) {
+							$postdata .= "--".$this->_mime_boundary."\r\n";
+							$postdata .= "Content-Disposition: form-data; name=\"$key\[\]\"\r\n\r\n";
+							$postdata .= "$cur_val\r\n";
+						}
+					} else {
+						$postdata .= "--".$this->_mime_boundary."\r\n";
+						$postdata .= "Content-Disposition: form-data; name=\"$key\"\r\n\r\n";
+						$postdata .= "$val\r\n";
+					}
+				}
+				
+				reset($formfiles);
+				while (list($field_name, $file_names) = each($formfiles)) {
+					settype($file_names, "array");
+					while (list(, $file_name) = each($file_names)) {
+						if (!is_readable($file_name)) continue;
+
+						$fp = fopen($file_name, "r");
+						$file_content = fread($fp, filesize($file_name));
+						fclose($fp);
+						$base_name = basename($file_name);
+
+						$postdata .= "--".$this->_mime_boundary."\r\n";
+						$postdata .= "Content-Disposition: form-data; name=\"$field_name\"; filename=\"$base_name\"\r\n\r\n";
+						$postdata .= "$file_content\r\n";
+					}
+				}
+				$postdata .= "--".$this->_mime_boundary."--\r\n";
+				break;
+		}
+
+		return $postdata;
+	}
+}
+
+?>
diff --git a/website/magpierss/rss_cache.inc b/website/magpierss/rss_cache.inc
new file mode 100644
index 0000000..b8d436c
--- /dev/null
+++ b/website/magpierss/rss_cache.inc
@@ -0,0 +1,200 @@
+<?php
+/*
+ * Project:     MagpieRSS: a simple RSS integration tool
+ * File:        rss_cache.inc, a simple, rolling(no GC), cache 
+ *              for RSS objects, keyed on URL.
+ * Author:      Kellan Elliott-McCrea <kellan at protest.net>
+ * Version:     0.51
+ * License:     GPL
+ *
+ * The lastest version of MagpieRSS can be obtained from:
+ * http://magpierss.sourceforge.net
+ *
+ * For questions, help, comments, discussion, etc., please join the
+ * Magpie mailing list:
+ * http://lists.sourceforge.net/lists/listinfo/magpierss-general
+ *
+ */
+
+class RSSCache {
+    var $BASE_CACHE = './cache';    // where the cache files are stored
+    var $MAX_AGE    = 3600;         // when are files stale, default one hour
+    var $ERROR      = "";           // accumulate error messages
+    
+    function RSSCache ($base='', $age='') {
+        if ( $base ) {
+            $this->BASE_CACHE = $base;
+        }
+        if ( $age ) {
+            $this->MAX_AGE = $age;
+        }
+        
+        // attempt to make the cache directory
+        if ( ! file_exists( $this->BASE_CACHE ) ) {
+            $status = @mkdir( $this->BASE_CACHE, 0755 );
+            
+            // if make failed 
+            if ( ! $status ) {
+                $this->error(
+                    "Cache couldn't make dir '" . $this->BASE_CACHE . "'."
+                );
+            }
+        }
+    }
+    
+/*=======================================================================*\
+    Function:   set
+    Purpose:    add an item to the cache, keyed on url
+    Input:      url from wich the rss file was fetched
+    Output:     true on sucess  
+\*=======================================================================*/
+    function set ($url, $rss) {
+        $this->ERROR = "";
+        $cache_file = $this->file_name( $url );
+        $fp = @fopen( $cache_file, 'w' );
+        
+        if ( ! $fp ) {
+            $this->error(
+                "Cache unable to open file for writing: $cache_file"
+            );
+            return 0;
+        }
+        
+        
+        $data = $this->serialize( $rss );
+        fwrite( $fp, $data );
+        fclose( $fp );
+        
+        return $cache_file;
+    }
+    
+/*=======================================================================*\
+    Function:   get
+    Purpose:    fetch an item from the cache
+    Input:      url from wich the rss file was fetched
+    Output:     cached object on HIT, false on MISS 
+\*=======================================================================*/ 
+    function get ($url) {
+        $this->ERROR = "";
+        $cache_file = $this->file_name( $url );
+        
+        if ( ! file_exists( $cache_file ) ) {
+            $this->debug( 
+                "Cache doesn't contain: $url (cache file: $cache_file)"
+            );
+            return 0;
+        }
+        
+        $fp = @fopen($cache_file, 'r');
+        if ( ! $fp ) {
+            $this->error(
+                "Failed to open cache file for reading: $cache_file"
+            );
+            return 0;
+        }
+        
+        if ($filesize = filesize($cache_file) ) {
+        	$data = fread( $fp, filesize($cache_file) );
+        	$rss = $this->unserialize( $data );
+        
+        	return $rss;
+    	}
+    	
+    	return 0;
+    }
+
+/*=======================================================================*\
+    Function:   check_cache
+    Purpose:    check a url for membership in the cache
+                and whether the object is older then MAX_AGE (ie. STALE)
+    Input:      url from wich the rss file was fetched
+    Output:     cached object on HIT, false on MISS 
+\*=======================================================================*/     
+    function check_cache ( $url ) {
+        $this->ERROR = "";
+        $filename = $this->file_name( $url );
+        
+        if ( file_exists( $filename ) ) {
+            // find how long ago the file was added to the cache
+            // and whether that is longer then MAX_AGE
+            $mtime = filemtime( $filename );
+            $age = time() - $mtime;
+            if ( $this->MAX_AGE > $age ) {
+                // object exists and is current
+                return 'HIT';
+            }
+            else {
+                // object exists but is old
+                return 'STALE';
+            }
+        }
+        else {
+            // object does not exist
+            return 'MISS';
+        }
+    }
+
+	function cache_age( $cache_key ) {
+		$filename = $this->file_name( $url );
+		if ( file_exists( $filename ) ) {
+			$mtime = filemtime( $filename );
+            $age = time() - $mtime;
+			return $age;
+		}
+		else {
+			return -1;	
+		}
+	}
+	
+/*=======================================================================*\
+    Function:   serialize
+\*=======================================================================*/     
+    function serialize ( $rss ) {
+        return serialize( $rss );
+    }
+
+/*=======================================================================*\
+    Function:   unserialize
+\*=======================================================================*/     
+    function unserialize ( $data ) {
+        return unserialize( $data );
+    }
+    
+/*=======================================================================*\
+    Function:   file_name
+    Purpose:    map url to location in cache
+    Input:      url from wich the rss file was fetched
+    Output:     a file name
+\*=======================================================================*/     
+    function file_name ($url) {
+        $filename = md5( $url );
+        return join( DIRECTORY_SEPARATOR, array( $this->BASE_CACHE, $filename ) );
+    }
+
+/*=======================================================================*\
+    Function:   error
+    Purpose:    register error
+\*=======================================================================*/         
+    function error ($errormsg, $lvl=E_USER_WARNING) {
+        // append PHP's error message if track_errors enabled
+        if ( isset($php_errormsg) ) { 
+            $errormsg .= " ($php_errormsg)";
+        }
+        $this->ERROR = $errormsg;
+        if ( MAGPIE_DEBUG ) {
+            trigger_error( $errormsg, $lvl);
+        }
+        else {
+            error_log( $errormsg, 0);
+        }
+    }
+    
+    function debug ($debugmsg, $lvl=E_USER_NOTICE) {
+        if ( MAGPIE_DEBUG ) {
+            $this->error("MagpieRSS [debug] $debugmsg", $lvl);
+        }
+    }
+
+}
+
+?>
diff --git a/website/magpierss/rss_fetch.inc b/website/magpierss/rss_fetch.inc
new file mode 100644
index 0000000..f2fa2fa
--- /dev/null
+++ b/website/magpierss/rss_fetch.inc
@@ -0,0 +1,458 @@
+<?php
+/*
+ * Project:     MagpieRSS: a simple RSS integration tool
+ * File:        rss_fetch.inc, a simple functional interface
+                to fetching and parsing RSS files, via the
+                function fetch_rss()
+ * Author:      Kellan Elliott-McCrea <kellan at protest.net>
+ * License:     GPL
+ *
+ * The lastest version of MagpieRSS can be obtained from:
+ * http://magpierss.sourceforge.net
+ *
+ * For questions, help, comments, discussion, etc., please join the
+ * Magpie mailing list:
+ * magpierss-general at lists.sourceforge.net
+ *
+ */
+ 
+// Setup MAGPIE_DIR for use on hosts that don't include
+// the current path in include_path.
+// with thanks to rajiv and smarty
+if (!defined('DIR_SEP')) {
+    define('DIR_SEP', DIRECTORY_SEPARATOR);
+}
+
+if (!defined('MAGPIE_DIR')) {
+    define('MAGPIE_DIR', dirname(__FILE__) . DIR_SEP);
+}
+
+require_once( MAGPIE_DIR . 'rss_parse.inc' );
+require_once( MAGPIE_DIR . 'rss_cache.inc' );
+
+// for including 3rd party libraries
+define('MAGPIE_EXTLIB', MAGPIE_DIR . 'extlib' . DIR_SEP);
+require_once( MAGPIE_EXTLIB . 'Snoopy.class.inc');
+
+
+/* 
+ * CONSTANTS - redefine these in your script to change the
+ * behaviour of fetch_rss() currently, most options effect the cache
+ *
+ * MAGPIE_CACHE_ON - Should Magpie cache parsed RSS objects? 
+ * For me a built in cache was essential to creating a "PHP-like" 
+ * feel to Magpie, see rss_cache.inc for rationale
+ *
+ *
+ * MAGPIE_CACHE_DIR - Where should Magpie cache parsed RSS objects?
+ * This should be a location that the webserver can write to.   If this 
+ * directory does not already exist Mapie will try to be smart and create 
+ * it.  This will often fail for permissions reasons.
+ *
+ *
+ * MAGPIE_CACHE_AGE - How long to store cached RSS objects? In seconds.
+ *
+ *
+ * MAGPIE_CACHE_FRESH_ONLY - If remote fetch fails, throw error
+ * instead of returning stale object?
+ *
+ * MAGPIE_DEBUG - Display debugging notices?
+ *
+*/
+
+
+/*=======================================================================*\
+    Function: fetch_rss: 
+    Purpose:  return RSS object for the give url
+              maintain the cache
+    Input:    url of RSS file
+    Output:   parsed RSS object (see rss_parse.inc)
+
+    NOTES ON CACHEING:  
+    If caching is on (MAGPIE_CACHE_ON) fetch_rss will first check the cache.
+    
+    NOTES ON RETRIEVING REMOTE FILES:
+    If conditional gets are on (MAGPIE_CONDITIONAL_GET_ON) fetch_rss will
+    return a cached object, and touch the cache object upon recieving a
+    304.
+    
+    NOTES ON FAILED REQUESTS:
+    If there is an HTTP error while fetching an RSS object, the cached
+    version will be return, if it exists (and if MAGPIE_CACHE_FRESH_ONLY is off)
+\*=======================================================================*/
+
+define('MAGPIE_VERSION', '0.72');
+
+$MAGPIE_ERROR = "";
+
+function fetch_rss ($url) {
+    // initialize constants
+    init();
+    
+    if ( !isset($url) ) {
+        error("fetch_rss called without a url");
+        return false;
+    }
+    
+    // if cache is disabled
+    if ( !MAGPIE_CACHE_ON ) {
+        // fetch file, and parse it
+        $resp = _fetch_remote_file( $url );
+        if ( is_success( $resp->status ) ) {
+            return _response_to_rss( $resp );
+        }
+        else {
+            error("Failed to fetch $url and cache is off");
+            return false;
+        }
+    } 
+    // else cache is ON
+    else {
+        // Flow
+        // 1. check cache
+        // 2. if there is a hit, make sure its fresh
+        // 3. if cached obj fails freshness check, fetch remote
+        // 4. if remote fails, return stale object, or error
+        
+        $cache = new RSSCache( MAGPIE_CACHE_DIR, MAGPIE_CACHE_AGE );
+        
+        if (MAGPIE_DEBUG and $cache->ERROR) {
+            debug($cache->ERROR, E_USER_WARNING);
+        }
+        
+        
+        $cache_status    = 0;       // response of check_cache
+        $request_headers = array(); // HTTP headers to send with fetch
+        $rss             = 0;       // parsed RSS object
+        $errormsg        = 0;       // errors, if any
+        
+        // store parsed XML by desired output encoding
+        // as character munging happens at parse time
+        $cache_key       = $url . MAGPIE_OUTPUT_ENCODING;
+        
+        if (!$cache->ERROR) {
+            // return cache HIT, MISS, or STALE
+            $cache_status = $cache->check_cache( $cache_key);
+        }
+                
+        // if object cached, and cache is fresh, return cached obj
+        if ( $cache_status == 'HIT' ) {
+            $rss = $cache->get( $cache_key );
+            if ( isset($rss) and $rss ) {
+                // should be cache age
+                $rss->from_cache = 1;
+                if ( MAGPIE_DEBUG > 1) {
+                    debug("MagpieRSS: Cache HIT", E_USER_NOTICE);
+                }
+                return $rss;
+            }
+        }
+        
+        // else attempt a conditional get
+        
+        // setup headers
+        if ( $cache_status == 'STALE' ) {
+            $rss = $cache->get( $cache_key );
+            if ( $rss and $rss->etag and $rss->last_modified ) {
+                $request_headers['If-None-Match'] = $rss->etag;
+                $request_headers['If-Last-Modified'] = $rss->last_modified;
+            }
+        }
+        
+        $resp = _fetch_remote_file( $url, $request_headers );
+        
+        if (isset($resp) and $resp) {
+          if ($resp->status == '304' ) {
+                // we have the most current copy
+                if ( MAGPIE_DEBUG > 1) {
+                    debug("Got 304 for $url");
+                }
+                // reset cache on 304 (at minutillo insistent prodding)
+                $cache->set($cache_key, $rss);
+                return $rss;
+            }
+            elseif ( is_success( $resp->status ) ) {
+                $rss = _response_to_rss( $resp );
+                if ( $rss ) {
+                    if (MAGPIE_DEBUG > 1) {
+                        debug("Fetch successful");
+                    }
+                    // add object to cache
+                    $cache->set( $cache_key, $rss );
+                    return $rss;
+                }
+            }
+            else {
+                $errormsg = "Failed to fetch $url ";
+                if ( $resp->status == '-100' ) {
+                    $errormsg .= "(Request timed out after " . MAGPIE_FETCH_TIME_OUT . " seconds)";
+                }
+                elseif ( $resp->error ) {
+                    # compensate for Snoopy's annoying habbit to tacking
+                    # on '\n'
+                    $http_error = substr($resp->error, 0, -2); 
+                    $errormsg .= "(HTTP Error: $http_error)";
+                }
+                else {
+                    $errormsg .=  "(HTTP Response: " . $resp->response_code .')';
+                }
+            }
+        }
+        else {
+            $errormsg = "Unable to retrieve RSS file for unknown reasons.";
+        }
+        
+        // else fetch failed
+        
+        // attempt to return cached object
+        if ($rss) {
+            if ( MAGPIE_DEBUG ) {
+                debug("Returning STALE object for $url");
+            }
+            return $rss;
+        }
+        
+        // else we totally failed
+        error( $errormsg ); 
+        
+        return false;
+        
+    } // end if ( !MAGPIE_CACHE_ON ) {
+} // end fetch_rss()
+
+/*=======================================================================*\
+    Function:   error
+    Purpose:    set MAGPIE_ERROR, and trigger error
+\*=======================================================================*/
+
+function error ($errormsg, $lvl=E_USER_WARNING) {
+        global $MAGPIE_ERROR;
+        
+        // append PHP's error message if track_errors enabled
+        if ( isset($php_errormsg) ) { 
+            $errormsg .= " ($php_errormsg)";
+        }
+        if ( $errormsg ) {
+            $errormsg = "MagpieRSS: $errormsg";
+            $MAGPIE_ERROR = $errormsg;
+            trigger_error( $errormsg, $lvl);                
+        }
+}
+
+function debug ($debugmsg, $lvl=E_USER_NOTICE) {
+    trigger_error("MagpieRSS [debug] $debugmsg", $lvl);
+}
+            
+/*=======================================================================*\
+    Function:   magpie_error
+    Purpose:    accessor for the magpie error variable
+\*=======================================================================*/
+function magpie_error ($errormsg="") {
+    global $MAGPIE_ERROR;
+    
+    if ( isset($errormsg) and $errormsg ) { 
+        $MAGPIE_ERROR = $errormsg;
+    }
+    
+    return $MAGPIE_ERROR;   
+}
+
+/*=======================================================================*\
+    Function:   _fetch_remote_file
+    Purpose:    retrieve an arbitrary remote file
+    Input:      url of the remote file
+                headers to send along with the request (optional)
+    Output:     an HTTP response object (see Snoopy.class.inc)  
+\*=======================================================================*/
+function _fetch_remote_file ($url, $headers = "" ) {
+    // Snoopy is an HTTP client in PHP
+    $client = new Snoopy();
+    $client->agent = MAGPIE_USER_AGENT;
+    $client->read_timeout = MAGPIE_FETCH_TIME_OUT;
+    $client->use_gzip = MAGPIE_USE_GZIP;
+    if (is_array($headers) ) {
+        $client->rawheaders = $headers;
+    }
+    
+    @$client->fetch($url);
+    return $client;
+
+}
+
+/*=======================================================================*\
+    Function:   _response_to_rss
+    Purpose:    parse an HTTP response object into an RSS object
+    Input:      an HTTP response object (see Snoopy)
+    Output:     parsed RSS object (see rss_parse)
+\*=======================================================================*/
+function _response_to_rss ($resp) {
+    $rss = new MagpieRSS( $resp->results, MAGPIE_OUTPUT_ENCODING, MAGPIE_INPUT_ENCODING, MAGPIE_DETECT_ENCODING );
+    
+    // if RSS parsed successfully       
+    if ( $rss and !$rss->ERROR) {
+        
+        // find Etag, and Last-Modified
+        foreach($resp->headers as $h) {
+            // 2003-03-02 - Nicola Asuni (www.tecnick.com) - fixed bug "Undefined offset: 1"
+            if (strpos($h, ": ")) {
+                list($field, $val) = explode(": ", $h, 2);
+            }
+            else {
+                $field = $h;
+                $val = "";
+            }
+            
+            if ( $field == 'ETag' ) {
+                $rss->etag = $val;
+            }
+            
+            if ( $field == 'Last-Modified' ) {
+                $rss->last_modified = $val;
+            }
+        }
+        
+        return $rss;    
+    } // else construct error message
+    else {
+        $errormsg = "Failed to parse RSS file.";
+        
+        if ($rss) {
+            $errormsg .= " (" . $rss->ERROR . ")";
+        }
+        error($errormsg);
+        
+        return false;
+    } // end if ($rss and !$rss->error)
+}
+
+/*=======================================================================*\
+    Function:   init
+    Purpose:    setup constants with default values
+                check for user overrides
+\*=======================================================================*/
+function init () {
+    if ( defined('MAGPIE_INITALIZED') ) {
+        return;
+    }
+    else {
+        define('MAGPIE_INITALIZED', true);
+    }
+    
+    if ( !defined('MAGPIE_CACHE_ON') ) {
+        define('MAGPIE_CACHE_ON', true);
+    }
+
+    if ( !defined('MAGPIE_CACHE_DIR') ) {
+        define('MAGPIE_CACHE_DIR', './cache');
+    }
+
+    if ( !defined('MAGPIE_CACHE_AGE') ) {
+        define('MAGPIE_CACHE_AGE', 60*60); // one hour
+    }
+
+    if ( !defined('MAGPIE_CACHE_FRESH_ONLY') ) {
+        define('MAGPIE_CACHE_FRESH_ONLY', false);
+    }
+
+    if ( !defined('MAGPIE_OUTPUT_ENCODING') ) {
+        define('MAGPIE_OUTPUT_ENCODING', 'ISO-8859-1');
+    }
+    
+    if ( !defined('MAGPIE_INPUT_ENCODING') ) {
+        define('MAGPIE_INPUT_ENCODING', null);
+    }
+    
+    if ( !defined('MAGPIE_DETECT_ENCODING') ) {
+        define('MAGPIE_DETECT_ENCODING', true);
+    }
+    
+    if ( !defined('MAGPIE_DEBUG') ) {
+        define('MAGPIE_DEBUG', 0);
+    }
+    
+    if ( !defined('MAGPIE_USER_AGENT') ) {
+        $ua = 'MagpieRSS/'. MAGPIE_VERSION . ' (+http://magpierss.sf.net';
+        
+        if ( MAGPIE_CACHE_ON ) {
+            $ua = $ua . ')';
+        }
+        else {
+            $ua = $ua . '; No cache)';
+        }
+        
+        define('MAGPIE_USER_AGENT', $ua);
+    }
+    
+    if ( !defined('MAGPIE_FETCH_TIME_OUT') ) {
+        define('MAGPIE_FETCH_TIME_OUT', 5); // 5 second timeout
+    }
+    
+    // use gzip encoding to fetch rss files if supported?
+    if ( !defined('MAGPIE_USE_GZIP') ) {
+        define('MAGPIE_USE_GZIP', true);    
+    }
+}
+
+// NOTE: the following code should really be in Snoopy, or at least
+// somewhere other then rss_fetch!
+
+/*=======================================================================*\
+    HTTP STATUS CODE PREDICATES
+    These functions attempt to classify an HTTP status code
+    based on RFC 2616 and RFC 2518.
+    
+    All of them take an HTTP status code as input, and return true or false
+
+    All this code is adapted from LWP's HTTP::Status.
+\*=======================================================================*/
+
+
+/*=======================================================================*\
+    Function:   is_info
+    Purpose:    return true if Informational status code
+\*=======================================================================*/
+function is_info ($sc) { 
+    return $sc >= 100 && $sc < 200; 
+}
+
+/*=======================================================================*\
+    Function:   is_success
+    Purpose:    return true if Successful status code
+\*=======================================================================*/
+function is_success ($sc) { 
+    return $sc >= 200 && $sc < 300; 
+}
+
+/*=======================================================================*\
+    Function:   is_redirect
+    Purpose:    return true if Redirection status code
+\*=======================================================================*/
+function is_redirect ($sc) { 
+    return $sc >= 300 && $sc < 400; 
+}
+
+/*=======================================================================*\
+    Function:   is_error
+    Purpose:    return true if Error status code
+\*=======================================================================*/
+function is_error ($sc) { 
+    return $sc >= 400 && $sc < 600; 
+}
+
+/*=======================================================================*\
+    Function:   is_client_error
+    Purpose:    return true if Error status code, and its a client error
+\*=======================================================================*/
+function is_client_error ($sc) { 
+    return $sc >= 400 && $sc < 500; 
+}
+
+/*=======================================================================*\
+    Function:   is_client_error
+    Purpose:    return true if Error status code, and its a server error
+\*=======================================================================*/
+function is_server_error ($sc) { 
+    return $sc >= 500 && $sc < 600; 
+}
+
+?>
diff --git a/website/magpierss/rss_parse.inc b/website/magpierss/rss_parse.inc
new file mode 100644
index 0000000..56d420f
--- /dev/null
+++ b/website/magpierss/rss_parse.inc
@@ -0,0 +1,605 @@
+<?php
+
+/**
+* Project:     MagpieRSS: a simple RSS integration tool
+* File:        rss_parse.inc  - parse an RSS or Atom feed
+*               return as a simple object.
+*
+* Handles RSS 0.9x, RSS 2.0, RSS 1.0, and Atom 0.3
+*
+* The lastest version of MagpieRSS can be obtained from:
+* http://magpierss.sourceforge.net
+*
+* For questions, help, comments, discussion, etc., please join the
+* Magpie mailing list:
+* magpierss-general at lists.sourceforge.net
+*
+* @author           Kellan Elliott-McCrea <kellan at protest.net>
+* @version          0.7a
+* @license          GPL
+*
+*/
+
+define('RSS', 'RSS');
+define('ATOM', 'Atom');
+
+require_once (MAGPIE_DIR . 'rss_utils.inc');
+
+/**
+* Hybrid parser, and object, takes RSS as a string and returns a simple object.
+*
+* see: rss_fetch.inc for a simpler interface with integrated caching support
+*
+*/
+class MagpieRSS {
+    var $parser;
+    
+    var $current_item   = array();  // item currently being parsed
+    var $items          = array();  // collection of parsed items
+    var $channel        = array();  // hash of channel fields
+    var $textinput      = array();
+    var $image          = array();
+    var $feed_type;
+    var $feed_version;
+    var $encoding       = '';       // output encoding of parsed rss
+    
+    var $_source_encoding = '';     // only set if we have to parse xml prolog
+    
+    var $ERROR = "";
+    var $WARNING = "";
+    
+    // define some constants
+    
+    var $_CONTENT_CONSTRUCTS = array('content', 'summary', 'info', 'title', 'tagline', 'copyright');
+    var $_KNOWN_ENCODINGS    = array('UTF-8', 'US-ASCII', 'ISO-8859-1');
+
+    // parser variables, useless if you're not a parser, treat as private
+    var $stack              = array(); // parser stack
+    var $inchannel          = false;
+    var $initem             = false;
+    var $incontent          = false; // if in Atom <content mode="xml"> field 
+    var $intextinput        = false;
+    var $inimage            = false;
+    var $current_namespace  = false;
+    
+
+    /**
+     *  Set up XML parser, parse source, and return populated RSS object..
+     *   
+     *  @param string $source           string containing the RSS to be parsed
+     *
+     *  NOTE:  Probably a good idea to leave the encoding options alone unless
+     *         you know what you're doing as PHP's character set support is
+     *         a little weird.
+     *
+     *  NOTE:  A lot of this is unnecessary but harmless with PHP5 
+     *
+     *
+     *  @param string $output_encoding  output the parsed RSS in this character 
+     *                                  set defaults to ISO-8859-1 as this is PHP's
+     *                                  default.
+     *
+     *                                  NOTE: might be changed to UTF-8 in future
+     *                                  versions.
+     *                               
+     *  @param string $input_encoding   the character set of the incoming RSS source. 
+     *                                  Leave blank and Magpie will try to figure it
+     *                                  out.
+     *                                  
+     *                                   
+     *  @param bool   $detect_encoding  if false Magpie won't attempt to detect
+     *                                  source encoding. (caveat emptor)
+     *
+     */
+    function MagpieRSS ($source, $output_encoding='ISO-8859-1', 
+                        $input_encoding=null, $detect_encoding=true) 
+    {   
+        # if PHP xml isn't compiled in, die
+        #
+        if (!function_exists('xml_parser_create')) {
+            $this->error( "Failed to load PHP's XML Extension. " . 
+                          "http://www.php.net/manual/en/ref.xml.php",
+                           E_USER_ERROR );
+        }
+        
+        list($parser, $source) = $this->create_parser($source, 
+                $output_encoding, $input_encoding, $detect_encoding);
+        
+        
+        if (!is_resource($parser)) {
+            $this->error( "Failed to create an instance of PHP's XML parser. " .
+                          "http://www.php.net/manual/en/ref.xml.php",
+                          E_USER_ERROR );
+        }
+
+        
+        $this->parser = $parser;
+        
+        # pass in parser, and a reference to this object
+        # setup handlers
+        #
+        xml_set_object( $this->parser, $this );
+        xml_set_element_handler($this->parser, 
+                'feed_start_element', 'feed_end_element' );
+                        
+        xml_set_character_data_handler( $this->parser, 'feed_cdata' ); 
+    
+        $status = xml_parse( $this->parser, $source );
+        
+        if (! $status ) {
+            $errorcode = xml_get_error_code( $this->parser );
+            if ( $errorcode != XML_ERROR_NONE ) {
+                $xml_error = xml_error_string( $errorcode );
+                $error_line = xml_get_current_line_number($this->parser);
+                $error_col = xml_get_current_column_number($this->parser);
+                $errormsg = "$xml_error at line $error_line, column $error_col";
+
+                $this->error( $errormsg );
+            }
+        }
+        
+        xml_parser_free( $this->parser );
+
+        $this->normalize();
+    }
+    
+    function feed_start_element($p, $element, &$attrs) {
+        $el = $element = strtolower($element);
+        $attrs = array_change_key_case($attrs, CASE_LOWER);
+        
+        // check for a namespace, and split if found
+        $ns = false;
+        if ( strpos( $element, ':' ) ) {
+            list($ns, $el) = split( ':', $element, 2); 
+        }
+        if ( $ns and $ns != 'rdf' ) {
+            $this->current_namespace = $ns;
+        }
+            
+        # if feed type isn't set, then this is first element of feed
+        # identify feed from root element
+        #
+        if (!isset($this->feed_type) ) {
+            if ( $el == 'rdf' ) {
+                $this->feed_type = RSS;
+                $this->feed_version = '1.0';
+            }
+            elseif ( $el == 'rss' ) {
+                $this->feed_type = RSS;
+                $this->feed_version = $attrs['version'];
+            }
+            elseif ( $el == 'feed' ) {
+                $this->feed_type = ATOM;
+                $this->feed_version = $attrs['version'];
+                $this->inchannel = true;
+            }
+            return;
+        }
+    
+        if ( $el == 'channel' ) 
+        {
+            $this->inchannel = true;
+        }
+        elseif ($el == 'item' or $el == 'entry' ) 
+        {
+            $this->initem = true;
+            if ( isset($attrs['rdf:about']) ) {
+                $this->current_item['about'] = $attrs['rdf:about']; 
+            }
+        }
+        
+        // if we're in the default namespace of an RSS feed,
+        //  record textinput or image fields
+        elseif ( 
+            $this->feed_type == RSS and 
+            $this->current_namespace == '' and 
+            $el == 'textinput' ) 
+        {
+            $this->intextinput = true;
+        }
+        
+        elseif (
+            $this->feed_type == RSS and 
+            $this->current_namespace == '' and 
+            $el == 'image' ) 
+        {
+            $this->inimage = true;
+        }
+        
+        # handle atom content constructs
+        elseif ( $this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) )
+        {
+            // avoid clashing w/ RSS mod_content
+            if ($el == 'content' ) {
+                $el = 'atom_content';
+            }
+            
+            $this->incontent = $el;
+            
+            
+        }
+        
+        // if inside an Atom content construct (e.g. content or summary) field treat tags as text
+        elseif ($this->feed_type == ATOM and $this->incontent ) 
+        {
+            // if tags are inlined, then flatten
+            $attrs_str = join(' ', 
+                    array_map('map_attrs', 
+                    array_keys($attrs), 
+                    array_values($attrs) ) );
+            
+            $this->append_content( "<$element $attrs_str>"  );
+                    
+            array_unshift( $this->stack, $el );
+        }
+        
+        // Atom support many links per containging element.
+        // Magpie treats link elements of type rel='alternate'
+        // as being equivalent to RSS's simple link element.
+        //
+        elseif ($this->feed_type == ATOM and $el == 'link' ) 
+        {
+            if ( isset($attrs['rel']) and $attrs['rel'] == 'alternate' ) 
+            {
+                $link_el = 'link';
+            }
+            else {
+                $link_el = 'link_' . $attrs['rel'];
+            }
+            
+            $this->append($link_el, $attrs['href']);
+        }
+        // set stack[0] to current element
+        else {
+            array_unshift($this->stack, $el);
+        }
+    }
+    
+
+    
+    function feed_cdata ($p, $text) {
+        if ($this->feed_type == ATOM and $this->incontent) 
+        {
+            $this->append_content( $text );
+        }
+        else {
+            $current_el = join('_', array_reverse($this->stack));
+            $this->append($current_el, $text);
+        }
+    }
+    
+    function feed_end_element ($p, $el) {
+        $el = strtolower($el);
+        
+        if ( $el == 'item' or $el == 'entry' ) 
+        {
+            $this->items[] = $this->current_item;
+            $this->current_item = array();
+            $this->initem = false;
+        }
+        elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'textinput' ) 
+        {
+            $this->intextinput = false;
+        }
+        elseif ($this->feed_type == RSS and $this->current_namespace == '' and $el == 'image' ) 
+        {
+            $this->inimage = false;
+        }
+        elseif ($this->feed_type == ATOM and in_array($el, $this->_CONTENT_CONSTRUCTS) )
+        {   
+            $this->incontent = false;
+        }
+        elseif ($el == 'channel' or $el == 'feed' ) 
+        {
+            $this->inchannel = false;
+        }
+        elseif ($this->feed_type == ATOM and $this->incontent  ) {
+            // balance tags properly
+            // note:  i don't think this is actually neccessary
+            if ( $this->stack[0] == $el ) 
+            {
+                $this->append_content("</$el>");
+            }
+            else {
+                $this->append_content("<$el />");
+            }
+
+            array_shift( $this->stack );
+        }
+        else {
+            array_shift( $this->stack );
+        }
+        
+        $this->current_namespace = false;
+    }
+    
+    function concat (&$str1, $str2="") {
+        if (!isset($str1) ) {
+            $str1="";
+        }
+        $str1 .= $str2;
+    }
+    
+    
+    
+    function append_content($text) {
+        if ( $this->initem ) {
+            $this->concat( $this->current_item[ $this->incontent ], $text );
+        }
+        elseif ( $this->inchannel ) {
+            $this->concat( $this->channel[ $this->incontent ], $text );
+        }
+    }
+    
+    // smart append - field and namespace aware
+    function append($el, $text) {
+        if (!$el) {
+            return;
+        }
+        if ( $this->current_namespace ) 
+        {
+            if ( $this->initem ) {
+                $this->concat(
+                    $this->current_item[ $this->current_namespace ][ $el ], $text);
+            }
+            elseif ($this->inchannel) {
+                $this->concat(
+                    $this->channel[ $this->current_namespace][ $el ], $text );
+            }
+            elseif ($this->intextinput) {
+                $this->concat(
+                    $this->textinput[ $this->current_namespace][ $el ], $text );
+            }
+            elseif ($this->inimage) {
+                $this->concat(
+                    $this->image[ $this->current_namespace ][ $el ], $text );
+            }
+        }
+        else {
+            if ( $this->initem ) {
+                $this->concat(
+                    $this->current_item[ $el ], $text);
+            }
+            elseif ($this->intextinput) {
+                $this->concat(
+                    $this->textinput[ $el ], $text );
+            }
+            elseif ($this->inimage) {
+                $this->concat(
+                    $this->image[ $el ], $text );
+            }
+            elseif ($this->inchannel) {
+                $this->concat(
+                    $this->channel[ $el ], $text );
+            }
+            
+        }
+    }
+    
+    function normalize () {
+        // if atom populate rss fields
+        if ( $this->is_atom() ) {
+            $this->channel['description'] = $this->channel['tagline'];
+            for ( $i = 0; $i < count($this->items); $i++) {
+                $item = $this->items[$i];
+                if ( isset($item['summary']) )
+                    $item['description'] = $item['summary'];
+                if ( isset($item['atom_content']))
+                    $item['content']['encoded'] = $item['atom_content'];
+                
+                $atom_date = (isset($item['issued']) ) ? $item['issued'] : $item['modified'];
+                if ( $atom_date ) {
+                    $epoch = @parse_w3cdtf($atom_date);
+                    if ($epoch and $epoch > 0) {
+                        $item['date_timestamp'] = $epoch;
+                    }
+                }
+                
+                $this->items[$i] = $item;
+            }       
+        }
+        elseif ( $this->is_rss() ) {
+            $this->channel['tagline'] = $this->channel['description'];
+            for ( $i = 0; $i < count($this->items); $i++) {
+                $item = $this->items[$i];
+                if ( isset($item['description']))
+                    $item['summary'] = $item['description'];
+                if ( isset($item['content']['encoded'] ) )
+                    $item['atom_content'] = $item['content']['encoded'];
+                
+                if ( $this->is_rss() == '1.0' and isset($item['dc']['date']) ) {
+                    $epoch = @parse_w3cdtf($item['dc']['date']);
+                    if ($epoch and $epoch > 0) {
+                        $item['date_timestamp'] = $epoch;
+                    }
+                }
+                elseif ( isset($item['pubdate']) ) {
+                    $epoch = @strtotime($item['pubdate']);
+                    if ($epoch > 0) {
+                        $item['date_timestamp'] = $epoch;
+                    }
+                }
+                
+                $this->items[$i] = $item;
+            }
+        }
+    }
+    
+    
+    function is_rss () {
+        if ( $this->feed_type == RSS ) {
+            return $this->feed_version; 
+        }
+        else {
+            return false;
+        }
+    }
+    
+    function is_atom() {
+        if ( $this->feed_type == ATOM ) {
+            return $this->feed_version;
+        }
+        else {
+            return false;
+        }
+    }
+
+    /**
+    * return XML parser, and possibly re-encoded source
+    *
+    */
+    function create_parser($source, $out_enc, $in_enc, $detect) {
+        if ( substr(phpversion(),0,1) == 5) {
+            $parser = $this->php5_create_parser($in_enc, $detect);
+        }
+        else {
+            list($parser, $source) = $this->php4_create_parser($source, $in_enc, $detect);
+        }
+        if ($out_enc) {
+            $this->encoding = $out_enc;
+            xml_parser_set_option($parser, XML_OPTION_TARGET_ENCODING, $out_enc);
+        }
+        
+        return array($parser, $source);
+    }
+    
+    /**
+    * Instantiate an XML parser under PHP5
+    *
+    * PHP5 will do a fine job of detecting input encoding
+    * if passed an empty string as the encoding. 
+    *
+    * All hail libxml2!
+    *
+    */
+    function php5_create_parser($in_enc, $detect) {
+        // by default php5 does a fine job of detecting input encodings
+        if(!$detect && $in_enc) {
+            return xml_parser_create($in_enc);
+        }
+        else {
+            return xml_parser_create('');
+        }
+    }
+    
+    /**
+    * Instaniate an XML parser under PHP4
+    *
+    * Unfortunately PHP4's support for character encodings
+    * and especially XML and character encodings sucks.  As
+    * long as the documents you parse only contain characters
+    * from the ISO-8859-1 character set (a superset of ASCII,
+    * and a subset of UTF-8) you're fine.  However once you
+    * step out of that comfy little world things get mad, bad,
+    * and dangerous to know.
+    *
+    * The following code is based on SJM's work with FoF
+    * @see http://minutillo.com/steve/weblog/2004/6/17/php-xml-and-character-encodings-a-tale-of-sadness-rage-and-data-loss
+    *
+    */
+    function php4_create_parser($source, $in_enc, $detect) {
+        if ( !$detect ) {
+            return array(xml_parser_create($in_enc), $source);
+        }
+        
+        if (!$in_enc) {
+            if (preg_match('/<?xml.*encoding=[\'"](.*?)[\'"].*?>/m', $source, $m)) {
+                $in_enc = strtoupper($m[1]);
+                $this->source_encoding = $in_enc;
+            }
+            else {
+                $in_enc = 'UTF-8';
+            }
+        }
+        
+        if ($this->known_encoding($in_enc)) {
+            return array(xml_parser_create($in_enc), $source);
+        }
+        
+        // the dectected encoding is not one of the simple encodings PHP knows
+        
+        // attempt to use the iconv extension to
+        // cast the XML to a known encoding
+        // @see http://php.net/iconv
+       
+        if (function_exists('iconv'))  {
+            $encoded_source = iconv($in_enc,'UTF-8', $source);
+            if ($encoded_source) {
+                return array(xml_parser_create('UTF-8'), $encoded_source);
+            }
+        }
+        
+        // iconv didn't work, try mb_convert_encoding
+        // @see http://php.net/mbstring
+        if(function_exists('mb_convert_encoding')) {
+            $encoded_source = mb_convert_encoding($source, 'UTF-8', $in_enc );
+            if ($encoded_source) {
+                return array(xml_parser_create('UTF-8'), $encoded_source);
+            }
+        }
+        
+        // else 
+        $this->error("Feed is in an unsupported character encoding. ($in_enc) " .
+                     "You may see strange artifacts, and mangled characters.",
+                     E_USER_NOTICE);
+            
+        return array(xml_parser_create(), $source);
+    }
+    
+    function known_encoding($enc) {
+        $enc = strtoupper($enc);
+        if ( in_array($enc, $this->_KNOWN_ENCODINGS) ) {
+            return $enc;
+        }
+        else {
+            return false;
+        }
+    }
+
+    function error ($errormsg, $lvl=E_USER_WARNING) {
+        // append PHP's error message if track_errors enabled
+        if ( isset($php_errormsg) ) { 
+            $errormsg .= " ($php_errormsg)";
+        }
+        if ( MAGPIE_DEBUG ) {
+            trigger_error( $errormsg, $lvl);        
+        }
+        else {
+            error_log( $errormsg, 0);
+        }
+        
+        $notices = E_USER_NOTICE|E_NOTICE;
+        if ( $lvl&$notices ) {
+            $this->WARNING = $errormsg;
+        } else {
+            $this->ERROR = $errormsg;
+        }
+    }
+    
+    
+} // end class RSS
+
+function map_attrs($k, $v) {
+    return "$k=\"$v\"";
+}
+
+// patch to support medieval versions of PHP4.1.x, 
+// courtesy, Ryan Currie, ryan at digibliss.com
+
+if (!function_exists('array_change_key_case')) {
+	define("CASE_UPPER",1);
+	define("CASE_LOWER",0);
+
+
+	function array_change_key_case($array,$case=CASE_LOWER) {
+       if ($case=CASE_LOWER) $cmd=strtolower;
+       elseif ($case=CASE_UPPER) $cmd=strtoupper;
+       foreach($array as $key=>$value) {
+               $output[$cmd($key)]=$value;
+       }
+       return $output;
+	}
+
+}
+
+?>
diff --git a/website/magpierss/rss_utils.inc b/website/magpierss/rss_utils.inc
new file mode 100644
index 0000000..2a29e72
--- /dev/null
+++ b/website/magpierss/rss_utils.inc
@@ -0,0 +1,67 @@
+<?php
+/*
+ * Project:     MagpieRSS: a simple RSS integration tool
+ * File:        rss_utils.inc, utility methods for working with RSS
+ * Author:      Kellan Elliott-McCrea <kellan at protest.net>
+ * Version:     0.51
+ * License:     GPL
+ *
+ * The lastest version of MagpieRSS can be obtained from:
+ * http://magpierss.sourceforge.net
+ *
+ * For questions, help, comments, discussion, etc., please join the
+ * Magpie mailing list:
+ * magpierss-general at lists.sourceforge.net
+ */
+
+
+/*======================================================================*\
+    Function: parse_w3cdtf
+    Purpose:  parse a W3CDTF date into unix epoch
+
+    NOTE: http://www.w3.org/TR/NOTE-datetime
+\*======================================================================*/
+
+function parse_w3cdtf ( $date_str ) {
+    
+    # regex to match wc3dtf
+    $pat = "/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2})(:(\d{2}))?(?:([-+])(\d{2}):?(\d{2})|(Z))?/";
+    
+    if ( preg_match( $pat, $date_str, $match ) ) {
+        list( $year, $month, $day, $hours, $minutes, $seconds) = 
+            array( $match[1], $match[2], $match[3], $match[4], $match[5], $match[6]);
+        
+        # calc epoch for current date assuming GMT
+        $epoch = gmmktime( $hours, $minutes, $seconds, $month, $day, $year);
+        
+        $offset = 0;
+        if ( $match[10] == 'Z' ) {
+            # zulu time, aka GMT
+        }
+        else {
+            list( $tz_mod, $tz_hour, $tz_min ) =
+                array( $match[8], $match[9], $match[10]);
+            
+            # zero out the variables
+            if ( ! $tz_hour ) { $tz_hour = 0; }
+            if ( ! $tz_min ) { $tz_min = 0; }
+        
+            $offset_secs = (($tz_hour*60)+$tz_min)*60;
+            
+            # is timezone ahead of GMT?  then subtract offset
+            #
+            if ( $tz_mod == '+' ) {
+                $offset_secs = $offset_secs * -1;
+            }
+            
+            $offset = $offset_secs; 
+        }
+        $epoch = $epoch + $offset;
+        return $epoch;
+    }
+    else {
+        return -1;
+    }
+}
+
+?>
diff --git a/website/nav.html b/website/nav.html
new file mode 100644
index 0000000..27685bf
--- /dev/null
+++ b/website/nav.html
@@ -0,0 +1,7 @@
+ <ul id="nav">
+   <li id="active">About</li>
+   <li><a href="news.php">News</a></li>
+   <li><a href="#">Download</a></li>
+   <li><a href="#">FAQ</a></li>
+   <li><a href="#">Communicate</a></li>
+ </ul>
diff --git a/website/nav.php b/website/nav.php
new file mode 100755
index 0000000..2646e2e
--- /dev/null
+++ b/website/nav.php
@@ -0,0 +1,96 @@
+<?php
+  switch ($current_page) {
+
+	case "about":
+		echo "<ul id=\"nav\">
+  		 <li id=\"active\"><a href=\"index.php\">About</a></li>
+  		 <li><a href=\"news.php\">News</a></li>
+   		<li><a href=\"download.php\">Download</a></li>
+  		 <li><a href=\"faq.php\">FAQ</a></li>
+  		 <li><a href=\"components\">Components</a></li>
+  		 <li><a href=\"documentation.php\">Documentation</a></li>
+  		 <li><a href=\"communicate\">Communicate</a></li>
+ 		</ul>";
+		break;
+  	case "news":
+		echo "<ul id=\"nav\">
+ 		  <li><a href=\"index.php\">About</a></li>
+  		 <li id=\"active\"><a href=\"news.php\">News</a></li>
+  		 <li><a href=\"download.php\">Download</a></li>
+  		 <li><a href=\"faq.php\">FAQ</a></li>
+  		 <li><a href=\"components\">Components</a></li>
+  		 <li><a href=\"documentation.php\">Documentation</a></li>
+ 		  <li><a href=\"communicate.php\">Communicate</a></li>
+ 		</ul>";
+		break;
+  	case "download":
+		echo "<ul id=\"nav\">
+   		<li><a href=\"index.php\">About</a></li>
+  		 <li><a href=\"news.php\">News</a></li>
+  		 <li id=\"active\"><a href=\"#\">Download</a></li>
+  		 <li><a href=\"faq.php\">FAQ</a></li>
+  		 <li><a href=\"components\">Components</a></li>
+  		 <li><a href=\"documentation.php\">Documentation</a></li>
+ 		  <li><a href=\"communicate.php\">Communicate</a></li>
+		 </ul>";
+		break;
+  	case "faq":
+		echo "<ul id=\"nav\">
+   		<li><a href=\"index.php\">About</a></li>
+  		 <li><a href=\"news.php\">News</a></li>
+  		 <li><a href=\"download.php\">Download</a></li>
+  		 <li id=\"active\"><a href=\"faq.php\">FAQ</a></li>
+  		 <li><a href=\"components\">Components</a></li>
+  		 <li><a href=\"documentation.php\">Documentation</a></li>
+  		 <li><a href=\"communicate.php\">Communicate</a></li>
+ 		</ul>";
+		break;
+  	case "communicate":
+		echo "<ul id=\"nav\">
+ 		  <li><a href=\"index.php\">About</a></li>
+		   <li><a href=\"news.php\">News</a></li>
+  		 <li><a href=\"download.php\">Download</a></li>
+  		 <li><a href=\"faq.php\">FAQ</a></li>
+  		 <li><a href=\"components\">Components</a></li>
+  		 <li><a href=\"documentation.php\">Documentation</a></li>
+  		 <li id=\"active\"><a href=\"communicate.php\">Communicate</a></li>
+ 		</ul>";
+		break;
+	case "documentation":
+                echo "<ul id=\"nav\">
+                  <li><a href=\"index.php\">About</a></li>
+                   <li><a href=\"news.php\">News</a></li>
+                 <li><a href=\"download.php\">Download</a></li>
+                 <li><a href=\"faq.php\">FAQ</a></li>
+  		 <li><a href=\"components\">Components</a></li>
+                 <li id=\"active\"><a href=\"documentation.php\">Documentation</a></li>                 
+		<li><a href=\"communicate.php\">Communicate</a></li>
+                </ul>";
+		break;
+	case "components":
+		echo " <ul id=\"nav\">
+  		 <li><a href=\"index.php\">About</a></li>
+ 		  <li><a href=\"news.php\">News</a></li>
+  		 <li><a href=\"download.php\">Download</a></li>
+  		 <li><a href=\"faq.php\">FAQ</a></li>
+  		 <li id=\"active\"><a href=\"components\">Components</a></li>
+  		 <li><a href=\"documentation.php\">Documentation</a></li>
+ 		  <li><a href=\"communicate.php\">Communicate</a></li>
+ 		</ul>";
+		break;
+	default:
+		echo " <ul id=\"nav\">
+  		 <li id=\"active\"><a href=\"index.php\">About</a></li>
+ 		  <li><a href=\"news.php\">News</a></li>
+  		 <li><a href=\"download.php\">Download</a></li>
+  		 <li><a href=\"faq.php\">FAQ</a></li>
+  		 <li><a href=\"components\">Components</a></li>
+  		 <li><a href=\"documentation.php\">Documentation</a></li>
+ 		  <li><a href=\"communicate.php\">Communicate</a></li>
+ 		</ul>";
+		break;
+
+}
+
+?>
+
diff --git a/common/busrpc/busrpc/__init__.py b/website/news-feed.php
similarity index 100%
copy from common/busrpc/busrpc/__init__.py
copy to website/news-feed.php
diff --git a/website/news.html b/website/news.html
new file mode 100644
index 0000000..2981fd1
--- /dev/null
+++ b/website/news.html
@@ -0,0 +1 @@
+news goes here.
diff --git a/website/news.php b/website/news.php
new file mode 100755
index 0000000..f44d24f
--- /dev/null
+++ b/website/news.php
@@ -0,0 +1,70 @@
+<?php
+  $current_page = 'news';
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="description" content="" />
+<meta name="keywords" content="" />
+<title>UMP: Update and Management Platform</title>
+
+  <link rel="stylesheet" href="css/style.css" type="text/css" media="all" />
+</head>
+
+<body>
+<div id="wrap">
+<?php 
+  include("top.html"); 
+?>
+
+<div id="main">
+<div id="sidebar">
+<?php 
+  include("nav.php"); 
+?>
+</div>
+
+<div id="content">
+
+<h2>News</h2>
+
+<?php
+
+require_once('magpierss/rss_fetch.inc');
+
+$url = 'http://umpdevel.wordpress.com/feed/';
+$rss = fetch_rss($url);
+
+	foreach ($rss->items as $item) {
+		$href = $item['link'];
+		$title = $item['title'];
+		$body = $item['content']['encoded'];
+		$author = $item['dc']['creator'];
+		$category = $item['category'];
+		$comment_url = $item['comments'];
+		$raw_timestamp = $item['pubdate'];
+		$unixtime = strtotime($raw_timestamp);
+		$timestamp = date('g:i A T j F Y', $unixtime);
+
+		echo "<h3>$title</h3>";
+		echo "<p>$body</p>";
+		echo "<p class=\"metadata\">Posted $timestamp by $author in $category  |  <a href=$href>Comment on this!</a></p>";
+	}
+	
+
+?>
+
+</div>
+</div>
+<div id="footer">
+<?php 
+  include("footer.html"); 
+?>
+</div>
+</div>
+</body>
+</html>
diff --git a/website/rss-aggregator.php b/website/rss-aggregator.php
new file mode 100755
index 0000000..9cbb837
--- /dev/null
+++ b/website/rss-aggregator.php
@@ -0,0 +1,73 @@
+<h1>Simple RSS agregator</h1>
+<a href="http://www.webdot.cz/lastrss/">
+<img src="lastrss_button.gif" alt="" width="88" height="31" border="0">
+</a><hr>
+<!-- / Heading -->
+
+<?php
+/* 
+ ======================================================================
+ lastRSS usage DEMO 3 - Simple RSS agregator
+ ----------------------------------------------------------------------
+ This example shows, how to create simple RSS agregator
+     - create lastRSS object
+    - set transparent cache
+    - show a few RSS files at once
+ ======================================================================
+*/
+
+function ShowOneRSS($url) {
+    global $rss;
+    if ($rs = $rss->get($url)) {
+        echo "<big><b><a href=\"$rs[link]\">$rs[title]</a></b></big><br />\n";
+        echo "$rs[description]<br />\n";
+
+            echo "<ul>\n";
+            foreach ($rs['items'] as $item) {
+                echo "\t<li><a href=\"$item[link]\" title=\"$item[description]\">$item[title]</a></li>\n";
+            }
+            if ($rs['items_count'] <= 0) { echo "<li>Sorry, no items found in the RSS file :-(</li>"; }
+            echo "</ul>\n";
+    }
+    else {
+        echo "Sorry: It's not possible to reach RSS file $url\n<br />";
+        // you will probably hide this message in a live version
+    }
+}
+
+// ===============================================================================
+
+// include lastRSS
+include "./rss-parser.php";
+
+// List of RSS URLs
+$rss_left = array(
+    'http://freshmeat.net/backend/fm.rdf',
+    'http://slashdot.org/slashdot.rdf'
+);
+$rss_right = array(
+    'http://www.freshfolder.com/rss.php',
+    'http://phpbuilder.com/rss_feed.php'
+);
+
+// Create lastRSS object
+$rss = new lastRSS;
+
+// Set cache dir and cache time limit (5 seconds)
+// (don't forget to chmod cahce dir to 777 to allow writing)
+$rss->cache_dir = './temp';
+$rss->cache_time = 1200;
+
+
+// Show all rss files
+echo "<table cellpadding=\"10\" border=\"0\"><tr><td width=\"50%\" valign=\"top\">";
+foreach ($rss_left as $url) {
+    ShowOneRSS($url);
+}
+echo "</td><td width=\"50%\" valign=\"top\">";
+foreach ($rss_right as $url) {
+    ShowOneRSS($url);
+}
+echo "</td></tr></table>";
+?>
+
diff --git a/website/rss-parser.php b/website/rss-parser.php
new file mode 100755
index 0000000..cfe1637
--- /dev/null
+++ b/website/rss-parser.php
@@ -0,0 +1,221 @@
+<?php
+/*
+ ======================================================================
+ lastRSS 0.9.1
+ 
+ Simple yet powerfull PHP class to parse RSS files.
+ 
+ by Vojtech Semecky, webmaster @ oslab . net
+ 
+ Latest version, features, manual and examples:
+     http://lastrss.oslab.net/
+
+ ----------------------------------------------------------------------
+ LICENSE
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License (GPL)
+ as published by the Free Software Foundation; either version 2
+ 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.
+
+ To read the license please visit http://www.gnu.org/copyleft/gpl.html
+ ======================================================================
+*/
+
+/**
+* lastRSS
+* Simple yet powerfull PHP class to parse RSS files.
+*/
+class lastRSS {
+    // -------------------------------------------------------------------
+    // Public properties
+    // -------------------------------------------------------------------
+    var $default_cp = 'UTF-8';
+    var $CDATA = 'nochange';
+    var $cp = '';
+    var $items_limit = 0;
+    var $stripHTML = False;
+    var $date_format = '';
+
+    // -------------------------------------------------------------------
+    // Private variables
+    // -------------------------------------------------------------------
+    var $channeltags = array ('title', 'link', 'description', 'language', 'copyright', 'managingEditor', 'webMaster', 'lastBuildDate', 'rating', 'docs');
+    var $itemtags = array('title', 'link', 'description', 'author', 'category', 'comments', 'enclosure', 'guid', 'pubDate', 'source');
+    var $imagetags = array('title', 'url', 'link', 'width', 'height');
+    var $textinputtags = array('title', 'description', 'name', 'link');
+
+    // -------------------------------------------------------------------
+    // Parse RSS file and returns associative array.
+    // -------------------------------------------------------------------
+    function Get ($rss_url) {
+        // If CACHE ENABLED
+        if ($this->cache_dir != '') {
+            $cache_file = $this->cache_dir . '/rsscache_' . md5($rss_url);
+            $timedif = @(time() - filemtime($cache_file));
+            if ($timedif < $this->cache_time) {
+                // cached file is fresh enough, return cached array
+                $result = unserialize(join('', file($cache_file)));
+                // set 'cached' to 1 only if cached file is correct
+                if ($result) $result['cached'] = 1;
+            } else {
+                // cached file is too old, create new
+                $result = $this->Parse($rss_url);
+                $serialized = serialize($result);
+                if ($f = @fopen($cache_file, 'w')) {
+                    fwrite ($f, $serialized, strlen($serialized));
+                    fclose($f);
+                }
+                if ($result) $result['cached'] = 0;
+            }
+        }
+        // If CACHE DISABLED >> load and parse the file directly
+        else {
+            $result = $this->Parse($rss_url);
+            if ($result) $result['cached'] = 0;
+        }
+        // return result
+        return $result;
+    }
+    
+    // -------------------------------------------------------------------
+    // Modification of preg_match(); return trimed field with index 1
+    // from 'classic' preg_match() array output
+    // -------------------------------------------------------------------
+    function my_preg_match ($pattern, $subject) {
+        // start regullar expression
+        preg_match($pattern, $subject, $out);
+
+        // if there is some result... process it and return it
+        if(isset($out[1])) {
+            // Process CDATA (if present)
+            if ($this->CDATA == 'content') { // Get CDATA content (without CDATA tag)
+                $out[1] = strtr($out[1], array('<![CDATA['=>'', ']]>'=>''));
+            } elseif ($this->CDATA == 'strip') { // Strip CDATA
+                $out[1] = strtr($out[1], array('<![CDATA['=>'', ']]>'=>''));
+            }
+
+            // If code page is set convert character encoding to required
+            if ($this->cp != '')
+                //$out[1] = $this->MyConvertEncoding($this->rsscp, $this->cp, $out[1]);
+                $out[1] = iconv($this->rsscp, $this->cp.'//TRANSLIT', $out[1]);
+            // Return result
+            return trim($out[1]);
+        } else {
+        // if there is NO result, return empty string
+            return '';
+        }
+    }
+
+    // -------------------------------------------------------------------
+    // Replace HTML entities &something; by real characters
+    // -------------------------------------------------------------------
+    function unhtmlentities ($string) {
+        // Get HTML entities table
+        $trans_tbl = get_html_translation_table (HTML_ENTITIES, ENT_QUOTES);
+        // Flip keys<==>values
+        $trans_tbl = array_flip ($trans_tbl);
+        // Add support for ' entity (missing in HTML_ENTITIES)
+        $trans_tbl += array(''' => "'");
+        // Replace entities by values
+        return strtr ($string, $trans_tbl);
+    }
+
+    // -------------------------------------------------------------------
+    // Parse() is private method used by Get() to load and parse RSS file.
+    // Don't use Parse() in your scripts - use Get($rss_file) instead.
+    // -------------------------------------------------------------------
+    function Parse ($rss_url) {
+        // Open and load RSS file
+        if ($f = @fopen($rss_url, 'r')) {
+            $rss_content = '';
+            while (!feof($f)) {
+                $rss_content .= fgets($f, 4096);
+            }
+            fclose($f);
+
+            // Parse document encoding
+            $result['encoding'] = $this->my_preg_match("'encoding=[\'\"](.*?)[\'\"]'si", $rss_content);
+            // if document codepage is specified, use it
+            if ($result['encoding'] != '')
+                { $this->rsscp = $result['encoding']; } // This is used in my_preg_match()
+            // otherwise use the default codepage
+            else
+                { $this->rsscp = $this->default_cp; } // This is used in my_preg_match()
+
+            // Parse CHANNEL info
+            preg_match("'<channel.*?>(.*?)</channel>'si", $rss_content, $out_channel);
+            foreach($this->channeltags as $channeltag)
+            {
+                $temp = $this->my_preg_match("'<$channeltag.*?>(.*?)</$channeltag>'si", $out_channel[1]);
+                if ($temp != '') $result[$channeltag] = $temp; // Set only if not empty
+            }
+            // If date_format is specified and lastBuildDate is valid
+            if ($this->date_format != '' && ($timestamp = strtotime($result['lastBuildDate'])) !==-1) {
+                        // convert lastBuildDate to specified date format
+                        $result['lastBuildDate'] = date($this->date_format, $timestamp);
+            }
+
+            // Parse TEXTINPUT info
+            preg_match("'<textinput(|[^>]*[^/])>(.*?)</textinput>'si", $rss_content, $out_textinfo);
+                // This a little strange regexp means:
+                // Look for tag <textinput> with or without any attributes, but skip truncated version <textinput /> (it's not beggining tag)
+            if (isset($out_textinfo[2])) {
+                foreach($this->textinputtags as $textinputtag) {
+                    $temp = $this->my_preg_match("'<$textinputtag.*?>(.*?)</$textinputtag>'si", $out_textinfo[2]);
+                    if ($temp != '') $result['textinput_'.$textinputtag] = $temp; // Set only if not empty
+                }
+            }
+            // Parse IMAGE info
+            preg_match("'<image.*?>(.*?)</image>'si", $rss_content, $out_imageinfo);
+            if (isset($out_imageinfo[1])) {
+                foreach($this->imagetags as $imagetag) {
+                    $temp = $this->my_preg_match("'<$imagetag.*?>(.*?)</$imagetag>'si", $out_imageinfo[1]);
+                    if ($temp != '') $result['image_'.$imagetag] = $temp; // Set only if not empty
+                }
+            }
+            // Parse ITEMS
+            preg_match_all("'<item(| .*?)>(.*?)</item>'si", $rss_content, $items);
+            $rss_items = $items[2];
+            $i = 0;
+            $result['items'] = array(); // create array even if there are no items
+            foreach($rss_items as $rss_item) {
+                // If number of items is lower then limit: Parse one item
+                if ($i < $this->items_limit || $this->items_limit == 0) {
+                    foreach($this->itemtags as $itemtag) {
+                        $temp = $this->my_preg_match("'<$itemtag.*?>(.*?)</$itemtag>'si", $rss_item);
+                        if ($temp != '') $result['items'][$i][$itemtag] = $temp; // Set only if not empty
+                    }
+                    // Strip HTML tags and other bullshit from DESCRIPTION
+                    if ($this->stripHTML && $result['items'][$i]['description'])
+                        $result['items'][$i]['description'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['description'])));
+                    // Strip HTML tags and other bullshit from TITLE
+                    if ($this->stripHTML && $result['items'][$i]['title'])
+                        $result['items'][$i]['title'] = strip_tags($this->unhtmlentities(strip_tags($result['items'][$i]['title'])));
+                    // If date_format is specified and pubDate is valid
+                    if ($this->date_format != '' && ($timestamp = strtotime($result['items'][$i]['pubDate'])) !==-1) {
+                        // convert pubDate to specified date format
+                        $result['items'][$i]['pubDate'] = date($this->date_format, $timestamp);
+                    }
+                    // Item counter
+                    $i++;
+                }
+            }
+
+            $result['items_count'] = $i;
+            return $result;
+        }
+        else // Error in opening return False
+        {
+            return False;
+        }
+    }
+}
+
+?>
+
diff --git a/website/top.html b/website/top.html
new file mode 100644
index 0000000..ec7aae8
--- /dev/null
+++ b/website/top.html
@@ -0,0 +1,3 @@
+<h1 id="masthead">
+<a href="index.php"><img src="img/logo-ump.png" alt="UMP: Update and Management Platform" /></a>
+</h1>
diff --git a/website/ump-install-setup.php b/website/ump-install-setup.php
new file mode 100755
index 0000000..99d6456
--- /dev/null
+++ b/website/ump-install-setup.php
@@ -0,0 +1,44 @@
+<?php
+  $current_page = 'documentation';
+?>
+
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+<meta name="description" content="" />
+<meta name="keywords" content="" />
+<title>UMP: Update and Management Platform</title>
+
+  <link rel="stylesheet" href="css/style.css" type="text/css" media="all" />
+</head>
+
+<body>
+<div id="wrap">
+<?php 
+  include("top.html"); 
+?>
+
+<div id="main">
+ <div id="sidebar">
+<?php 
+  include("nav.php"); 
+?>
+ </div>
+
+<div id="content">
+<?php 
+  include("docs/ump-install-setup.html"); 
+?>
+
+</div>
+</div>
+<div id="footer">
+<?php 
+  include("footer.html"); 
+?>
+</div>
+</div>
+</body>
+</html>

hooks/update
---
Git Source Code Management System
hooks/update refs/heads/master \
  4c53d869c32be040edb8006ff5ddaa5dc9dcb60c \
  38c41af4ae9a7718bd982ac8dc24ac2593598c8f




More information about the Et-mgmt-commits-list mailing list