- Merge from PlanetLab Europe
authorTony Mack <tmack@cs.princeton.edu>
Mon, 1 Oct 2007 20:51:47 +0000 (20:51 +0000)
committerTony Mack <tmack@cs.princeton.edu>
Mon, 1 Oct 2007 20:51:47 +0000 (20:51 +0000)
13 files changed:
Makefile
PLC/Methods/GetNodeNetworks.py
PLC/Methods/GetNodes.py
PLC/Methods/GetPersons.py
PLC/Methods/GetSites.py
PLC/Methods/GetSlices.py
PLC/Methods/__init__.py
PLC/Persons.py
PLC/PyCurl.py
PLC/Sites.py
PLC/Slices.py
PLC/__init__.py
setup.py

index 3196661..ee4855a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -4,7 +4,7 @@
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2005 The Trustees of Princeton University
 #
-# $Id: Makefile,v 1.13 2007/08/31 02:46:47 mef Exp $
+# $Id: Makefile 793 2007-08-28 15:21:17Z thierry $
 #
 
 # Metafiles
@@ -16,12 +16,9 @@ modules := psycopg2
 # Temporarily until we can kill the Fedora Core 2 build
 curl_vernum := $(shell printf %d 0x$(shell curl-config --vernum))
 pycurl_vernum := $(shell printf %d 0x070d01) # 7.13.1
-pycurl_incompatnum := $(shell printf %d 0x071000) # 7.16.0
 ifeq ($(shell test $(curl_vernum) -ge $(pycurl_vernum) && echo 1),1)
-ifeq ($(shell test $(curl_vernum) -ge $(pycurl_incompatnum) && echo 0),1)
 modules += pycurl
 endif
-endif
 
 modules-install := $(foreach module, $(modules), $(module)-install)
 modules-clean := $(foreach module, $(modules), $(module)-clean)
@@ -73,31 +70,70 @@ clean: $(modules-clean)
 
 index: $(init)
 
+index-clean:
+       rm $(init)
+
 tags:
        find . '(' -name '*.py' -o -name '*.sql' -o -name '*.php' -o -name Makefile ')' | xargs etags
 
+########## make sync PLCHOST=hostname
+ifdef PLCHOST
+PLCSSH:=root@$(PLCHOST)
+endif
+
+LOCAL_RSYNC_EXCLUDES   := --exclude '*.pyc' 
+RSYNC_EXCLUDES         := --exclude .svn --exclude CVS --exclude '*~' --exclude TAGS $(LOCAL_RSYNC_EXCLUDES)
+RSYNC_COND_DRY_RUN     := $(if $(findstring n,$(MAKEFLAGS)),--dry-run,)
+RSYNC                  := rsync -a -v $(RSYNC_COND_DRY_RUN) $(RSYNC_EXCLUDES)
+
+sync:
+ifeq (,$(PLCSSH))
+       echo "sync: You must define target host as PLCHOST on the command line"
+       echo " e.g. make sync PLCHOST=private.one-lab.org" ; exit 1
+else
+       +$(RSYNC) PLC planetlab4.sql migrations $(PLCSSH):/plc/root/usr/share/plc_api/
+       ssh $(PLCSSH) chroot /plc/root apachectl graceful
+endif
+
+####################
 # All .py files in PLC/
-PLC := $(filter-out %/__init__.py, $(wildcard PLC/*.py))
-PLC_init := all = '$(notdir $(PLC:.py=))'.split()
 
-PLC/__init__.py:
-       echo "$(PLC_init)" >$@
+# the current content of __init__.py
+PLC_now := $(sort $(shell fgrep -v '"' PLC/__init__.py 2>/dev/null))
+# what should be declared
+PLC_paths := $(filter-out %/__init__.py, $(wildcard PLC/*.py))
+PLC_files := $(sort $(notdir $(PLC_paths:.py=)))
 
-ifneq ($(sort $(PLC_init)), $(sort $(shell cat PLC/__init__.py 2>/dev/null)))
+ifneq ($(PLC_now),$(PLC_files))
 PLC/__init__.py: force
 endif
+PLC/__init__.py: 
+       (echo 'all = """' ; cd PLC; ls -1 *.py | grep -v __init__ | sed -e 's,.py$$,,' ; echo '""".split()') > $@
 
-# All .py files in PLC/Methods/ and PLC/Methods/system/
-METHODS := $(filter-out %/__init__.py, $(wildcard PLC/Methods/*.py PLC/Methods/system/*.py))
-Methods_init := methods = '$(notdir $(subst system/, system., $(METHODS:.py=)))'.split()
 
-PLC/Methods/__init__.py:
-       echo "$(Methods_init)" >$@
+# the current content of __init__.py
+METHODS_now := $(sort $(shell fgrep -v '"' PLC/Methods/__init__.py 2>/dev/null))
+# what should be declared
+METHODS_paths := $(filter-out %/__init__.py, $(wildcard PLC/Methods/*.py PLC/Methods/system/*.py))
+METHODS_files := $(sort $(notdir $(subst system/, system., $(METHODS_paths:.py=))))
 
-ifneq ($(sort $(Methods_init)), $(sort $(shell cat PLC/Methods/__init__.py 2>/dev/null)))
+ifneq ($(METHODS_now),$(METHODS_files))
 PLC/Methods/__init__.py: force
 endif
+PLC/Methods/__init__.py: 
+       (echo 'methods = """' ; cd PLC/Methods; ls -1 *.py system/*.py | grep -v __init__ | sed -e 's,.py$$,,' -e 's,system/,system.,' ; echo '""".split()') > $@
 
 force:
 
 .PHONY: all install force clean index tags $(subdirs) $(modules)
+
+#################### convenience, for debugging only
+# make +foo : prints the value of $(foo)
+# make ++foo : idem but verbose, i.e. foo=$(foo)
+++%: varname=$(subst +,,$@)
+++%:
+       @echo "$(varname)=$($(varname))"
++%: varname=$(subst +,,$@)
++%:
+       @echo "$($(varname))"
+
index 558dcf3..150f87d 100644 (file)
@@ -10,9 +10,10 @@ class GetNodeNetworks(Method):
     Returns an array of structs containing details about node network
     interfacess. If nodenetworks_filter is specified and is an array
     of node network identifiers, or a struct of node network
-    attributes, only node network interfaces matching the filter will
-    be returned. If return_fields is specified, only the
-    specified details will be returned.
+    fields and values, only node network interfaces matching the filter
+    will be returned.
+
+    If return_fields is given, only the specified details will be returned.
     """
 
     roles = ['admin', 'pi', 'user', 'tech', 'node', 'anonymous']
@@ -20,6 +21,7 @@ class GetNodeNetworks(Method):
     accepts = [
         Auth(),
         Mixed([NodeNetwork.fields['nodenetwork_id']],
+              Parameter (int, "nodenetwork id"),
               Filter(NodeNetwork.fields)),
         Parameter([str], "List of fields to return", nullok = True)
         ]
index 912e84e..8e2931a 100644 (file)
@@ -23,6 +23,8 @@ class GetNodes(Method):
         Auth(),
         Mixed([Mixed(Node.fields['node_id'],
                      Node.fields['hostname'])],
+             Parameter(str,"hostname"),
+              Parameter(int,"node_id"),
               Filter(Node.fields)),
         Parameter([str], "List of fields to return", nullok = True),
         ]
index e48db7b..a483dd4 100644 (file)
@@ -27,6 +27,8 @@ class GetPersons(Method):
         Auth(),
         Mixed([Mixed(Person.fields['person_id'],
                      Person.fields['email'])],
+             Parameter(str,"email"),
+              Parameter(int,"person_id"), 
               Filter(Person.fields)),
         Parameter([str], "List of fields to return", nullok = True)
         ]
index 0d98e6b..c0f198e 100644 (file)
@@ -19,6 +19,8 @@ class GetSites(Method):
         Auth(),
         Mixed([Mixed(Site.fields['site_id'],
                      Site.fields['login_base'])],
+             Parameter(str,"login_base"),
+              Parameter(int,"site_id"),
               Filter(Site.fields)),
         Parameter([str], "List of fields to return", nullok = True)        
         ]
index b2ddfde..c300ce0 100644 (file)
@@ -26,6 +26,8 @@ class GetSlices(Method):
         Auth(),
         Mixed([Mixed(Slice.fields['slice_id'],
                      Slice.fields['name'])],
+             Parameter(str,"name"),
+              Parameter(int,"slice_id"),
               Filter(Slice.fields)),
         Parameter([str], "List of fields to return", nullok = True)
         ]
index 246e36a..0527421 100644 (file)
@@ -1 +1,221 @@
-methods = 'AddAddressType AddAddressTypeToAddress AddBootState AddConfFile AddConfFileToNodeGroup AddConfFileToNode AddInitScript AddKeyType AddMessage AddNetworkMethod AddNetworkType AddNodeGroup AddNodeNetwork AddNodeNetworkSetting AddNodeNetworkSettingType AddNode AddNodeToNodeGroup AddNodeToPCU AddPCU AddPeer AddPersonKey AddPerson AddPersonToSite AddPersonToSlice AddRole AddRoleToPerson AddSession AddSiteAddress AddSite AddSliceAttribute AddSliceAttributeType AddSliceInstantiation AddSlice AddSliceToNodes AddSliceToNodesWhitelist AdmAddAddressType AdmAddNodeGroup AdmAddNodeNetwork AdmAddNode AdmAddNodeToNodeGroup AdmAddPersonKey AdmAddPerson AdmAddPersonToSite AdmAddSitePowerControlUnit AdmAddSite AdmAssociateNodeToPowerControlUnitPort AdmAuthCheck AdmDeleteAddressType AdmDeleteAllPersonKeys AdmDeleteNodeGroup AdmDeleteNodeNetwork AdmDeleteNode AdmDeletePersonKeys AdmDeletePerson AdmDeleteSitePowerControlUnit AdmDeleteSite AdmDisassociatePowerControlUnitPort AdmGenerateNodeConfFile AdmGetAllAddressTypes AdmGetAllKeyTypes AdmGetAllNodeNetworks AdmGetAllRoles AdmGetNodeGroupNodes AdmGetNodeGroups AdmGetNodes AdmGetPersonKeys AdmGetPersonRoles AdmGetPersonSites AdmGetPersons AdmGetPowerControlUnitNodes AdmGetPowerControlUnits AdmGetSiteNodes AdmGetSitePersons AdmGetSitePIs AdmGetSitePowerControlUnits AdmGetSites AdmGetSiteTechContacts AdmGrantRoleToPerson AdmIsPersonInRole AdmQueryConfFile AdmQueryNode AdmQueryPerson AdmQueryPowerControlUnit AdmQuerySite AdmRebootNode AdmRemoveNodeFromNodeGroup AdmRemovePersonFromSite AdmRevokeRoleFromPerson AdmSetPersonEnabled AdmSetPersonPrimarySite AdmUpdateNodeGroup AdmUpdateNodeNetwork AdmUpdateNode AdmUpdatePerson AdmUpdateSitePowerControlUnit AdmUpdateSite AnonAdmGetNodeGroups AuthCheck BlacklistKey BootCheckAuthentication BootGetNodeDetails BootNotifyOwners BootUpdateNode DeleteAddress DeleteAddressTypeFromAddress DeleteAddressType DeleteBootState DeleteConfFileFromNodeGroup DeleteConfFileFromNode DeleteConfFile DeleteInitScript DeleteKey DeleteKeyType DeleteMessage DeleteNetworkMethod DeleteNetworkType DeleteNodeFromNodeGroup DeleteNodeFromPCU DeleteNodeGroup DeleteNodeNetwork DeleteNodeNetworkSetting DeleteNodeNetworkSettingType DeleteNode DeletePCU DeletePeer DeletePersonFromSite DeletePersonFromSlice DeletePerson DeleteRoleFromPerson DeleteRole DeleteSession DeleteSite DeleteSliceAttribute DeleteSliceAttributeType DeleteSliceFromNodes DeleteSliceFromNodesWhitelist DeleteSliceInstantiation DeleteSlice GenerateNodeConfFile GetAddresses GetAddressTypes GetBootMedium GetBootStates GetConfFiles GetEventObjects GetEvents GetInitScripts GetKeys GetKeyTypes GetMessages GetNetworkMethods GetNetworkTypes GetNodeGroups GetNodeNetworkSettings GetNodeNetworkSettingTypes GetNodeNetworks GetNodes GetPCUs GetPeerData GetPeerName GetPeers GetPersons GetPlcRelease GetRoles GetSession GetSessions GetSites GetSliceAttributes GetSliceAttributeTypes GetSliceInstantiations GetSliceKeys GetSlicesMD5 GetSlices GetSliceTicket GetSlivers GetWhitelist NotifyPersons RebootNode RefreshPeer ResetPassword SetPersonPrimarySite SliceCreate SliceDelete SliceExtendedInfo SliceGetTicket SliceInfo SliceListNames SliceListUserSlices SliceNodesAdd SliceNodesDel SliceNodesList SliceRenew SliceTicketGet SliceUpdate SliceUserAdd SliceUserDel SliceUsersList UpdateAddress UpdateAddressType UpdateConfFile UpdateInitScript UpdateKey UpdateMessage UpdateNodeGroup UpdateNodeNetwork UpdateNodeNetworkSetting UpdateNodeNetworkSettingType UpdateNode UpdatePCU UpdatePeer UpdatePerson UpdateSite UpdateSliceAttribute UpdateSliceAttributeType UpdateSlice VerifyPerson  system.listMethods  system.methodHelp  system.methodSignature  system.multicall'.split()
+methods = """
+AddAddressType
+AddAddressTypeToAddress
+AddBootState
+AddConfFile
+AddConfFileToNode
+AddConfFileToNodeGroup
+AddInitScript
+AddKeyType
+AddMessage
+AddNetworkMethod
+AddNetworkType
+AddNode
+AddNodeGroup
+AddNodeNetwork
+AddNodeNetworkSetting
+AddNodeNetworkSettingType
+AddNodeToNodeGroup
+AddNodeToPCU
+AddPCU
+AddPeer
+AddPerson
+AddPersonKey
+AddPersonToSite
+AddPersonToSlice
+AddRole
+AddRoleToPerson
+AddSession
+AddSite
+AddSiteAddress
+AddSlice
+AddSliceAttribute
+AddSliceAttributeType
+AddSliceInstantiation
+AddSliceToNodes
+AddSliceToNodesWhitelist
+AdmAddAddressType
+AdmAddNode
+AdmAddNodeGroup
+AdmAddNodeNetwork
+AdmAddNodeToNodeGroup
+AdmAddPerson
+AdmAddPersonKey
+AdmAddPersonToSite
+AdmAddSite
+AdmAddSitePowerControlUnit
+AdmAssociateNodeToPowerControlUnitPort
+AdmAuthCheck
+AdmDeleteAddressType
+AdmDeleteAllPersonKeys
+AdmDeleteNode
+AdmDeleteNodeGroup
+AdmDeleteNodeNetwork
+AdmDeletePerson
+AdmDeletePersonKeys
+AdmDeleteSite
+AdmDeleteSitePowerControlUnit
+AdmDisassociatePowerControlUnitPort
+AdmGetAllAddressTypes
+AdmGetAllKeyTypes
+AdmGetAllNodeNetworks
+AdmGetAllRoles
+AdmGetNodeGroupNodes
+AdmGetNodeGroups
+AdmGetNodes
+AdmGetPersonKeys
+AdmGetPersonRoles
+AdmGetPersonSites
+AdmGetPersons
+AdmGetPowerControlUnitNodes
+AdmGetPowerControlUnits
+AdmGetSiteNodes
+AdmGetSitePIs
+AdmGetSitePersons
+AdmGetSitePowerControlUnits
+AdmGetSiteTechContacts
+AdmGetSites
+AdmGrantRoleToPerson
+AdmIsPersonInRole
+AdmQueryConfFile
+AdmQueryNode
+AdmQueryPerson
+AdmQueryPowerControlUnit
+AdmQuerySite
+AdmRebootNode
+AdmRemoveNodeFromNodeGroup
+AdmRemovePersonFromSite
+AdmRevokeRoleFromPerson
+AdmSetPersonEnabled
+AdmSetPersonPrimarySite
+AdmUpdateNode
+AdmUpdateNodeGroup
+AdmUpdateNodeNetwork
+AdmUpdatePerson
+AdmUpdateSite
+AdmUpdateSitePowerControlUnit
+AnonAdmGetNodeGroups
+AuthCheck
+BlacklistKey
+BootCheckAuthentication
+BootGetNodeDetails
+BootNotifyOwners
+BootUpdateNode
+DeleteAddress
+DeleteAddressType
+DeleteAddressTypeFromAddress
+DeleteBootState
+DeleteConfFile
+DeleteConfFileFromNode
+DeleteConfFileFromNodeGroup
+DeleteInitScript
+DeleteKey
+DeleteKeyType
+DeleteMessage
+DeleteNetworkMethod
+DeleteNetworkType
+DeleteNode
+DeleteNodeFromNodeGroup
+DeleteNodeFromPCU
+DeleteNodeGroup
+DeleteNodeNetwork
+DeleteNodeNetworkSetting
+DeleteNodeNetworkSettingType
+DeletePCU
+DeletePeer
+DeletePerson
+DeletePersonFromSite
+DeletePersonFromSlice
+DeleteRole
+DeleteRoleFromPerson
+DeleteSession
+DeleteSite
+DeleteSlice
+DeleteSliceAttribute
+DeleteSliceAttributeType
+DeleteSliceFromNodes
+DeleteSliceFromNodesWhitelist
+DeleteSliceInstantiation
+GetAddressTypes
+GetAddresses
+GetBootMedium
+GetBootStates
+GetConfFiles
+GetEventObjects
+GetEvents
+GetInitScripts
+GetKeyTypes
+GetKeys
+GetMessages
+GetNetworkMethods
+GetNetworkTypes
+GetNodeGroups
+GetNodeNetworkSettingTypes
+GetNodeNetworkSettings
+GetNodeNetworks
+GetNodes
+GetPCUs
+GetPeerData
+GetPeerName
+GetPeers
+GetPersons
+GetPlcRelease
+GetRoles
+GetSession
+GetSessions
+GetSites
+GetSliceAttributeTypes
+GetSliceAttributes
+GetSliceInstantiations
+GetSliceKeys
+GetSliceTicket
+GetSlices
+GetSlicesMD5
+GetSlivers
+GetWhitelist
+NotifyPersons
+NotifySupport
+RebootNode
+RefreshPeer
+ResetPassword
+SetPersonPrimarySite
+SliceCreate
+SliceDelete
+SliceExtendedInfo
+SliceGetTicket
+SliceInfo
+SliceListNames
+SliceListUserSlices
+SliceNodesAdd
+SliceNodesDel
+SliceNodesList
+SliceRenew
+SliceTicketGet
+SliceUpdate
+SliceUserAdd
+SliceUserDel
+SliceUsersList
+UpdateAddress
+UpdateAddressType
+UpdateConfFile
+UpdateInitScript
+UpdateKey
+UpdateMessage
+UpdateNode
+UpdateNodeGroup
+UpdateNodeNetwork
+UpdateNodeNetworkSetting
+UpdateNodeNetworkSettingType
+UpdatePCU
+UpdatePeer
+UpdatePerson
+UpdateSite
+UpdateSlice
+UpdateSliceAttribute
+UpdateSliceAttributeType
+VerifyPerson
+system.listMethods
+system.methodHelp
+system.methodSignature
+system.multicall
+""".split()
index 94ab402..139deef 100644 (file)
@@ -4,7 +4,7 @@
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
 #
-# $Id: Persons.py,v 1.37 2007/06/14 16:26:01 tmack Exp $
+# $Id: Persons.py,v 1.38 2007/08/22 19:54:07 tmack Exp $
 #
 
 from types import StringTypes
@@ -326,6 +326,14 @@ class Persons(Table):
             elif isinstance(person_filter, dict):
                 person_filter = Filter(Person.fields, person_filter)
                 sql += " AND (%s)" % person_filter.sql(api, "AND")
+           elif isinstance (person_filter, StringTypes):
+                person_filter = Filter(Person.fields, {'email':[person_filter]})
+                sql += " AND (%s)" % person_filter.sql(api, "AND")
+            elif isinstance (person_filter, int):
+                person_filter = Filter(Person.fields, {'person_id':[person_filter]})
+                sql += " AND (%s)" % person_filter.sql(api, "AND")
+           else:
+                raise PLCInvalidArgument, "Wrong person filter %r"%person_filter           
 
        # aggregate data
        all_persons = {}
index 14e14c4..e43efe6 100644 (file)
@@ -5,7 +5,7 @@
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
 #
-# $Id: PyCurl.py,v 1.1 2006/12/15 18:21:39 mlhuang Exp $
+# $Id: PyCurl.py,v 1.2 2007/09/12 17:52:27 tmack Exp $
 #
 
 import os
@@ -70,7 +70,7 @@ class PyCurlTransport(xmlrpclib.Transport):
         if errcode == 60:
             raise Exception, "PyCurl: SSL certificate validation failed"
         elif errcode != 200:
-            raise Exception, "PyCurl: HTTP error %d" % errcode
+           raise Exception, "PyCurl: HTTP error %d -- %r" % (errcode,errmsg)
 
         # Parse response
         p, u = self.getparser()
index 4aead29..759e1d7 100644 (file)
@@ -186,5 +186,13 @@ class Sites(Table):
             elif isinstance(site_filter, dict):
                 site_filter = Filter(Site.fields, site_filter)
                 sql += " AND (%s)" % site_filter.sql(api, "AND")
+           elif isinstance (site_filter, StringTypes):
+                site_filter = Filter(Site.fields, {'login_base':[site_filter]})
+                sql += " AND (%s)" % site_filter.sql(api, "AND")
+            elif isinstance (site_filter, int):
+                site_filter = Filter(Site.fields, {'site_id':[site_filter]})
+                sql += " AND (%s)" % site_filter.sql(api, "AND")
+            else:
+                raise PLCInvalidArgument, "Wrong site filter %r"%site_filter
 
         self.selectall(sql)
index d8962c4..88c0b57 100644 (file)
@@ -155,5 +155,13 @@ class Slices(Table):
             elif isinstance(slice_filter, dict):
                 slice_filter = Filter(Slice.fields, slice_filter)
                 sql += " AND (%s)" % slice_filter.sql(api, "AND")
+           elif isinstance (slice_filter, StringTypes):
+                slice_filter = Filter(Slice.fields, {'name':[slice_filter]})
+                sql += " AND (%s)" % slice_filter.sql(api, "AND")
+            elif isinstance (slice_filter, int):
+                slice_filter = Filter(Slice.fields, {'slice_id':[slice_filter]})
+                sql += " AND (%s)" % slice_filter.sql(api, "AND")
+            else:
+                raise PLCInvalidArgument, "Wrong slice filter %r"%slice_filter
 
         self.selectall(sql)
index fed5fa7..5d41de2 100644 (file)
@@ -1 +1,46 @@
-all = 'Addresses AddressTypes API Auth Boot BootStates Cache ConfFiles Config Debug EventObjects Events Faults Filter GPG InitScripts Keys KeyTypes Messages Method NetworkMethods NetworkTypes NodeGroups NodeNetworkSettings NodeNetworkSettingTypes NodeNetworks Nodes Parameter PCUs Peers Persons POD PostgreSQL PyCurl Roles sendmail Sessions Shell Sites SliceAttributes SliceAttributeTypes SliceInstantiations Slices Table Test'.split()
+all = """
+API
+AddressTypes
+Addresses
+Auth
+Boot
+BootStates
+ConfFiles
+Config
+Debug
+EventObjects
+Events
+Faults
+Filter
+GPG
+InitScripts
+KeyTypes
+Keys
+Messages
+Method
+NetworkMethods
+NetworkTypes
+NodeGroups
+NodeNetworkSettingTypes
+NodeNetworkSettings
+NodeNetworks
+Nodes
+PCUs
+POD
+Parameter
+Peers
+Persons
+PostgreSQL
+PyCurl
+Roles
+Sessions
+Shell
+Sites
+SliceAttributeTypes
+SliceAttributes
+SliceInstantiations
+Slices
+Table
+Test
+sendmail
+""".split()
index 5df2a9e..78d1343 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -5,7 +5,7 @@
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
 #
-# $Id: setup.py,v 1.8 2007/01/30 11:48:14 thierry Exp $
+# $Id: setup.py 519 2007-06-12 14:36:25Z thierry $
 #
 
 from distutils.core import setup
@@ -13,7 +13,7 @@ from glob import glob
 
 setup(py_modules = ['ModPython'],
       packages = ['PLC', 'PLC/Methods', 'PLC/Methods/system'],
-      scripts = ['plcsh', 'Server.py', 'Test.py'],
+      scripts = ['plcsh', 'Server.py'],
       data_files = [('', ['planetlab4.sql']),
                     ('php', ['php/plc_api.php']),
                     ('migrations', ['migrations/README.txt'] + glob('migrations/[0-9][0-9][0-9]*')),