RSYNC_COND_DRY_RUN := $(if $(findstring n,$(MAKEFLAGS)),--dry-run,)
RSYNC := rsync -a -v $(RSYNC_COND_DRY_RUN) $(RSYNC_EXCLUDES)
+BINS = ./config/sfa-config-tty ./sfa/plc/sfa-import-plc.py ./sfa/plc/sfa-nuke-plc.py \
+ ./sfa/server/sfa-server.py \
+ ./sfa/client/sfi.py ./sfa/client/getNodes.py ./sfa/client/getRecord.py \
+ ./sfa/client/setRecord.py ./sfa/client/genidump.py
+
sync:
ifeq (,$(SSHURL))
@echo "sync: You must define, either PLC, or PLCHOST & GUEST, on the command line"
@exit 1
else
+$(RSYNC) ./sfa/ $(SSHURL)/usr/lib/python2.5/site-packages/sfa/
- +$(RSYNC) ./config/sfa-config-tty $(SSHURL)/usr/bin
+ +$(RSYNC) $(BINS) $(SSHURL)/usr/bin
$(SSHCOMMAND) exec service sfa restart
endif
"SFA_REGISTRY_LEVEL1_AUTH",
"SFA_PLC_USER",
"SFA_PLC_PASSWORD",
+ "SFA_PLC_DB_HOST",
"SFA_PLC_DB_USER",
"SFA_PLC_DB_PASSWORD",
]
# Password for user account
SFA_PLC_PASSWORD='root'
-# Hostname
-# Fully qualified hostname of PLC interface
+# Full URL of PLC interface
SFA_PLC_URL='https://localhost:443/PLCAPI/'
-# PLC Shell PATH
-# This only applies if sfa services and PLC interface are running on the same machine
-SFA_PLC_SHELL_PATH='/usr/share/plc_api'
-
# PLC DB Name
SFA_PLC_DB_NAME='planetlab5'
# PLC DB Host
-SFA_PLC_DB_HOST='www.planet-lab.org'
+SFA_PLC_DB_HOST='localhost'
# PLC DB port
SFA_PLC_DB_PORT=5432
]),
('/etc/init.d/', ['sfa/init.d/sfa']),
]
-symlinks = [ '/usr/share/sfa' ]
initscripts = [ '/etc/init.d/sfa' ]
if sys.argv[1] in ['uninstall', 'remove', 'delete', 'clean']:
remove_dirs = ['/etc/sfa/'] + site_packages_path
remove_files = [ '/usr/bin/sfa-config-tty',
'/usr/bin/sfa-import-plc.py',
+ '/usr/bin/sfa-nuke-plc.py',
'/usr/bin/sfa-server.py',
'/usr/bin/sfi.py',
'/usr/bin/getNodes.py',
'/usr/bin/getRecord.py',
'/usr/bin/setRecord.py',
'/usr/bin/genidump.py',
- ] + symlinks + initscripts
+ ] + initscripts
# remove files
for filepath in remove_files:
scripts = scripts,
)
- # create symlink to geniwrapper source in /usr/share
- python_path = sys.path
- site_packages_path = [ path + os.sep + 'sfa' for path in python_path if path.endswith('site-packages')]
- # python path usualy has /usr/local/lib/ path , filter this out
- site_packages_path = [x for x in site_packages_path if 'local' not in x]
-
- # we can not do this here as installation root might change paths
- # - baris
- #
- # for src in site_packages_path:
- # for dst in symlinks:
- # try:
- # os.symlink(src, dst)
- # except: pass
- # for initscript in initscripts:
- # os.chmod(initscript, 00744)
/etc/init.d/sfa
%{_bindir}/sfa-config-tty
%{_bindir}/sfa-import-plc.py*
+%{_bindir}/sfa-nuke-plc.py*
%{_bindir}/sfa-server.py*
%files client
from sfa.trust.certificate import Certificate
from sfa.trust.credential import Credential
-from sfa.trust.gid import create_uuid
-from sfa.util.geniclient import GeniClient, ServerException
+from sfa.util.geniclient import GeniClient
from sfa.util.record import GeniRecord
from sfa.util.rspec import Rspec
from sfa.trust.certificate import Keypair, Certificate
from sfa.trust.credential import Credential
-from sfa.trust.gid import create_uuid
from sfa.util.geniclient import GeniClient
from sfa.util.record import *
from sfa.util.rspec import Rspec
+from sfa.util.xmlrpcprotocol import ServerException
# xxx todo xxx auto-load ~/.sfi/sfi_config
from sfa.util.faults import *
from sfa.util.method import Method
from sfa.util.parameter import Parameter, Mixed
+
+from sfa.trust.gid import create_uuid
from sfa.trust.auth import Auth
class create_gid(Method):
from sfa.util.misc import *
from sfa.util.method import Method
from sfa.util.parameter import Parameter, Mixed
-from sfa.trust.auth import Auth
from sfa.util.record import GeniRecord
from sfa.util.debug import log
+from sfa.trust.auth import Auth
+from sfa.trust.gid import create_uuid
+
class register(Method):
"""
Register an object with the registry. In addition to being stored in the
import sys
import tempfile
-from sfa.trust.certificate import convert_public_key, Keypair
-from sfa.trust.trustedroot import *
-
-from sfa.trust.hierarchy import *
from sfa.util.record import *
-from sfa.util.genitable import *
+from sfa.util.genitable import GeniTable
from sfa.util.misc import *
from sfa.util.config import *
+from sfa.util.report import trace, error
+
+from sfa.trust.certificate import convert_public_key, Keypair
+from sfa.trust.trustedroot import *
+from sfa.trust.hierarchy import *
+from sfa.trust.gid import create_uuid
# get PL account settings from config module
pl_auth = get_pl_auth()
# connect to planetlab
if "Url" in pl_auth:
- from sfa.plc import remoteshell
- shell = remoteshell.RemoteShell()
+ from sfa.plc.remoteshell import RemoteShell
+ shell = RemoteShell()
else:
import PLC.Shell
shell = PLC.Shell.Shell(globals = globals())
# into this authority yet.
if not table.exists():
- report.trace("Import: creating table for authority " + auth_name)
+ trace("Import: creating table for authority " + auth_name)
table.create()
return table
if len(hrn) > 64:
hrn = hrn[:64]
- report.trace("Import: importing person " + hrn)
+ trace("Import: importing person " + hrn)
table = get_auth_table(parent_hrn)
pkey =convert_public_key(key)
else:
# the user has no keys
- report.trace(" person " + hrn + " does not have a PL public key")
+ trace(" person " + hrn + " does not have a PL public key")
# if a key is unavailable, then we still need to put something in the
# user's GID. So make one up.
person_gid = AuthHierarchy.create_gid(hrn, create_uuid(), pkey)
person_record = table.resolve("user", hrn)
if not person_record:
- report.trace(" inserting user record for " + hrn)
+ trace(" inserting user record for " + hrn)
person_record = GeniRecord(hrn=hrn, gid=person_gid, type="user", pointer=person['person_id'])
table.insert(person_record)
else:
- report.trace(" updating user record for " + hrn)
+ trace(" updating user record for " + hrn)
person_record = GeniRecord(hrn=hrn, gid=person_gid, type="user", pointer=person['person_id'])
table.update(person_record)
slicename = cleanup_string(slicename)
if not slicename:
- report.error("Import_Slice: failed to parse slice name " + slice['name'])
+ error("Import_Slice: failed to parse slice name " + slice['name'])
return
hrn = parent_hrn + "." + slicename
- report.trace("Import: importing slice " + hrn)
+ trace("Import: importing slice " + hrn)
table = get_auth_table(parent_hrn)
pkey = Keypair(create=True)
slice_gid = AuthHierarchy.create_gid(hrn, create_uuid(), pkey)
slice_record = GeniRecord(hrn=hrn, gid=slice_gid, type="slice", pointer=slice['slice_id'])
- report.trace(" inserting slice record for " + hrn)
+ trace(" inserting slice record for " + hrn)
table.insert(slice_record)
def import_node(parent_hrn, node):
nodename = cleanup_string(nodename)
if not nodename:
- report.error("Import_node: failed to parse node name " + node['hostname'])
+ error("Import_node: failed to parse node name " + node['hostname'])
return
hrn = parent_hrn + "." + nodename
if len(hrn) > 64:
hrn = hrn[:64]
- report.trace("Import: importing node " + hrn)
+ trace("Import: importing node " + hrn)
table = get_auth_table(parent_hrn)
pkey = Keypair(create=True)
node_gid = AuthHierarchy.create_gid(hrn, create_uuid(), pkey)
node_record = GeniRecord(hrn=hrn, gid=node_gid, type="node", pointer=node['node_id'])
- report.trace(" inserting node record for " + hrn)
+ trace(" inserting node record for " + hrn)
table.insert(node_record)
def import_site(parent_hrn, site):
hrn = ".".join([parent_hrn, "internet2", sitename])
sitename = sitename.replace("nlr", "")
- report.trace("Import_Site: importing site " + hrn)
+ trace("Import_Site: importing site " + hrn)
# create the authority
if not AuthHierarchy.auth_exists(hrn):
auth_record = table.resolve("authority", hrn)
if not auth_record:
auth_record = GeniRecord(hrn=hrn, gid=auth_info.get_gid_object(), type="authority", pointer=site['site_id'])
- report.trace(" inserting authority record for " + hrn)
+ trace(" inserting authority record for " + hrn)
table.insert(auth_record)
if 'person_ids' in site:
try:
import_person(hrn, persons[0])
except Exception, e:
- report.trace("Failed to import: %s (%s)" % (persons[0], e))
+ trace("Failed to import: %s (%s)" % (persons[0], e))
if 'slice_ids' in site:
for slice_id in site['slice_ids']:
slices = shell.GetSlices(pl_auth, [slice_id])
try:
import_slice(hrn, slices[0])
except Exception, e:
- report.trace("Failed to import: %s (%s)" % (slices[0], e))
+ trace("Failed to import: %s (%s)" % (slices[0], e))
if 'node_ids' in site:
for node_id in site['node_ids']:
nodes = shell.GetNodes(pl_auth, [node_id])
try:
import_node(hrn, nodes[0])
except Exception, e:
- report.trace("Failed to import: %s (%s)" % (nodes[0], e))
+ trace("Failed to import: %s (%s)" % (nodes[0], e))
def create_top_level_auth_records(hrn):
parent_hrn = get_authority(hrn)
auth_record = table.resolve("authority", hrn)
if not auth_record:
auth_record = GeniRecord(hrn=hrn, gid=auth_info.get_gid_object(), type="authority", pointer=-1)
- report.trace(" inserting authority record for " + hrn)
+ trace(" inserting authority record for " + hrn)
table.insert(auth_record)
def main():
+#!/usr/bin/python
##
# Delete all the database records for Geni. This tool is used to clean out Geni
# records during testing.
from sfa.trust.hierarchy import *
from sfa.util.record import *
-from sfa.util.genitable import *
+from sfa.util.genitable import GeniTable
from sfa.util.config import *
def process_options():
- global hrn
(options, args) = getopt.getopt(sys.argv[1:], '', [])
for opt in options:
process_options()
print "purging geni records from database"
- geni_records_purge(get_default_dbinfo())
+ GeniTable.geni_records_purge(get_default_dbinfo())
if __name__ == "__main__":
main()
from sfa.trust.rights import RightList
from sfa.util.faults import *
from sfa.trust.hierarchy import Hierarchy
-from sfa.util.genitable import *
+from sfa.util.genitable import GeniTable
from sfa.util.config import *
from sfa.util.misc import *
### $URL$
import xmlrpclib
-
import uuid
+
from sfa.trust.certificate import Certificate
##
from sfa.util.report import *
from sfa.trust.certificate import Keypair
from sfa.trust.credential import *
-from sfa.trust.gid import *
+from sfa.trust.gid import GID, create_uuid
from sfa.util.misc import *
from sfa.util.config import *
It was copied out from SimpleXMLRPCServer.py and modified to shutdown the socket cleanly.
"""
- self.api = GeniAPI(peer_cert = self.server.peer_cert, interface = self.server.interface, key_file = self.server.key_file, cert_file = self.server.cert_file)
+ self.api = GeniAPI(peer_cert = self.server.peer_cert,
+ interface = self.server.interface,
+ key_file = self.server.key_file,
+ cert_file = self.server.cert_file)
try:
# get arguments
request = self.rfile.read(int(self.headers["content-length"]))
from sfa.util.record import *
from sfa.util.debug import *
-GENI_TABLE_PREFIX = "sfa$"
-
class GeniTable:
+
+ GENI_TABLE_PREFIX = "sfa$"
+
def __init__(self, create=False, hrn="unspecified.default.registry", cninfo=None):
- global GENI_TABLE_PREFIX
self.hrn = hrn
# pgsql doesn't like table names with "." in them, to replace it with "$"
- self.tablename = GENI_TABLE_PREFIX + self.hrn.replace(".", "$")
+ self.tablename = GeniTable.GENI_TABLE_PREFIX + self.hrn.replace(".", "$")
# establish a connection to the pgsql server
self.cnx = DB(cninfo['dbname'], cninfo['address'], port=cninfo['port'], user=cninfo['user'], passwd=cninfo['password'])
result_rec_list.append(GeniRecord(dict=dict).as_dict())
return result_rec_list
-def set_geni_table_prefix(x):
- global GENI_TABLE_PREFIX
-
- GENI_TABLE_PREFIX = x
-
-def geni_records_purge(cninfo):
- global GENI_TABLE_PREFIX
-
- cnx = DB(cninfo['dbname'], cninfo['address'], port=cninfo['port'], user=cninfo['user'], passwd=cninfo['password'])
- tableList = cnx.get_tables()
- for table in tableList:
- if table.startswith(GENI_TABLE_PREFIX) or \
- table.startswith('public.' + GENI_TABLE_PREFIX) or \
- table.startswith('public."' + GENI_TABLE_PREFIX):
- report.trace("dropping table " + table)
- cnx.query("DROP TABLE " + table)
+ @staticmethod
+ def geni_records_purge(cninfo):
+
+ cnx = DB(cninfo['dbname'], cninfo['address'],
+ port=cninfo['port'], user=cninfo['user'], passwd=cninfo['password'])
+ tableList = cnx.get_tables()
+ for table in tableList:
+ if table.startswith(GeniTable.GENI_TABLE_PREFIX) or \
+ table.startswith('public.' + GeniTable.GENI_TABLE_PREFIX) or \
+ table.startswith('public."' + GeniTable.GENI_TABLE_PREFIX):
+ report.trace("dropping table " + table)
+ cnx.query("DROP TABLE " + table)
"""
Given a list of field names, return a list of values for those public.
"""
- strs = []
- for fieldname in fieldnames:
- strs.append(self.get_field_value_string(fieldname))
- return strs
+ return [ self.get_field_value_string (fieldname) for fieldname in fieldnames ]
##
# Return the record in the form of a dictionary