From dc3f5ff87cfa085998bf69db6dedad45440419d3 Mon Sep 17 00:00:00 2001 From: Kyle Ambroff Date: Sat, 21 Jun 2008 07:39:52 +0000 Subject: svn merge -r90150:90340 svn+ssh://svn.lindenlab.com/svn/linden/branches/qar-699_combo-merge --> release QAR-699 - Combo merge for QAR-687, QAR-637, QAR-586 * QAR-687 - Test build with libs on S3 * QAR-637 Test dynamic sound throttle * QAR-586 Test new http features branch --- indra/cmake/CMakeLists.txt | 1 - indra/llcommon/llkeythrottle.h | 35 ++-- indra/llmessage/llcurl.cpp | 54 +++--- indra/llmessage/llcurl.h | 28 ++- indra/llmessage/llhttpclient.cpp | 43 ++--- indra/llmessage/llhttpnode.cpp | 27 +++ indra/llmessage/llhttpnode.h | 88 +++++++--- indra/llmessage/lliohttpserver.cpp | 48 ++++-- indra/newview/CMakeLists.txt | 1 - indra/test/lliohttpserver_tut.cpp | 17 ++ install.xml | 342 ++++++++++++++++++++----------------- scripts/install.py | 228 +++++++++++++------------ 12 files changed, 530 insertions(+), 382 deletions(-) diff --git a/indra/cmake/CMakeLists.txt b/indra/cmake/CMakeLists.txt index 9cc34ea159..f0bb241961 100644 --- a/indra/cmake/CMakeLists.txt +++ b/indra/cmake/CMakeLists.txt @@ -63,7 +63,6 @@ set(cmake_SOURCE_FILES PNG.cmake Python.cmake QuickTime.cmake - Smartheap.cmake TemplateCheck.cmake UI.cmake UnixInstall.cmake diff --git a/indra/llcommon/llkeythrottle.h b/indra/llcommon/llkeythrottle.h index 61a43b2dad..ac2f4254f2 100644 --- a/indra/llcommon/llkeythrottle.h +++ b/indra/llcommon/llkeythrottle.h @@ -55,28 +55,31 @@ class LLKeyThrottleImpl protected: struct Entry { U32 count; - BOOL blocked; + bool blocked; - Entry() : count(0), blocked(FALSE) { } + Entry() : count(0), blocked(false) { } }; typedef std::map EntryMap; - EntryMap * prevMap; - EntryMap * currMap; + EntryMap* prevMap; + EntryMap* currMap; U32 countLimit; // maximum number of keys allowed per interval U64 intervalLength; // each map covers this time period (usec or frame number) U64 startTime; // start of the time period (usec or frame number) - // currMap started counting at this time // prevMap covers the previous interval - LLKeyThrottleImpl() : prevMap(0), currMap(0), - countLimit(0), intervalLength(1), - startTime(0) { }; + LLKeyThrottleImpl() : + prevMap(NULL), + currMap(NULL), + countLimit(0), + intervalLength(1), + startTime(0) + {} static U64 getTime() { @@ -93,7 +96,9 @@ template< class T > class LLKeyThrottle { public: - LLKeyThrottle(U32 limit, F32 interval, BOOL realtime = TRUE) // realtime = FALSE for frame-based throttle, TRUE for usec real-time throttle + // @param realtime = FALSE for frame-based throttle, TRUE for usec + // real-time throttle + LLKeyThrottle(U32 limit, F32 interval, BOOL realtime = TRUE) : m(* new LLKeyThrottleImpl) { setParameters( limit, interval, realtime ); @@ -149,7 +154,7 @@ public: } U32 prevCount = 0; - BOOL prevBlocked = FALSE; + bool prevBlocked = false; typename LLKeyThrottleImpl::EntryMap::const_iterator prev = m.prevMap->find(id); if (prev != m.prevMap->end()) @@ -198,17 +203,17 @@ public: noteAction(id); typename LLKeyThrottleImpl::Entry& curr = (*m.currMap)[id]; curr.count = llmax(m.countLimit, curr.count); - curr.blocked = TRUE; + curr.blocked = true; } - // returns TRUE if key is blocked - BOOL isThrottled(const T& id) const + // returns true if key is blocked + bool isThrottled(const T& id) const { if (m.currMap->empty() && m.prevMap->empty()) { // most of the time we'll fall in here - return FALSE; + return false; } // NOTE, we ignore the case where id is in the map but the map is stale. @@ -226,7 +231,7 @@ public: { return entry->second.blocked; } - return FALSE; + return false; } // Get the throttling parameters diff --git a/indra/llmessage/llcurl.cpp b/indra/llmessage/llcurl.cpp index e282f49438..5a426c7238 100644 --- a/indra/llmessage/llcurl.cpp +++ b/indra/llmessage/llcurl.cpp @@ -112,6 +112,15 @@ LLCurl::Responder::~Responder() { } +// virtual +void LLCurl::Responder::error( + U32 status, + const std::string& reason, + const LLSD&) +{ + error(status, reason); +} + // virtual void LLCurl::Responder::error(U32 status, const std::string& reason) { @@ -124,38 +133,16 @@ void LLCurl::Responder::result(const LLSD& content) } // virtual -void LLCurl::Responder::completedRaw(U32 status, const std::string& reason, - const LLChannelDescriptors& channels, - const LLIOPipe::buffer_ptr_t& buffer) +void LLCurl::Responder::completedRaw( + U32 status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer) { - if (isGoodStatus(status)) - { - LLSD content; - LLBufferStream istr(channels, buffer.get()); - LLSDSerialize::fromXML(content, istr); -/* - const S32 parseError = -1; - if(LLSDSerialize::fromXML(content, istr) == parseError) - { - mStatus = 498; - mReason = "Client Parse Error"; - } -*/ - completed(status, reason, content); - } - else if (status == 400) - { - // Get reason from buffer - char tbuf[4096]; - S32 len = 4096; - buffer->readAfter(channels.in(), NULL, (U8*)tbuf, len); - tbuf[len] = 0; - completed(status, std::string(tbuf), LLSD()); - } - else - { - completed(status, reason, LLSD()); - } + LLSD content; + LLBufferStream istr(channels, buffer.get()); + LLSDSerialize::fromXML(content, istr); + completed(status, reason, content); } // virtual @@ -167,10 +154,7 @@ void LLCurl::Responder::completed(U32 status, const std::string& reason, const L } else { - // *NOTE: This is kind of messed up. This should probably call - // the full error method which then provides a default impl - // which calls the thinner method. - error(status, reason); + error(status, reason, content); } } diff --git a/indra/llmessage/llcurl.h b/indra/llmessage/llcurl.h index 1b3d3f6266..b7634d420f 100644 --- a/indra/llmessage/llcurl.h +++ b/indra/llmessage/llcurl.h @@ -84,17 +84,31 @@ public: return((200 <= status) && (status < 300)); } + virtual void error( + U32 status, + const std::string& reason, + const LLSD& content); + //< called by completed() on bad status + virtual void error(U32 status, const std::string& reason); - // called with non-200 status codes + //< called by default error(status, reason, content) virtual void result(const LLSD& content); - - // Override point for clients that may want to use this class when the response is some other format besides LLSD - virtual void completedRaw(U32 status, const std::string& reason, - const LLChannelDescriptors& channels, - const LLIOPipe::buffer_ptr_t& buffer); + //< called by completed for good status codes. + + virtual void completedRaw( + U32 status, + const std::string& reason, + const LLChannelDescriptors& channels, + const LLIOPipe::buffer_ptr_t& buffer); + /**< Override point for clients that may want to use this + class when the response is some other format besides LLSD + */ - virtual void completed(U32 status, const std::string& reason, const LLSD& content); + virtual void completed( + U32 status, + const std::string& reason, + const LLSD& content); /**< The default implemetnation calls either: * result(), or diff --git a/indra/llmessage/llhttpclient.cpp b/indra/llmessage/llhttpclient.cpp index 859f3c1536..52cb8fe1c3 100644 --- a/indra/llmessage/llhttpclient.cpp +++ b/indra/llmessage/llhttpclient.cpp @@ -205,9 +205,7 @@ static void request( Injector* body_injector, LLCurl::ResponderPtr responder, const F32 timeout = HTTP_REQUEST_EXPIRY_SECS, - const LLSD& headers = LLSD(), - S32 offset = 0, - S32 bytes = 0) + const LLSD& headers = LLSD()) { if (!LLHTTPClient::hasPump()) { @@ -216,7 +214,7 @@ static void request( } LLPumpIO::chain_t chain; - LLURLRequest *req = new LLURLRequest(method, url); + LLURLRequest* req = new LLURLRequest(method, url); req->checkRootCertificate(true); // Insert custom headers is the caller sent any @@ -235,7 +233,7 @@ static void request( //to not use the proxy (read: llurlrequest.cpp) if ((iter->first == "Pragma") && (iter->second.asString() == "")) { - req->useProxy(FALSE); + req->useProxy(false); } header << iter->first << ": " << iter->second.asString() ; lldebugs << "header = " << header.str() << llendl; @@ -258,34 +256,27 @@ static void request( chain.push_back(LLIOPipe::ptr_t(body_injector)); } - if (method == LLURLRequest::HTTP_GET && (offset > 0 || bytes > 0)) - { - std::string range = llformat("Range: bytes=%d-%d", offset,offset+bytes-1); - req->addHeader(range.c_str()); - } - chain.push_back(LLIOPipe::ptr_t(req)); theClientPump->addChain(chain, timeout); } -void LLHTTPClient::getByteRange(const std::string& url, - S32 offset, S32 bytes, - ResponderPtr responder, - const LLSD& headers, - const F32 timeout) +void LLHTTPClient::getByteRange( + const std::string& url, + S32 offset, + S32 bytes, + ResponderPtr responder, + const LLSD& hdrs, + const F32 timeout) { - // *FIX: Why is the headers argument ignored? Phoenix 2008-04-28 - request( - url, - LLURLRequest::HTTP_GET, - NULL, - responder, - timeout, - LLSD(), // WTF? Shouldn't this be used? - offset, - bytes); + LLSD headers = hdrs; + if(offset > 0 || bytes > 0) + { + std::string range = llformat("bytes=%d-%d", offset, offset+bytes-1); + headers["Range"] = range; + } + request(url,LLURLRequest::HTTP_GET, NULL, responder, timeout, headers); } void LLHTTPClient::head(const std::string& url, ResponderPtr responder, const F32 timeout) diff --git a/indra/llmessage/llhttpnode.cpp b/indra/llmessage/llhttpnode.cpp index 196aa5f8cf..91605b4008 100644 --- a/indra/llmessage/llhttpnode.cpp +++ b/indra/llmessage/llhttpnode.cpp @@ -174,6 +174,26 @@ LLSD LLHTTPNode::del(const LLSD&) const throw NotImplemented(); } +// virtual +void LLHTTPNode::options(ResponsePtr response, const LLSD& context) const +{ + //llinfos << "options context: " << context << llendl; + + // default implementation constructs an url to the documentation. + std::string host = context[CONTEXT_REQUEST]["headers"]["host"].asString(); + if(host.empty()) + { + response->status(400, "Bad Request -- need Host header"); + return; + } + std::ostringstream ostr; + ostr << "http://" << host << "/web/server/api"; + ostr << context[CONTEXT_REQUEST]["path"].asString(); + static const std::string DOC_HEADER("X-Documentation-URL"); + response->addHeader(DOC_HEADER, ostr.str()); + response->status(200, "OK"); +} + // virtual LLHTTPNode* LLHTTPNode::getChild(const std::string& name, LLSD& context) const @@ -386,6 +406,13 @@ void LLHTTPNode::Response::methodNotAllowed() status(405, "Method Not Allowed"); } +void LLHTTPNode::Response::addHeader( + const std::string& name, + const std::string& value) +{ + mHeaders[name] = value; +} + void LLHTTPNode::describe(Description& desc) const { desc.shortInfo("unknown service (missing describe() method)"); diff --git a/indra/llmessage/llhttpnode.h b/indra/llmessage/llhttpnode.h index e27056a51f..54715f2b38 100644 --- a/indra/llmessage/llhttpnode.h +++ b/indra/llmessage/llhttpnode.h @@ -82,33 +82,79 @@ public: */ //@{ public: - virtual LLSD get() const; - virtual LLSD put(const LLSD& input) const; - virtual LLSD post(const LLSD& input) const; - virtual LLSD del(const LLSD& context) const; + virtual LLSD get() const; + virtual LLSD put(const LLSD& input) const; + virtual LLSD post(const LLSD& input) const; + virtual LLSD del(const LLSD& context) const; - class Response : public LLRefCount - { - protected: - virtual ~Response(); + class Response : public LLRefCount + { + protected: + virtual ~Response(); - public: - virtual void result(const LLSD&) = 0; - virtual void status(S32 code, const std::string& message) = 0; + public: + /** + * @brief Return the LLSD content and a 200 OK. + */ + virtual void result(const LLSD&) = 0; + + /** + * @brief return status code and reason string on http header, + * but do not return a payload. + */ + virtual void status(S32 code, const std::string& message) = 0; + + /** + * @brief Return no body, just status code and 'UNKNOWN ERROR'. + */ + void status(S32 code); + + void notFound(const std::string& message); + void notFound(); + void methodNotAllowed(); + + /** + * @breif Add a name: value http header. + * + * No effort is made to ensure the response is a valid http + * header. + * The headers are stored as a map of header name : value. + * Though HTTP allows the same header name to be transmitted + * more than once, this implementation only stores a header + * name once. + * @param name The name of the header, eg, "Content-Encoding" + * @param value The value of the header, eg, "gzip" + */ + void addHeader(const std::string& name, const std::string& value); + + protected: + /** + * @brief Headers to be sent back with the HTTP response. + * + * Protected class membership since derived classes are + * expected to use it and there is no use case yet for other + * uses. If such a use case arises, I suggest making a + * headers() public method, and moving this member data into + * private. + */ + LLSD mHeaders; + }; - void status(S32 code); - void notFound(const std::string& message); - void notFound(); - void methodNotAllowed(); - }; - typedef LLPointer ResponsePtr; + typedef LLPointer ResponsePtr; - virtual void get(ResponsePtr, const LLSD& context) const; - virtual void put(ResponsePtr, const LLSD& context, const LLSD& input) const; - virtual void post(ResponsePtr, const LLSD& context, const LLSD& input) const; - virtual void del(ResponsePtr, const LLSD& context) const; + virtual void get(ResponsePtr, const LLSD& context) const; + virtual void put( + ResponsePtr, + const LLSD& context, + const LLSD& input) const; + virtual void post( + ResponsePtr, + const LLSD& context, + const LLSD& input) const; + virtual void del(ResponsePtr, const LLSD& context) const; + virtual void options(ResponsePtr, const LLSD& context) const; //@} diff --git a/indra/llmessage/lliohttpserver.cpp b/indra/llmessage/lliohttpserver.cpp index ec5cb93d69..90f8ef7638 100644 --- a/indra/llmessage/lliohttpserver.cpp +++ b/indra/llmessage/lliohttpserver.cpp @@ -57,10 +57,13 @@ static const char HTTP_VERSION_STR[] = "HTTP/1.0"; static const std::string CONTEXT_REQUEST("request"); static const std::string CONTEXT_RESPONSE("response"); +static const std::string CONTEXT_VERB("verb"); +static const std::string CONTEXT_HEADERS("headers"); static const std::string HTTP_VERB_GET("GET"); static const std::string HTTP_VERB_PUT("PUT"); static const std::string HTTP_VERB_POST("POST"); static const std::string HTTP_VERB_DELETE("DELETE"); +static const std::string HTTP_VERB_OPTIONS("OPTIONS"); static LLIOHTTPServer::timing_callback_t sTimingCallback = NULL; static void* sTimingCallbackData = NULL; @@ -130,6 +133,7 @@ private: LLSD mGoodResult; S32 mStatusCode; std::string mStatusMessage; + LLSD mHeaders; }; LLIOPipe::EStatus LLHTTPPipe::process_impl( @@ -164,7 +168,7 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl( static LLTimer timer; timer.reset(); - std::string verb = context[CONTEXT_REQUEST]["verb"]; + std::string verb = context[CONTEXT_REQUEST][CONTEXT_VERB]; if(verb == HTTP_VERB_GET) { mNode.get(LLHTTPNode::ResponsePtr(mResponse), context); @@ -185,6 +189,10 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl( { mNode.del(LLHTTPNode::ResponsePtr(mResponse), context); } + else if(verb == HTTP_VERB_OPTIONS) + { + mNode.options(LLHTTPNode::ResponsePtr(mResponse), context); + } else { mResponse->methodNotAllowed(); @@ -231,7 +239,9 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl( case STATE_GOOD_RESULT: { - context[CONTEXT_RESPONSE]["contentType"] = "application/xml"; + LLSD headers = mHeaders; + headers["Content-Type"] = "application/xml"; + context[CONTEXT_RESPONSE][CONTEXT_HEADERS] = headers; LLBufferStream ostr(channels, buffer.get()); LLSDSerialize::toXML(mGoodResult, ostr); @@ -240,7 +250,9 @@ LLIOPipe::EStatus LLHTTPPipe::process_impl( case STATE_STATUS_RESULT: { - context[CONTEXT_RESPONSE]["contentType"] = "text/plain"; + LLSD headers = mHeaders; + headers["Content-Type"] = "text/plain"; + context[CONTEXT_RESPONSE][CONTEXT_HEADERS] = headers; context[CONTEXT_RESPONSE]["statusCode"] = mStatusCode; context[CONTEXT_RESPONSE]["statusMessage"] = mStatusMessage; LLBufferStream ostr(channels, buffer.get()); @@ -287,6 +299,7 @@ void LLHTTPPipe::Response::result(const LLSD& r) mPipe->mStatusMessage = "OK"; mPipe->mGoodResult = r; mPipe->mState = STATE_GOOD_RESULT; + mPipe->mHeaders = mHeaders; mPipe->unlockChain(); } @@ -302,6 +315,7 @@ void LLHTTPPipe::Response::status(S32 code, const std::string& message) mPipe->mStatusCode = code; mPipe->mStatusMessage = message; mPipe->mState = STATE_STATUS_RESULT; + mPipe->mHeaders = mHeaders; mPipe->unlockChain(); } @@ -389,17 +403,24 @@ LLIOPipe::EStatus LLHTTPResponseHeader::process_impl( } ostr << HTTP_VERSION_STR << " " << code << " " << message << "\r\n"; - - std::string type = context[CONTEXT_RESPONSE]["contentType"].asString(); - if (!type.empty()) - { - ostr << "Content-Type: " << type << "\r\n"; - } S32 content_length = buffer->countAfter(channels.in(), NULL); if(0 < content_length) { ostr << "Content-Length: " << content_length << "\r\n"; } + // *NOTE: This guard can go away once the LLSD static map + // iterator is available. Phoenix. 2008-05-09 + LLSD headers = context[CONTEXT_RESPONSE][CONTEXT_HEADERS]; + if(headers.isDefined()) + { + LLSD::map_iterator iter = headers.beginMap(); + LLSD::map_iterator end = headers.endMap(); + for(; iter != end; ++iter) + { + ostr << (*iter).first << ": " << (*iter).second.asString() + << "\r\n"; + } + } ostr << "\r\n"; LLChangeChannel change(channels.in(), channels.out()); @@ -606,11 +627,12 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl( read_next_line = true; LLMemoryStream header((U8*)buf, len); header >> mVerb; - + if((HTTP_VERB_GET == mVerb) || (HTTP_VERB_POST == mVerb) || (HTTP_VERB_PUT == mVerb) - || (HTTP_VERB_DELETE == mVerb)) + || (HTTP_VERB_DELETE == mVerb) + || (HTTP_VERB_OPTIONS == mVerb)) { header >> mAbsPathAndQuery; header >> mVersion; @@ -721,7 +743,7 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl( { // hey, hey, we should have everything now, so we pass it to // a content handler. - context[CONTEXT_REQUEST]["verb"] = mVerb; + context[CONTEXT_REQUEST][CONTEXT_VERB] = mVerb; const LLHTTPNode* node = mRootNode.traverse(mPath, context); if(node) { @@ -765,7 +787,7 @@ LLIOPipe::EStatus LLHTTPResponder::process_impl( = mBuildContext["remote-host"]; context[CONTEXT_REQUEST]["remote-port"] = mBuildContext["remote-port"]; - context[CONTEXT_REQUEST]["headers"] = mHeaders; + context[CONTEXT_REQUEST][CONTEXT_HEADERS] = mHeaders; const LLChainIOFactory* protocolHandler = node->getProtocolHandler(); diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 20876d630f..85cb5dd007 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -28,7 +28,6 @@ include(LScript) include(Linking) include(Mozlib) include(NDOF) -include(Smartheap) include(TemplateCheck) include(UI) include(UnixInstall) diff --git a/indra/test/lliohttpserver_tut.cpp b/indra/test/lliohttpserver_tut.cpp index 5401d1a8ae..e5607cdad7 100644 --- a/indra/test/lliohttpserver_tut.cpp +++ b/indra/test/lliohttpserver_tut.cpp @@ -327,6 +327,23 @@ namespace tut ensure_starts_with("large echo status", result, "HTTP/1.0 200 OK\r\n"); } + template<> template<> + void HTTPServiceTestObject::test<8>() + { + // test the OPTIONS http method -- the default implementation + // should return the X-Documentation-URL + std::ostringstream http_request; + http_request << "OPTIONS / HTTP/1.0\r\nHost: localhost\r\n\r\n"; + bool timeout = false; + std::string result = makeRequest("/", http_request.str(), timeout); + ensure_starts_with("OPTIONS verb ok", result, "HTTP/1.0 200 OK\r\n"); + ensure_contains( + "Doc url header exists", + result, + "X-Documentation-URL: http://localhost"); + } + + /* TO DO: test generation of not found and method not allowed errors */ diff --git a/install.xml b/install.xml index f00fdd3aa3..3fb439e183 100644 --- a/install.xml +++ b/install.xml @@ -1,7 +1,7 @@ - binaries + installables GL @@ -16,23 +16,23 @@ darwin md5sum - 7b147162449c216a016dc2bfe2a4380c + 0bd2795a2afe09f6c563f2f888f24cc9 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/GL-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-darwin-20080613.tar.bz2 linux md5sum - d78e3e4d8c33e5233d88ec8096307ee8 + 85f2ed989f853beb3d6cc94413b35f1a url - http://int.codex.lindenlab.com/~jenn/install_pkgs/GL-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-linux-20080613.tar.bz2 windows md5sum - e0736f3f17fe980ef68b8a65ef90011d + e6ba152b7edd4ad2c9db4f9ff7bd38e1 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/GL-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/GL-windows-20080613.tar.bz2 @@ -49,23 +49,23 @@ darwin md5sum - d7500212b654e9380c4dc24166285407 + 025bb5e76fd964b89c508d88d37bb802 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/SDL-1.2.5-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-darwin-20080613.tar.bz2 linux md5sum - c7f3da1da96ccc1f26ec92634e7771b8 + a28fe914d3f3241c824aabba69f1d946 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/SDL-1.2.5-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-linux-20080613.tar.bz2 windows md5sum - 1c081cc35730919781e23b916a56722e + 149626b0c10d7eb8b9f9be96b5318218 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/SDL-1.2.5-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/SDL-1.2.5-windows-20080613.tar.bz2 @@ -78,23 +78,23 @@ darwin md5sum - ee3014eda3d5f912c1e3ec21bbdddcaf + 10b11783907b72712daef3ed5803d56d url - http://int.codex.lindenlab.com/~jenn/install_pkgs/apr_suite-1.2.8-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-darwin-20080618.tar.bz2 linux md5sum - 4b0f2cc3ec66162be6cf0b13186bc838 + b99f6bd3548c4f4613fe95320e14dbf3 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/apr_suite-1.2.8-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-linux-20080618.tar.bz2 windows md5sum - 979257a1b24d9200be58872d9c658114 + 352c46f39773b9415f8a9bf868c4c305 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/apr_suite-1.2.8-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/apr_suite-1.2.8-windows-20080618.tar.bz2 @@ -111,23 +111,23 @@ darwin md5sum - 19aae45edfd29a269cd10af7729489e7 + b6109b75e53c72e021625e375ba52080 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/ares-1.3.0-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-darwin-20080618.tar.bz2 linux md5sum - 8b163aa08cf4a5b70f93519137fa6cf0 + 1e800e34d2799abb0797f05c6e38ea1a url - http://int.codex.lindenlab.com/~jenn/install_pkgs/ares-1.3.0-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-linux-20080618.tar.bz2 windows md5sum - bbbe5e5f8504125e2ab813f666fd61ba + 085a62de4c264d6a3718ad789aacd297 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/ares-1.3.0-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ares-1.3.0-windows-20080618.tar.bz2 @@ -153,23 +153,23 @@ darwin md5sum - 4afb62f563bb2fd9d43fc071e2eeb167 + 792601ce1f38067c086394842852fa11 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/boost-1.32.0-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-darwin-20080613.tar.bz2 linux md5sum - 14aba81fa0993e420882314a3fea5127 + e65f06e2500db0bbc34506194ac49f6a url - http://int.codex.lindenlab.com/~jenn/install_pkgs/boost-1.32.0-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-linux-20080613.tar.bz2 windows md5sum - 2b627d2a598f883950c21bae52738176 + 6f03592f4db4c177c7b255520283f547 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/boost-1.32.0-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/boost-1.32.0-windows-20080613.tar.bz2 @@ -186,23 +186,23 @@ darwin md5sum - 722c0e0eccf28b00e0f759362ef81ddf + 73965ddba50e5c4d46d50a966b472626 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/curl-7.16.0-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-darwin-20080613.tar.bz2 linux md5sum - cd89f34324acf1222078298974c1dfb3 + a7791ee5ca19f208808f71730c3c2feb url - http://int.codex.lindenlab.com/~jenn/install_pkgs/curl-7.16.0-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-linux-20080613.tar.bz2 windows md5sum - 08d17bc997494a852537b0c7b4425d47 + fb42c5b40e34b043cee236aa216b141e url - http://int.codex.lindenlab.com/~jenn/install_pkgs/curl-7.16.0-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/curl-7.16.0-windows-20080613.tar.bz2 @@ -215,9 +215,9 @@ linux md5sum - e4f5109f8c119613d7b2c3706d786e43 + feb9d72c373c5dd4c6b88ed02e2b2bf0 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/elfio-1.0.3-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/elfio-1.0.3-linux-20080613.tar.bz2 @@ -234,23 +234,23 @@ darwin md5sum - 93760196ea3e851b1a334743816e189d + 7b9380e6bac8d9ba5e6ff20da5cad91a url - http://int.codex.lindenlab.com/~jenn/install_pkgs/expat-1.95.8-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-darwin-20080617.tar.bz2 linux md5sum - 8e990a9e3c30c7c37c147ac0df70a323 + e59d8314185e3d87d72ff90d6cff0d30 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/expat-1.95.8-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-linux-20080613.tar.bz2 windows md5sum - e58538aae9982209e095bbf6660c8d6b + abd100b16dbe4621019a229af0411f5d url - http://int.codex.lindenlab.com/~jenn/install_pkgs/expat-1.95.8-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/expat-1.95.8-windows-20080617.tar.bz2 @@ -296,9 +296,9 @@ linux md5sum - 6630fea6b036f3e937608b3d4186adfa + 9af6a1ed39fa540bfcaa402b0ea22f78 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/fontconfig-2.2.3-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/fontconfig-2.2.3-linux-20080613.tar.bz2 @@ -315,23 +315,23 @@ darwin md5sum - b34eb8af0a2b736a1d70d8b32b3e009d + cd8a8f8af5a01fac015e5b0325daa2ae url - http://int.codex.lindenlab.com/~jenn/install_pkgs/freetype-2.1.5-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-darwin-20080613.tar.bz2 linux md5sum - a52b44f89b7422c565da5f4a5c7f582c + 83e7aafe0807c2adec68f67b5738d856 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/freetype-2.1.5-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-linux-20080613.tar.bz2 windows md5sum - 5b1aae54ea3313a9f424719323eb5ad3 + b22d33d86567561eb116aa2ccd024d88 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/freetype-2.1.5-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/freetype-2.1.5-windows-20080613.tar.bz2 @@ -348,23 +348,23 @@ darwin md5sum - 64ea2fca2ca9457b9305ec416c574a61 + 23bd9a75e5a2365a827461e6c324f52b url - http://int.codex.lindenlab.com/~jenn/install_pkgs/glh_linear-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-darwin-20080613.tar.bz2 linux md5sum - 6fd9c490b7460e2b433381050495e48e + 2965646aea1d2a6aec1fbc431c02733f url - http://int.codex.lindenlab.com/~jenn/install_pkgs/glh_linear-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-linux-20080613.tar.bz2 windows md5sum - e286dc9f7ce90856a7ac291874b6fc34 + 38b9ddfe8dceff55ee4351016a937d1b url - http://int.codex.lindenlab.com/~jenn/install_pkgs/glh_linear-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/glh_linear-windows-20080613.tar.bz2 @@ -377,9 +377,9 @@ linux md5sum - 6df3889822deb8b80ac6f6d421a35137 + 589a8385979d2b0561daaec2148f8b77 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/google-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/google-linux-20080613.tar.bz2 @@ -392,9 +392,9 @@ linux md5sum - 5e0e4ee938b56a118c90d51447009ba9 + c829b638b6eef71ca63418cb9aea46a2 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/gstreamer-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gstreamer-linux-20080613.tar.bz2 @@ -411,16 +411,16 @@ linux md5sum - 72801a23b43586b822c8a1dfc1a6e313 + 83eddf6114f1e306c61fbda16ad02f0c url - http://int.codex.lindenlab.com/~jenn/install_pkgs/gtk-atk-pango-glib-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-linux-20080613.tar.bz2 windows md5sum - 492b04de6ba02167cef7a04e8dc5e748 + d963750bcd333a108b3697d220c87d09 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/gtk-atk-pango-glib-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/gtk-atk-pango-glib-windows-20080613.tar.bz2 @@ -470,23 +470,23 @@ darwin md5sum - 62cc07ef64f31f493f55e618c915125b + 30b12debc3efce275a335b824dda22d2 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/jpeglib-6b-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-darwin-20080613.tar.bz2 linux md5sum - 6bb623a88116002124686248ebd35fd9 + 9297565a09754fdf2b58cefef60450c7 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/jpeglib-6b-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-linux-20080613.tar.bz2 windows md5sum - b28852df715401eae575ccd9d5c84cf1 + 475ab2d2f4b769834bd3f35562b8c445 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/jpeglib-6b-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/jpeglib-6b-windows-20080613.tar.bz2 @@ -503,23 +503,56 @@ darwin md5sum - a351af91b5a102d1b6fe95b5d1ab4347 + 4db422310f3b35710e44f69ecda19195 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-darwin-20080610.tar.bz2 + http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-darwin-20080613.tar.bz2 linux md5sum - 155ecb6f704c1082aa6565537ada024b + 5a70296632fa973e6484f60de067088c url - http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-linux-20080610.tar.bz2 + http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-linux-20080613.tar.bz2 windows md5sum - 5cd4c0db91e3687290de685203634ab8 + 15528c24ca657b524d9ab3ccbb33c766 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-windows-20080611.tar.bz2 + http://int.codex.lindenlab.com/~jenn/install_pkgs/kdu-5.2.1-windows-20080613.tar.bz2 + + + + kdu-binaries + + copyright + see kdu + description + see kdu + license + kdu + packages + + darwin + + md5sum + 480fbeeb47c9b9c4a2f947e310c9821c + url + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-binaries-5.2.1-darwin-20080617.tar.bz2 + + linux + + md5sum + ca87644e377a6cf16db4ba6dbd2f8689 + url + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-binaries-5.2.1-linux-20080617.tar.bz2 + + windows + + md5sum + 87af253b1d76437290355e8e20029377 + url + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/kdu-binaries-5.2.1-windows-20080617.tar.bz2 @@ -536,23 +569,23 @@ darwin md5sum - 2e41f3710b5769e58d2e00944feb7bee + 90488b309856a82a152348db177a44c5 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/libpng-1.2.18-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-darwin-20080613.tar.bz2 linux md5sum - 642dd0ba1fa7ac55fae555cd622b36f6 + b47eca741c218e13e6838583c9169b64 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/libpng-1.2.18-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-linux-20080613.tar.bz2 windows md5sum - 0274c3d4a3b7cce8eede207348438f3b + 96ad03239a2b1d50584dcaf66162e03e url - http://int.codex.lindenlab.com/~jenn/install_pkgs/libpng-1.2.18-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libpng-1.2.18-windows-20080613.tar.bz2 @@ -569,9 +602,9 @@ linux md5sum - 8c39ea5d1feebbe9b8ee5d5933eeabe5 + 0591314df0293ba948b0445b0215a18d url - http://int.codex.lindenlab.com/~jenn/install_pkgs/libstdc++-6.0-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libstdc++-6.0-linux-20080613.tar.bz2 @@ -588,9 +621,9 @@ linux md5sum - cf68933edc8d556d6901179a7993bbc0 + 495f01afa67ed1ae59b7b8005cfa55ff url - http://int.codex.lindenlab.com/~jenn/install_pkgs/libuuid-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libuuid-linux-20080613.tar.bz2 @@ -603,9 +636,9 @@ linux md5sum - 3a71ea5ff924e70c6786ef2c202f553b + 4b5d2dcfe8a49b73fb69f10aab441092 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/libxml-2.6.24-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/libxml-2.6.24-linux-20080613.tar.bz2 @@ -618,23 +651,23 @@ darwin md5sum - e2969baf0e39f6a586141a75c3360330 + 056ad496f0ec2bf386d50f694f6bade3 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/llmozlib-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-darwin-20080613.tar.bz2 linux md5sum - 55ab8be3f18e27095f7ecae7d90804d5 + c80e060867b07dd3e3c1dce70f2316eb url - http://int.codex.lindenlab.com/~jenn/install_pkgs/llmozlib-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-linux-20080613.tar.bz2 windows md5sum - 73a0bc8ea770a4035175161d2b1e903f + 4bf828c670fb9848c7d2a91bf4eccafc url - http://int.codex.lindenlab.com/~jenn/install_pkgs/llmozlib-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/llmozlib-windows-20080613.tar.bz2 @@ -651,16 +684,16 @@ linux md5sum - 461891f44070780d9ca0b26988b6f44e + 13802606c5f6e98af7cfa72cc85e3a92 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/mesa-7.0-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-linux-20080613.tar.bz2 windows md5sum - e0a27aef7b2de0d5c78c753f72214e8d + 82cdcdcb2d0615389a7480485ea35f4c url - http://int.codex.lindenlab.com/~jenn/install_pkgs/mesa-7.0-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/mesa-7.0-windows-20080613.tar.bz2 @@ -689,7 +722,7 @@ ndofdev copyright - (c) 2008 Linden Lab. + Copyright (c) 2007, 3Dconnexion, Inc. - All rights reserved. description in use on windows and darwin for joystick support. license @@ -699,23 +732,23 @@ darwin md5sum - dae6e00c7eed6bacdecd639c4f5cef1d + 15df716b66bd83e2198450eed93197cd url - http://int.codex.lindenlab.com/~jenn/install_pkgs/ndofdev-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-darwin-20080618.tar.bz2 linux md5sum - ccaf379968c886258d5390d06ff1a2c0 + 489612b246b2f4b2f239611d786c79de url - http://int.codex.lindenlab.com/~jenn/install_pkgs/ndofdev-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-linux-20080618.tar.bz2 windows md5sum - af8249252bcd3782606bf17cdc145ea4 + 03cbdf59996f468f907f11cb9c64f93f url - http://int.codex.lindenlab.com/~jenn/install_pkgs/ndofdev-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ndofdev-windows-20080618.tar.bz2 @@ -732,23 +765,23 @@ darwin md5sum - 59d3f15d89d9433f931f480878f46d4c + 8d9bb71c06f6494cc767965145f31c63 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/ogg-vorbis-1.03-1.1.2-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-darwin-20080613.tar.bz2 linux md5sum - 54a29d28fbce6dd6abb875975a42acf1 + 1e912aef160c1d8f46f4194942922654 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/ogg-vorbis-1.03-1.1.2-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-linux-20080613.tar.bz2 windows md5sum - 2800543038e88c233976a2301e67325f + 9667525f28adb4ad54bbc883b14324ac url - http://int.codex.lindenlab.com/~jenn/install_pkgs/ogg-vorbis-1.03-1.1.2-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/ogg-vorbis-1.03-1.1.2-windows-20080613.tar.bz2 @@ -761,23 +794,23 @@ darwin md5sum - 5da0ef41618a024795508f5c93d61754 + a708e7b41b91852b060bb3d62112b4d7 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/openSSL-0.9.7c-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-darwin-20080613.tar.bz2 linux md5sum - fb54b93f881e587363b134f42e2f1c0b + 727f2a9399b7f414260a03fdf700aef4 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/openSSL-0.9.7c-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-linux-20080613.tar.bz2 windows md5sum - 0f0e8ea5014f2112f2d04a85a0b8720e + 8a75180cae12d268071c090abb031ba5 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/openSSL-0.9.7c-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openSSL-0.9.7c-windows-20080613.tar.bz2 @@ -794,23 +827,23 @@ darwin md5sum - e169d2372539fc96b72dc59aa7a656e6 + 85b34723ab22591ebbc51c474588c2e0 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/openjpeg-1.2-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-darwin-20080613.tar.bz2 linux md5sum - 8b2733f8e4b7d58db7392d7a6837675f + 406ceca1c85b64df18deed95f3b7854c url - http://int.codex.lindenlab.com/~jenn/install_pkgs/openjpeg-1.2-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-linux-20080613.tar.bz2 windows md5sum - 9f7ae7023fad3c823a303c57610973c5 + 33ceb9232a59c0399ef4d239373c3e42 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/openjpeg-1.2-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/openjpeg-1.2-windows-20080613.tar.bz2 @@ -879,23 +912,23 @@ darwin md5sum - fe8045e47dc505786e1d45d480190f96 + 1116d9ba0c34c042788421d4e520e747 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/tut-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-darwin-20080613.tar.bz2 linux md5sum - 2e28af0b6124a472b9aac6f2225dca8d + da7872a8a5cfe5d14ceeeebe73e58d6b url - http://int.codex.lindenlab.com/~jenn/install_pkgs/tut-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-linux-20080613.tar.bz2 windows md5sum - 953cc124943a05e474687a127d2e88d9 + aa5e69f024bb408fac41d77d1101ccb6 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/tut-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/tut-windows-20080613.tar.bz2 @@ -914,7 +947,7 @@ md5sum 6353aff33d7d03b22055aec76f53a866 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/unistd-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/unistd-windows-20080611.tar.bz2 @@ -929,23 +962,23 @@ darwin md5sum - 121199818b827e147179c3d3494815e1 + 4d786ce5732b70cf230f0eebcec9571c url - http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-darwin-20080610.tar.bz2 + http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-darwin-20080613.tar.bz2 linux md5sum - c58f03002a9c452d4c8cb1874d3ac44b + 3b7dc33c106e1c4c10fc515249ac7bda url - http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-linux-20080610.tar.bz2 + http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-linux-20080613.tar.bz2 windows md5sum - fce352d6d99233b2dac1cd51add0f0d1 + ef09fcc8dea5d5fc911667f03c8b8a99 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-windows-20080611.tar.bz2 + http://int.codex.lindenlab.com/~jenn/install_pkgs/vivox-windows-20080613.tar.bz2 @@ -962,23 +995,23 @@ darwin md5sum - d116c41b95ec41adee7bbfdbf2c74ffb + f3e2f3428913bf8b8d70d28a3d079811 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/xmlrpc-epi-0.51-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-darwin-20080613.tar.bz2 linux md5sum - dd08d9f03c9fb84406aa31494e4e5663 + 0cc87341785bf23c253e6e69a7c16ca0 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/xmlrpc-epi-0.51-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-linux-20080618.tar.bz2 windows md5sum - e904dd2653fdb9dac15cc452a74f4bcb + ef96676498fef5c2bd1a1de0144163e2 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/xmlrpc-epi-0.51-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/xmlrpc-epi-0.51-windows-20080613.tar.bz2 @@ -995,30 +1028,23 @@ darwin md5sum - 99be09df2ec92282293761cd9ae242ac + 6f5d1799ffacaec4b61d53051443c672 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/zlib-1.1.4-darwin-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-darwin-20080618.tar.bz2 linux - i686 - - md5sum - 7efbde55728369e76ab9d46bff60c87f - url - http://int.codex.lindenlab.com/~aaronb/install_pkgs/zlib-1.2.1-linux-i686.tar.gz - md5sum - a93da3d0a1fcf05c70d545991e0be227 + 4140bc104e828c5c33f251a2d5bfe144 url - http://int.codex.lindenlab.com/~jenn/install_pkgs/zlib-1.1.4-linux-20080610.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-linux-20080618.tar.bz2 windows md5sum - 7058b7aeded6d8bb10bd0de8539f8392 + bebeba689d2a8d19cfde150582a4f85a url - http://int.codex.lindenlab.com/~jenn/install_pkgs/zlib-1.1.4-windows-20080611.tar.bz2 + https://s3.amazonaws.com/viewer-source-downloads/install_pkgs/zlib-1.1.4-windows-20080618.tar.bz2 diff --git a/scripts/install.py b/scripts/install.py index 7a1d57aaa7..ea32f0b8aa 100755 --- a/scripts/install.py +++ b/scripts/install.py @@ -121,7 +121,7 @@ class LicenseDefinition(object): self._definition = definition -class BinaryDefinition(object): +class InstallableDefinition(object): def __init__(self, definition): #probably looks like: # { packages : {platform...}, @@ -223,9 +223,9 @@ class Installer(object): if os.path.exists(self._install_filename): install = llsd.parse(file(self._install_filename, 'rb').read()) try: - for name in install['binaries']: - self._installables[name] = BinaryDefinition( - install['binaries'][name]) + for name in install['installables']: + self._installables[name] = InstallableDefinition( + install['installables'][name]) except KeyError: pass try: @@ -236,7 +236,7 @@ class Installer(object): if os.path.exists(self._installed_filename): installed = llsd.parse(file(self._installed_filename, 'rb').read()) try: - bins = installed['binaries'] + bins = installed['installables'] for name in bins: self._installed[name] = InstalledPackage(bins[name]) except KeyError: @@ -254,29 +254,31 @@ class Installer(object): for name in self._licenses: state['licenses'][name] = self._licenses[name]._definition #print "self._installables:",self._installables - state['binaries'] = {} + state['installables'] = {} for name in self._installables: - state['binaries'][name] = self._installables[name]._definition + state['installables'][name] = \ + self._installables[name]._definition self._write(self._install_filename, state) if self._installed_changed: state = {} - state['binaries'] = {} - bin = state['binaries'] + state['installables'] = {} + bin = state['installables'] for name in self._installed: #print "installed:",name,self._installed[name]._installed bin[name] = self._installed[name]._installed self._write(self._installed_filename, state) def is_valid_license(self, bin): - "@brief retrun true if we have valid license info for binary." - binary = self._installables[bin]._definition - if 'license' not in binary: + "@brief retrun true if we have valid license info for installable." + installable = self._installables[bin]._definition + if 'license' not in installable: print >>sys.stderr, "No license info found for", bin print >>sys.stderr, 'Please add the license with the', - print >>sys.stderr, '--add-installable option. See', sys.argv[0], '--help' + print >>sys.stderr, '--add-installable option. See', \ + sys.argv[0], '--help' return False - if binary['license'] not in self._licenses: - lic = binary['license'] + if installable['license'] not in self._licenses: + lic = installable['license'] print >>sys.stderr, "Missing license info for '" + lic + "'.", print >>sys.stderr, 'Please add the license with the', print >>sys.stderr, '--add-license option. See', sys.argv[0], @@ -285,11 +287,11 @@ class Installer(object): return True def list_installables(self): - "Return a list of all known binaries." + "Return a list of all known installables." return self._installables.keys() - def detail_binary(self, name): - "Return a binary definition detail" + def detail_installable(self, name): + "Return a installable definition detail" return self._installables[name]._definition def list_licenses(self): @@ -304,43 +306,49 @@ class Installer(object): "Return a list of installed packages." return self._installed.keys() - def _update_field(self, binary, field, value): + def _update_field(self, description, field, value, multiline=False): """Given a block and a field name, add or update it. - @param binary[in,out] a dict containing all the details about a binary. + @param description a dict containing all the details of a description. @param field the name of the field to update. @param value the value of the field to update; if omitted, interview will ask for value. + @param multiline boolean specifying whether field is multiline or not. """ if value: - binary[field] = value + description[field] = value else: - if field in binary: + if field in description: print "Update value for '" + field + "'" print "(Leave blank to keep current value)" - print "Current Value: '" + binary[field] + "'" + print "Current Value: '" + description[field] + "'" else: print "Specify value for '" + field + "'" - new_value = raw_input("Enter New Value: ") - if field in binary and not new_value: + if not multiline: + new_value = raw_input("Enter New Value: ") + else: + print "Please enter " + field + ". End input with EOF (^D)." + new_value = sys.stdin.read() + + if field in description and not new_value: pass elif new_value: - binary[field] = new_value + description[field] = new_value self._install_changed = True return True def _update_installable(self, name, platform, url, md5sum): """Update installable entry with specific package information. - @param binary[in,out] a dict containing all the details about a binary. + @param installable[in,out] a dict containing installable details. @param platform Platform info, i.e. linux/i686, windows/i686 etc. @param url URL of tar file @param md5sum md5sum of tar file """ - binary = self._installables[name]._definition + installable = self._installables[name]._definition path = platform.split('/') - if 'packages' not in binary: - binary['packages'] = {} - update = binary['packages'] + if 'packages' not in installable: + installable['packages'] = {} + update = installable['packages'] for child in path: if child not in update: update[child] = {} @@ -354,8 +362,8 @@ class Installer(object): def add_installable_package(self, name, **kwargs): - """Add an url for a platform path to the binary. - @param binary[in,out] a dict containing all the details about a binary. + """Add an url for a platform path to the installable. + @param installable[in,out] a dict containing installable details. """ platform_help_str = """\ Please enter a new package location and url. Some examples: @@ -369,10 +377,11 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package""" +"--add-installable-package option" return False else: - print "Updating binary '" + name + "'." + print "Updating installable '" + name + "'." for arg in ('platform', 'url', 'md5sum'): if not kwargs[arg]: - if arg == 'platform': print platform_help_str + if arg == 'platform': + print platform_help_str kwargs[arg] = raw_input("Package "+arg+":") path = kwargs['platform'].split('/') @@ -381,22 +390,22 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package""" def add_installable_metadata(self, name, **kwargs): """Interactively add (only) library metadata into install, - w/o adding binary""" + w/o adding installable""" if name not in self._installables: print "Adding installable '" + name + "'." - self._installables[name] = BinaryDefinition({}) + self._installables[name] = InstallableDefinition({}) else: print "Updating installable '" + name + "'." - binary = self._installables[name]._definition + installable = self._installables[name]._definition for field in ('copyright', 'license', 'description'): - self._update_field(binary, field, kwargs[field]) + self._update_field(installable, field, kwargs[field]) print "Added installable '" + name + "':" pprint.pprint(self._installables[name]) return True def add_installable(self, name, **kwargs): - "Interactively pull a new binary into the install" + "Interactively pull a new installable into the install" ret_a = self.add_installable_metadata(name, **kwargs) ret_b = self.add_installable_package(name, **kwargs) return (ret_a and ret_b) @@ -405,17 +414,18 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package""" self._installables.pop(name) self._install_changed = True - def add_license(self, name, text, url): - if name in self._licenses: - print "License '" + name + "' being overwritten." - definition = {} - if url: - definition['url'] = url - if not url and text is None: - print "Please enter license text. End input with EOF (^D)." - text = sys.stdin.read() - definition['text'] = text - self._licenses[name] = LicenseDefinition(definition) + def add_license(self, name, **kwargs): + if name not in self._licenses: + print "Adding license '" + name + "'." + self._licenses[name] = LicenseDefinition({}) + else: + print "Updating license '" + name + "'." + license = self._licenses[name]._definition + for field in ('url', 'text'): + multiline = False + if field == 'text': + multiline = True + self._update_field(license, field, kwargs[field], multiline) self._install_changed = True return True @@ -423,15 +433,15 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package""" self._licenses.pop(name) self._install_changed = True - def _uninstall(self, binaries): + def _uninstall(self, installables): """@brief Do the actual removal of files work. *NOTE: This method is not transactionally safe -- ie, if it raises an exception, internal state may be inconsistent. How should we address this? - @param binaries The package names to remove + @param installables The package names to remove """ remove_file_list = [] - for pkgname in binaries: + for pkgname in installables: for url in self._installed[pkgname].urls(): remove_file_list.extend( self._installed[pkgname].files_in(url)) @@ -455,16 +465,16 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package""" # normal failures. pass - def uninstall(self, binaries, install_dir): + def uninstall(self, installables, install_dir): """@brief Remove the packages specified. - @param binaries The package names to remove + @param installables The package names to remove @param install_dir The directory to work from """ - print "uninstall",binaries,"from",install_dir + print "uninstall",installables,"from",install_dir cwd = os.getcwdu() os.chdir(install_dir) try: - self._uninstall(binaries) + self._uninstall(installables) finally: os.chdir(cwd) @@ -476,7 +486,9 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package""" """ ifiles = [] for bin in self._installables: - ifiles.extend(self._installables[bin].ifiles(bin, platform, cache_dir)) + ifiles.extend(self._installables[bin].ifiles(bin, + platform, + cache_dir)) to_install = [] #print "self._installed",self._installed for ifile in ifiles: @@ -484,13 +496,15 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package""" to_install.append(ifile) elif ifile.url not in self._installed[ifile.pkgname].urls(): to_install.append(ifile) - elif ifile.md5sum != self._installed[ifile.pkgname].get_md5sum(ifile.url): + elif ifile.md5sum != \ + self._installed[ifile.pkgname].get_md5sum(ifile.url): # *TODO: We may want to uninstall the old version too # when we detect it is installed, but the md5 sum is # different. to_install.append(ifile) else: - #print "Installation up to date:",ifile.pkgname,ifile.platform_path + #print "Installation up to date:", + # ifile.pkgname,ifile.platform_path pass #print "to_install",to_install return to_install @@ -521,9 +535,9 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package""" self._installed[ifile.pkgname] = InstalledPackage(definition) self._installed_changed = True - def install(self, binaries, platform, install_dir, cache_dir): + def install(self, installables, platform, install_dir, cache_dir): """@brief Do the installation for for the platform. - @param binaries The requested binaries to install. + @param installables The requested installables to install. @param platform The target platform. Eg, windows or linux/i686/gcc/3.3 @param install_dir The root directory to install into. Created if missing. @@ -537,7 +551,7 @@ windows/i686/vs/2003 -- specify a windows visual studio 2003 package""" to_install = self._build_ifiles(platform, cache_dir) # Filter for files which we actually requested to install. - to_install = [ifl for ifl in to_install if ifl.pkgname in binaries] + to_install = [ifl for ifl in to_install if ifl.pkgname in installables] for ifile in to_install: ifile.fetch_local() self._install(to_install, install_dir) @@ -614,9 +628,9 @@ def _getuser(): import win32api return win32api.GetUserName() -def _default_binary_cache(): - """In general, the binary files do not change much, so find a host/user - specific location to cache files.""" +def _default_installable_cache(): + """In general, the installable files do not change much, so find a + host/user specific location to cache files.""" user = _getuser() cache_dir = "/var/tmp/%s/install.cache" % user if _get_platform() == 'windows': @@ -628,23 +642,23 @@ def _default_binary_cache(): def parse_args(): parser = optparse.OptionParser( - usage="usage: %prog [options] [binary1 [binary2 [binary3...]]]", + usage="usage: %prog [options] [installable1 [installable2...]]", formatter = helpformatter.Formatter(), - description="""This script fetches and installs binary packages. + description="""This script fetches and installs installable packages. It also handles uninstalling those packages and manages the mapping between packages and their license. The process is to open and read an install manifest file which specifies -what files should be installed. For each binary to be installed. +what files should be installed. For each installable to be installed. * make sure it has a license * check the installed version ** if not installed and needs to be, download and install ** if installed version differs, download & install -If no binaries are specified on the command line, then the defaut -behavior is to install all known binaries appropriate for the platform -specified or uninstall all binaries if --uninstall is set. You can specify -more than one binary on the command line. +If no installables are specified on the command line, then the defaut +behavior is to install all known installables appropriate for the platform +specified or uninstall all installables if --uninstall is set. You can specify +more than one installable on the command line. When specifying a platform, you can specify 'all' to install all packages, or any platform of the form: @@ -696,13 +710,14 @@ darwin/universal/gcc/4.0 default=_get_platform(), dest='platform', help="""Override the automatically determined platform. \ -You can specify 'all' to do a installation of binaries for all platforms.""") +You can specify 'all' to do a installation of installables for all platforms.""") parser.add_option( '--cache-dir', type='string', - default=_default_binary_cache(), + default=_default_installable_cache(), dest='cache_dir', - help='Where to download files. Default: %s'%(_default_binary_cache())) + help='Where to download files. Default: %s'% \ + (_default_installable_cache())) parser.add_option( '--install-dir', type='string', @@ -767,14 +782,14 @@ Ignored if --add-license is not specified.""") type='string', default=None, dest='remove_installable', - help="Remove a binary from the install file.") + help="Remove a installable from the install file.") parser.add_option( '--add-installable', type='string', default=None, dest='add_installable', - help="""Add a binary into the install file. Argument is the name of \ -the binary to add.""") + help="""Add a installable into the install file. Argument is \ +the name of the installable to add.""") parser.add_option( '--add-installable-metadata', type='string', @@ -836,21 +851,22 @@ Ignored if --add-installable or --add-installable-package is not specified.""") action='store_true', default=False, dest='list_installables', - help="List the binaries in the install manifest and exit.") + help="List the installables in the install manifest and exit.") parser.add_option( '--detail', type='string', default=None, - dest='detail_binary', - help="Get detailed information on specified binary and exit.") + dest='detail_installable', + help="Get detailed information on specified installable and exit.") parser.add_option( '--uninstall', action='store_true', default=False, dest='uninstall', - help="""Remove the binaries specified in the arguments. Just like \ -during installation, if no binaries are listed then all installed binaries \ -are removed.""") + help="""Remove the installables specified in the arguments. Just like \ +during installation, if no installables are listed then all installed \ +installables are removed.""") + return parser.parse_args() def main(): @@ -867,15 +883,15 @@ def main(): print "installed list:", installer.list_installed() return 0 if options.list_installables: - print "binary list:", installer.list_installables() + print "installable list:", installer.list_installables() return 0 - if options.detail_binary: + if options.detail_installable: try: - detail = installer.detail_binary(options.detail_binary) - print "Detail on binary",options.detail_binary+":" + detail = installer.detail_installable(options.detail_installable) + print "Detail on installable",options.detail_installable+":" pprint.pprint(detail) except KeyError: - print "Bianry '"+options.detail_binary+"' not found in", + print "Binary '"+options.detail_installable+"' not found in", print "install file." return 0 if options.list_licenses: @@ -887,7 +903,7 @@ def main(): print "Detail on license",options.detail_license+":" pprint.pprint(detail) except KeyError: - print "License '"+options.detail_binary+"' not defined in", + print "License '"+options.detail_license+"' not defined in", print "install file." return 0 if options.export_manifest: @@ -905,8 +921,8 @@ def main(): if options.new_license: if not installer.add_license( options.new_license, - options.license_text, - options.license_url): + text=options.license_text, + url=options.license_url): return 1 elif options.remove_license: installer.remove_license(options.remove_license) @@ -945,14 +961,15 @@ def main(): # passed in on the command line. We'll need to verify we # know about them here. uninstall_installables = args - for binary in uninstall_installables: - if binary not in all_installed: - raise RuntimeError('Binary not installed: %s' % (binary,)) + for installable in uninstall_installables: + if installable not in all_installed: + raise RuntimeError('Binary not installed: %s' % + (installable,)) installer.uninstall(uninstall_installables, options.install_dir) else: - # Determine what binaries should be installed. If they were + # Determine what installables should be installed. If they were # passed in on the command line, use them, otherwise install - # all known binaries. + # all known installables. all_installables = installer.list_installables() if not len(args): install_installables = all_installables @@ -960,18 +977,19 @@ def main(): # passed in on the command line. We'll need to verify we # know about them here. install_installables = args - for binary in install_installables: - if binary not in all_installables: - raise RuntimeError('Unknown binary: %s' % (binary,)) + for installable in install_installables: + if installable not in all_installables: + raise RuntimeError('Unknown installable: %s' % + (installable,)) if options.check_license: # *TODO: check against a list of 'known good' licenses. # *TODO: check for urls which conflict -- will lead to # problems. - for binary in install_installables: - if not installer.is_valid_license(binary): + for installable in install_installables: + if not installer.is_valid_license(installable): return 1 - # Do the work of installing the requested binaries. + # Do the work of installing the requested installables. installer.install( install_installables, options.platform, -- cgit v1.2.3