From 703b9e1c76d57efbdff18cc4969e056593794056 Mon Sep 17 00:00:00 2001 From: Tony Mack Date: Thu, 16 Sep 2010 22:51:47 +0000 Subject: [PATCH] sfa-0.9-17 tag --- CHANGES-0.2-to-0.8.txt | 56 + INSTALL.txt | 146 + LICENSE.txt | 20 + Makefile | 94 + README.txt | 7 + TODO | 41 + config/aggregates.xml | 3 + config/default_config.xml | 260 ++ config/gen-sfa-cm-config.py | 58 + config/registries.xml | 3 + config/sfa-config-tty | 41 + config/sfa_component_config | 116 + config/sfi_config | 24 + docs/Geniwrapper_Design_Docu.html | 1890 +++++++++ docs/Makefile | 11 + docs/README | 5 + docs/geniwrapper.doc | Bin 0 -> 186880 bytes docs/geniwrapper.pdf | Bin 0 -> 421200 bytes docs/pythondoc-cert.html | 307 ++ docs/pythondoc-component.html | 136 + docs/pythondoc-config.html | 36 + docs/pythondoc-credential.html | 159 + docs/pythondoc-geniclient.html | 322 ++ docs/pythondoc-geniserver.html | 83 + docs/pythondoc-gid.html | 103 + docs/pythondoc-hierarchy.html | 209 + docs/pythondoc-import.html | 26 + docs/pythondoc-record.html | 169 + docs/pythondoc-registry.html | 433 +++ docs/pythondoc-rights.html | 111 + docs/sfa-2008-08-08.pdf | Bin 0 -> 469838 bytes docs/sfa-2008-11-03.pdf | Bin 0 -> 257479 bytes docs/sfa-impl-2009-04-07.pdf | Bin 0 -> 487170 bytes docs/sfa-impl.doc | Bin 0 -> 200192 bytes docs/sfa-impl.pdf | Bin 0 -> 430040 bytes docs/sfa.doc | Bin 0 -> 107008 bytes docs/sfa.pdf | Bin 0 -> 247679 bytes keyconvert/keyconvert.py | 115 + keyconvert/test.sh | 33 + keyconvert/test.txt | 1 + keyconvert/test/openssh_dsa_1024 | 12 + keyconvert/test/openssh_dsa_1024.pub | 1 + keyconvert/test/openssh_dsa_2048 | 20 + keyconvert/test/openssh_dsa_2048.pub | 1 + keyconvert/test/openssh_dsa_512 | 8 + keyconvert/test/openssh_dsa_512.pub | 1 + keyconvert/test/openssh_rsa1_1024 | Bin 0 -> 529 bytes keyconvert/test/openssh_rsa1_1024.pub | 1 + keyconvert/test/openssh_rsa1_2048 | Bin 0 -> 977 bytes keyconvert/test/openssh_rsa1_2048.pub | 1 + keyconvert/test/openssh_rsa1_512 | Bin 0 -> 305 bytes keyconvert/test/openssh_rsa1_512.pub | 1 + keyconvert/test/openssh_rsa_1024 | 15 + keyconvert/test/openssh_rsa_1024.pub | 1 + keyconvert/test/openssh_rsa_2048 | 27 + keyconvert/test/openssh_rsa_2048.pub | 1 + keyconvert/test/openssh_rsa_512 | 9 + keyconvert/test/openssh_rsa_512.pub | 1 + keyconvert/testkey.sh | 6 + rspec/model/Registry.ecore | 78 + rspec/model/planetlab.ecore | 80 + rspec/model/planetlab.ecore_diagram | 228 ++ rspec/model/planetlab.genmodel | 44 + rspec/model/planetlab.xsd | 85 + rspec/sample_rspec.xml | 30 + setup.py | 103 + sfa.spec | 321 ++ sfa/Makefile | 5 + sfa/__init__.py | 0 sfa/client/__init__.py | 0 sfa/client/getNodes.py | 84 + sfa/client/getRecord.py | 91 + sfa/client/setRecord.py | 112 + sfa/client/sfadump.py | 94 + sfa/client/sfi.py | 937 +++++ sfa/client/sfiAddAttribute.py | 36 + sfa/client/sfiAddSliver.py | 22 + sfa/client/sfiDeleteAttribute.py | 37 + sfa/client/sfiDeleteSliver.py | 22 + sfa/client/sfiListNodes.py | 17 + sfa/client/sfiListSlivers.py | 28 + sfa/cron.d/sfa.cron | 8 + sfa/init.d/sfa | 113 + sfa/init.d/sfa-cm | 80 + sfa/managers/__init__.py | 0 sfa/managers/aggregate_manager_pl.py | 326 ++ sfa/managers/component_manager_default.py | 22 + sfa/managers/component_manager_pl.py | 73 + sfa/managers/eucalyptus/eucalyptus.rnc | 89 + sfa/managers/eucalyptus/eucalyptus.rng | 222 ++ sfa/managers/eucalyptus/eucalyptus.xml | 76 + sfa/managers/max/max.xml | 90 + sfa/managers/pl/pl.rnc | 56 + sfa/managers/pl/pl.rng | 201 + sfa/managers/pl/pl.xml | 3420 +++++++++++++++++ sfa/managers/registry_manager_pl.py | 421 ++ sfa/managers/slice_manager_pl.py | 308 ++ sfa/managers/vini/__init__.py | 0 sfa/managers/vini/request.xml | 26 + sfa/managers/vini/topology.py | 38 + sfa/managers/vini/utils.py | 719 ++++ sfa/managers/vini/vini.rnc | 70 + sfa/managers/vini/vini.rng | 255 ++ sfa/managers/vini/vini.xml | 373 ++ sfa/managers/vini/vini_network.py | 469 +++ sfa/methods/CreateSliver.py | 52 + sfa/methods/DeleteSliver.py | 41 + sfa/methods/GetCredential.py | 55 + sfa/methods/GetGids.py | 47 + sfa/methods/GetSelfCredential.py | 75 + sfa/methods/GetTicket.py | 64 + sfa/methods/GetVersion.py | 21 + sfa/methods/List.py | 38 + sfa/methods/ListResources.py | 55 + sfa/methods/ListSlices.py | 37 + sfa/methods/RedeemTicket.py | 35 + sfa/methods/Register.py | 51 + sfa/methods/RegisterPeerObject.py | 73 + sfa/methods/Remove.py | 52 + sfa/methods/RemovePeerObject.py | 103 + sfa/methods/RenewSliver.py | 41 + sfa/methods/Resolve.py | 50 + sfa/methods/ResolveGENI.py | 30 + sfa/methods/Shutdown.py | 25 + sfa/methods/SliverStatus.py | 31 + sfa/methods/Start.py | 41 + sfa/methods/Stop.py | 41 + sfa/methods/Update.py | 41 + sfa/methods/UpdateSliver.py | 35 + sfa/methods/__init__.py | 45 + sfa/methods/create_slice.py | 35 + sfa/methods/delete_slice.py | 34 + sfa/methods/get_aggregates.py | 36 + sfa/methods/get_credential.py | 37 + sfa/methods/get_gids.py | 30 + sfa/methods/get_key.py | 88 + sfa/methods/get_registries.py | 36 + sfa/methods/get_resources.py | 40 + sfa/methods/get_self_credential.py | 53 + sfa/methods/get_slices.py | 30 + sfa/methods/get_ticket.py | 43 + sfa/methods/get_trusted_certs.py | 42 + sfa/methods/list.py | 34 + sfa/methods/redeem_ticket.py | 31 + sfa/methods/register.py | 36 + sfa/methods/register_peer_object.py | 73 + sfa/methods/remove.py | 38 + sfa/methods/remove_peer_object.py | 103 + sfa/methods/reset_slice.py | 52 + sfa/methods/resolve.py | 36 + sfa/methods/start_slice.py | 34 + sfa/methods/stop_slice.py | 33 + sfa/methods/update.py | 38 + sfa/plc/__init__.py | 0 sfa/plc/api-dev.py | 562 +++ sfa/plc/api.py | 678 ++++ sfa/plc/network.py | 594 +++ sfa/plc/peers.py | 36 + sfa/plc/remoteshell.py | 107 + sfa/plc/sfa-import-plc.py | 273 ++ sfa/plc/sfa-nuke-plc.py | 32 + sfa/plc/sfaImport.py | 246 ++ sfa/plc/slices.py | 443 +++ sfa/rspecs/__init__.py | 0 sfa/rspecs/aggregates/__init__.py | 0 sfa/rspecs/aggregates/max.xml | 90 + sfa/rspecs/aggregates/openflow.xml | 101 + sfa/rspecs/aggregates/rspec_manager_max.py | 331 ++ .../aggregates/rspec_manager_openflow.py | 166 + sfa/rspecs/aggregates/rspec_manager_pl.py | 8 + sfa/server/__init__.py | 0 sfa/server/aggregate.py | 47 + sfa/server/component.py | 35 + sfa/server/interface.py | 207 + sfa/server/modpython/SfaAggregateModPython.py | 70 + sfa/server/modpython/SfaRegistryModPython.py | 69 + sfa/server/modpython/SfaSliceMgrModPython.py | 70 + sfa/server/modpython/sfa.aggregate.httpd.conf | 24 + sfa/server/modpython/sfa.registry.httpd.conf | 24 + sfa/server/modpython/sfa.slicemgr.httpd.conf | 24 + sfa/server/modpythonapi/ApiExceptionCodes.py | 2 + sfa/server/modpythonapi/ApiExceptions.py | 15 + sfa/server/modpythonapi/AuthenticatedApi.py | 66 + .../modpythonapi/AuthenticatedClient.py | 24 + sfa/server/modpythonapi/BaseApi.py | 203 + sfa/server/modpythonapi/BaseClient.py | 46 + sfa/server/modpythonapi/ModPython.py | 68 + sfa/server/modpythonapi/TestApi.py | 19 + sfa/server/modpythonapi/installTest.sh | 37 + sfa/server/modpythonapi/test.py | 44 + sfa/server/modpythonapi/test.sh | 3 + sfa/server/modpythonapi/testapi.conf | 5 + sfa/server/registry.py | 53 + sfa/server/sfa-ca.py | 242 ++ sfa/server/sfa-clean-peer-records.py | 79 + sfa/server/sfa-server.py | 221 ++ sfa/server/sfa_component_setup.py | 311 ++ sfa/server/slicemgr.py | 23 + sfa/trust/__init__.py | 0 sfa/trust/auth.py | 321 ++ sfa/trust/certificate.py | 604 +++ sfa/trust/credential.py | 851 ++++ sfa/trust/credential_legacy.py | 247 ++ sfa/trust/gid.py | 219 ++ sfa/trust/hierarchy.py | 364 ++ sfa/trust/rights.py | 288 ++ sfa/trust/trusted_certs/plc_ca.crt | 18 + sfa/trust/trusted_certs/ple_ca.crt | 20 + sfa/trust/trustedroot.py | 46 + sfa/util/PostgreSQL.py | 269 ++ sfa/util/__init__.py | 0 sfa/util/api.py | 273 ++ sfa/util/cache.py | 62 + sfa/util/client.py | 382 ++ sfa/util/componentserver.py | 138 + sfa/util/config.py | 128 + sfa/util/debug.py | 57 + sfa/util/faults.py | 290 ++ sfa/util/filter.py | 218 ++ sfa/util/method.py | 306 ++ sfa/util/misc.py | 49 + sfa/util/namespace.py | 108 + sfa/util/nodemanager.py | 46 + sfa/util/parameter.py | 108 + sfa/util/policy.py | 23 + sfa/util/prefixTree.py | 97 + sfa/util/record.py | 399 ++ sfa/util/report.py | 11 + sfa/util/row.py | 57 + sfa/util/rspec.py | 420 ++ sfa/util/rspecHelper.py | 326 ++ sfa/util/server.py | 280 ++ sfa/util/sfalogging.py | 22 + sfa/util/sfatablesRuntime.py | 38 + sfa/util/sfaticket.py | 130 + sfa/util/soapprotocol.py | 36 + sfa/util/specdict.py | 134 + sfa/util/storage.py | 73 + sfa/util/table.py | 196 + sfa/util/threadmanager.py | 71 + sfa/util/xmlrpcprotocol.py | 54 + sfatables/README | 265 ++ sfatables/TO_CLEANUP | 3 + sfatables/__init__.py | 0 sfatables/command.py | 26 + sfatables/commands/Add.py | 70 + sfatables/commands/Delete.py | 32 + sfatables/commands/Insert.py | 65 + sfatables/commands/List.py | 103 + sfatables/commands/SetDefault.py | 19 + sfatables/commands/__init__.py | 7 + sfatables/commands/moo.py | 210 + sfatables/globals.py | 5 + sfatables/matches/all.xml | 12 + sfatables/matches/hrn.xml | 19 + sfatables/matches/slice-whitelist.xml | 7 + sfatables/matches/slice.xml | 19 + sfatables/pretty.py | 38 + .../processors/__sfatables_rule_wrap_up__.xsl | 15 + .../processors/__sfatables_wrap_up__.xsl | 14 + sfatables/processors/accept.xsl | 12 + sfatables/processors/all.xsl | 8 + sfatables/processors/hrn.xsl | 24 + .../processors/legacy-restrict-to-nodes.xsl | 26 + sfatables/processors/link/restrict_slice.xml | 28 + sfatables/processors/max_link_kbps.xsl | 39 + sfatables/processors/max_node_kbps.xsl | 60 + sfatables/processors/reject.xsl | 8 + sfatables/processors/restrict_to_flowspec.xsl | 30 + sfatables/processors/restrict_to_nodes.xsl | 25 + sfatables/processors/slice-hrn.xsl | 24 + sfatables/processors/slice-whitelist.xsl | 54 + sfatables/processors/test.xml | 3 + sfatables/runtime.py | 110 + sfatables/sfatables | 138 + sfatables/targets/ACCEPT.xml | 10 + sfatables/targets/REJECT.xml | 10 + sfatables/targets/RESTRICT_SLICE_DOMAIN.xml | 63 + sfatables/targets/RESTRICT_SLICE_PROP.xml | 26 + sfatables/test.rspec | 13 + sfatables/test.sfarspec | 16 + sfatables/vini.rspec | 26 + sfatables/xmlextension.py | 47 + sfatables/xmlrule.py | 138 + tests/client/README | 1 + tests/client/demoAggregate.sh | 56 + tests/client/testAggregate.py | 32 + tests/client/testSfi.sh | 12 + tests/client/testSfiDelegate.sh | 12 + tests/client/testSfiSliceRegister.sh | 84 + tests/testAll.py | 12 + tests/testCert.py | 204 + tests/testCred.py | 173 + tests/testGid.py | 63 + tests/testHierarchy.py | 51 + tests/testInterfaces.py | 321 ++ tests/testKeypair.py | 53 + tests/testMisc.py | 18 + tests/testRecord.py | 15 + tests/testRights.py | 86 + wsdl/Makefile | 49 + wsdl/apistub.py | 12 + wsdl/globals.py | 4 + wsdl/sfa2wsdl.py | 342 ++ xmlbuilder-0.9/LICENSE | 21 + xmlbuilder-0.9/MANIFEST.in | 2 + xmlbuilder-0.9/PKG-INFO | 80 + xmlbuilder-0.9/README.txt | 1 + xmlbuilder-0.9/setup.cfg | 5 + xmlbuilder-0.9/setup.py | 43 + xmlbuilder-0.9/xmlbuilder.egg-info/PKG-INFO | 80 + .../xmlbuilder.egg-info/SOURCES.txt | 13 + .../xmlbuilder.egg-info/dependency_links.txt | 1 + .../xmlbuilder.egg-info/top_level.txt | 1 + xmlbuilder-0.9/xmlbuilder/__init__.py | 153 + xmlbuilder-0.9/xmlbuilder/docs/long_descr.rst | 68 + xmlbuilder-0.9/xmlbuilder/tests/__init__.py | 99 + 317 files changed, 34735 insertions(+) create mode 100644 CHANGES-0.2-to-0.8.txt create mode 100644 INSTALL.txt create mode 100644 LICENSE.txt create mode 100644 Makefile create mode 100644 README.txt create mode 100644 TODO create mode 100644 config/aggregates.xml create mode 100644 config/default_config.xml create mode 100644 config/gen-sfa-cm-config.py create mode 100644 config/registries.xml create mode 100755 config/sfa-config-tty create mode 100644 config/sfa_component_config create mode 100644 config/sfi_config create mode 100644 docs/Geniwrapper_Design_Docu.html create mode 100644 docs/Makefile create mode 100644 docs/README create mode 100644 docs/geniwrapper.doc create mode 100644 docs/geniwrapper.pdf create mode 100644 docs/pythondoc-cert.html create mode 100644 docs/pythondoc-component.html create mode 100644 docs/pythondoc-config.html create mode 100644 docs/pythondoc-credential.html create mode 100644 docs/pythondoc-geniclient.html create mode 100644 docs/pythondoc-geniserver.html create mode 100644 docs/pythondoc-gid.html create mode 100644 docs/pythondoc-hierarchy.html create mode 100644 docs/pythondoc-import.html create mode 100644 docs/pythondoc-record.html create mode 100644 docs/pythondoc-registry.html create mode 100644 docs/pythondoc-rights.html create mode 100644 docs/sfa-2008-08-08.pdf create mode 100644 docs/sfa-2008-11-03.pdf create mode 100644 docs/sfa-impl-2009-04-07.pdf create mode 100644 docs/sfa-impl.doc create mode 100644 docs/sfa-impl.pdf create mode 100644 docs/sfa.doc create mode 100644 docs/sfa.pdf create mode 100755 keyconvert/keyconvert.py create mode 100755 keyconvert/test.sh create mode 100644 keyconvert/test.txt create mode 100644 keyconvert/test/openssh_dsa_1024 create mode 100644 keyconvert/test/openssh_dsa_1024.pub create mode 100644 keyconvert/test/openssh_dsa_2048 create mode 100644 keyconvert/test/openssh_dsa_2048.pub create mode 100644 keyconvert/test/openssh_dsa_512 create mode 100644 keyconvert/test/openssh_dsa_512.pub create mode 100644 keyconvert/test/openssh_rsa1_1024 create mode 100644 keyconvert/test/openssh_rsa1_1024.pub create mode 100644 keyconvert/test/openssh_rsa1_2048 create mode 100644 keyconvert/test/openssh_rsa1_2048.pub create mode 100644 keyconvert/test/openssh_rsa1_512 create mode 100644 keyconvert/test/openssh_rsa1_512.pub create mode 100644 keyconvert/test/openssh_rsa_1024 create mode 100644 keyconvert/test/openssh_rsa_1024.pub create mode 100644 keyconvert/test/openssh_rsa_2048 create mode 100644 keyconvert/test/openssh_rsa_2048.pub create mode 100644 keyconvert/test/openssh_rsa_512 create mode 100644 keyconvert/test/openssh_rsa_512.pub create mode 100755 keyconvert/testkey.sh create mode 100644 rspec/model/Registry.ecore create mode 100644 rspec/model/planetlab.ecore create mode 100644 rspec/model/planetlab.ecore_diagram create mode 100644 rspec/model/planetlab.genmodel create mode 100644 rspec/model/planetlab.xsd create mode 100644 rspec/sample_rspec.xml create mode 100755 setup.py create mode 100644 sfa.spec create mode 100644 sfa/Makefile create mode 100644 sfa/__init__.py create mode 100644 sfa/client/__init__.py create mode 100644 sfa/client/getNodes.py create mode 100755 sfa/client/getRecord.py create mode 100755 sfa/client/setRecord.py create mode 100644 sfa/client/sfadump.py create mode 100755 sfa/client/sfi.py create mode 100755 sfa/client/sfiAddAttribute.py create mode 100755 sfa/client/sfiAddSliver.py create mode 100755 sfa/client/sfiDeleteAttribute.py create mode 100755 sfa/client/sfiDeleteSliver.py create mode 100755 sfa/client/sfiListNodes.py create mode 100755 sfa/client/sfiListSlivers.py create mode 100644 sfa/cron.d/sfa.cron create mode 100755 sfa/init.d/sfa create mode 100755 sfa/init.d/sfa-cm create mode 100644 sfa/managers/__init__.py create mode 100644 sfa/managers/aggregate_manager_pl.py create mode 100644 sfa/managers/component_manager_default.py create mode 100644 sfa/managers/component_manager_pl.py create mode 100644 sfa/managers/eucalyptus/eucalyptus.rnc create mode 100644 sfa/managers/eucalyptus/eucalyptus.rng create mode 100644 sfa/managers/eucalyptus/eucalyptus.xml create mode 100644 sfa/managers/max/max.xml create mode 100644 sfa/managers/pl/pl.rnc create mode 100644 sfa/managers/pl/pl.rng create mode 100644 sfa/managers/pl/pl.xml create mode 100644 sfa/managers/registry_manager_pl.py create mode 100644 sfa/managers/slice_manager_pl.py create mode 100644 sfa/managers/vini/__init__.py create mode 100644 sfa/managers/vini/request.xml create mode 100755 sfa/managers/vini/topology.py create mode 100644 sfa/managers/vini/utils.py create mode 100644 sfa/managers/vini/vini.rnc create mode 100644 sfa/managers/vini/vini.rng create mode 100644 sfa/managers/vini/vini.xml create mode 100644 sfa/managers/vini/vini_network.py create mode 100644 sfa/methods/CreateSliver.py create mode 100644 sfa/methods/DeleteSliver.py create mode 100644 sfa/methods/GetCredential.py create mode 100644 sfa/methods/GetGids.py create mode 100644 sfa/methods/GetSelfCredential.py create mode 100644 sfa/methods/GetTicket.py create mode 100644 sfa/methods/GetVersion.py create mode 100644 sfa/methods/List.py create mode 100644 sfa/methods/ListResources.py create mode 100644 sfa/methods/ListSlices.py create mode 100644 sfa/methods/RedeemTicket.py create mode 100644 sfa/methods/Register.py create mode 100644 sfa/methods/RegisterPeerObject.py create mode 100644 sfa/methods/Remove.py create mode 100644 sfa/methods/RemovePeerObject.py create mode 100644 sfa/methods/RenewSliver.py create mode 100644 sfa/methods/Resolve.py create mode 100644 sfa/methods/ResolveGENI.py create mode 100644 sfa/methods/Shutdown.py create mode 100644 sfa/methods/SliverStatus.py create mode 100644 sfa/methods/Start.py create mode 100644 sfa/methods/Stop.py create mode 100644 sfa/methods/Update.py create mode 100644 sfa/methods/UpdateSliver.py create mode 100644 sfa/methods/__init__.py create mode 100644 sfa/methods/create_slice.py create mode 100644 sfa/methods/delete_slice.py create mode 100644 sfa/methods/get_aggregates.py create mode 100644 sfa/methods/get_credential.py create mode 100644 sfa/methods/get_gids.py create mode 100644 sfa/methods/get_key.py create mode 100644 sfa/methods/get_registries.py create mode 100644 sfa/methods/get_resources.py create mode 100644 sfa/methods/get_self_credential.py create mode 100644 sfa/methods/get_slices.py create mode 100644 sfa/methods/get_ticket.py create mode 100644 sfa/methods/get_trusted_certs.py create mode 100644 sfa/methods/list.py create mode 100644 sfa/methods/redeem_ticket.py create mode 100644 sfa/methods/register.py create mode 100644 sfa/methods/register_peer_object.py create mode 100644 sfa/methods/remove.py create mode 100644 sfa/methods/remove_peer_object.py create mode 100644 sfa/methods/reset_slice.py create mode 100644 sfa/methods/resolve.py create mode 100644 sfa/methods/start_slice.py create mode 100644 sfa/methods/stop_slice.py create mode 100644 sfa/methods/update.py create mode 100644 sfa/plc/__init__.py create mode 100644 sfa/plc/api-dev.py create mode 100644 sfa/plc/api.py create mode 100644 sfa/plc/network.py create mode 100644 sfa/plc/peers.py create mode 100644 sfa/plc/remoteshell.py create mode 100755 sfa/plc/sfa-import-plc.py create mode 100755 sfa/plc/sfa-nuke-plc.py create mode 100644 sfa/plc/sfaImport.py create mode 100644 sfa/plc/slices.py create mode 100644 sfa/rspecs/__init__.py create mode 100644 sfa/rspecs/aggregates/__init__.py create mode 100644 sfa/rspecs/aggregates/max.xml create mode 100755 sfa/rspecs/aggregates/openflow.xml create mode 100644 sfa/rspecs/aggregates/rspec_manager_max.py create mode 100755 sfa/rspecs/aggregates/rspec_manager_openflow.py create mode 100644 sfa/rspecs/aggregates/rspec_manager_pl.py create mode 100644 sfa/server/__init__.py create mode 100644 sfa/server/aggregate.py create mode 100644 sfa/server/component.py create mode 100644 sfa/server/interface.py create mode 100755 sfa/server/modpython/SfaAggregateModPython.py create mode 100755 sfa/server/modpython/SfaRegistryModPython.py create mode 100755 sfa/server/modpython/SfaSliceMgrModPython.py create mode 100644 sfa/server/modpython/sfa.aggregate.httpd.conf create mode 100644 sfa/server/modpython/sfa.registry.httpd.conf create mode 100644 sfa/server/modpython/sfa.slicemgr.httpd.conf create mode 100644 sfa/server/modpythonapi/ApiExceptionCodes.py create mode 100644 sfa/server/modpythonapi/ApiExceptions.py create mode 100755 sfa/server/modpythonapi/AuthenticatedApi.py create mode 100755 sfa/server/modpythonapi/AuthenticatedClient.py create mode 100755 sfa/server/modpythonapi/BaseApi.py create mode 100755 sfa/server/modpythonapi/BaseClient.py create mode 100755 sfa/server/modpythonapi/ModPython.py create mode 100755 sfa/server/modpythonapi/TestApi.py create mode 100755 sfa/server/modpythonapi/installTest.sh create mode 100755 sfa/server/modpythonapi/test.py create mode 100755 sfa/server/modpythonapi/test.sh create mode 100644 sfa/server/modpythonapi/testapi.conf create mode 100644 sfa/server/registry.py create mode 100755 sfa/server/sfa-ca.py create mode 100644 sfa/server/sfa-clean-peer-records.py create mode 100755 sfa/server/sfa-server.py create mode 100755 sfa/server/sfa_component_setup.py create mode 100644 sfa/server/slicemgr.py create mode 100644 sfa/trust/__init__.py create mode 100644 sfa/trust/auth.py create mode 100644 sfa/trust/certificate.py create mode 100644 sfa/trust/credential.py create mode 100644 sfa/trust/credential_legacy.py create mode 100644 sfa/trust/gid.py create mode 100644 sfa/trust/hierarchy.py create mode 100644 sfa/trust/rights.py create mode 100644 sfa/trust/trusted_certs/plc_ca.crt create mode 100644 sfa/trust/trusted_certs/ple_ca.crt create mode 100644 sfa/trust/trustedroot.py create mode 100644 sfa/util/PostgreSQL.py create mode 100644 sfa/util/__init__.py create mode 100644 sfa/util/api.py create mode 100644 sfa/util/cache.py create mode 100644 sfa/util/client.py create mode 100644 sfa/util/componentserver.py create mode 100644 sfa/util/config.py create mode 100644 sfa/util/debug.py create mode 100644 sfa/util/faults.py create mode 100644 sfa/util/filter.py create mode 100644 sfa/util/method.py create mode 100644 sfa/util/misc.py create mode 100644 sfa/util/namespace.py create mode 100644 sfa/util/nodemanager.py create mode 100644 sfa/util/parameter.py create mode 100644 sfa/util/policy.py create mode 100755 sfa/util/prefixTree.py create mode 100644 sfa/util/record.py create mode 100644 sfa/util/report.py create mode 100644 sfa/util/row.py create mode 100644 sfa/util/rspec.py create mode 100755 sfa/util/rspecHelper.py create mode 100644 sfa/util/server.py create mode 100644 sfa/util/sfalogging.py create mode 100644 sfa/util/sfatablesRuntime.py create mode 100644 sfa/util/sfaticket.py create mode 100644 sfa/util/soapprotocol.py create mode 100644 sfa/util/specdict.py create mode 100644 sfa/util/storage.py create mode 100644 sfa/util/table.py create mode 100755 sfa/util/threadmanager.py create mode 100644 sfa/util/xmlrpcprotocol.py create mode 100644 sfatables/README create mode 100644 sfatables/TO_CLEANUP create mode 100644 sfatables/__init__.py create mode 100644 sfatables/command.py create mode 100644 sfatables/commands/Add.py create mode 100644 sfatables/commands/Delete.py create mode 100644 sfatables/commands/Insert.py create mode 100644 sfatables/commands/List.py create mode 100644 sfatables/commands/SetDefault.py create mode 100644 sfatables/commands/__init__.py create mode 100644 sfatables/commands/moo.py create mode 100644 sfatables/globals.py create mode 100644 sfatables/matches/all.xml create mode 100644 sfatables/matches/hrn.xml create mode 100644 sfatables/matches/slice-whitelist.xml create mode 100644 sfatables/matches/slice.xml create mode 100644 sfatables/pretty.py create mode 100644 sfatables/processors/__sfatables_rule_wrap_up__.xsl create mode 100644 sfatables/processors/__sfatables_wrap_up__.xsl create mode 100644 sfatables/processors/accept.xsl create mode 100644 sfatables/processors/all.xsl create mode 100644 sfatables/processors/hrn.xsl create mode 100644 sfatables/processors/legacy-restrict-to-nodes.xsl create mode 100644 sfatables/processors/link/restrict_slice.xml create mode 100644 sfatables/processors/max_link_kbps.xsl create mode 100644 sfatables/processors/max_node_kbps.xsl create mode 100644 sfatables/processors/reject.xsl create mode 100644 sfatables/processors/restrict_to_flowspec.xsl create mode 100644 sfatables/processors/restrict_to_nodes.xsl create mode 100644 sfatables/processors/slice-hrn.xsl create mode 100644 sfatables/processors/slice-whitelist.xsl create mode 100644 sfatables/processors/test.xml create mode 100644 sfatables/runtime.py create mode 100755 sfatables/sfatables create mode 100644 sfatables/targets/ACCEPT.xml create mode 100644 sfatables/targets/REJECT.xml create mode 100644 sfatables/targets/RESTRICT_SLICE_DOMAIN.xml create mode 100644 sfatables/targets/RESTRICT_SLICE_PROP.xml create mode 100644 sfatables/test.rspec create mode 100644 sfatables/test.sfarspec create mode 100644 sfatables/vini.rspec create mode 100644 sfatables/xmlextension.py create mode 100644 sfatables/xmlrule.py create mode 100644 tests/client/README create mode 100644 tests/client/demoAggregate.sh create mode 100644 tests/client/testAggregate.py create mode 100644 tests/client/testSfi.sh create mode 100644 tests/client/testSfiDelegate.sh create mode 100644 tests/client/testSfiSliceRegister.sh create mode 100755 tests/testAll.py create mode 100755 tests/testCert.py create mode 100755 tests/testCred.py create mode 100755 tests/testGid.py create mode 100755 tests/testHierarchy.py create mode 100755 tests/testInterfaces.py create mode 100755 tests/testKeypair.py create mode 100755 tests/testMisc.py create mode 100755 tests/testRecord.py create mode 100755 tests/testRights.py create mode 100644 wsdl/Makefile create mode 100644 wsdl/apistub.py create mode 100644 wsdl/globals.py create mode 100755 wsdl/sfa2wsdl.py create mode 100644 xmlbuilder-0.9/LICENSE create mode 100644 xmlbuilder-0.9/MANIFEST.in create mode 100644 xmlbuilder-0.9/PKG-INFO create mode 100644 xmlbuilder-0.9/README.txt create mode 100644 xmlbuilder-0.9/setup.cfg create mode 100644 xmlbuilder-0.9/setup.py create mode 100644 xmlbuilder-0.9/xmlbuilder.egg-info/PKG-INFO create mode 100644 xmlbuilder-0.9/xmlbuilder.egg-info/SOURCES.txt create mode 100644 xmlbuilder-0.9/xmlbuilder.egg-info/dependency_links.txt create mode 100644 xmlbuilder-0.9/xmlbuilder.egg-info/top_level.txt create mode 100644 xmlbuilder-0.9/xmlbuilder/__init__.py create mode 100644 xmlbuilder-0.9/xmlbuilder/docs/long_descr.rst create mode 100644 xmlbuilder-0.9/xmlbuilder/tests/__init__.py diff --git a/CHANGES-0.2-to-0.8.txt b/CHANGES-0.2-to-0.8.txt new file mode 100644 index 00000000..00646320 --- /dev/null +++ b/CHANGES-0.2-to-0.8.txt @@ -0,0 +1,56 @@ +==================== +changes between 0.2 and 0.8 from a user's perspective +==================== + +-------------------- +- 3 packages named +-- sfa (libraries) +-- sfa-plc (server side) +-- sfa-client (client-side) + +-------------------- new names for commands +gimport.py -> sfa-import-plc.py +plc.py -> sfa-server.py +geni-config-tty -> sfa-config-tty + +-------------------- new names for config files & miscell +/etc/geni -> /etc/sfa +/etc/geni/configSfi.sh -> /etc/sfa/sfa_config +/etc/init.d/geniwrapper -> /etc/init.d/sfa + +/etc/sfa/config_sfa, +/etc/sfa/config_sfi, +/etc/sfa/aggregates.xml, +/etc/sfa/registries.xml + are now preserved across rpm updates + + +==================== +changes between 0.2 and 0.8 from a devel's perspective +==================== + +cmdline/ has moved to + sfa/client +first-class objects involved in the server side + sfa/server +plc-dependent code has moved to + sfa/plc +basic identification/authentication objects (up to credentials) have moved to + sfa/trust + (this also holds in trusted_roots the CA certs of PLC-PLE) +code for the methods have remained in + sfa/methods + +init.d instscript is now in + sfa/init.d + +config files and utilities are in + config/ + (should this move under sfa ?) + +-------------------- deprecated +gacks/ +gui/ +dummy/ + +some apparently test-related stuff formerly in cmdline hace moved to tests/client diff --git a/INSTALL.txt b/INSTALL.txt new file mode 100644 index 00000000..d748883f --- /dev/null +++ b/INSTALL.txt @@ -0,0 +1,146 @@ +This installation note assumes that you have installed and configured MyPLC in the usual manner, and you have set up your yum repo like for a MyPLC install. + +Once you have completed the server configuration, a brief introduction to the SFA user tools is here: + http://svn.planet-lab.org/wiki/SFAGuide + +----- +1) Install the SFA packages: + +# yum install sfa-plc sfa-client + +Note that the above command installs both sfa server (sfa-plc) and sfa client packages along with necessary dependency packages. Depending on the requirements, you may choose to install the appropriate one (server, client or both) for you. For e.g. to set up your own SFA server on top of your MyPLC, you need sfa-plc. On the other hand, if you plan to use an existing SFA server, you would typically need the sfa-client only. +------- +2) Note down the PLC_ROOT_USER, PLC_ROOT_PASSWORD, PLC_DB_USER and PLC_DB_PASSWORD of your MyPLC installation: + +# plc-config-tty +Enter command (u for usual changes, w to save, ? for help) s PLC_ROOT_USER +PLC_ROOT_USER = root@test.onelab.eu +Enter command (u for usual changes, w to save, ? for help) s PLC_ROOT_PASSWORD +PLC_ROOT_PASSWORD = test++ +Enter command (u for usual changes, w to save, ? for help) s PLC_DB_USER +PLC_DB_USER = pgsqluser +Enter command (u for usual changes, w to save, ? for help) s PLC_DB_PASSWORD +PLC_DB_PASSWORD = 4a333aba-a322-41b1-9c05-90b4f34d1332 + +These four configuration parameters are required for SFA server configuration +------- +3) Configure and start SFA servers: + +(a) # sfa-config-tty + + set SFA_PLC_USER to PLC_ROOT_USER + set SFA_PLC_PASSWORD to PLC_ROOT_PASSWORD + set SFA_PLC_DB_USER to PLC_DB_USER + set SFA_PLC_DB_PASSWORD to PLC_DB_PASSWORD +write and quit + +*NOTE* at this point you get a warning b/c the authorities hierarchy has not been created yet; ignore + +(b) # sfa-import-plc.py + +(o/p will look like this) +Import: creating top level authorities +Hierarchy: creating authority: plc +plc : +Import: creating table for authority plc +NOTICE: table "sfa$plc" does not exist, skipping + inserting authority record for plc +Import: adding plc to trusted list +Import_Site: importing site plc.internet2 +Hierarchy: creating authority: plc.internet2 + inserting authority record for plc.internet2 +Import_Site: importing site plc.pl +Hierarchy: creating authority: plc.pl + inserting authority record for plc.pl +Import: importing person plc.pl.root +Import: creating table for authority plc.pl +NOTICE: table "sfa$plc$pl" does not exist, skipping + +(c) run sfa-config-tty again and select q to come out of the config command +This will initialize /etc/sfa/authorities/server.key from /etc/sfa/authorities/plc/plc.pkey + +(d) # service sfa start +This will start Registry, Slice Manager and Aggregate Manager. Your ps command output would look like: + +# ps -ef | grep python +root 24944 1 0 May11 ? 00:00:00 /usr/bin/python /usr/bin/sfa-server.py -r -d +root 24957 1 0 May11 ? 00:00:00 /usr/bin/python /usr/bin/sfa-server.py -a -d +root 24970 1 0 May11 ? 00:00:00 /usr/bin/python /usr/bin/sfa-server.py -s -d +------- +4) Configure SFA client: + + (a) # mkdir ~/.sfi + (b)copy your private RSA key to ~/.sfi/username.pkey Replace username with your actual account name. NOTE: DSA KEYS WILL NOT WORK + (c) # cp /etc/sfa/sfi_config ~/.sfi/ + (d) edit ~/.sfi/sfi_config. A sample configuration looks like: + + SFI_AUTH='plc.pl' + SFI_USER='plc.pl.root' + SFI_REGISTRY='http://vplc25.inria.fr:12345/' + SFI_SM='http://vplc25.inria.fr:12347/' + +------ +5) Testing: + +At this stage you should be able to run sfi command. Some sample outputs are: + + (a) # sfi.py list plc.pl + plc.pl.netflow (slice) + plc.pl.sirius (slice) + plc.pl.root (user) + plc.pl.pif (node) + + (b) # sfi.py show plc.pl.pif + gid: + hrn: plc.pl.pif + uuid: 99878316891261700702442883738232624912 + hrn: plc.pl.pif + type: node + node_type: regular + hostname: pif.inria.fr + + (c) # sfi.py show plc.pl.root + gid: + hrn: plc.pl.root + uuid: 67306954103472941609600457537601239401 + hrn: plc.pl.root + type: user + last_name: Administrator + phone: None + key: plc.pl.root#user + first_name: Default + email: root@vplc25.inria.fr + + (d) # sfi.py slices + plc.pl.netflow + plc.pl.sirius + + (e) # sfi.py resources + + +------ + +6) Federation configuration: + +(a) Follow the same procedure to install and configure second MyPLC with SFA server. +(b) On each PLC, edit the /etc/sfa/registries.xml file + + set addr to ip or hostname of federated (remote) peer + set port to sfa service port on federated (remote) peer + set hrn to human readable name of federated (remote) peer interface +Sample configuration: + + + + + +(c) Likewise, edit the /etc/sfa/aggregates.xml +Sampel configuration + + + + + +(d) trade trusted root gid's (seen on /etc/sfa/trusted_roots) +we have to copy the gid of first SFA server to the /etc/sfa/trusted_roots directory of second one and vice-versa. + diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..08f6d5d3 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,20 @@ +Copyright (c) 2008 Board of Trustees, Princeton University + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and/or hardware specification (the “Work”) to +deal in the Work without restriction, including without limitation the +rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Work, and to permit persons to whom the Work +is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Work. + +THE WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE WORK OR THE USE OR OTHER DEALINGS +IN THE WORK. diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..a1bd00a1 --- /dev/null +++ b/Makefile @@ -0,0 +1,94 @@ +# +## (Re)builds Python metafile (__init__.py) and documentation +# +# overwritten by the specfile +DESTDIR="/" + +########## +all: python wsdl + +install: python-install wsdl-install xmlbuilder-install + +clean: python-clean wsdl-clean + +uninstall: python-uninstall + +.PHONY: all install clean + +########## +python: + +xmlbuilder-install: + cd xmlbuilder-0.9 && python setup.py install --root=$(DESTDIR) && cd - + +python-install: + python setup.py install --root=$(DESTDIR) + chmod 444 $(DESTDIR)/etc/sfa/default_config.xml + +python-clean: + python setup.py clean + rm $(init) + +.PHONY: python python-install python-clean xmlbuilder-install +########## +wsdl: + $(MAKE) -C wsdl + +# propagate DESTDIR from the specfile +wsdl-install: + $(MAKE) -C wsdl install + +wsdl-clean: + $(MAKE) -C wsdl clean + +.PHONY: wsdl wsdl-install wsdl-clean +########## + +# are the .java files used ? +tags: + find . -type f | egrep -v '/\.svn/|TAGS|\.py[co]$$|\.doc$$|\.html$$|\.pdf$$' | xargs etags +.PHONY: tags + + +########## sync +# 2 forms are supported +# (*) if your plc root context has direct ssh access: +# make sync PLC=private.one-lab.org +# (*) otherwise, entering through the root context +# make sync PLCHOST=testbox1.inria.fr GUEST=vplc03.inria.fr + +ifdef GUEST +ifdef PLCHOST +SSHURL:=root@$(PLCHOST):/vservers/$(GUEST) +SSHCOMMAND:=ssh root@$(PLCHOST) vserver $(GUEST) +endif +endif +ifdef PLC +SSHURL:=root@$(PLC):/ +SSHCOMMAND:=ssh root@$(PLC) +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) + +BINS = ./config/sfa-config-tty ./config/gen-sfa-cm-config.py \ + ./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/sfadump.py + +sync: +ifeq (,$(SSHURL)) + @echo "sync: You must define, either PLC, or PLCHOST & GUEST, on the command line" + @echo " e.g. make sync PLC=private.one-lab.org" + @echo " or make sync PLCHOST=testbox1.inria.fr GUEST=vplc03.inria.fr" + @exit 1 +else + +$(RSYNC) ./sfa/ $(SSHURL)/usr/lib/python2.5/site-packages/sfa/ + +$(RSYNC) $(BINS) $(SSHURL)/usr/bin + $(SSHCOMMAND) exec service sfa restart +endif + +.PHONY: sync +########## diff --git a/README.txt b/README.txt new file mode 100644 index 00000000..42255d4a --- /dev/null +++ b/README.txt @@ -0,0 +1,7 @@ +This module (sfa) is installed as part of MyPLC, available as +part of the PlanetLab development effort. For more information on +accessing, installing, developing and deploying PlanetLab software, +visit http://svn.planet-lab.org. + +For a brief introduction to the SFA user tools, please visit: + http://svn.planet-lab.org/wiki/SFAGuide diff --git a/TODO b/TODO new file mode 100644 index 00000000..b5628f47 --- /dev/null +++ b/TODO @@ -0,0 +1,41 @@ +- Build/Tags +* test rpm build/install + +- Stop invalid users +* a recently disabled/deleted user may still have a valid cred. Keep a list of valid/invalid users on the aggregate and check callers against this list + +- NM Plugin + * install the slice and node gid when the slice is created (create NM plugin to execute sfa_component_setup.py ?) + * test + +- Component manager + * install trusted certs when interface starts (component_manager_pl.init_server()) + * Redeem ticket - RedeemTicket/AdminTicket not working. Why? + ** This may be replaced by sfa + credentials + +- Registry +* fix legacy credential support +* move db tables into db with less overhead (tokyocabinet?) + +- GUI/Auth Service + * develop a simple service where users auth using username/passord and + receive their cred + * service manages users key/cert,creds + * gui requires user's cred (depends on Auth Service above) + +- Protogeni +* agree on standard set of privs +* on permission error, return priv needed to make call +* cache slice resource states (if aggregate goes down, how do we know what + slices were on it and recreate them? do we make some sort of transaction log) + +Questions +========= +- SM/Aggregate +* should the rspec contain only the resources a slice is using or all resources availa and mark what the slice is using. + +- Initscripts on sfa / geniwrapper +* should sfa have native initscript support or should we piggyback off of myplc? +* should this be in the rspec + + diff --git a/config/aggregates.xml b/config/aggregates.xml new file mode 100644 index 00000000..4630736c --- /dev/null +++ b/config/aggregates.xml @@ -0,0 +1,3 @@ + + + diff --git a/config/default_config.xml b/config/default_config.xml new file mode 100644 index 00000000..cfe76c24 --- /dev/null +++ b/config/default_config.xml @@ -0,0 +1,260 @@ + + + + + + + + + + + + General + Basic system variables. + + + + Human readable name + plc + The human readable name for this interface. + + + + Debug + false + Flag to turn debug on. + + + + + + + + Registry + The settings that affect the registry that will run + as part of this SFA instance. + + + + Enable Registry + true + Allows this local SFA instance to run as a + registry. + + + + Registry type + pl + The type of backend server for this + registry. Some registries may not be myplc. + + + + Hostname + localhost + The hostname where the registry is expected to + be found; using localhost when the local registry is enabled + seems reasonable. + + + + Port number + 12345 + The port where the registry is to be found. + + + + Root Authority + plc + The hrn of the registry's root auth. + + + + + + + + Aggregate + The settings that affect the aggregate manager that will run + as part of this SFA instance. + + + + Enable Aggregate + true + Allows this local SFA instance to run as an + aggregate manager. + + + + Aggregate type + pl + The type of backend server for this + aggregate. Some aggregates may not be myplc. + + + + RSpec Schema + /etc/sfa/pl.rng + The path to the default schema + + + + Hostname + localhost + The hostname where the aggregate is expected to + be found. + + + + Port number + 12346 + The port where the aggregate is to be found. + + + + + + + GENI Aggregate + The settings that affect the geni aggregate manager that will run + as part of this SFA instance. + + + + Enable GENI Aggregate + true + Allows this local SFA instance to run as an + GENI aggregate manager. + + + + GENI Aggregate type + pl + The type of backend server for this + aggregate. Some aggregates may not be myplc. + + + + Hostname + localhost + The hostname where the aggregate is expected to + be found. + + + + Port number + 12348 + The port where the aggregate is to be found. + + + + + + + + Slice Manager + The settings that affect the slice manager that will run + as part of this SFA instance. + + + + Enable Slice Manager + true + Allows this local SFA instance to run as a + slice manager. + + + + Slice Manager type + pl + The type of backend server for this + slice manager. Not all slice managers are myplc. + + + + Hostname + localhost + The hostname where the slice manager is expected to + be found. + + + + Port number + 12347 + The port where the slice manager is to be found. + + + + + + + + The settings that tell this SFA instance how to interact with the underlying PLC. Refer to plc-config-tty on this installation for more information. + + + + PLC login name for an admin user; SFA will carry on operations under this account. + root@localhost.localdomain + + + + + Password + root + The PLC password for SFA_PLC_USER. + + + + URL + https://localhost:443/PLCAPI/ + Full URL of PLC interface. + + + + Database name + planetlab5 + Planetlab database name. + + + + Datbase host + localhost + The host where the PLC database can be reached. + + + + Database port + 5432 + The port where the PLC database can be reached. + + + + Database user + pgsqluser + + + + + Database password + + The password for PLC_DB_USER. + + + + + + + + + + + + diff --git a/config/gen-sfa-cm-config.py b/config/gen-sfa-cm-config.py new file mode 100644 index 00000000..f8a0f70f --- /dev/null +++ b/config/gen-sfa-cm-config.py @@ -0,0 +1,58 @@ +#!/usr/bin/python +import os +import sys +import socket +sys.path.append('/usr/share/plc_api') +from sfa.util.config import Config as SfaConfig +from PLC.Config import Config as PlcConfig + +sfa_config = SfaConfig() +plc_config = PlcConfig() +default_host = socket.gethostbyname(socket.gethostname()) +all_vars = ['SFA_CONFIG_DIR', 'SFA_DATA_DIR', 'SFA_INTERFACE_HRN', + 'SFA_CM_SLICE_PREFIX', 'SFA_REGISTRY_HOST', 'SFA_REGISTRY_PORT', + 'SFA_AGGREGATE_HOST', 'SFA_AGGREGATE_PORT', + 'SFA_SM_HOST', 'SFA_SM_PORT', + 'SFA_CM_ENABLED', 'SFA_CM_HOST', 'SFA_CM_PORT', 'SFA_CM_TYPE', 'SFA_CM_SLICE_PREFIX', + 'SFA_API_DEBUG'] + +defaults = { + 'SFA_CM_ENABLED': '1', + 'SFA_CM_HOST': 'localhost', + 'SFA_CM_PORT': '12346', + 'SFA_CM_SLICE_PREFIX': plc_config.PLC_SLICE_PREFIX, + 'SFA_CM_TYPE': 'pl', + 'SFA_API_DEBUG': '0' + } + +host_defaults = { + 'SFA_REGISTRY_HOST': default_host, + 'SFA_AGGREGATE_HOST': default_host, + 'SFA_SM_HOST': default_host, + } + +const_dict = {} +for key in all_vars: + value = "" + + + if key in defaults: + value = defaults[key] + elif hasattr(sfa_config, key): + value = getattr(sfa_config, key) + # sfa_config may specify localhost instead of a resolvalbe host or ip + # if so replace this with the host's address + if key in host_defaults and value in ['localhost', '127.0.0.1']: + value = host_defaults[key] + const_dict[key] = value + +filename = sfa_config.config_path + os.sep + 'sfa_component_config' +conffile = open(filename, 'w') +format='%s="%s"\n' + +for var in all_vars: + conffile.write(format % (var, const_dict[var])) + +conffile.close() + + diff --git a/config/registries.xml b/config/registries.xml new file mode 100644 index 00000000..79967814 --- /dev/null +++ b/config/registries.xml @@ -0,0 +1,3 @@ + + + diff --git a/config/sfa-config-tty b/config/sfa-config-tty new file mode 100755 index 00000000..9b2c439e --- /dev/null +++ b/config/sfa-config-tty @@ -0,0 +1,41 @@ +#!/bin/env python + +import sys +import readline +import plc_config + +def validator(validated_variables): + pass +# maint_user = validated_variables["PLC_API_MAINTENANCE_USER"] +# root_user = validated_variables["PLC_ROOT_USER"] +# if maint_user == root_user: +# errStr="PLC_API_MAINTENANCE_USER=%s cannot be the same as PLC_ROOT_USER=%s"%(maint_user,root_user) +# raise plc_config.ConfigurationException(errStr) + +usual_variables = [ + "SFA_INTERFACE_HRN", + "SFA_REGISTRY_ROOT_AUTH", + "SFA_REGISTRY_HOST", + "SFA_AGGREGATE_HOST", + "SFA_SM_HOST", + "SFA_PLC_USER", + "SFA_PLC_PASSWORD", + "SFA_PLC_DB_HOST", + "SFA_PLC_DB_USER", + "SFA_PLC_DB_PASSWORD", + "SFA_PLC_URL", + ] + +configuration={ \ + 'name':'sfa', + 'service':"sfa", + 'usual_variables':usual_variables, + 'config_dir':"/etc/sfa", + 'validate_variables':{}, + 'validator':validator, + } + +if __name__ == '__main__': + command=sys.argv[0] + argv = sys.argv[1:] + plc_config.main(command,argv,configuration) diff --git a/config/sfa_component_config b/config/sfa_component_config new file mode 100644 index 00000000..137405eb --- /dev/null +++ b/config/sfa_component_config @@ -0,0 +1,116 @@ +# SFA Config file for the Component Manager +# + +# HRN +# Human readable name for this interface +SFA_INTERFACE_HRN="plc" + +# API Debug +# Are we logging +SFA_API_DEBUG=1 + +## ============================================================ +# Registry Configuration +# +# Enabled +# Enable the registry interface +SFA_REGISTRY_ENABLED=0 + +# +# The type of backend server for this registry +# Some registries may not be myplc +SFA_REGISTRY_TYPE='pl' + +# Root Auth +# The hrn of the registry's root auth +SFA_REGISTRY_ROOT_AUTH="plc" + +# Level1 Auth +# The hrn of the registry's level1 auth (sub authority) +# The full name of this interface (only secify if this +# interface is a sub authority) +# xxx could be determined from hrn above +SFA_REGISTRY_LEVEL1_AUTH="" + +# Hostname +# The fully qualified hostname of the registry server +SFA_REGISTRY_HOST="localhost" + +# Port +# SFA registry port +SFA_REGISTRY_PORT=12345 + +## ============================================================== +## Aggregate Configuration +## +## Enable aggregate inteface +## Enable the aggregate inteface. +SFA_AGGREGATE_ENABLED=0 + +# Aggregate Type +# +# The type of backend server for this aggregate +# Some aggregates may not be myplc +SFA_AGGREGATE_TYPE='pl' + +# +# +## Hostname +## The fully qualified hostname of the aggregate server +SFA_AGGREGATE_HOST="localhost" +# +## Port +## SFA aggregate server port +SFA_AGGREGATE_PORT=12346 + +## ============================================================== +# Slice Manager Configuration +# +# Enabled +# Enable the slice manager +SFA_SM_ENABLED=0 + +# Slice Manager type +# +## The type of backend server for this slice manager +## The slice manager doesnt rely on a specific backend server so +## you probably will never need to change this type unless you +## need to reimplement the slice manager +SFA_SM_TYPE='pl' + +# Host +## The fully qualified hostname or IP address of the slice manager server +SFA_SM_HOST="localhost" + +# Port +# SFA slice manager server port +SFA_SM_PORT=12347 + +## =============================================================== +# Component Manager Configuration +# +# Enabled +## Enable the slice manager +SFA_CM_ENABLED=1 + +# Component Manager type +# +# The type of backend server for this component manager +SFA_CM_TYPE='pl' +# +# Host +## The fully qualified hostname or IP address of the slice manager server +SFA_CM_HOST="localhost" +# +# Port +# SFA slice manager server port +SFA_CM_PORT=12346 + + +# Directory internal data gets stored +# using /etc/sfa until gec5 but /var/lib/sfa would be a more reasonable choice +SFA_CONFIG_DIR="/etc/sfa" + +# Directory internal data gets stored +SFA_DATA_DIR="/var/lib/sfa" + diff --git a/config/sfi_config b/config/sfi_config new file mode 100644 index 00000000..3314790a --- /dev/null +++ b/config/sfi_config @@ -0,0 +1,24 @@ +# user-level configuration for sfi + +### hrn of your authority +# For instance, the hrn of a user at the Princeton site on PlanetLab (PLC) +# would be plc.princeton. Likewise if the user was part of the NYU site, the HRN +# would be plc.nyu +SFI_AUTH='plc.princeton' + +### your user hrn +# This is your authority. +SFI_USER='plc.princeton.faiyaza' +# + +### where to find the registry +SFI_REGISTRY='http://www.planet-lab.org:12345/' + +# where to find the slice manager +SFI_SM='http://www.planet-lab.org:12347/' + +# where to find the geni aggregate manager +# XX this should be handled by the slice manger +# XX but we cant support it until the geni_am and sfa +# XX interfaces has been unified +SFI_GENI_AM='http://www.planet-lab.org:12348' diff --git a/docs/Geniwrapper_Design_Docu.html b/docs/Geniwrapper_Design_Docu.html new file mode 100644 index 00000000..8e8eefed --- /dev/null +++ b/docs/Geniwrapper_Design_Docu.html @@ -0,0 +1,1890 @@ + + + + + + + + + + + + + + + + + + + + + +
+
+ Geniwrapper Design Document +
+
+
+   +
+
+ 1.0 High Level Overview +
+
+   +
+
+ The purpose of Geniwrapper is to provide a Geni-like interface around the + existing planetlab infrastructure. The existing infrastructure consists of two + parts: planetlab central (PLC) and planetlab nodes. Geni defines three + interfaces: Registry, Slice, and Component Management.  A part of the wrapper is co-located with PLC (it exports the Registry and Slice interfaces), + and a part of the wrapper is co-located with each node (it exports the Slice + and Management interfaces). +
+
+   +
+
+ Geniwrapper is comprised of the following logical modules: utility + classesplc wrapper, component wrapper, and command + line client. Client-server communication uses a variant of XML-RPC called + the Geni protocol. Section 1 of this document presents a very brief + overview of each module. In-depth discussion occurs later. +
+
+   +
+
+ Much of this design adheres to the SFA, and as such this document avoids + duplication of the information already presented in the SFA. For example, the + description of privileges, which operations are allowed by a specific + privileges, and how privileges are assigned to principals is described fully + in the SFA and is therefore not duplicated here. +
+
+   +
+
+ NOTE: API documentation is extracted from code comments automatically + and is maintained in separate files, one documentation file corresponding to + each python source file. An effort has been made to keep API documentation + separate from this document, so that the API documentation may be + self-maintaining as the code is updated. +
+
+   +
+
+ Geniwrapper is checked into a subversion repository at + http://svn.planetlab.org/geniwrapper. + [TODO: verify link] +
+
+   +
+
+
+ 1.1 Utility classes +
+
+   +
+
+ Utility classes include python classes that implement certificates, GIDs, + credentials, and tickets. There are also utility classes for implementing + the server and client stubs and the security protocol. The utility modules + are designed to be generally re-usable. For example, the credential + management class may be used as part of the Geni Registry, Geni Components, + and the end-user tools that interact with Geni. +
+
+   +
+
+ The utility classes are located in the + util subdirectory. +
+
+
+   +
+
+ 1.2 PLC wrapper +
+
+   +
+
+ The plc wrapper is intended to be colocated with PLC. All communication + between the plc wrapper and PLC uses the PLCAPI interface and as such, + the plc wrapper can be run on a separate machine for ease of development. + In addition to the Geni registry operations (register, update, ...), + the plc wrapper also implements slice operations, such as GetTicket. +
+
+   +
+
+ The plc wrapper is located in the plc subdirectory. +
+
+   +
+
+ TODO: Most of the slice interface is yet to be implemented in plc wrapper. +
+
+   +
+
+ 1.3 The component wrapper +
+
+   +
+
+ The component wrapper is located on planetlab nodes. It implements + the slice interface, and the component management interface. Due to SFA + engineering decisions, some slice operations (i.e. GetTicket) are + not supported in the component wrapper. +
+
+   +
+
+ The component wrapper is located in the component subdirectory. +
+
+   +
+
+ 1.4 Command line client +
+
+   +
+
+ The command line client exports a client interface to Geni that may be used + for testing and demonstration purposes. It allows easy invocation of Geni api + functions and dumps the results in a human-readable format. +
+
+   +
+
+ The command line client is located in the cmdline + subdirectory +
+
+   +
+
+ 1.5 Geni Protocol +
+
+   +
+
+ The Geni protocol is based on XML-RPC. It is implemented primarily in the + geniserver.py and geniclient.py files located with the utility classes. + Modifications to the XML-RPC protocol include the following: +
+
+   +
+
    +
  1. + The transport mechanism uses HTTPS instead of HTTP. +
  2. +
  3. + HTTPS certificate verification is disabled so that custom Geni verification + based on GID can be done instead. +
  4. +
  5. + When an exception occurs on the server, verbose exception information is + sent to the client, to assist debugging efforts +
  6. +
+
+   +
+
+ Authentication: +
+
+   +
+
+ Authentication of the client by the server is done by using Credentials/GIDs. + Generally, each operation contains a credential as the first argument. This + credential includes the GID of the caller, which in turn contains the public + key of the caller. The server ensures that this public key matches the public + key that is being used to decrypt the HTTPS connection, thus ensuring the + caller must posess the private key that corresponds to the GID. +
+
+   +
+
+ Authentication of the server by the client is left as an exercise for the + client. It may be done easily by specifying the server's public key when the + client create the HTTPS connection. This presumes the client knows the public + key (or GID) of the server he is trying to connect to. +
+
+  
+ 1.6 Extending Geniwrapper to other environments
+
+ The PLC Wrapper and Component Wrapper are implemented to work on top of the + Planetlab environment, but Geniwrapper was designed specifically to be easy to + port to other platforms or environments. The utility classes are generally + planetlab-independent, and the planetlab specific code is located in the + directories that house the PLC and Component wrappers. The utility classes + implement most of the complexity of the Geni wrapper, allowing the PLC and + Component wrappers to be relatively lightweight.
+
+ For example, looking at the code for the stop_slice function implemented in + the component wrapper:
+
+     def stop_slice(self, cred_str):
+         + self.decode_authentication(cred_str, "stopslice")
+         slicename = + hrn_to_pl_slicename(self.object_gid.get_hrn())
+         print "stopslice:", slicename
+         accounts.get(slicename).stop()
+
+ The hrn_to_pl_slicename() function and accounts() class are planetlab-specific + and implement the actual stopping of the slice. The remaining code that + implements the Geni protocol, decodes credentials and authentication, etc., is + planetlab-independent, and could be easily used in a non-planetlab + environment.
+
+
+
+ 2.0 Utility Classes +
+
+   +
+
+ 2.1 Certificates and Keys (cert.py) +
+
+   +
+
+ Geniwrapper uses two crypto libraries: pyOpenSSL and M2Crypto to implement the + necessary crypto functionality. Ideally just one of these libraries would be + used, but unfortunately each of these libraries is independently lacking. The + pyOpenSSL library is missing many necessary functions, and the M2Crypto + library has crashed inside of some of the functions. The design decision is to + use pyOpenSSL whenever possible as it seems more stable, and only use M2Crypto + for those functions that are not possible in pyOpenSSL. +
+
+   +
+
+ 2.1.1 Keys +
+
+   +
+
+ Public-private key pairs are implemented by the Keypair class. A + Keypair object may represent both a public and private key pair, or it may + represent only a public key (this usage is consistent with OpenSSL). +
+

+      +

+
+ 2.1.2 Certificates +
+
+   +
+
+ The certificate class implements a general purpose X509 certificate, making + use of the appropriate pyOpenSSL or M2Crypto abstractions. It also adds + several addition features, such as the ability to maintain a chain of parent + certificates, and storage of application-specific data. +
+
+   +
+
+ Certificates include the ability to maintain a chain of parents. Each + certificate includes a pointer to it's parent certificate. When loaded from a + file or a string, the parent chain will be automatically loaded. When saving a + certificate to a file or a string, the caller can choose whether to save the + parent certificates as well. +
+
+   +
+
+ Example creation of a certificate: +
+
+   +
+
+       # create a key for an issuer
+       issuerKey = Keypair(create=True)
+       issuerSubject = "testissuer" +
+
+   +
+
+       # create a key for the certificate +
+
+       userKey = KeyPair(create=True) +
+
+   +
+
+       # create the certificate, set the issuer, and + sign it +
+
+       cert = Certificate(subject="test")
+       cert.set_issuer(issuerKey, issuerSubject) +
+
+       cert.set_pubkey(userKey)
+       cert.sign() +
+
+   +
+
+ 2.1.3 Certificate Verification +
+
+   +
+
+

+ Verification examines a chain of certificates to ensure that each parent + signs the child, and that some certificate in the chain is signed by a + trusted certificate. Verification is a basic recursion: +

+
    if this_certificate was signed by trusted_certs:
return
else
return verify_chain(parent, trusted_certs)
+
+
+ At each recursion, the parent is tested to ensure that it did sign the child. + If a parent did not sign a child, then an exception is thrown. If the bottom + of the recursion is reached and the certificate does not match a trusted root, + then an exception is thrown. +
+
+      
+ 2.2 GIDS (gid.py) +
+
+   +
+
+ GIDs are a derivative class of certificates and as such the GID class + inherits all the methods of the certificate class. A GID includes a tuple + of the following fields:  +
+
+   +
+
+    (uuid, hrn, public_key) +
+
+   +
+
+ UUID is a unique identifier and is created by the python uuid module (or the + utility function create_uuid() in gid.py). +
+
+   +
+
+ HRN is a human readable name. It is a dotted form similar to a backward domain + name. For example, planetlab.us.arizona.bakers. +
+
+   +
+
+ PUBLIC_KEY is the public key of the principal identified by the UUID/HRN. It + is a Keypair object as defined in the cert.py module. +
+
+   +
+
+ It is expected that there is a one-to-one pairing between UUIDs and HRN, but + it is uncertain how this would be inforced or if it needs to be enforced. +
+
+   +
+
+ 2.2.1 Encoding and Decoding +
+
+   +
+
+ The 5 fields of the GID tuple are stored in the subject-alt-name field of + the X509 certificate. Two routines are included to package and unpackage these + fields: Encode() and Decode(). Encode should be called prior to signing the + GID. Decode is automatically called on demand by the various get_*() + functions. +
+
+   +
+
+ 2.2.2 Verification of GIDs +
+
+   +
+Verification first performs the checks of the certificate class (verifying that +each parent signs the child, etc). In addition, GIDs also confirm that the +parent's HRN is a prefix of the child's HRN. Verifying these prefixes prevents a +rogue authority from signing a GID for a principal that is not a member of that +authority. For example, planetlab.us.arizona cannot sign a GID for +planetlab.us.princeton.foo. +
+   +
+
+ 2.3 Credentials (credential.py) +
+
+   +
+
+ Credentials are a derivative class of certificates and as such the credential + class inherits all the methods of the certificate class. A credential includes + a tuple of the following fields: +
+
+   +
+
+     (GIDCaller, GIDObject, LifeTime, Privileges, Delegate) +
+
+   +
+
+ GIDCaller identifies the holder of the credential. When a credential is + presented to a component, the security layer ensures that the client matches + the public key that is contained in GIDCaller. +
+
+   +
+
+ GIDObject identifies the object of the credential. This object depends upon + the type of the credential. For example, the credential for a user likely has + GIDObject == GIDCaller. Credentials for slices would include the GID of the + slice in the GIDObject field. Credentials for authorities include the GID of + the authority in the GIDObject field. +
+
+   +
+
+ LifeTime is the lifetime of the credential. Currently not implemented; expect + to implement it as an expiration date, and refuse credentials beyond that + date. +
+
+   +
+
+ Privileges is a Rights object that describes the rights that are granted to + the holder of the credential. +
+
+   +
+
+ Delegate is a True/False bit that indicates whether or not a credential can be + delegated to a different caller. +
+
+   +
+
+ 2.3.1 Encoding and Decoding +
+
+   +
+
+ The 5 fields of the credential tuple are stored in the subject-alt-name field + of the X509 certificate. Two routines are included to package and unpackage + these fields: Encode() and Decode(). Encode should be called prior to signing + the credential. Decode is automatically called on demand by the various + get_*() functions. +
+
+   +
+
+ 2.3.2 Verification of Credentials +
+
+   +
+
+ In addition to the checks for ordinary certificates, verification of + credentials also ensures that the delegate bit was set by each parent in the + chain. If a delegate bit was not set, then an exception is thrown. Each + credential must also contain a subset of the rights of the parent credential + (i.e. a user credential cannot delegate authority rights).
+
+ 2.4 Rights (rights.py)
+
+
Rights are implemented by two classes:
+
+ Right - represents a single right
+ RightList - represents a list of rights A right may allow several different + operations.
+
+ For example, the "info" right allows "listslices", "listcomponentresources", + etc.
+
+ 2.5 Records (record.py)
+
+
+   +
+
+ The GeniRecord class implements a Geni Record. The GeniRecord class implements + an abstract interface for the record, so that a client may use records without + having to understant the underlying implementation details, such as whether + the record is realized in the registry database, a local cache, or has been + transmitted over the wire by an interface. A GeniRecord is a tuple (Name, GID, + Type, Info). +
+
+   +
+
+   Name specifies the HRN of the object GID is the GID of the object +
+
+   +
+
+   Type is user | sa | ma | slice | component Info is comprised of the + following sub-fields +
+
+   +
+
+   Pointer is a pointer to the record in the PL database +
+
+   +
+
+   pl_info is planetlab-specific info (when talking to client) +
+
+   +
+
+   geni_info = geni-specific info (when talking to client) +
+
+   +
+
+ The pointer is interpreted depending on the type of the record. For example, + if the type=="user", then pointer is assumed to be a person_id that indexes + into the persons table. +
+
+   +
+
+ A given HRN may have more than one record, provided that the records are of + different types. For example, planetlab.us.arizona may have both an SA and a + MA record, but cannot have two SA records. +
+
+   +
+
+ 2.6 Tickets (geniticket.py) +
+
+   +
+
+ Similar to GIDs and Credentials, tickets also leverage the certificate object. +
+
+   +
+
+ A Ticket is tuple:
+    (gidCaller, gidObject, attributes, rspec, delegate)
+
+     gidCaller = GID of the caller performing the operation
+     gidObject = GID of the slice
+     attributes = slice attributes (keys, vref, instantiation, + etc)
+     rspec = resources +
+
+   +
+
+ Tickets are created by invoking GetTicket() on the plc wrapper. The slice + attributes and rspec are taken from the planetlab slice database and represent + the current state of the slice. As of yet, tickets do not include any concept + of time -- a ticket represents the state of the slice at the current time + only. +
+
+   +
+
+ Tickets are redeemed by invoking RedeemTicket() on the slice interface. The + attributes and spec are combined back into a planetlab slice record and handed + off to the node manager. +
+
+   +
+
+ Tickets are signed by an authority and include parentage information that + traces the chain of authorities back to a trusted root. +
+
+   +
+
+ 2.6.1 rspecs +
+
+   +
+
+ The rspec is currently a dictionary of {name: value} pairs. These pairs are + taken verbatim from the planetlab slice database. +
+
+   +
+
+ The general rule that is used is that things in the slice record that do not + specifically imply a tangible resource (initscripts, keys, etc) are treated as + attributes and things that do specify a tangible resource (disk, network, etc) + are treated as the rspec. +
+
+   +
+
+ TODO: The definition of an rspec is evolving. It remains to reconcile the + eclipse schema with Geniwrapper. Gacks is also using another rspec format, + which may be need to be reconciled with the eclipse schema and/or geniwrapper. +
+
+   +
+
+
+ 2.6.2 Encoding and Decoding +
+
+   +
+
+ The 5 fields of the credential tuple are stored in the subject-alt-name + field of the X509 certificate. Two routines are included to package and + unpackage these fields: Encode() and Decode(). Encode should be called prior + to signing the ticket. Decode is automatically called on demand by the + various get_*() functions. +
+
+   +
+
+ 2.6.3 Verification of Tickets +
+
+   +
+
+ Verification uses the standard parentage verification provided by the + certificate class. Specifically, each certificate is signed by a parent, and + some certificate must resolve to the trusted root set that is specified on + the component. +
+
+   +
+
+ Unlike credentials and GIDs, the parent of a ticket may be a degenerate + ticket that does not include the full 5-tuple (caller, object, attributes, + rspec, delegate). In such a case, the parent is just a placeholder in the + chain of authority used to convey the parentage information. +
+
+   +
+
+ Delegation of tickets is not something that is discussed in the SFA, but it + is supported in the ticket class and may be a useful feature. For example, + Alice may hold a ticket for a particular component, and delegate that ticket + to Bob. Bob could then instantiate a slice for Alice. This may be one way to + implement a slice manager.
+
+ 2.7 Hierarchy of Authorities (hierarchy.py)
+
+ This module implements a hierarchy of authorities and performs a similar + function as the "tree" module of the original geniwrapper prototype. An HRN + is assumed to be a string of authorities separated by dots. For example, + "planetlab.us.arizona.bakers". Each component of the HRN is a different + authority, with the last component being a leaf in the tree. Each authority + is stored in a subdirectory on the registry.
+
+ Inside this subdirectory are several files:
+ *.GID - GID file
+ *.PKEY - private key file
+ *.DBINFO - database info
+
+ The hierarchy class can be used to create GIDs, Credentials, and Tickets for + a given authority. +
+
+
+   +
+
+ The default behavior is that all authorities contained in the hierarchy will + be located together in a single physical registry. However, this is not + strictly necessary. The *.DBINFO files contain the database information for an + authority and can easily be configured to point to other machines. How an + authority would cause the DBINFO files to be installed in the correct places + is left as a separate exercise, possibly via an out-of-band management + interface or a web page. +
+
+
+ 2.8 Configuration Information (config.py)
+
+ This module holds configuration parameters for geniwrapper. There are two main + pieces of information that are used: the database connection and the PLCAPI + connection.
+
+ Geniwrapper uses a MYSQL database to store records. This database may be + co-located with the PLC database, or it may be a separate database. The + following parameters define the connection to the database. Note that + Geniwrapper does not access any of the PLC databases directly via a mysql + connection; All PLC databases are accessed via PLCAPI.
+
+

+ Geniwrapper uses a PLCAPI connection to perform operations on the registry, + such as creating and deleting slices. This connection requires an account on + the PLC server with full administrator access. The Url parameter controls + whether the connection uses PLCAPI directly (i.e. Geniwrapper is located on + the same machine as PLC), or uses a XMLRPC connection to the PLC machine. If + you wish to use the API directly, then remove the Url field from the + dictionary. +

+
+
+ 2.8.1 Database Configuration +
+
+   +
+
+ Below is an example database configuration from config.py: +
+
+   +
+
+ def get_default_dbinfo():
+     dbinfo={}
+     dbinfo['dbname'] = 'planetlab4'
+     dbinfo['address'] = 'localhost'
+     dbinfo['port'] = 5432
+     dbinfo['user'] = 'pgsqluser'
+     dbinfo['password'] = '4c77b272-c892-4bdf-a833-dddeeee1a2ed' +
+
+     return dbinfo +
+
+   +
+
+ This identifies several important pieces of the database configuration. The + name specifies the database name as used by pgsql. The address is the hostname + (or ip-address) of the machine that is hosting the database. It is most likely + the local machine. Port specifies the socket port where the pgsql is + listening. The user and password authenticate Geniwrapper to the pgsql + database. In this example, an existing PLC database was used. This is not + strictly necessary as only Geni-specific information is stored in this + database. A separate database could be used, on a separate machine than PLC if + desired. +
+
+   +
+
+ 2.8.2 PLCAPI Configuration +
+
+   +
+
+ Blow is an example PLCAPI configuration from config.py: +
+
+   +
+
+ def get_pl_auth():
+     pl_auth = {'Username': + 'root@198.0.0.132',
+     'AuthMethod': 'password',
+     'AuthString':  'root',
+     "Url": + "https://localhost:443/PLCAPI/"
+     } +
+
+     return pl_auth +
+
+   +
+
+ The PLCAPI configuration tells Geniwrapper how to connect to PLC. There are + two options: a local connection or a remote connection. If the Url field is + defined, then a remote connection is assumed, and Geniwrapper will attempt to + connect via XMLRPC to a remote PLCAPI server. If the Url field is not defined, + then Geniwrapper will assume that PYTHONPATH includes the relevant PLCAPI + classes to use PLCAPI directly. +
+
+   +
+
+ Username specifies the name of the PLCAPI user. It is suggested that a user + with full administrative authority be allowed. Otherwise, Geniwrapper will be + unable to lookup public keys and other information that PLC does not make + available publicly. Administrative permission is also required to create PLC + sites, users, etc. Authmethod and AuthString specify the password require to + use this account. +
+
+   +
+
+ 2.9 GeniServer and GeniClient +
+
+   +
+
+ Two files, geniserver.py and geniclient.py implement a basic Geni server and + client. +
+
+   +
+
+ Geniserver forms the basis of any server that exports a Geni interface. + Examples include the PLC and Component wrappers. The Geniserver class itself + does not export any useful API functions other than a "noop" function that can + be used to test the server interface. Descendant classes register additional + API functions by overriding the register_function() member of the geniserver + object. +
+
+   +
+
+ Geniserver provides a function, decode_authentication, that decodes + credentials. Credentials are supplied as the first parameter to many registry + and slice interface API functions. This function converts the credential + string supplied by the user into a credential object, checks to see that the + key the caller is using to encrypt the SSL connection matches the public key + in the caller GID of the credential, checks to see that the credential allows + the operation the caller is attempting to do, and finally verifies that the + parentage of the credential traces back to a trusted root. +
+
+   +
+
+ Geniclient provides a variety of client-side stubs for invoking operations on + Geni interfaces. These stubs convert objects into strings that may be encoded + by XMLRPC, call the associated XMLRPC function, and convert the results back + into objects. Use of the Geniclient class is optional, but it makes a + convenient mechanism to execute API calls. +
+
+   +
+
+ 3.0 The PLC Wrapper +
+
+   +
+
+ This wrapper implements the Registry and Slice interfaces. According to the + SFA, the basic functionality of a registry is to map HRNs into records. + However, because of the interactions between Geniwrapper and PLC, the registry + does more than act as a simple database. The registry performs API calls on + PLC that create slices, sites, users, etc., and as such may indirectly cause + slices to be instantiated on components, because components are also linked to + PLC. +
+
+   +
+
+ The mapping of Geni objects to planetlab objects is relatively + straightforward: +
+
+   +
+
+     slice = slice +
+
+     user = person +
+
+     component = node +
+
+     sa = site +
+
+     ma = site +
+
+   +
+
+ The one part that is slightly counterintuitive is SA and MA, which both map to + the planetlab site object. In a unified registry (a registry that serves as + both slice and component registry), these will map to the same site record in + the PLC database. However, there are two distinct Geni records, one for + the SA and one for the MA.  +
+
+   +
+
+ Registry and slice operations generally authenticate the caller by + credential. There are a few exceptions, and the registry API documents + should note those exceptions.  +
+
+   +
+
+ 3.1 PLC Wrapper Tools +
+
+   +
+
+ The registry include several additional tools that are used to manage it. + These include: +
+
+   +
+
+ import.py - imports existing PLC records into the registry +
+
+   +
+
+ nuke.py - deletes all Geni records +
+
+   +
+
+ 3.1 Bootstrapping the PLC Wrapper +
+
+   +
+
+ There are several items that need to be done before starting the plc wrapper. +
+
+   +
+
+ 1) Update util/config.py to match the parameters of your PLC installation. +
+
+   +
+
+ 2) Import the existing planetlab database, creating the appropriate geni + records. This is done by running the "import.py" tool. +
+
+   +
+
+ 3) Create a "trusted_roots" directory and place the certificate of the root + authority in that directory. Given the defaults in import.py, this certificate + would be named "planetlab.gid". For example, mkdir trusted_roots; cp + authorities/planetlab.gid trusted_roots/ +
+
+   +
+
+ 4.0 The Component Wrapper +
+
+
+ The Geni Component Wrapper implements the Geni Slice and Component Management + interfaces. It includes functions for redeeming tickets, + starting/stopping/resetting/deleting slices, and management such as rebooting + the component. +
+
+   +
+
+ The design of the component differs from the plc wrapper in the respect that + the component wrapper must be run in the same domain (VM) as the NM for the + node it is responsible for. That is, the component wrapper directly calls + the local node manager. +
+
+   +
+
+ 4.1 Component Authentication of Credentials +
+
+   +
+
+ The component authenticates credentials the same way that the plc wrapper + does. Specifically, there is a directory of trusted_root certificates (or + GIDs) on the component. Any credential presented to the component must include + in it's parentage some certificate in the set of trusted roots. Otherwise, and + exception is thrown. +
+
+   +
+
+ 4.2 The Ticket interface +
+
+   +
+
+ Mainpulating tickets is split between the PLC wrapper and the Component wrapper. + Specifically, the authoritative copy of planetlab state is stored on PLC and only cached on + the components. Thus, GetTicket() is implemented by the plc wrapper, and + RedeemTicket() is implemented by the component wrapper. Attempting to call GetTicket() + on a component will fail.
+
+ InstantiateSlice is not implemented, as that operation is a combination of + GetTicket/RedeemTicket and would therefore span the PLC and Component + wrappers.
+
+
+   +
+
+ 4.3 Sliver Credentials +
+
+   +
+
+ A recent Geni Architecture call mentioned the need for sliver credentials. A + sliver credential would be identical to a slice credential, but would 1) only + be redeemable on a particular component, and 2) would resolve to a + trusted_root unique to that component (likely the component's GID + certificate). Sliver credentials would be returned by the RedeemTicket call + and would give the caller the permission required to start and stop the + sliver, etc. +
+
+   +
+
+ Sliver credentials are not yet implemented, but their implementation would be + straightforward. +
+
+   +
+
+ 4.4 Bootstrapping the Component Wrapper +
+
+   +
+
+ The first step is to install some required libraries on the component. These + include the m2crypto and pyopenssl libraries. Installing the actual RPMs for + these libaries on a running component proved difficult due to additional + support packages that require installation (python-devel, etc). For + development purposes, it was sufficient to copy the installed/compiled version + of the libraries from the development machine to the component. +
+
+   +
+
+ The second step is to copy the files required by the component wrapper to + the node manager. They are copied to the /usr/share/Nodemanager directory. A + list of the files is contained in the copynode.sh script in the component + subdirectory. +
+
+   +
+
+ The third step is to copy the trusted root certificates to the component. They + are stored in /usr/share/Nodemanager/trusted_roots. This should include the + certificate for the registry. +
+
+   +
+
+ The fourth step is to start the component manager. This is done by + connecting to the component via SSH and running + /usr/share/Nodemanager/component.py. +
+
+
+ In a production environment, all of these steps would be integrated into the + DVD boot image for the planetlab node. +
+
+   +
+
+ 5.0 Command-Line Interface +
+
+   +
+
+ A command-line interface is provided that allows a user to interact with the + Geni Registry and Component. This command line interface is located in the + cmdline directory and can be invoked by running genicli.py. Specifying + "genicli.py help" will display a list of available commands. +
+
+   +
+
+ 5.1 Examples +
+
+   +
+
+ Several examples of using the CLI are presented in the form of shell scripts + in the cmdline directory. These scripts demonstrate creating slices, + authorities, users, nodes, and getting tickets and redeeming tickets. Rather + than duplicating all of those examples here, a few short examples are + presented below. +
+
+   +
+
+ 5.1.1 Getting a Credential +
+
+   +
+
+ python ./genicli.py --username root --credfile None --outfile test.cred + getCredential user planetlab.us.pl.account_test +
+
+   +
+
+ The credential for planetlab.us.pl.account_test is retrieved and stored in the + local file test.cred. The private ket test.pkey is used when opening the + XMLRPC connection and authenticates the client. test.pkey must match the + public key that is in the GID for the user record for + planetlab.us.pl.account_test. +
+
+   +
+
+ Sample output: (in human-readable summary) +
+
+   +
+
+ CREDENTIAL planetlab.us.pl.account_test
+       privs: refresh,resolve,info
+   gidCaller:
+           hrn: + planetlab.us.pl.account_test
+          uuid: + 276262316202422735940395896620385479122
+   gidObject:
+           hrn: + planetlab.us.pl.account_test
+          uuid: + 276262316202422735940395896620385479122
+    delegate: False +
+
+   +
+
+   +
+
+ 5.1.2 Resolving a record +
+
+   +
+
+ python ./genicli.py --username test resolve planetlab.us.pl.account_test +
+
+   +
+
+ The record for planetlab.us.pl.account_test is retrieved and printed to + stdout. The credential used comes from the local file test.cred. +
+
+   +
+
+ Sample output: (in human-readable summary) +
+
+   +
+
+ RECORD planetlab.us.pl.account_test
+         hrn: planetlab.us.pl.account_test
+        type: user
+         gid:
+           hrn: + planetlab.us.pl.account_test
+          uuid: + 276262316202422735940395896620385479122
+     pointer: 6
+   geni_info:
+         email : + test@test.com
+     pl_info:
+         bio : None
+         first_name : test
+         last_name : account
+         last_updated : 1222497672
+         uuid : None
+         roles : ['user']
+         title : None
+         url : None
+         key_ids : [1]
+         enabled : True
+         slice_ids : [24]
+         phone : None
+         peer_person_id : None
+         role_ids : [30]
+         person_id : 6
+         date_created : 1219083140
+         site_ids : [1]
+         peer_id : None
+         email : + test@test.com +
+
+   +
+
+ 5.1.3 Updating a record +
+
+   +
+
+ python ./genicli.py --username test update user planetlab.us.pl.account_test +
+
+   +
+
+ The record for planetlab.us.pl.account_test is updated. The credential used + comes from the local file test.cred. No changes are specified, so the only + thing that should be updated is the expiration time. +
+
+   +
+
+ 5.1.4 Resolving an authority +
+
+   +
+
+ An authority is an example of an HRN that might resolve to two different + records, an SA and a MA record. +
+
+   +
+
+ python ./genicli.py --username test resolve planetlab.us.pl +
+
+   +
+
+ Sample Output: (in human readable summary) +
+
+   +
+
+ RECORD planetlab.us.pl
+         hrn: planetlab.us.pl
+        type: sa
+         gid:
+           hrn: planetlab.us.pl
+          uuid: + 294786197975089072547582920862317666209
+     pointer: 1
+   geni_info:
+         pi : + ['planetlab.us.pl.Administrator_Default']
+     pl_info:
+         last_updated : 1224136003
+         node_ids : [1]
+         site_id : 1
+         pcu_ids : []
+         max_slices : 100
+         ext_consortium_id : None
+         peer_site_id : None
+         abbreviated_name : plctest
+         uuid : + 230749975723590978208303655640765327534
+         person_ids : [2, 4, 6]
+         slice_ids : [24, 1, 2]
+         latitude : None
+         peer_id : None
+         max_slivers : 1000
+         is_public : False
+         address_ids : []
+         name : plctest Central
+         url : + http://198.0.0.132/
+         enabled : True
+         longitude : None
+         login_base : pl
+         date_created : 1209428329
+ RESULT:
+ RECORD planetlab.us.pl
+         hrn: planetlab.us.pl
+        type: ma
+         gid:
+           hrn: planetlab.us.pl
+          uuid: + 294786197975089072547582920862317666209
+     pointer: 1
+   geni_info:
+         operator : []
+         owner : + ['planetlab.us.pl.Administrator_Default']
+     pl_info:
+         last_updated : 1224136003
+         node_ids : [1]
+         site_id : 1
+         pcu_ids : []
+         max_slices : 100
+         ext_consortium_id : None
+         peer_site_id : None
+         abbreviated_name : plctest
+         uuid : + 230749975723590978208303655640765327534
+         person_ids : [2, 4, 6]
+         slice_ids : [24, 1, 2]
+         latitude : None
+         peer_id : None
+         max_slivers : 1000
+         is_public : False
+         address_ids : []
+         name : plctest Central
+         url : + http://198.0.0.132/
+         enabled : True
+         longitude : None
+         login_base : pl
+         date_created : 1209428329 +
+
\ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 00000000..463dbaf6 --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,11 @@ +### this seems like totally out-of-date +doc: + pythondoc.py ../sfa/util/certificate.py ../sfa/util/credential.py ../sfa/util/gid.py \ + ../sfa/util/rights.py ../sfa/util/config.py ../sfa/trust/hierarchy.py \ + ../sfa/util/record.py ../sfa/util/client.py \ + ../sfa/util/server.py + + pythondoc.py ../sfa/registry/registry.py ../sfa/registry/import.py \ + ../sfa/registry/nuke.py + + pythondoc.py ../component/component.py diff --git a/docs/README b/docs/README new file mode 100644 index 00000000..3dad1aaf --- /dev/null +++ b/docs/README @@ -0,0 +1,5 @@ +This directory contains API documentation. See the developer's wiki for a +general design overview. + +API documentation is generated by using the pytondoc tool. +See http://effbot.org/zone/pythondoc.htm to obtain the tool. diff --git a/docs/geniwrapper.doc b/docs/geniwrapper.doc new file mode 100644 index 0000000000000000000000000000000000000000..e42b9af8994ab7580db5af54bc2254c9edfda4c7 GIT binary patch literal 186880 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 Q5w-4~TA@G;<-c711!(bce*gdg literal 0 HcmV?d00001 diff --git a/docs/geniwrapper.pdf b/docs/geniwrapper.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e0cca42807b44704099137caf0a3d7df2c1f948b GIT binary patch literal 421200 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�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%0A+azl15ogn0mL>+#3x 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⪼2=tE|g&b1GbT?oXOA+0=8hYSls^EWLZQaU&q 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 !U`^3hr8*P#f%8* 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

7?Ggm)}lt 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 q7xrc$DzNQV~*x*=~3HcDs}(o)jaqrJ(x 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 + + + +The cert Module + + +

The cert Module

+

Geniwrapper uses two crypto libraries: pyOpenSSL and M2Crypto to implement +the necessary crypto functionality. Ideally just one of these libraries +would be used, but unfortunately each of these libraries is independently +lacking. The pyOpenSSL library is missing many necessary functions, and +the M2Crypto library has crashed inside of some of the functions. The +design decision is to use pyOpenSSL whenever possible as it seems more +stable, and only use M2Crypto for those functions that are not possible +in pyOpenSSL. + +This module exports two classes: Keypair and Certificate.

+
+

The Certificate Class

+
+
Certificate(create=False, subject=None, string=None, filename=None) (class) [#]
+
+

The certificate class implements a general purpose X509 certificate, making +use of the appropriate pyOpenSSL or M2Crypto abstractions. It also adds +several addition features, such as the ability to maintain a chain of +parent certificates, and storage of application-specific data. + +Certificates include the ability to maintain a chain of parents. Each +certificate includes a pointer to it's parent certificate. When loaded +from a file or a string, the parent chain will be automatically loaded. +When saving a certificate to a file or a string, the caller can choose +whether to save the parent certificates as well.

+
+
__init__(create=False, subject=None, string=None, filename=None) [#]
+
+

Create a certificate object.

+
+
create
+
+If create==True, then also create a blank X509 certificate.
+
subject
+
+If subject!=None, then create a blank certificate and set + it's subject name.
+
string
+
+If string!=None, load the certficate from the string.
+
filename
+
+If filename!=None, load the certficiate from the file.
+

+
+
add_extension(name, critical, value) [#]
+
+

Add an X509 extension to the certificate. Add_extension can only be called +once for a particular extension name, due to limitations in the underlying +library.

+
+
name
+
+string containing name of extension
+
value
+
+string containing value of the extension
+

+
+
create() [#]
+
+

Create a blank X509 certificate and store it in this object.

+
+
get_data() [#]
+
+

Return the data string that was previously set with set_data

+
+
get_extension(name) [#]
+
+

Get an X509 extension from the certificate

+
+
get_issuer(which="CN") [#]
+
+

Get the issuer name

+
+
get_parent() [#]
+
+

Return the certificate object of the parent of this certificate.

+
+
get_pubkey() [#]
+
+

Get the public key of the certificate. +It is returned in the form of a Keypair object.

+
+
get_subject(which="CN") [#]
+
+

Get the subject name of the certificate

+
+
is_pubkey(pkey) [#]
+
+

Return True if pkey is identical to the public key that is contained in the certificate.

+
+
pkey
+
+Keypair object
+

+
+
is_signed_by_cert(cert) [#]
+
+

Given a certificate cert, verify that this certificate was signed by the +public key contained in cert. Throw an exception otherwise.

+
+
cert
+
+certificate object
+

+
+
load_from_file(filename) [#]
+
+

Load the certificate from a file

+
+
load_from_pyopenssl_x509(x509) [#]
+
+

Given a pyOpenSSL X509 object, store that object inside of this +certificate object.

+
+
load_from_string(string) [#]
+
+

Load the certificate from a string

+
+
save_to_file(filename, save_parents=False) [#]
+
+

Save the certificate to a file.

+
+
save_parents
+
+If save_parents==True, then also save the parent certificates.
+

+
+
save_to_string(save_parents=False) [#]
+
+

Save the certificate to a string.

+
+
save_parents
+
+If save_parents==True, then also save the parent certificates.
+

+
+
set_data(str) [#]
+
+

Set_data is a wrapper around add_extension. It stores the parameter str in +the X509 subject_alt_name extension. Set_data can only be called once, due +to limitations in the underlying library.

+
+
set_issuer(key, subject=None, cert=None) [#]
+
+

Sets the issuer private key and name

+
+
key
+
+Keypair object containing the private key of the issuer
+
subject
+
+String containing the name of the issuer
+
cert
+
+(optional) Certificate object containing the name of the issuer
+

+
+
set_parent(p) [#]
+
+

Set the parent certficiate.

+
+
p
+
+certificate object.
+

+
+
set_pubkey(key) [#]
+
+

Get the public key of the certificate.

+
+
key
+
+Keypair object containing the public key
+

+
+
set_subject(name) [#]
+
+

Set the subject name of the certificate

+
+
sign() [#]
+
+

Sign the certificate using the issuer private key and issuer subject previous set with set_issuer().

+
+
verify(pkey) [#]
+
+

Verify the authenticity of a certificate.

+
+
pkey
+
+is a Keypair object representing a public key. If Pkey + did not sign the certificate, then an exception will be thrown.
+

+
+
verify_chain(trusted_certs=None) [#]
+
+

Verification examines a chain of certificates to ensure that each parent +signs the child, and that some certificate in the chain is signed by a +trusted certificate. + +Verification is a basic recursion:

+    if this_certificate was signed by trusted_certs:
+        return
+    else
+        return verify_chain(parent, trusted_certs)
+
+ +At each recursion, the parent is tested to ensure that it did sign the +child. If a parent did not sign a child, then an exception is thrown. If +the bottom of the recursion is reached and the certificate does not match +a trusted root, then an exception is thrown. + +

+
Trusted_certs
+
+is a list of certificates that are trusted.
+

+
+
+

The Keypair Class

+
+
Keypair(create=False, string=None, filename=None) (class) [#]
+
+

Public-private key pairs are implemented by the Keypair class. +A Keypair object may represent both a public and private key pair, or it +may represent only a public key (this usage is consistent with OpenSSL).

+
+
__init__(create=False, string=None, filename=None) [#]
+
+

Creates a Keypair object

+
+
create
+
+If create==True, creates a new public/private key and + stores it in the object
+
string
+
+If string!=None, load the keypair from the string (PEM)
+
filename
+
+If filename!=None, load the keypair from the file
+

+
+
as_pem() [#]
+
+

Return the private key in PEM format.

+
+
create() [#]
+
+

Create a RSA public/private key pair and store it inside the keypair object

+
+
get_m2_pkey() [#]
+
+

Return an OpenSSL pkey object

+
+
get_openssl_pkey() [#]
+
+

Given another Keypair object, return TRUE if the two keys are the same.

+
+
load_from_file(filename) [#]
+
+

Load the private key from a file. Implicity the private key includes the public key.

+
+
load_from_string(string) [#]
+
+

Load the private key from a string. Implicitly the private key includes the public key.

+
+
load_pubkey_from_file(filename) [#]
+
+

Load the public key from a string. No private key is loaded.

+
+
load_pubkey_from_string(string) [#]
+
+

Load the public key from a string. No private key is loaded.

+
+
save_to_file(filename) [#]
+
+

Save the private key to a file

+
+
filename
+
+name of file to store the keypair in
+

+
+
+ diff --git a/docs/pythondoc-component.html b/docs/pythondoc-component.html new file mode 100644 index 00000000..655f2862 --- /dev/null +++ b/docs/pythondoc-component.html @@ -0,0 +1,136 @@ + + + + +The component Module + + +

The component Module

+

Geni Component Wrapper + +This wrapper implements the Geni Component Interface

+
+
ComponentManager(ip, port, key_file, cert_file) (class) [#]
+
+

ComponentManager is a GeniServer that serves component interface requests.

+

For more information about this class, see The ComponentManager Class.

+
+
+

The ComponentManager Class

+
+
ComponentManager(ip, port, key_file, cert_file) (class) [#]
+
+

ComponentManager is a GeniServer that serves component interface requests.

+
+
decode_ticket(ticket_string) [#]
+
+

Examine the ticket that was provided by the caller, check that it is +signed and verified correctly. Throw an exception if something is +wrong with the ticket. + +This is similar to geniserver.decode_authentication

+
+
ticket_string
+
+the string representation of the ticket
+

+
+
delete_slice(cred_str) [#]
+
+

Delete a slice.

+
+
cred
+
+a credential identifying the caller (callerGID) and the slice + (objectGID)
+

+
+
geni_ticket_to_plc_rec(ticket) [#]
+
+

Convert a geni ticket into a PLC record that can be submitted to the +node manager. This involves some minor reformatting of the fields +contained in the ticket.

+
+
ticket
+
+a ticket object
+
Returns:
+
+a dictionary containing the PLC record info
+

+
+
list_slices(cred_str) [#]
+
+

List the slices on a component.

+
+
cred_str
+
+string representation of a credential object that + authorizes the caller
+
Returns:
+
+a list of slice names
+

+
+
reboot(cred_str) [#]
+
+

Reboot the component.

+
+
cred_str
+
+string representation of a credential object that + authorizes the caller
+

+
+
redeem_ticket(ticket_str) [#]
+
+

Redeem a ticket. + +The ticket is submitted to the node manager, and the slice is instantiated +or updated as appropriate. + +TODO: This operation should return a sliver credential and indicate +whether or not the component will accept only sliver credentials, or +will accept both sliver and slice credentials.

+
+
ticket_str
+
+the string representation of a ticket object
+

+
+
register_functions() [#]
+
+

Register the server RPCs for the component

+
+
reset_slice(cred_str) [#]
+
+

Reset a slice.

+
+
cred
+
+a credential identifying the caller (callerGID) and the slice + (objectGID)
+

+
+
start_slice(cred_str) [#]
+
+

Start a slice.

+
+
cred
+
+a credential identifying the caller (callerGID) and the slice + (objectGID)
+

+
+
stop_slice(cred_str) [#]
+
+

Stop a slice.

+
+
cred
+
+a credential identifying the caller (callerGID) and the slice + (objectGID)
+

+
+
+ diff --git a/docs/pythondoc-config.html b/docs/pythondoc-config.html new file mode 100644 index 00000000..a7240b24 --- /dev/null +++ b/docs/pythondoc-config.html @@ -0,0 +1,36 @@ + + + + +The config Module + + +

The config Module

+

Geniwrapper Configuration Info + +This module holds configuration parameters for geniwrapper. There are two +main pieces of information that are used: the database connection and +the PLCAPI connection

+
+
get_default_dbinfo() [#]
+
+

Geniwrapper uses a MYSQL database to store records. This database may be +co-located with the PLC database, or it may be a separate database. The +following parameters define the connection to the database. + +Note that Geniwrapper does not access any of the PLC databases directly via +a mysql connection; All PLC databases are accessed via PLCAPI.

+
+
get_pl_auth() [#]
+
+

Geniwrapper uses a PLCAPI connection to perform operations on the registry, +such as creating and deleting slices. This connection requires an account +on the PLC server with full administrator access. + +The Url parameter controls whether the connection uses PLCAPI directly (i.e. +Geniwrapper is located on the same machine as PLC), or uses a XMLRPC connection +to the PLC machine. If you wish to use the API directly, then remove the Url +field from the dictionary.

+
+
+ diff --git a/docs/pythondoc-credential.html b/docs/pythondoc-credential.html new file mode 100644 index 00000000..7c88af35 --- /dev/null +++ b/docs/pythondoc-credential.html @@ -0,0 +1,159 @@ + + + + +The credential Module + + +

The credential Module

+

Implements Geni Credentials + +Credentials are layered on top of certificates, and are essentially a +certificate that stores a tuple of parameters.

+
+
Credential(create=False, subject=None, string=None, filename=None) (class) [#]
+
+

Credential is a tuple: + (GIDCaller, GIDObject, LifeTime, Privileges, Delegate) + +These fields are encoded using xmlrpc into the subjectAltName field of the +x509 certificate.

+

For more information about this class, see The Credential Class.

+
+
+

The Credential Class

+
+
Credential(create=False, subject=None, string=None, filename=None) (class) [#]
+
+

Credential is a tuple: + (GIDCaller, GIDObject, LifeTime, Privileges, Delegate) + +These fields are encoded using xmlrpc into the subjectAltName field of the +x509 certificate. Note: Call encode() once the fields have been filled in +to perform this encoding.

+
+
__init__(create=False, subject=None, string=None, filename=None) [#]
+
+

Create a Credential object

+
+
create
+
+If true, create a blank x509 certificate
+
subject
+
+If subject!=None, create an x509 cert with the subject name
+
string
+
+If string!=None, load the credential from the string
+
filename
+
+If filename!=None, load the credential from the file
+

+
+
can_perform(op_name) [#]
+
+

determine whether the credential allows a particular operation to be +performed

+
+
op_name
+
+string specifying name of operation ("lookup", "update", etc)
+

+
+
decode() [#]
+
+

Retrieve the attributes of the credential from the alt-subject-name field +of the X509 certificate. This is automatically done by the various +get_* methods of this class and should not need to be called explicitly.

+
+
dump(dump_parents=False) [#]
+
+

Dump the contents of a credential to stdout in human-readable format

+
+
dump_parents
+
+If true, also dump the parent certificates
+

+
+
encode() [#]
+
+

Encode the attributes of the credential into a string and store that +string in the alt-subject-name field of the X509 object. This should be +done immediately before signing the credential.

+
+
get_delegate() [#]
+
+

get the delegate bit

+
+
get_gid_caller() [#]
+
+

get the GID of the object

+
+
get_gid_object() [#]
+
+

get the GID of the object

+
+
get_lifetime() [#]
+
+

get the lifetime of the credential

+
+
get_privileges() [#]
+
+

return the privileges as a RightList object

+
+
set_delegate(delegate) [#]
+
+

set the delegate bit

+
+
delegate
+
+boolean (True or False)
+

+
+
set_gid_caller(gid) [#]
+
+

set the GID of the caller

+
+
gid
+
+GID object of the caller
+

+
+
set_gid_object(gid) [#]
+
+

set the GID of the object

+
+
gid
+
+GID object of the object
+

+
+
set_lifetime(lifeTime) [#]
+
+

set the lifetime of this credential

+
+
lifetime
+
+lifetime of credential
+

+
+
set_privileges(privs) [#]
+
+

set the privileges

+
+
privs
+
+either a comma-separated list of privileges of a RightList object
+

+
+
verify_chain(trusted_certs=None) [#]
+
+

Verify that a chain of credentials is valid (see cert.py:verify). In +addition to the checks for ordinary certificates, verification also +ensures that the delegate bit was set by each parent in the chain. If +a delegate bit was not set, then an exception is thrown. + +Each credential must be a subset of the rights of the parent.

+
+
+ diff --git a/docs/pythondoc-geniclient.html b/docs/pythondoc-geniclient.html new file mode 100644 index 00000000..6620407d --- /dev/null +++ b/docs/pythondoc-geniclient.html @@ -0,0 +1,322 @@ + + + + +The geniclient Module + + +

The geniclient Module

+

This module implements the client-side of the Geni API. Stubs are provided +that convert the supplied parameters to the necessary format and send them +via XMLRPC to a Geni Server. + +TODO: Investigate ways to combine this with existing PLC API?

+
+
GeniClient(url, key_file, cert_file) (class) [#]
+
+

The GeniClient class provides stubs for executing Geni operations.

+

For more information about this class, see The GeniClient Class.

+
+
GeniTransport (class) [#]
+
+

For more information about this class, see The GeniTransport Class.

+
+
ServerException (class) [#]
+
+

ServerException, ExceptionUnmarshaller + +Used to convert server exception strings back to an exception.

+

For more information about this class, see The ServerException Class.

+
+
+

The GeniClient Class

+
+
GeniClient(url, key_file, cert_file) (class) [#]
+
+

The GeniClient class provides stubs for executing Geni operations. A given +client object connects to one server. To connect to multiple servers, create +multiple GeniClient objects. + +The Geni protocol uses an HTTPS connection, and the client's side of the +connection uses his private key. Generally, this private key must match the +public key that is containing in the GID that the client is providing for +those functions that take a GID.

+
+
create_gid(cred, name, uuid, pkey_string) [#]
+
+

Create a new GID. For MAs and SAs that are physically located on the +registry, this allows a owner/operator/PI to create a new GID and have it +signed by his respective authority.

+
+
cred
+
+credential of caller
+
name
+
+hrn for new GID
+
uuid
+
+unique identifier for new GID
+
pkey_string
+
+public-key string (TODO: why is this a string and not a keypair object?)
+
Returns:
+
+a GID object
+

+
+
delete_slice(cred) [#]
+
+

Delete a slice.

+
+
cred
+
+a credential identifying the caller (callerGID) and the slice + (objectGID)
+

+
+
get_credential(cred, type, name) [#]
+
+

Retrieve a credential for an object. + +If cred==None, then the behavior reverts to get_self_credential()

+
+
cred
+
+credential object specifying rights of the caller
+
type
+
+type of object (user | slice | sa | ma | node)
+
name
+
+human readable name of object
+
Returns:
+
+a credental object
+

+
+
get_gid(name) [#]
+
+

Retrieve the GID for an object. This function looks up a record in the +registry and returns the GID of the record if it exists. +TODO: Is this function needed? It's a shortcut for Resolve()

+
+
name
+
+hrn to look up
+
Returns:
+
+a GID object
+

+
+
get_self_credential(type, name) [#]
+
+

Get_self_credential a degenerate version of get_credential used by a +client to get his initial credential when he doesn't have one. This is +the same as get_credential(..., cred=None,...). + +The registry ensures that the client is the principal that is named by +(type, name) by comparing the public key in the record's GID to the +private key used to encrypt the client-side of the HTTPS connection. Thus +it is impossible for one principal to retrieve another principal's +credential without having the appropriate private key.

+
+
type
+
+type of object (user | slice | sa | ma | node
+
name
+
+human readable name of object
+
Returns:
+
+a credential object
+

+
+
get_ticket(cred, name, rspec) [#]
+
+

Retrieve a ticket. This operation is currently implemented on the +registry (see SFA, engineering decisions), and is not implemented on +components. + +The ticket is filled in with information from the PLC database. This +information includes resources, and attributes such as user keys and +initscripts.

+
+
cred
+
+credential object
+
name
+
+name of the slice to retrieve a ticket for
+
rspec
+
+resource specification dictionary
+
Returns:
+
+a ticket object
+

+
+
list(cred) [#]
+
+

List the records in an authority. The objectGID in the supplied credential +should name the authority that will be listed.

+
+
cred
+
+credential object specifying rights of the caller
+
Returns:
+
+list of record objects
+

+
+
list_slices(cred) [#]
+
+

List the slices on a component.

+
+
cred
+
+credential object that authorizes the caller
+
Returns:
+
+a list of slice names
+

+
+
redeem_ticket(ticket) [#]
+
+

Redeem a ticket. This operation is currently implemented on the +component. + +The ticket is submitted to the node manager, and the slice is instantiated +or updated as appropriate. + +TODO: This operation should return a sliver credential and indicate +whether or not the component will accept only sliver credentials, or +will accept both sliver and slice credentials.

+
+
ticket
+
+a ticket object containing the ticket
+

+
+
register(cred, record) [#]
+
+

Register an object with the registry. In addition to being stored in the +Geni database, the appropriate records will also be created in the +PLC databases. + +The geni_info and/or pl_info fields must in the record must be filled +out correctly depending on the type of record that is being registered. + +TODO: The geni_info member of the record should be parsed and the pl_info +adjusted as necessary (add/remove users from a slice, etc)

+
+
cred
+
+credential object specifying rights of the caller
+
Returns:
+
+record to register
+

+
+
remove(cred, record) [#]
+
+

Remove an object from the registry. If the object represents a PLC object, +then the PLC records will also be removed.

+
+
cred
+
+credential object specifying rights of the caller
+
record
+
+record to register. The only relevant + fields of the record are 'name' and 'type', which are used to lookup + the current copy of the record in the Geni database, to make sure + that the appopriate record is removed.
+

+
+
reset_slice(cred) [#]
+
+

Reset a slice.

+
+
cred
+
+a credential identifying the caller (callerGID) and the slice + (objectGID)
+

+
+
resolve(cred, name) [#]
+
+

Resolve an object in the registry. A given HRN may have multiple records +associated with it, and therefore multiple records may be returned. The +caller should check the type fields of the records to find the one that +he is interested in.

+
+
cred
+
+credential object specifying rights of the caller
+
name
+
+human readable name of object
+

+
+
start_slice(cred) [#]
+
+

Start a slice.

+
+
cred
+
+a credential identifying the caller (callerGID) and the slice + (objectGID)
+

+
+
stop_slice(cred) [#]
+
+

Stop a slice.

+
+
cred
+
+a credential identifying the caller (callerGID) and the slice + (objectGID)
+

+
+
update(cred, record) [#]
+
+

Update an object in the registry. Currently, this only updates the +PLC information associated with the record. The Geni fields (name, type, +GID) are fixed. + +The record is expected to have the pl_info field filled in with the data +that should be updated. + +TODO: The geni_info member of the record should be parsed and the pl_info +adjusted as necessary (add/remove users from a slice, etc)

+
+
cred
+
+credential object specifying rights of the caller
+
record
+
+a record object to be updated
+

+
+
+

The GeniTransport Class

+
+
GeniTransport (class) [#]
+
+

GeniTransport + +A transport for XMLRPC that works on top of HTTPS

+
+
+

The ServerException Class

+
+
ServerException (class) [#]
+
+

ServerException, ExceptionUnmarshaller + +Used to convert server exception strings back to an exception. + from usenet, Raghuram Devarakonda

+
+
+ diff --git a/docs/pythondoc-geniserver.html b/docs/pythondoc-geniserver.html new file mode 100644 index 00000000..9aa0996c --- /dev/null +++ b/docs/pythondoc-geniserver.html @@ -0,0 +1,83 @@ + + + + +The geniserver Module + + +

The geniserver Module

+

This module implements a general-purpose server layer for geni. +The same basic server should be usable on the registry, component, or +other interfaces. + +TODO: investigate ways to combine this with existing PLC server?

+
+
GeniServer(ip, port, key_file, cert_file) (class) [#]
+
+

Implements an HTTPS XML-RPC server.

+

For more information about this class, see The GeniServer Class.

+
+
SecureXMLRpcRequestHandler (class) [#]
+
+

taken from the web (XXX find reference).

+

For more information about this class, see The SecureXMLRpcRequestHandler Class.

+
+
SecureXMLRPCServer(server_address, HandlerClass, key_file, cert_file, logRequests=True) (class) [#]
+
+

Taken from the web (XXX find reference).

+

For more information about this class, see The SecureXMLRPCServer Class.

+
+
verify_callback(conn, x509, err, depth, preverify) [#]
+
+

Verification callback for pyOpenSSL. We do our own checking of keys because +we have our own authentication spec. Thus we disable several of the normal +prohibitions that OpenSSL places on certificates

+
+
+

The GeniServer Class

+
+
GeniServer(ip, port, key_file, cert_file) (class) [#]
+
+

Implements an HTTPS XML-RPC server. Generally it is expected that GENI +functions will take a credential string, which is passed to +decode_authentication. Decode_authentication() will verify the validity of +the credential, and verify that the user is using the key that matches the +GID supplied in the credential.

+
+
decode_authentication(cred_string, operation) [#]
+
+

Decode the credential string that was submitted by the caller. Several +checks are performed to ensure that the credential is valid, and that the +callerGID included in the credential matches the caller that is +connected to the HTTPS connection.

+
+
noop(cred, anything) [#]
+
+

Sample no-op server function. The no-op function decodes the credential +that was passed to it.

+
+
register_functions() [#]
+
+

Register functions that will be served by the XMLRPC server. This +function should be overrided by each descendant class.

+
+
run() [#]
+
+

Execute the server, serving requests forever.

+
+
+

The SecureXMLRpcRequestHandler Class

+
+
SecureXMLRpcRequestHandler (class) [#]
+
+

taken from the web (XXX find reference). Implents HTTPS xmlrpc request handler

+
+
+

The SecureXMLRPCServer Class

+
+
SecureXMLRPCServer(server_address, HandlerClass, key_file, cert_file, logRequests=True) (class) [#]
+
+

Taken from the web (XXX find reference). Implements an HTTPS xmlrpc server

+
+
+ diff --git a/docs/pythondoc-gid.html b/docs/pythondoc-gid.html new file mode 100644 index 00000000..c05dac43 --- /dev/null +++ b/docs/pythondoc-gid.html @@ -0,0 +1,103 @@ + + + + +The gid Module + + +

The gid Module

+

Implements GENI GID. GIDs are based on certificates, and the GID class is a +descendant of the certificate class.

+
+
create_uuid() [#]
+
+

Create a new uuid. Returns the UUID as a string.

+
+
GID(create=False, subject=None, string=None, filename=None, uuid=None, hrn=None) (class) [#]
+
+

GID is a tuplie: + (uuid, hrn, public_key) + +UUID is a unique identifier and is created by the python uuid module + (or the utility function create_uuid() in gid.py).

+

For more information about this class, see The GID Class.

+
+
+

The GID Class

+
+
GID(create=False, subject=None, string=None, filename=None, uuid=None, hrn=None) (class) [#]
+
+

GID is a tuplie: + (uuid, hrn, public_key) + +UUID is a unique identifier and is created by the python uuid module + (or the utility function create_uuid() in gid.py). + +HRN is a human readable name. It is a dotted form similar to a backward domain + name. For example, planetlab.us.arizona.bakers. + +PUBLIC_KEY is the public key of the principal identified by the UUID/HRN. +It is a Keypair object as defined in the cert.py module. + +It is expected that there is a one-to-one pairing between UUIDs and HRN, +but it is uncertain how this would be inforced or if it needs to be enforced. + +These fields are encoded using xmlrpc into the subjectAltName field of the +x509 certificate. Note: Call encode() once the fields have been filled in +to perform this encoding.

+
+
__init__(create=False, subject=None, string=None, filename=None, uuid=None, hrn=None) [#]
+
+

Create a new GID object

+
+
create
+
+If true, create the X509 certificate
+
subject
+
+If subject!=None, create the X509 cert and set the subject name
+
string
+
+If string!=None, load the GID from a string
+
filename
+
+If filename!=None, load the GID from a file
+

+
+
decode() [#]
+
+

Decode the subject-alt-name field of the X509 certificate into the +fields of the GID. This is automatically called by the various get_*() +functions in this class.

+
+
dump(indent=0, dump_parents=False) [#]
+
+

Dump the credential to stdout.

+
+
indent
+
+specifies a number of spaces to indent the output
+
dump_parents
+
+If true, also dump the parents of the GID
+

+
+
encode() [#]
+
+

Encode the GID fields and package them into the subject-alt-name field +of the X509 certificate. This must be called prior to signing the +certificate. It may only be called once per certificate.

+
+
verify_chain(trusted_certs=None) [#]
+
+

Verify the chain of authenticity of the GID. First perform the checks +of the certificate class (verifying that each parent signs the child, +etc). In addition, GIDs also confirm that the parent's HRN is a prefix +of the child's HRN. + +Verifying these prefixes prevents a rogue authority from signing a GID +for a principal that is not a member of that authority. For example, +planetlab.us.arizona cannot sign a GID for planetlab.us.princeton.foo.

+
+
+ diff --git a/docs/pythondoc-hierarchy.html b/docs/pythondoc-hierarchy.html new file mode 100644 index 00000000..ec7ee800 --- /dev/null +++ b/docs/pythondoc-hierarchy.html @@ -0,0 +1,209 @@ + + + + +The hierarchy Module + + +

The hierarchy Module

+

This module implements a hierarchy of authorities and performs a similar +function as the "tree" module of the original geniwrapper prototype. An HRN +is assumed to be a string of authorities separated by dots. For example, +"planetlab.us.arizona.bakers". Each component of the HRN is a different +authority, with the last component being a leaf in the tree. + +Each authority is stored in a subdirectory on the registry. Inside this +subdirectory are several files: + *.GID - GID file + *.PKEY - private key file + *.DBINFO - database info

+
+
AuthInfo(hrn, gid_filename, privkey_filename, dbinfo_filename) (class) [#]
+
+

The AuthInfo class contains the information for an authority.

+

For more information about this class, see The AuthInfo Class.

+
+
Hierarchy(basedir=".") (class) [#]
+
+

The Hierarchy class is responsible for managing the tree of authorities.

+

For more information about this class, see The Hierarchy Class.

+
+
+

The AuthInfo Class

+
+
AuthInfo(hrn, gid_filename, privkey_filename, dbinfo_filename) (class) [#]
+
+

The AuthInfo class contains the information for an authority. This information +includes the GID, private key, and database connection information.

+
+
__init__(hrn, gid_filename, privkey_filename, dbinfo_filename) [#]
+
+

Initialize and authority object.

+
+
hrn
+
+the human readable name of the authority
+
gid_filename
+
+the filename containing the GID
+
privkey_filename
+
+the filename containing the private key
+
dbinfo_filename
+
+the filename containing the database info
+

+
+
get_dbinfo() [#]
+
+

Get the dbinfo in the form of a dictionary

+
+
get_gid_object() [#]
+
+

Get the GID in the form of a GID object

+
+
get_pkey_object() [#]
+
+

Get the private key in the form of a Keypair object

+
+
set_gid_filename(fn) [#]
+
+

Set the filename of the GID

+
+
fn
+
+filename of file containing GID
+

+
+
update_gid_object(gid) [#]
+
+

Replace the GID with a new one. The file specified by gid_filename is +overwritten with the new GID object

+
+
gid
+
+object containing new GID
+

+
+
+

The Hierarchy Class

+
+
Hierarchy(basedir=".") (class) [#]
+
+

The Hierarchy class is responsible for managing the tree of authorities. +Each authority is a node in the tree and exists as an AuthInfo object. + +The tree is stored on disk in a hierarchical manner than reflects the +structure of the tree. Each authority is a subdirectory, and each subdirectory +contains the GID, pkey, and dbinfo files for that authority (as well as +subdirectories for each sub-authority)

+
+
auth_exists(hrn) [#]
+
+

Check to see if an authority exists. An authority exists if it's disk +files exist.

+
+
the
+
+human readable name of the authority to check
+

+
+
create_auth(hrn, create_parents=False) [#]
+
+

Create an authority. A private key for the authority and the associated +GID are created and signed by the parent authority.

+
+
hrn
+
+the human readable name of the authority to create
+
create_parents
+
+if true, also create the parents if they do not exist
+

+
+
create_gid(hrn, uuid, pkey) [#]
+
+

Create a new GID. The GID will be signed by the authority that is it's +immediate parent in the hierarchy (and recursively, the parents' GID +will be signed by its parent)

+
+
hrn
+
+the human readable name to store in the GID
+
uuid
+
+the unique identifier to store in the GID
+
pkey
+
+the public key to store in the GID
+

+
+
get_auth_cred(hrn) [#]
+
+

Retrieve an authority credential for an authority. The authority +credential will contain the authority privilege and will be signed by +the authority's parent.

+
+
hrn
+
+the human readable name of the authority
+

+
+
get_auth_filenames(hrn) [#]
+
+

Given a hrn, return the filenames of the GID, private key, and dbinfo +files.

+
+
hrn
+
+the human readable name of the authority
+

+
+
get_auth_info(hrn) [#]
+
+

Return the AuthInfo object for the specified authority. If the authority +does not exist, then an exception is thrown. As a side effect, disk files +and a subdirectory may be created to store the authority.

+
+
hrn
+
+the human readable name of the authority to create.
+

+
+
get_auth_ticket(hrn) [#]
+
+

Retrieve an authority ticket. An authority ticket is not actually a +redeemable ticket, but only serves the purpose of being included as the +parent of another ticket, in order to provide a chain of authentication +for a ticket. + +This looks almost the same as get_auth_cred, but works for tickets +XXX does similarity imply there should be more code re-use?

+
+
hrn
+
+the human readable name of the authority
+

+
+
refresh_gid(gid, hrn=None, uuid=None, pubkey=None) [#]
+
+

Refresh a GID. The primary use of this function is to refresh the +the expiration time of the GID. It may also be used to change the HRN, +UUID, or Public key of the GID.

+
+
gid
+
+the GID to refresh
+
hrn
+
+if !=None, change the hrn
+
uuid
+
+if !=None, change the uuid
+
pubkey
+
+if !=None, change the public key
+

+
+
+ diff --git a/docs/pythondoc-import.html b/docs/pythondoc-import.html new file mode 100644 index 00000000..0c66c158 --- /dev/null +++ b/docs/pythondoc-import.html @@ -0,0 +1,26 @@ + + + + +The import Module + + +

The import Module

+

Import PLC records into the Geni database. It is indended that this tool be +run once to create Geni records that reflect the current state of the +planetlab database. + +The import tool assumes that the existing PLC hierarchy should all be part +of "planetlab.us" (see the root_auth and level1_auth variables below). + +Public keys are extracted from the users' SSH keys automatically and used to +create GIDs. This is relatively experimental as a custom tool had to be +written to perform conversion from SSH to OpenSSL format. It only supports +RSA keys at this time, not DSA keys.

+
+
root_auth (variable) [#]
+
+

Two authorities are specified: the root authority and the level1 authority.

+
+
+ diff --git a/docs/pythondoc-record.html b/docs/pythondoc-record.html new file mode 100644 index 00000000..97b5d276 --- /dev/null +++ b/docs/pythondoc-record.html @@ -0,0 +1,169 @@ + + + + +The record Module + + +

The record Module

+

Implements support for geni records + +TODO: Use existing PLC database methods? or keep this separate?

+
+
GeniRecord(name=None, gid=None, type=None, pointer=None, dict=None) (class) [#]
+
+

The GeniRecord class implements a Geni Record.

+

For more information about this class, see The GeniRecord Class.

+
+
+

The GeniRecord Class

+
+
GeniRecord(name=None, gid=None, type=None, pointer=None, dict=None) (class) [#]
+
+

The GeniRecord class implements a Geni Record. A GeniRecord is a tuple +(Name, GID, Type, Info). + +Name specifies the HRN of the object +GID is the GID of the object +Type is user | sa | ma | slice | component + +Info is comprised of the following sub-fields + pointer = a pointer to the record in the PL database + pl_info = planetlab-specific info (when talking to client) + geni_info = geni-specific info (when talking to client) + +The pointer is interpreted depending on the type of the record. For example, +if the type=="user", then pointer is assumed to be a person_id that indexes +into the persons table. + +A given HRN may have more than one record, provided that the records are +of different types. For example, planetlab.us.arizona may have both an SA +and a MA record, but cannot have two SA records.

+
+
as_dict() [#]
+
+

Return the record in the form of a dictionary

+
+
dump(dump_parents=False) [#]
+
+

Dump the record to stdout

+
+
dump_parents
+
+if true, then the parents of the GID will be dumped
+

+
+
get_field_names() [#]
+
+

Returns a list of field names in this record. pl_info, geni_info are not +included because they are not part of the record that is stored in the +database, but are rather computed values from other entities

+
+
get_field_value_string(fieldname) [#]
+
+

Given a field name ("name", "gid", ...) return the value of that field.

+
+
name
+
+is the name of field to be returned
+

+
+
get_field_value_strings(fieldnames) [#]
+
+

Given a list of field names, return a list of values for those fields.

+
+
fieldnames
+
+is a list of field names
+

+
+
get_geni_info() [#]
+
+

Return the geni_info of the record, or an empty dictionary if none exists

+
+
get_gid_object() [#]
+
+

Return the GID of the record, in the form of a GID object +TODO: not the best name for the function, because we have things called +gidObjects in the Cred

+
+
get_key() [#]
+
+

Return a key that uniquely identifies this record among all records in +Geni. This key is used to uniquely identify the record in the Geni +database.

+
+
get_name() [#]
+
+

Return the name (HRN) of the record

+
+
get_pl_info() [#]
+
+

Return the pl_info of the record, or an empty dictionary if none exists

+
+
get_pointer() [#]
+
+

Return the pointer of the record. The pointer is an integer that may be +used to look up the record in the PLC database. The evaluation of pointer +depends on the type of the record

+
+
get_type() [#]
+
+

Return the type of the record

+
+
set_geni_info(geni_info) [#]
+
+

Set the geni info the record

+
+
geni_info
+
+is a dictionary containing geni info
+

+
+
set_gid(gid) [#]
+
+

Set the GID of the record

+
+
gid
+
+is a GID object or the string representation of a GID object
+

+
+
set_name(name) [#]
+
+

Set the name of the record

+
+
name
+
+is a string containing the HRN
+

+
+
set_pl_info(pl_info) [#]
+
+

Set the PLC info of the record

+
+
pl_info
+
+is a dictionary containing planetlab info
+

+
+
set_pointer(pointer) [#]
+
+

Set the pointer of the record

+
+
pointer
+
+is an integer containing the ID of a PLC record
+

+
+
set_type(type) [#]
+
+

Set the type of the record

+
+
type
+
+is a string: user | sa | ma | slice | component
+

+
+
+ diff --git a/docs/pythondoc-registry.html b/docs/pythondoc-registry.html new file mode 100644 index 00000000..5bc665e5 --- /dev/null +++ b/docs/pythondoc-registry.html @@ -0,0 +1,433 @@ + + + + +The registry Module + + +

The registry Module

+

Geni Registry Wrapper + +This wrapper implements the Geni Registry. + +There are several items that need to be done before starting the registry. + +1) Update util/config.py to match the parameters of your PLC installation. + +2) Import the existing planetlab database, creating the +appropriate geni records. This is done by running the "import.py" tool. + +3) Create a "trusted_roots" directory and place the certificate of the root +authority in that directory. Given the defaults in import.py, this certificate +would be named "planetlab.gid". For example, + + mkdir trusted_roots; cp authorities/planetlab.gid trusted_roots/

+
+
geni_fields_to_pl_fields(type, hrn, geni_fields, pl_fields) [#]
+
+

Convert geni fields to PLC fields for use when registering up updating +registry record in the PLC database

+
+
type
+
+type of record (user, slice, ...)
+
hrn
+
+human readable name
+
geni_fields
+
+dictionary of geni fields
+
pl_fields
+
+dictionary of PLC fields (output)
+

+
+
Registry(ip, port, key_file, cert_file) (class) [#]
+
+

Registry is a GeniServer that serves registry requests.

+

For more information about this class, see The Registry Class.

+
+
+

The Registry Class

+
+
Registry(ip, port, key_file, cert_file) (class) [#]
+
+

Registry is a GeniServer that serves registry requests. It also serves +component and slice operations that are implemented on the registry +due to SFA engineering decisions

+
+
connect_local_shell() [#]
+
+

Connect to a local shell via local API functions

+
+
connect_remote_shell() [#]
+
+

Connect to a remote shell via XMLRPC

+
+
create_gid(cred, name, uuid, pubkey_str) [#]
+
+

GENI_API: Create_gid + +Create a new GID. For MAs and SAs that are physically located on the +registry, this allows a owner/operator/PI to create a new GID and have it +signed by his respective authority.

+
+
cred
+
+credential of caller
+
name
+
+hrn for new GID
+
uuid
+
+unique identifier for new GID
+
pkey_string
+
+public-key string (TODO: why is this a string and not a keypair object?)
+
Returns:
+
+the string representation of a GID object
+

+
+
determine_rights(type, name) [#]
+
+

Determine tje rights that an object should have. The rights are entirely +dependent on the type of the object. For example, users automatically +get "refresh", "resolve", and "info".

+
+
type
+
+the type of the object (user | sa | ma | slice | node)
+
name
+
+human readable name of the object (not used at this time)
+
Returns:
+
+RightList object containing rights
+

+
+
fill_record_geni_info(record) [#]
+
+

Fill in the geni-specific fields of the record. + +Note: It is assumed the fill_record_pl_info() has already been performed +on the record.

+
+
fill_record_info(record) [#]
+
+

Given a Geni record, fill in the PLC-specific and Geni-specific fields +in the record.

+
+
fill_record_pl_info(record) [#]
+
+

Fill in the planetlab-specific fields of a Geni record. This involves +calling the appropriate PLC methods to retrieve the database record for +the object. + +PLC data is filled into the pl_info field of the record.

+
+
record
+
+record to fill in fields (in/out param)
+

+
+
get_auth_info(auth_hrn) [#]
+
+

Given an authority name, return the information for that authority. This +is basically a stub that calls the hierarchy module.

+
+
auth_hrn
+
+human readable name of authority
+

+
+
get_auth_table(auth_name) [#]
+
+

Given an authority name, return the database table for that authority. If +the database table does not exist, then one will be automatically +created.

+
+
auth_name
+
+human readable name of authority
+

+
+
get_credential(cred, type, name) [#]
+
+

GENI API: Get_credential + +Retrieve a credential for an object. + +If cred==None, then the behavior reverts to get_self_credential()

+
+
cred
+
+credential object specifying rights of the caller
+
type
+
+type of object (user | slice | sa | ma | node)
+
name
+
+human readable name of object
+
Returns:
+
+the string representation of a credental object
+

+
+
get_gid(name) [#]
+
+

GENI API: get_gid + +Retrieve the GID for an object. This function looks up a record in the +registry and returns the GID of the record if it exists. +TODO: Is this function needed? It's a shortcut for Resolve()

+
+
name
+
+hrn to look up
+
Returns:
+
+the string representation of a GID object
+

+
+
get_self_credential(type, name) [#]
+
+

GENI API: Get_self_credential + +Get_self_credential a degenerate version of get_credential used by a +client to get his initial credential when he doesn't have one. This is +the same as get_credential(..., cred=None,...). + +The registry ensures that the client is the principal that is named by +(type, name) by comparing the public key in the record's GID to the +private key used to encrypt the client-side of the HTTPS connection. Thus +it is impossible for one principal to retrieve another principal's +credential without having the appropriate private key.

+
+
type
+
+type of object (user | slice | sa | ma | node
+
name
+
+human readable name of object
+
Returns:
+
+the string representation of a credential object
+

+
+
get_ticket(cred, name, rspec) [#]
+
+

GENI API: get_ticket + +Retrieve a ticket. This operation is currently implemented on the +registry (see SFA, engineering decisions), and is not implemented on +components. + +The ticket is filled in with information from the PLC database. This +information includes resources, and attributes such as user keys and +initscripts.

+
+
cred
+
+credential string
+
name
+
+name of the slice to retrieve a ticket for
+
rspec
+
+resource specification dictionary
+
Returns:
+
+the string representation of a ticket object
+

+
+
list(cred) [#]
+
+

List the records in an authority. The objectGID in the supplied credential +should name the authority that will be listed. + +TODO: List doesn't take an hrn and uses the hrn contained in the + objectGid of the credential. Does this mean the only way to list an + authority is by having a credential for that authority?

+
+
cred
+
+credential string specifying rights of the caller
+
Returns:
+
+list of record dictionaries
+

+
+
lookup_users(auth_table, user_id_list, role="*") [#]
+
+

Look up user records given PLC user-ids. This is used as part of the +process for reverse-mapping PLC records into Geni records.

+
+
auth_table
+
+database table for the authority that holds the user records
+
user_id_list
+
+list of user ids
+
role
+
+either "*" or a string describing the role to look for ("pi", "user", ...) + +TODO: This function currently only searches one authority because it would +be inefficient to brute-force search all authorities for a user id. The +solution would likely be to implement a reverse mapping of user-id to +(type, hrn) pairs.
+

+
+
record_to_slice_info(record) [#]
+
+

Convert a PLC record into the slice information that will be stored in +a ticket. There are two parts to this information: attributes and +rspec. + +Attributes are non-resource items, such as keys and the initscript +RSpec is a set of resource specifications

+
+
record
+
+a record object
+
Returns:
+
+a tuple (attrs, rspec) of dictionaries
+

+
+
register(cred, record_dict) [#]
+
+

GENI API: register + +Register an object with the registry. In addition to being stored in the +Geni database, the appropriate records will also be created in the +PLC databases

+
+
cred
+
+credential string
+
record_dict
+
+dictionary containing record fields
+

+
+
register_functions() [#]
+
+

Register the server RPCs for the registry

+
+
remove(cred, record_dict) [#]
+
+

GENI API: remove + +Remove an object from the registry. If the object represents a PLC object, +then the PLC records will also be removed.

+
+
cred
+
+credential string
+
record_dict
+
+dictionary containing record fields. The only relevant + fields of the record are 'name' and 'type', which are used to lookup + the current copy of the record in the Geni database, to make sure + that the appopriate record is removed.
+

+
+
resolve(cred, name) [#]
+
+

GENI API: Resolve + +This is a wrapper around resolve_raw that converts records objects into +dictionaries before returning them to the user.

+
+
cred
+
+credential string authorizing the caller
+
name
+
+human readable name to resolve
+
Returns:
+
+a list of record dictionaries, or an empty list
+

+
+
resolve_raw(type, name, must_exist=True) [#]
+
+

Resolve a record. This is an internal version of the Resolve API call +and returns records in record object format rather than dictionaries +that may be sent over XMLRPC.

+
+
type
+
+type of record to resolve (user | sa | ma | slice | node)
+
name
+
+human readable name of object
+
must_exist
+
+if True, throw an exception if no records are found
+
Returns:
+
+a list of record objects, or an empty list []
+

+
+
update(cred, record_dict) [#]
+
+

GENI API: Register + +Update an object in the registry. Currently, this only updates the +PLC information associated with the record. The Geni fields (name, type, +GID) are fixed. + +The record is expected to have the pl_info field filled in with the data +that should be updated. + +TODO: The geni_info member of the record should be parsed and the pl_info +adjusted as necessary (add/remove users from a slice, etc)

+
+
cred
+
+credential string specifying rights of the caller
+
record
+
+a record dictionary to be updated
+

+
+
verify_auth_belongs_to_me(name) [#]
+
+

Verify that an authority belongs to this registry. This is basically left +up to the implementation of the hierarchy module. If the specified name +does not belong to this registry, an exception is thrown indicating the +caller should contact someone else.

+
+
auth_name
+
+human readable name of authority
+

+
+
verify_object_belongs_to_me(name) [#]
+
+

Verify that an object belongs to this registry. By extension, this implies +that the authority that owns the object belongs to this registry. If the +object does not belong to this registry, then an exception is thrown.

+
+
name
+
+human readable name of object
+

+
+
verify_object_permission(name) [#]
+
+

Verify that the object_gid that was specified in the credential allows +permission to the object 'name'. This is done by a simple prefix test. +For example, an object_gid for planetlab.us.arizona would match the +objects planetlab.us.arizona.slice1 and planetlab.us.arizona.

+
+
name
+
+human readable name to test
+

+
+
+ diff --git a/docs/pythondoc-rights.html b/docs/pythondoc-rights.html new file mode 100644 index 00000000..cc32deea --- /dev/null +++ b/docs/pythondoc-rights.html @@ -0,0 +1,111 @@ + + + + +The rights Module + + +

The rights Module

+

This Module implements rights and lists of rights for the Geni wrapper. Rights +are implemented by two classes: + +Right - represents a single right + +RightList - represents a list of rights + +A right may allow several different operations. For example, the "info" right +allows "listslices", "listcomponentresources", etc.

+
+
privilege_table (variable) [#]
+
+

privilege_table is a list of priviliges and what operations are allowed +per privilege.

+
+
Right(kind) (class) [#]
+
+

The Right class represents a single privilege.

+

For more information about this class, see The Right Class.

+
+
RightList(string=None) (class) [#]
+
+

A RightList object represents a list of privileges.

+

For more information about this class, see The RightList Class.

+
+
+

The Right Class

+
+
Right(kind) (class) [#]
+
+

The Right class represents a single privilege.

+
+
can_perform(op_name) [#]
+
+

Test to see if this right object is allowed to perform an operation. +Returns True if the operation is allowed, False otherwise.

+
+
op_name
+
+is a string naming the operation. For example "listslices".
+

+
+
is_superset(child) [#]
+
+

Test to see if this right is a superset of a child right. A right is a +superset if every operating that is allowed by the child is also allowed +by this object.

+
+
child
+
+is a Right object describing the child right
+

+
+
+

The RightList Class

+
+
RightList(string=None) (class) [#]
+
+

A RightList object represents a list of privileges.

+
+
add(right) [#]
+
+

Add a right to this list

+
+
right
+
+is either a Right object or a string describing the right
+

+
+
can_perform(op_name) [#]
+
+

Check to see if some right in this list allows an operation. This is +done by evaluating the can_perform function of each operation in the +list.

+
+
op_name
+
+is an operation to check, for example "listslices"
+

+
+
is_superset(child) [#]
+
+

Check to see if all of the rights in this rightlist are a superset +of all the rights in a child rightlist. A rightlist is a superset +if there is no operation in the child rightlist that cannot be +performed in the parent rightlist.

+
+
child
+
+is a rightlist object describing the child
+

+
+
load_from_string(string) [#]
+
+

Load the rightlist object from a string

+
+
save_to_string() [#]
+
+

Save the rightlist object to a string. It is saved in the format of a +comma-separated list.

+
+
+ diff --git a/docs/sfa-2008-08-08.pdf b/docs/sfa-2008-08-08.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bf99df95c2a23ea363f5074b9dee95215b93fe40 GIT binary patch literal 469838 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

^`E*-G`2n2Qg5m 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

  • eiL!j=DV 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

    (8{c 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 z zx*5NeF4Bj&u#lk#QE>iWN7NU(;$g7j8qlSO`w}Zp#?LDDw0Ux!wu-fg&sHgnfmIs!Io^u&u|FqY1_EBXzgTN;E1AFB6ajbZDUR% zb!Z7v7wZsmg^;$l&3GTViu(iP9z7wpy71hs&KiNO+0SPju-b;Ax!xi{I@C7auS*8& zflKc3KP~0nv2Cn%u7%C(YAq$K95Bv>wlS|9aMoCdD=2>*DZ>|}TMhe))9s5Br6O00000 literal 0 HcmV?d00001 diff --git a/docs/sfa-2008-11-03.pdf b/docs/sfa-2008-11-03.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6b51abd47b9511240fd435d06596b7542bfe99b3 GIT binary patch literal 257479 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≺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

    l;`1G`bNR=LygD}1lwU8!EEG+`5^5oj2b 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 literal 0 HcmV?d00001 diff --git a/docs/sfa-impl-2009-04-07.pdf b/docs/sfa-impl-2009-04-07.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2eb49c2b0be2cc9b2ab514a3896baf96025c4205 GIT binary patch literal 487170 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ഴ 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∈4E_t{)5@)?2D4~Eyfh)I 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 JR#lGt{{i!_DBA!4 literal 0 HcmV?d00001 diff --git a/docs/sfa-impl.doc b/docs/sfa-impl.doc new file mode 100644 index 0000000000000000000000000000000000000000..5e1aa7974b2b4fd1bf99c9548a3a83a6c3b31ef9 GIT binary patch literal 200192 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ƅoRVb1cRqIGQiLyWf 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 bw|!^YS=DnioTcSl?qSLkqMK&n0}KBLCend1 literal 0 HcmV?d00001 diff --git a/docs/sfa-impl.pdf b/docs/sfa-impl.pdf new file mode 100644 index 0000000000000000000000000000000000000000..16eec4001fec261da25de743f85dc86b497aa81e GIT binary patch literal 430040 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 z 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%0DvrdiaF7d011XOm4d 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⪻MXKmWi?Qv9aRFxYM}Z@}(cf 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 I4MnQ|2Ql#)O#lD@ literal 0 HcmV?d00001 diff --git a/docs/sfa.doc b/docs/sfa.doc new file mode 100644 index 0000000000000000000000000000000000000000..55f3c6674bce30220696577d677478c703593d29 GIT binary patch literal 107008 zcmeFa3z#Kkc_;ombM4C}i-QFa%|o5oSghnz^9@1J&nLch}76szX(s z?rAYb%*0C&qky8uDEdbuMg?OyNi>^8lhwG%8lS9Dl4sqhYj(4)>n+A?bd>+|d*AQ- z>Z{Y;%tT{wgU1JZ&Z(;J@_z6AR-gHcQ@{Am51sQR^n9L+rTF2a{aE4sz68LZ+wZ3U zp9W9^@WV$ReUv}{Cjfs2;L)Fb{-61L?cE>49WU=+2K?XC{!q@gb}DM9p%3`=F7PCb zA09t^<=``C`7Z*#$aB6J z_}bDEe}2@@|9SDkPqwEo{QcJNe~OGzJ{JF;yG!xu+!rg}*-!rs!2LDgZ*BxG1O)&1 zx&6g@{-fi1r-cu{?*!cZ_V<77k3BE$bIrf@;Qxjniyysz|D_+YbUxGj*M53`@BRMo z^+VqLnpMF683DG|fR$KPTa9`Rpj7$U=coHquh;jr;zqRYiZG9w!IfbnZpFo1uq|s$ z#YNO8I$2b&Uma%ITrd_DQI@C4NHCVgNh2!KWN=@aL|L#enu(K!|NHK6F1R{sXHnQ0 z2@VwD)ZpH9Jj#k-Z`^3a=BM51R1#dDrHxiNn;+q?`?g=OYu~QH{j!wtC@X*3S48cp zC<*p8re?$Okzijt%!;tSuaOo-a7B28_ioGLm!wHpAFS7RWZ^^+9E`F&PLp8$=!Ki= z^=<7eZUq;O1RE~A@RGWG_D{umFq>vaf;bQIPP?6EMbr%9B;fGD_*}4O-<82+7A8d= zY~QnQ-G!SsU3l^O%|Vzn_4}5M>o;xKFuH1gINpkabRyWECPkDKdHwWY|FzqL8`I#K z>(_03W^l&({#{9trOi&Gh|{G1^k8h;RnOo1{40Z-_ot0ZHeY=4`U^K+65Kcy)Xvy= zW_?4y06A`lt$e|IH(luN-PpfvJTJ0P243Xu^?LWFGwT~i*9Y6v>2{iMnG27-!Ml4y zAQ-a9og4Me&1cp(_3sI%qdYh-*wu`ZBA$q&Y>|gH=|fx2tZy1!AMA}LF4jjb;n*94 z{c+<+R4ja_ImY!D^43kk_AC;JEOwNe%~A6HEyR*2n+O|=Y;m(W$@S~ctZylyHy60) z7F^S2bENAx@G*0yCwj&l?)r`L%;@@HSCSWDQp8~qCzC;_n6dDD=8WyL8-lScory_~ zCw$Z#`1(yc?M9)gEN!(;_@p`h^_%s{O}fBfS2B@i)8V3Yx7lEWKF9eCc?8#lNjMoz zM@exaSQ+eCzvayOMg7}4#Z;QbFOeyQS!`=GqCB@dSr}v%Z7w>qex~xLdfn$4%C4Ge zqazDyMiX%o-q&yNp-X!njTM^bE83hTdSB#JCmF(&Vy)TBF&0mGK*$|v{T6PxaMG25(}x! zL?c051kE(cgCs42MkmXnq-f0rQ{hY$gvnfxPE5p&m#0Xy29FhDYnA$31+9#Aj~3O&Z3Dl<8A~NF@^6$n#qIF(IU!{u+^Fi z$Z&XRJemq;;xywV#Z(k$L3C>;Zj+1@$2fA77vXp-&Uvg+FcnWut!qUyQ7dStt++v4 z2@of69irOSh-KLbWRavF%Kpm37V08viwkqILN52=2TpgNe8MR%_hUd@NvUDi|~ktcd9OP2XWGjXX0ij zY`MpY)}b(jI1BQ)h(;YjOn34kn2wrpSO`7`6KSiJ&U)aEqkL<98-FxNz%y({jTR{& zi}JLSHKHJFwNk@;3HMGOPDWLPbsXI1x}AjFQ%RwbQZH>OsEX7f&vew73X?dWR>Y4e zL>qdH#6?RLDhGr&w}l>vos=>{rNM06Y6as_Fx_btF=4M5Evt5#>c*gsN^N(QMG3 zn#xT+EI7dP=M^wKd0WkCUx8qNK<|;YV9J zN9LUhnP@Q;CPA7+6>JZ}CY1_`6P|f9&JU+?QUr~()r!>8Al!-7xrjs}s>fnDdn1d8 z-h@FrZFgGyB1#4skRoo0%JM`p6&ae%I*CX1>#UyPfJY;ZcaH}9(rJ<0BD8v-B;qp6 ziQ_X-5|i7R!!5NQcN%*B+-)l!&q7)xJlj^7Om;|CStlvtY2iEJ96@W?Y?Fo}-(u9P`yc-BW@d|&Y4Brf1Id^y0yN|keF^q z_1|JH7`kTLFj2BsQ0F`}vL;nnOD5H@x_7?Sz?TQ2v>d02sz@H&RfVs7Y9xpfBNGVY z@`5S>5!InIlR=Br>PFNNIv!6`@`{c|jgFIc3$fhUIG-YtDF1PDDUTbiZ&Pd!JaFt= z7#v)xucT0LizaW$WhU)3rU(i01>WtS^#a0^M{uO zskGB-%CLI-bezj-BJQD+tD+qeYw|Q9mlJWWEF%yelBF$SoMhz2iF9x1Ez7zag*|an=q=a9jKJoO^nu^ zRh@hPwE8@G$#j^_1>>E#CDb|IN*hNkbbLc)G`KR&g6L>C-EPTQmvlEBPfk%pWy)@Z zyAjKplgbG?1^t9!(CFkvIvu}62tP~pXP!D)&SVx&Ps#? zX@p)W6}e)EB2)#aQ;=|-7U8Z2L(%Bu=t!`A>;P5S=`@=gp`bl75{!pQb2e@kQ^P?k zofPF`-eVJSi!vl{WO18%?1)$-LDHEXr`~N;gt?@cii)@~|M_-E4;C59Y^V%zBFu}R z9TrphuxNF;FP$4DU6Pi;<)zNsMT7hnBN=;vS>OjsAVaVh?(i!E~*ok)7pU@ z-AqNLNXvt8CX8Exag@gSJT-zpdkUEY6Nk4Ue^UJu9Vk1=eqT*6eUS4wj|UY>%nVvYtw!q$e%Q9bahlgr*~h72UwV5q1`**QL^FdvT-r;X0US<#`c zPL{#lmVh6c71dp&I#(Hljaxf$Cj7@d7BtefGl$%h{(gr=x{c3?qd^aei)C$0xnL^Hnl!aUyD*BrZ`g`P5a+2iO=c)oC$e-}!7R>@kziUiC%Q~M z<*7)6nK+s)mll#s+-<4QamsA;9@PZ7e4Wr5n)cp2XoPK{iF6`prJ)E6Qf#S$5+LiG z!C}M{pG$(Um5Zgv)euxJl*OYJB}??!Gzp?)CeG4?BsNNao@`f^WbG2MIn1op2UJw& zVJuR0oQiZ2&xk?CVMc>%X<7zDNt&$FOT*^O@&)B`Bb}b^B-V56AaQA+LNN@APLf2e zk>KFf+xCnEjW}y`;zH23MKQmQf@(CV)BF>&%y`B;Q%{^;#;r3?NIUY#_27&o3nwSD zXj1&!6*YqdtLjBTtCmby=rc*_G2mIX;^c_v-Q!{7$T;t}E=(du;*Y$KmYx5TB(-7}JXRmUt+_H!{|^I>y)Mk6&`n_U;?Y2tTUrCXt5r2~o<8ZR zreZtM{G%N&q(RL@z8Z`2UWbM%7nH#^&BhXjAH>+VdbyIQx|=OcmUbK+VOiLStgv%7 z4YgARa%--%5+!)Tkd92@TYy5Qc{>#EZh6I?L5ayDLA%vaWXtokK^w1WElCkA7JbYi%IwKLnDtW9?x)mn8g_nwkSmN5^t8H*B9a3l|qFWx6=F=%wf+@vWVRkrkSa>NW~m z@q};dT* ziy$Op(L(l!?A8^)vrs8kkLJ?_B5TixU{~Fq#n*2SopUf z&(L_97EzPdL}A>dVh)knihkHgn__&@U(lLRa1zx@yyoev1)NEwKgtY6EwbZaTw^oO>Y0DhJ~|%p?92dkHRvic6Hl6mgU>8$w_t*g-pd#5e#%2P24; zmL2@eM(M6+5L5Jwc-k9R_hdYaN{th75*H;MsHf8R(&>uaMpduMqKPb$2$@@|8I@t1 zw5hhlsE4z{Xf5_nOjx!@po+KC#B+5vC7)g#=GvH_Q$%fx5n0rxYq?n}*`fl7MmZ5S ztPkF$DrjIWPG-{93}>8WaC&?lhs?LSQ)M(c&T``;HVC)KqLeww5sgQAvCc$+7b7)A zTdJ8E1%+lpL`@wfY&Jz*4qL%cJIbcQb{QIoMLjrQat!j_%u!}92+=QIwj zB2$`qbX_dwYAcvjb;~V6%5ienT^1Ij!8JBuQx2r+=D2vmE9SpJV^NrBaA%!Fea7Xp z0e$8ML)&2%PD?hKAa*Na7~GMALk%^GhDrjD(_}d4Bsxk{R6#O=a^NTy9aM(u#Uh#j zyx@RYntdX|DCA1Msb*424Ra?08(}+cl2;o3G<(fdXb@1w&Wu+A-|V#(*dtKP;hB zu>+k_fXl@Be!fPBQNYsQ1lUCo4<#FibKlpK*p7LThBX`e=u zf(=5v`Ba(}BSAD1WpfhXE9NX4HqkR#rttwV#^m%(t7lxbYsYB)s$DxIY&k7!7!PyO zws`nNzBe?CCjqq5Au7g?j8D}xDLA=&rOH8}K?CoqT|3AqtWqZkAk%2XMXt|=^s43^ z<0X@bgLrA3Mk6tyq$$jpIU(awB>L&3m2gx%I;75mCXxi{#GP!8D`>RBc-m+vrOLv` z2z0YZ{*#7Cks8@;uW^B4gPw-goLT8;o!N4d%VXR@cBerj%9zhru46nVG8gG&Wav$z zL2=a3U`Sl%TW#e@1eXOvW1aC<+;~AW7aTaSYsW}%wNb!^1#cAxOI#Hd*e-S|ZE-ec z9Au)ch|js)w1EO|C}%OU`zp>QG0*WiB7lO7lDI^P63lU$sOyevlv554B%*!`pbn@e zS>`teH@tAmmWyt36s6l34YnobpLgYMsCat1!vvEk7>WyOqjS0^HQY3UR4!k6Ts|yp zARN!rR;SP>P2i8gN$x`)H{dI#GNvWjBqWWG8@f@Ct^+$AExEYH)Pq{$%uLvdo0k%B zd5}cP*Ty6IHAM7B&3me{o|`ST1Zt%={ZkGxW>Us%q6aY*i8jMTCPQ9i-ZN1aPms3~ zRp^s#WOMC;e)#rO+~8pwyQLL{O|h=&>K3P*Fo%%PiYakY>!v-DaLz1EC9cH344__5 zVV4j~bA}qo5139N@$}h9Jl1hC*s2u@AL1Pw*A*S+ zHmHj_98YJWVHJSJvB;gtopR0HuhyE}q<-(oD3RnkV*>j6n1iwL>~r4nPST_!+YN76 zdO0guaz~QO=nAIGN`Y+;oW2T$Tak5g@_GSUIoW7X#XmBMpuMy+GXE>4pSn&ywlQaVdNaU+3_~JY+^15yE@Ysw=ZoQ9^+vxAQ(joHl-Ah_}j+d{)IM zI-jS&%+l#NkD7)YsUJ0r7U1R0IHth>rsEq1;~afuqZFPg3p)3)WB>~ z0jkWcF#3eGRoCfI!ZTdCu|QoCqMT?DT5@&C3XL$) z(Ht>oI#jdMpdQnTn=-AWJjGdaq_jTl7~C7-Mk)!0=vZls2b~FyZ6%9pudns&uhXF5#QF@08K z5y!}bp`Cm840E&O`Vtssu!~Ma!YrfWO3KTFW;z|lNf{>gB)y5Y$Z5I&tmv(xUy={e z>8Vodz+Q>ZYu*(f(VOndouAWb*kNNzb)sO`7;(_K^uuN|V|bRx&LO5lW=M!LqIX;o zOIGLRXuMy*M;)x4GTqCKXVMAg=glx!rOUTl;?tU3C??jcC>9PsLFtQF$iD2`KY+*q{kzgYQNy z3*D_U{Jd?;4x3R+obH;0l1Ui9nm{H~IEzCeFR3jG3#G~2o6Ba4he46HOfy73$EC)OOBga#2PX2$ygaG zbNx#(Nzizu0^*Cw;s!I=HPpG_T1V)KXhal!;w>PWR$XbDJ23y@ISB;{ItvxJNNU(A z(j=W`s`544NKy>MOj4NZoaF5q+9YJF13faM}u93v7*9-Sh9@ZuwA{lvSVtvA~L)+For`eP3racB;awe zMuLAH+jUdS=e#x)HDa(UEL;kd3~Y04rl*Y)Y@X-dODM3aQZMr+sqGrGte4+*?AfRE zX4G6_46~Q~jaiPbZqOkwquAyAiqlM`t}6|wdU&d7M0HZ*XeS@F!Mo99t`XFAlPW1n zV438~V9$%T2V?0N;m%488hiU(^iSLw!ayn1Rpj(evJi&R9-k)%czDkLQ^|p}$#3)A zUB&>m`?1lY9%_)-F=aZFdQO5Ql;?UJiHRW0!Re(2bqMuP!oF>}@_RbTC6~ujj82Ls z%&-)^9PG!ShsQ!J15JZp%(&%*UdrWS=%vf+K`qDKN2AVYoMdr0+6-H94|XYJHD%hl zKU`syxoiPX4kN^x%>rtq!*%Y{jGA>TF_@i{*KSjnPP2Eqi!2k7CBU37c^ii8L{bFyCgFa6-)2 zbMRwVE>_u)?DNt@m2?t5BNbRYwGxC2vvXn1x?FX3SZbj0RiU|gB<3Y;P&cHu;DO7X zfeIrN@$ETCYJZds{sJmTqZlD|M$EsnK{gxvg^p{x}wD&~1?YVv8&%v)cn zBPf|zI^aU-LbB;AI(L}>M(th$*gZta$ujCA^aw~)wxTFjXR%&jNt(|s8ryLAL@J3n z6ZGoYWc~UzEUZv(j(Afmn)F>Hi3aPf#0phEy;Z2^Y&y0zMTJ$)SIB%25QEg^B@A&Y zOqvs&7G;ADPJf5z-syz}MH>qWi?}n*hkS#`$_&FYm@N_E zV00IFYaKD*Q_NAyCUVhfsbO2)h+VkJ2dbx?>}KOrxw%~J==9vp{%S{AS8%hO9{tMY z2~!6hmn49sxsDQRzCU7wjvPMEi*%5a0*nzOdn3+Fj~JYh95)s}6slDxG{H=Dq|Jc$ zbHW$2yLoP%JmOi68yYR9SQ<%=5a#NUk|#yfWzlrR{6?PYElPQL z7Tz%2yOzsZrmt+xO*GFj!1M8jc5>G`zm0jQteDQnvKHU+6YC52j?Em+kjo%jr-qCq zXq$`eES1E5Idbp(Y*A7LlJlNvOA8We0a28HmsNzpLK=MUU@$4bCV1} z`k*_`80NVNlUhwn3naZqwcN#~yXjdlv!ua-@}`vDSp_C(WRXuQJS;#JdjetM7xxzQ$=fK$q47|Q^C@M zA3pi02cz7Xn|4HF8Ulur50U!Hnqwx!OvF*EnQsm1L;H#_EB41s*V|!IONQ&T4hT|{ zm#+CfLhSLh`YTG0M@FSUqe(V(MPwSAD=__Tj$mMA?MUF3 zblIMCR={spcG<2(fF4Y25NGXRcZQ_i0^EAwCsmt7f6M~ zqNL{X87^O5oGW3JgF}lEtEsPX;xa-u zjRbW*8(bFb+ZMbuxQ74ds>p(un(i(y4G!c{Ru7YAopVUC!LA#En?{0bz3Tm8QSaPv z?pEnOp?8~l@yCAjn)1;Ddv}clSBJ&bDSIyL8WZPLWgfR!H=R6Fwo8z?*e7J4RB=@v zmVO)V!7&L^Y-={Nkzi~pO(M2R3FFpCz-BZ1(<4!m-w@nX8A0G8dV*o}>I0w`P>5Zd zfiNIJRI)J(m9wT)!InSyqRt$>v?>X+ro~KW<+A_LPT=_2BTHGcrQQ?H3jpMX;MNGVxc)93=c`ix2 zYO9DI9hnA5DivIBBCW4dg7gZcjQfIkUM5|;&8cZvsatmj5x1?=YmKMcC$7VZu5vWE zJ`&YMs~}j-W&AXD8#Zfgn)#ubdI0xrBSTOtOd)Gvp?!iZyOee@iXlZR`D5bF8Ll7% z@yxOc5prt5NVY`O490ei1VUybfu%8>x1@vWDajal6tu$esFh1F)$(E184Fkl)FI}_ zOiZx-59cv1$gr@Rq#cBoK{_qni{M6P--58=_V?p0dG`OklI)F49vg zS%slsDZ;FrUtXkI6J~otG0`_>Ntxd}z!pyQXHA@+v>1|3t5aB-LtvJ)Lk0Ba0-f*VN$!K?o`rzWs#P*nN4wlLa~mWSc6&d z#3cljbp&odaWZ*&2Bo3rDjL^T3#IPE3erNUC&u#f{Nmf6C*}5_JPL zqauu%2}hCKoMW7yw$A+cuA|bPRC?++%yty0i3qL2!G$O~bW6xZQKJmN=4&v{NOrLt zyC*dRo#J9tEX%pJUt?u&UPd1@gwl#aSFP(=O%8HmgVNTvr^il6xtK8vySF3+7AIwV z-KzU#FppJAqRDGs9E+t&+9n(5kp^X~OUw{9i8bQE1W^?YOK*v0xX^v7UE(sSH8ObG zTMKUb<4~BLnL0g)#vVdnQon;E3vBf2fM&n205BU_?fKVafU5dKV;nGQ2(vI~I zNvAOh{3}0}hz(^=)3ALdPUFS%%7Q9+D3zO3k}H@NpdVkS>1lN|q9Q$=Fm3=wWmtJ7 zWx1jmF(HcHsaMgib5*{^faFRc{j90CZOzIBv(P1s^wQ(Rl5(&dHqesGEQlKqm zM(Y}_FwcEs-_}`>f?IUaSwf7Z6QCegT|3WKx{)y5P$Z7JJ-n>NFes!^E!~#ReW;|yN`uB!$y z;}h(*8(VcL^JczOP@gyHjZykqHR;Q+-jf6S0RT0ir_IOU4+Q71Op6YQCNM)}D+GXO*FE`HS7}62P0C9`f zAZ+zOMJ(JNwpvjpDPz}4BChvO5$w-D+GZ0G>E1pQx1veO!ZP`o7GvEgy+~G}qjC@4 zI+>v&)lJF@E-jZKxTK3>=B!KJCy-RedbGeFy-~xq7+{y$1q(>s91`8|8Vbz>Al?wjzm8N?(X{UE%#9CtxJJ@RP zsmjq;3CLLqbZyymc4e|ADYV77)H?H&STS}1&C$U1GiJ(xb@NL8n3w*mIhoRenQNAu z74eIOy&)e%ElO6@rA3I?`KYXwTUmI!!ZJ+oM+=Vy_WpT@Dq0=Ln?XDSQYy_OWZr;c zHmO(2$tp?i4O$X%r#nmakLJv$GK|fetE>~qqIGuG=BPHCa+5hH0hb`GNf`$*hd_uj z=G@s_GnZ*3Ss@F!TPc^E(U6Z;Fj?i&);e1+>rPj?cJM3J=N6|)zH+5Qj+LfFU~XmD zYOP#pio42R_eRqx`&J(i!gmkRMpcN2C3!s3=+V%9ZVSr8uQ@^ioxd%+FUv zg{mWxp|h`l3Q}!qO>a(33IQSMoyZ{IT@k?B&Mae4`LM!yfX1WGl8 zP$DATdh9jr%-jYupNteF&bs{k#|lMz<9TgRyeKpyd)6>^u9Dt0yZ*zWg0<3v%GCOr zUS(w9CP3`^9D7pUhy;7uwj3gKt>49{$e}l>aJG5# z*+MoRuq?ya0wLWF%Gt%NFsVk;pkHzyY39&7MTF6K1cigD#IzrT7n2PzZf`1jBh8!h zeSMtQZ@MUqy1`=WRB{QXZFc}MWfy{G?nOQwt_iAHM@V_<)^Dg_D33Ldk9vUK8n~V+ zLnX5rF)!^Ht}D-4@RD+Z1uwaXC8@bJQ@u$vBnAyRI!)~xf}4WNgy&TT^X@BG7FV~~#Vwl=6>v06DUDa?+l ze$5ICF_jQf0H4hnSBdio7z2p<=(>c}S3dWVTq0Z8ZA7T?F_lEi76dkXS$ef;J7U*7 z#P%3rnt-CQ9^SBZPTIBPMB|jN^&o-pIf|^Ny4RRoQ%o(qY4scSvQFp5wRM5iNeNWm zI1x`QHd+?(-8C}{0g+D{PH0a_{jZK$(ka#~RW>SmtyZ~eHKK(%GKL`85{93Pb>rch z=qZ-%7JudsC0X1R?9`?QwL^d)7Ojp=Z{lBqk;wbC8THJS#D#^ZTX z%d?zN7bexC7DV&XQs-0aKB;gs0*#iWfmJ!RNp$88jC-OIK9-s!4_PLtLWq~jbTtq| zrz{oK0(o`Qn(mWMoZ2>n%v{jaGW(zjCP@-{oF{h`t_wmerSQ}-a&a)Y!K5gZ;TDM| z`&?cHgkflYI;6i3VMhz0gT;9luJ0i!(RN0IYZJAfye>IRzAK_hsgII4UNS)sq9Bjk zsN>jnBSc}-j;=`g3Lgm)l@Huy`o(IlHTw|=bC~5rrGLz(Lx_u~+^2rGQyEv6meV@F zf=l#}@ViF!q#&Jd0EqLjITI#qO~)gPj<(I~e|XiV>`U`9zIP`W+Q0n@iCo+D@HRWW zq$i8R-E_bbrXa<6yv=5qn4=M^OGDo3J?1^$&ID>!KAV+juaB1WJCwwU>fS0RMB7DT zM&;4aZDv}nN+P&Jd(NxL32u=Rg7sPfszoI7E40D$VE^_jyl`3Kauj&-*(usBK z?QK(#=Lwv$#!N6-8rdtg%j-8<(l{+IvJN{KiS%R`$%Y}lr-#awDw5cj|5$@fb%Zk3 z17Hs3nkU+MRj2Enhm60}M0$%j8EsX$;G!KmfPtb>^Nf^c4v|&H z#&((WlLHaaG3x_H)Fg?E4Jn<7wAcGYJl~beib=ivxkMaygxr|wNpu*QrUhl^m<7*z z^d2T+l^!zxG{jb8*@~Q;h^Z2PO8mUXs=TBRsz#C^$=;AgSeJfS0>e3UH3mj8nfC}u zUlrnB7h3tqJ>_0yp_2bf5R?fvC1_+8@fq?hTN;&Tt50T&DAx#EY%jsLo0)!DBXoUA zS3C6q(`BszJMoe___Nb8J5%Sxnleg2AUHH&D9=(+1tr+v%T$6>@r{#?iUxD0%3o~e zzqOBJ!2}lm(5=rBDMi>cizh|TByS}8xHYo0i+$$JD?bF})&XGfNi-R0F{nBFxxO>1 z;`cPN+GvADa+HW5RYq+lG&nsiI%>M-vD%n+ykeR&B_!*(CE>}1%<&Nd$ZG{;NtZj& z`uQe1@=ddYhHYr0?vI5$--1il+VE^kNtCJvyhV@@^`wD{X)?j@L@V>9X1-B zENr-JlB;&@xGV3mE!h{+cAE7hx~Ls|RT*1aw3tIKp;T=z)hkyV#VfmEJ|T^2;;H2t zyJb}?Mn(3r%l>}y!(VP z`qEdX?18-=-B2dgGBgechTi6EDBM=frPPC!#Zz78C|2E;!<0k{2^Y;fLD$`t(Cfhm zf=17P&5&%`75AzY%Vnm42#4zCwfn2*q`H=ED{S5Yhn5BDvZXVt5M^l9qFy_dY-vvU zp>ry5&Bka7S@>?O(+W?RjK!8DCt4t4z~4&Gm}f^xqJxVwl7KvayI_}VBUvuP&uDZl zL(4&=s)3od?j>HLNAg{BQpU}W)bjd0laOR$Bnz(3Dv@eHOFvan49nRZi*TV&=Lu(# zU^`4a36i)}ET>v=gGbrt#!LQTRwkQf`bE>OI^9hz>B=3kV(c4pyo)2{c(m-i7X*qb zRLOs=+)L}r_K`ORAeU${zMNj{LYp*M;)rvH%Zn&9-_+D`7JTDQ)TXSNW}-$f?5tOx zPe}(gcY@RyOngKEonJ~^Q$iP kE-&OJ)v%pEY5OTyX821d>`q!nBqMiP5yh`12B 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 literal 0 HcmV?d00001 diff --git a/docs/sfa.pdf b/docs/sfa.pdf new file mode 100644 index 0000000000000000000000000000000000000000..873731bd74b26838fb4eaeb07aa13c0fc4ddac45 GIT binary patch literal 247679 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̾=Dis{moBHI!KivL#GWafgJR>U3! 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

    f!Goae!Ph(%Hc2h`uglbH5jrGuiK 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
    C?#y?QtJ%xp0akF7bp@`h><51`Fbv zH79Lo<1rO!Lv}keM?A%9P-S(#ZC7tw?ostl&VYFYQXK17v7cYblCr0eOS6(s?X+Y!$ef^qFvQJksPB1>W(<+d6slb6<%Mm_s<@7>a)!sL zVupi&d$np;R=#j4?~f4KZM(WrAOQ=`LZy3si(Ie<797d!2v@WTm&&w<(pW`VZJm7- zT!{3Ev{v!gKs&}SC5a_qZ~;8;8voU2a6adjB|W3t9q=dpXRT3qo0~xOW&vu>o})f@ zE6&nBmXmaudDLENZCSL;W@Vdi0~V3#Bq1Js7dSAC!h1L1^0y%0D|tzUJv3|vNZvzV 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

    p*%3^>3507v^cYB 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

    @D-@>mmjX?M1G&!RmoSkdh%6{ch&H5)G>QVo; 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", length)[0] + return length, key + + def read_values(key, count): + v = [] + for i in range(count): + length, key = read_length(key) + size = 4 + length + v.append(key[:size]) + key = key[size:] + return v + + length, key = read_length(key) + key = key[4:] + key_type = key[:length] + key = key[length:] + + if key_type == "ssh-rsa": + # prepare parameters for RSA.new_pub_key + v = read_values(key, 2) + e, n = v[0], v[1] + return key_type, e, n + + elif key_type == "ssh-dss": + # prepare parameters for DSA.set_params + v = read_values(key, 4) + p, q, g, y = v[0], v[1], v[2], v[3] + return key_type, p, q, g, y + + +def convert(fin, fout): + key = decode_key(fin) + ret = read_key(key) + key_type = ret[0] + + if key_type == "ssh-rsa": + e, n = ret[1:] + rsa = rsa_new_pub_key((e, n)) + rsa.save_pem(fout) + + elif key_type == "ssh-dss": + p, q, g, y = ret[1:] + dsa = DSA.set_params(p, q, g) + dsa.gen_key() + dsa.save_pub_key(fout) + # FIXME: This is wrong. + # M2Crypto doesn't allow us to set the public key parameter + raise(Exception, "DSA keys are not supported yet: M2Crypto doesn't allow us to set the public key parameter") + + +if __name__ == "__main__": + if len(sys.argv) != 3: + print "Usage: %s " + sys.exit(1) + + fin = sys.argv[1] + fout = sys.argv[2] + convert(fin, fout) diff --git a/keyconvert/test.sh b/keyconvert/test.sh new file mode 100755 index 00000000..5c5744a9 --- /dev/null +++ b/keyconvert/test.sh @@ -0,0 +1,33 @@ +# this scripts tests the key conversion routines +# it converts the _pub files in test/ from openssh to openssl +# it then verifies signatures with openssl (see keytest.sh) + +rm -rf testout +mkdir testout + +# rsa1 keys +# these are in a different format +#./keyconvert.py test/openssh_rsa1_512.pub testout/openssl_rsa1_512.pem +#./keyconvert.py test/openssh_rsa1_1024.pub testout/openssl_rsa1_1024.pem +#./keyconvert.py test/openssh_rsa1_2048.pub testout/openssl_rsa1_2048.pem + +# rsa2 keys +./keyconvert.py test/openssh_rsa_512.pub testout/openssl_rsa_512.pem +./keyconvert.py test/openssh_rsa_1024.pub testout/openssl_rsa_1024.pem +./keyconvert.py test/openssh_rsa_2048.pub testout/openssl_rsa_2048.pem + +# dsa keys +./keyconvert.py test/openssh_dsa_512.pub testout/openssl_dsa_512.pem +./keyconvert.py test/openssh_dsa_1024.pub testout/openssl_dsa_1024.pem +./keyconvert.py test/openssh_dsa_2048.pub testout/openssl_dsa_2048.pem + +# make a test file to encrypt +echo "this is a test to see if the key conversion routines work" > test.txt + +# test the keys +./testkey.sh -sha1 rsa_512 +./testkey.sh -sha1 rsa_1024 +./testkey.sh -sha1 rsa_2048 +./testkey.sh -dss1 dsa_512 +./testkey.sh -dss1 dsa_1024 +./testkey.sh -dss1 dsa_2048 diff --git a/keyconvert/test.txt b/keyconvert/test.txt new file mode 100644 index 00000000..0bd7ba19 --- /dev/null +++ b/keyconvert/test.txt @@ -0,0 +1 @@ +this is a test to see if the key conversion routines work diff --git a/keyconvert/test/openssh_dsa_1024 b/keyconvert/test/openssh_dsa_1024 new file mode 100644 index 00000000..f6c3f7db --- /dev/null +++ b/keyconvert/test/openssh_dsa_1024 @@ -0,0 +1,12 @@ +-----BEGIN DSA PRIVATE KEY----- +MIIBvQIBAAKBgQDx32kPfS+uiVq6pqgEGORLZx0EfSXvlluD/nKtLQoBxDY7JntP +oVyI29KPVSnsjqEAVI7r9pEJ/aszrc4jLj5dbjqehLF5qnkrr/XAcTv4MsxKuyDy +6R0AhU91YrkChO8JedxbUdf6lI3DLREaRIvLhHew05k34W0dGdEV/U/hvQIVANT3 +PYXSBKIShJovHfC4YQ65kOy3AoGBANs/BTSWWUEs3jppa65VZV/8WbV7Q3uV9PVu +Ljf6E9DKFI5PPbJOMPbX7XF3zrCRtiTVl1dTc/xH7LYXvHTVU469mRpdNDwCMF5r +y1bWbVVKhIrcrlVnEF3+up2jD7Xu+tfIn/YmJyrHhvKV842HLv+LAbUJbMQ/9POt +5w9RufrNAoGBAJYsrPd4VhUQwTzWW/LQmIevjT/X5T2putWXttsZ1KzMP2qi9rf8 +GATnPJahYq1DXgNSPcqIHF5FUgVEITJ3R/CTCFiKF/+N5yBzEXmbo+HGG8W1hKnp +QdzVKZq0esGwEKfkZ0lUPJCh5IYyRL8ceh8KRjEFSKuSEPZqwrngklw0AhUAg8tD +T7VLBFkDCC7bhsKqFkJ4AAo= +-----END DSA PRIVATE KEY----- diff --git a/keyconvert/test/openssh_dsa_1024.pub b/keyconvert/test/openssh_dsa_1024.pub new file mode 100644 index 00000000..d81b006a --- /dev/null +++ b/keyconvert/test/openssh_dsa_1024.pub @@ -0,0 +1 @@ +ssh-dss AAAAB3NzaC1kc3MAAACBAPHfaQ99L66JWrqmqAQY5EtnHQR9Je+WW4P+cq0tCgHENjsme0+hXIjb0o9VKeyOoQBUjuv2kQn9qzOtziMuPl1uOp6EsXmqeSuv9cBxO/gyzEq7IPLpHQCFT3ViuQKE7wl53FtR1/qUjcMtERpEi8uEd7DTmTfhbR0Z0RX9T+G9AAAAFQDU9z2F0gSiEoSaLx3wuGEOuZDstwAAAIEA2z8FNJZZQSzeOmlrrlVlX/xZtXtDe5X09W4uN/oT0MoUjk89sk4w9tftcXfOsJG2JNWXV1Nz/Efsthe8dNVTjr2ZGl00PAIwXmvLVtZtVUqEityuVWcQXf66naMPte7618if9iYnKseG8pXzjYcu/4sBtQlsxD/0863nD1G5+s0AAACBAJYsrPd4VhUQwTzWW/LQmIevjT/X5T2putWXttsZ1KzMP2qi9rf8GATnPJahYq1DXgNSPcqIHF5FUgVEITJ3R/CTCFiKF/+N5yBzEXmbo+HGG8W1hKnpQdzVKZq0esGwEKfkZ0lUPJCh5IYyRL8ceh8KRjEFSKuSEPZqwrngklw0 smbaker@test64 diff --git a/keyconvert/test/openssh_dsa_2048 b/keyconvert/test/openssh_dsa_2048 new file mode 100644 index 00000000..b43eb653 --- /dev/null +++ b/keyconvert/test/openssh_dsa_2048 @@ -0,0 +1,20 @@ +-----BEGIN DSA PRIVATE KEY----- +MIIDPgIBAAKCAQEAhvJpPI7AbHEyXauGmXyCGsVCkTXD4i9b/eobbwG1Hhm8FvtM +wq5oopWItMH0HMcKfBGmHlp46u5KJcYmrSsHSDX+6n9+Mw/Pn2Sldg26OTkyfsaV +qelapH0Q3ILt8fTrHosy9aosBiZbu4wPdjiBs441ekhGpZfsdaa3g657VGSG1YqH +S/eMw7fs068Vsp5ickYCapI+XICFnf2lQesC4gfElDRGOG3/6n0Pkhsw0TwXRgka +GgXfxHR4CPIlH7fV1/QIYXLXRU8ftkrwakIltSrl50pQOXDuCOGR49ng2JaxFdWv +sjUundZsmnWjGFFE2ORrTBFHagmwOsQXY4vOXwIVAJtUPdFxKVNC2t89reLuOGao +FFxJAoIBAQCAZYog0D72F0TIAIMIahnDDNjN2T3Sb3Zqhd27oExdUpbNDbM8F+qY +HpqJRtQRc59sSsroif+K0yEaeReOapEb6Cf1N4yGDppr1ClMBGHKk/Wsjf/ASqa8 +/mibtSF4P5I6e0w8FWrTrhu2vJ9W2ONRqVAUxgBMsEKXFXvkYtf31LKsQFUEcmtO +uXalXiKAdr+APQya6lDiUxGELjuNzwsGxjdo15wa6NcKLfHUv3XYU6WxL2USGFBW +5I1aHu/Uc7YGhl2I9fSulzotEc4PV40nlC54NVx65pQjeViJ4ZSSlrSm58xxfrdF +TnWvEJjSu6CAFYfWEzx5RtbjuWMk6yAdAoIBAFx7TsT+G3sryKRs4DRWSSlU8PAO +2I326UJps4CiiAS6x6XGnB9kLX3E/xfdmM9mrhQBNn0OPo5iCK2me1W2sXQ6QWD/ +dRhKwIcrHVexwu5iMtoMtMAeDI5P7/ahVSIxDAKkABD4hDJB3UcTDYXaz1/bNqW6 +FXYK2C9CrfhYF3NX28MU+eJhIFRpEaVU42bQ5OeDaJiz2tQeSrT5LqbV58RhARew +9tK1FOCBTBsJ+bBr4Q5f9bFNpSqqn513H/cc6qkuRCluxeGTAtNt5qdHYH+rvxey +FpBzy8MmXkHxsQWxZ1DAkaUgPaxXevNQRk/iNsk1W3zWqJ72KI5lNFgJ9yECFA/o +gWjBm06JTkYWBOgkYRRVRzr7 +-----END DSA PRIVATE KEY----- diff --git a/keyconvert/test/openssh_dsa_2048.pub b/keyconvert/test/openssh_dsa_2048.pub new file mode 100644 index 00000000..69d00b60 --- /dev/null +++ b/keyconvert/test/openssh_dsa_2048.pub @@ -0,0 +1 @@ +ssh-dss AAAAB3NzaC1kc3MAAAEBAIbyaTyOwGxxMl2rhpl8ghrFQpE1w+IvW/3qG28BtR4ZvBb7TMKuaKKViLTB9BzHCnwRph5aeOruSiXGJq0rB0g1/up/fjMPz59kpXYNujk5Mn7GlanpWqR9ENyC7fH06x6LMvWqLAYmW7uMD3Y4gbOONXpIRqWX7HWmt4Oue1RkhtWKh0v3jMO37NOvFbKeYnJGAmqSPlyAhZ39pUHrAuIHxJQ0Rjht/+p9D5IbMNE8F0YJGhoF38R0eAjyJR+31df0CGFy10VPH7ZK8GpCJbUq5edKUDlw7gjhkePZ4NiWsRXVr7I1Lp3WbJp1oxhRRNjka0wRR2oJsDrEF2OLzl8AAAAVAJtUPdFxKVNC2t89reLuOGaoFFxJAAABAQCAZYog0D72F0TIAIMIahnDDNjN2T3Sb3Zqhd27oExdUpbNDbM8F+qYHpqJRtQRc59sSsroif+K0yEaeReOapEb6Cf1N4yGDppr1ClMBGHKk/Wsjf/ASqa8/mibtSF4P5I6e0w8FWrTrhu2vJ9W2ONRqVAUxgBMsEKXFXvkYtf31LKsQFUEcmtOuXalXiKAdr+APQya6lDiUxGELjuNzwsGxjdo15wa6NcKLfHUv3XYU6WxL2USGFBW5I1aHu/Uc7YGhl2I9fSulzotEc4PV40nlC54NVx65pQjeViJ4ZSSlrSm58xxfrdFTnWvEJjSu6CAFYfWEzx5RtbjuWMk6yAdAAABAFx7TsT+G3sryKRs4DRWSSlU8PAO2I326UJps4CiiAS6x6XGnB9kLX3E/xfdmM9mrhQBNn0OPo5iCK2me1W2sXQ6QWD/dRhKwIcrHVexwu5iMtoMtMAeDI5P7/ahVSIxDAKkABD4hDJB3UcTDYXaz1/bNqW6FXYK2C9CrfhYF3NX28MU+eJhIFRpEaVU42bQ5OeDaJiz2tQeSrT5LqbV58RhARew9tK1FOCBTBsJ+bBr4Q5f9bFNpSqqn513H/cc6qkuRCluxeGTAtNt5qdHYH+rvxeyFpBzy8MmXkHxsQWxZ1DAkaUgPaxXevNQRk/iNsk1W3zWqJ72KI5lNFgJ9yE= smbaker@test64 diff --git a/keyconvert/test/openssh_dsa_512 b/keyconvert/test/openssh_dsa_512 new file mode 100644 index 00000000..003f01c0 --- /dev/null +++ b/keyconvert/test/openssh_dsa_512 @@ -0,0 +1,8 @@ +-----BEGIN DSA PRIVATE KEY----- +MIH4AgEAAkEAm3PK+DSgbavp8uFzwHkLBQkAQ+zYH7oQQfVf9qfj9McPwPSRjyE2 +euX37kG9V+8fMYGkrXiAnTF338/7l/BitQIVAPhdznYDxCFE+K7Fkmric3uRLhKl +AkASi9+yBXkSh/PBIB2VTwUNJ2Je2rMT/KArLw86dQuMdV2QPnCI4jwvFeWJW8q1 +CSKyBcwoxaSwPN6MAYNRLmPtAkA/5M4TgOWQjoUDc1DwwAFzl8kXc8Jywyz3Ck1a +uCgs+unOttuDT+ZYicDRSnq7G3paTGm5U9h3Pf4BOzqKymxmAhUAsvh3vpJX52p7 +WTaXKaBm7ysblAE= +-----END DSA PRIVATE KEY----- diff --git a/keyconvert/test/openssh_dsa_512.pub b/keyconvert/test/openssh_dsa_512.pub new file mode 100644 index 00000000..a4a4f6ed --- /dev/null +++ b/keyconvert/test/openssh_dsa_512.pub @@ -0,0 +1 @@ +ssh-dss AAAAB3NzaC1kc3MAAABBAJtzyvg0oG2r6fLhc8B5CwUJAEPs2B+6EEH1X/an4/THD8D0kY8hNnrl9+5BvVfvHzGBpK14gJ0xd9/P+5fwYrUAAAAVAPhdznYDxCFE+K7Fkmric3uRLhKlAAAAQBKL37IFeRKH88EgHZVPBQ0nYl7asxP8oCsvDzp1C4x1XZA+cIjiPC8V5YlbyrUJIrIFzCjFpLA83owBg1EuY+0AAABAP+TOE4DlkI6FA3NQ8MABc5fJF3PCcsMs9wpNWrgoLPrpzrbbg0/mWInA0Up6uxt6WkxpuVPYdz3+ATs6ispsZg== smbaker@test64 diff --git a/keyconvert/test/openssh_rsa1_1024 b/keyconvert/test/openssh_rsa1_1024 new file mode 100644 index 0000000000000000000000000000000000000000..1d814be45b6b0442fb7334ee848964120fb024c9 GIT binary patch literal 529 zcmV+s0`C1&Q%E3CQb|@pR7D_5MOh$5NlZl`Mo&^rK~x|yE-?xK000000000400aQI z^#g@OwPen0@MsoYThI?0S3ra0f0E_+=DgNnI`E*W*x;4#I@&~=%2=Q8X-LNA%(!It z=NN?ZEv@osF0u(5Qrc3(K%QGs6R&ovcffIr-5?J+Hh_CrTHVw)s<(`BXRto9;fOKOMEkc=KP95eSZ=jR1+pieW)$IQ*vT5h|HOehC~3La%RO_-=6B zKhIcwvhTYaas>;4vv^Idr9rj*(Vw?G5KG{q20szcH^U^-UXGSf&o@pbt zv+veRSA6tD;_9;_TkayTsEG2~V<92|uml>Qo?2e}$;fXgl4I|NG0~Rg!Ue|^3jEh1DuBuy4TQft2)KntD TAwx?(#~E|#6wS8{00000Z71}J literal 0 HcmV?d00001 diff --git a/keyconvert/test/openssh_rsa1_1024.pub b/keyconvert/test/openssh_rsa1_1024.pub new file mode 100644 index 00000000..8e8d3089 --- /dev/null +++ b/keyconvert/test/openssh_rsa1_1024.pub @@ -0,0 +1 @@ +1024 35 129881281989970257849297143265405883841808716551531717161470388680233069834806491515662719447667414192316994820475038514678885956467447964923197868990351993958234384078203216494595575140725420329195654521080877033819243506183873392482029450927674981321293693168525102276485740189208563187461931348496284073193 smbaker@test64 diff --git a/keyconvert/test/openssh_rsa1_2048 b/keyconvert/test/openssh_rsa1_2048 new file mode 100644 index 0000000000000000000000000000000000000000..adf13a28e55695e29d05e9e18e39559eb42bf128 GIT binary patch literal 977 zcmV;?11|hiQ%E3CQb|@pR7D_5MOh$5NlZl`Mo&^rK~x|yE-?xK000000000800;oZ zy#{v$u>d>7cB5#zvldqppecA>uMu_7*oc>KfA@i=4%8ko+`u!uk!W@bm91OUfqDyyjY zg`sJ@Z$uHu)Rr)HQt9Q1rBsYaZ6^kg3fe|NW0&{EJ&@@BPkZZ6u^;sfnpu>~6+%`NDGkjFpVXFXg!nRC zmgBBR>HJTH>PQ|KlSjF4U-bk4{oA4br@q8BV9MCcUU}Z9`e83S!bv%zhe`xR{Qp1`kE2w>y$d>#Ab@wN(OB<|_ZvM;P<&DEhy<95C=1A{2e7CRxXLMu{iFRh5E!{D}oKlhFHET}{?BR`-or5f20#cPFop+3nmY60Ra4Ao17ZsA_MUcw`3X3XnxiC z9tb^qxyV8+C^H=do|6Fp{P`A>JD#66EP signature.bin +openssl dgst $1 -signature signature.bin -verify testout/openssl_$2.pem test.txt +rm -rf signature.bin diff --git a/rspec/model/Registry.ecore b/rspec/model/Registry.ecore new file mode 100644 index 00000000..ae7ecaca --- /dev/null +++ b/rspec/model/Registry.ecore @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rspec/model/planetlab.ecore b/rspec/model/planetlab.ecore new file mode 100644 index 00000000..68dd1a74 --- /dev/null +++ b/rspec/model/planetlab.ecore @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rspec/model/planetlab.ecore_diagram b/rspec/model/planetlab.ecore_diagram new file mode 100644 index 00000000..df5642bc --- /dev/null +++ b/rspec/model/planetlab.ecore_diagram @@ -0,0 +1,228 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rspec/model/planetlab.genmodel b/rspec/model/planetlab.genmodel new file mode 100644 index 00000000..ce59a871 --- /dev/null +++ b/rspec/model/planetlab.genmodel @@ -0,0 +1,44 @@ + + + planetlab.ecore + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rspec/model/planetlab.xsd b/rspec/model/planetlab.xsd new file mode 100644 index 00000000..c6076024 --- /dev/null +++ b/rspec/model/planetlab.xsd @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/rspec/sample_rspec.xml b/rspec/sample_rspec.xml new file mode 100644 index 00000000..886fc8a2 --- /dev/null +++ b/rspec/sample_rspec.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/setup.py b/setup.py new file mode 100755 index 00000000..f0f89a49 --- /dev/null +++ b/setup.py @@ -0,0 +1,103 @@ +#!/usr/bin/python + +""" +Installation script for the sfa module +""" + +import sys, os, os.path +from glob import glob +import shutil +from distutils.core import setup + +bins = [ + 'config/sfa-config-tty', + 'config/gen-sfa-cm-config.py', + 'sfa/plc/sfa-import-plc.py', + 'sfa/plc/sfa-nuke-plc.py', + 'sfa/server/sfa-ca.py', + 'sfa/server/sfa-server.py', + 'sfa/server/sfa-clean-peer-records.py', + 'sfa/server/sfa_component_setup.py', + 'sfa/client/sfi.py', + 'sfa/client/getNodes.py', + 'sfa/client/getRecord.py', + 'sfa/client/setRecord.py', + 'sfa/client/sfadump.py', + 'sfa/client/sfiListNodes.py', + 'sfa/client/sfiListSlivers.py', + 'sfa/client/sfiAddSliver.py', + 'sfa/client/sfiDeleteSliver.py', + 'sfa/client/sfiAddAttribute.py', + 'sfa/client/sfiDeleteAttribute.py', + 'sfatables/sfatables', + 'keyconvert/keyconvert.py' + ] + +package_dirs = [ + 'sfa', + 'sfa/client', + 'sfa/methods', + 'sfa/plc', + 'sfa/server', + 'sfa/trust', + 'sfa/util', + 'sfa/managers', + 'sfa/rspecs', + 'sfa/rspecs/aggregates', + 'sfatables', + 'sfatables/commands', + 'sfatables/processors', + ] + + +data_files = [('/etc/sfa/', [ 'config/aggregates.xml', + 'config/registries.xml', + 'config/default_config.xml', + 'config/sfi_config', + 'sfa/managers/pl/pl.rng']), + ('/etc/sfatables/matches/', glob('sfatables/matches/*.xml')), + ('/etc/sfatables/targets/', glob('sfatables/targets/*.xml')), + ('/etc/init.d/', ['sfa/init.d/sfa', 'sfa/init.d/sfa-cm'])] + +# add sfatables processors as data_files +processor_files = [f for f in glob('sfatables/processors/*') if os.path.isfile(f)] +data_files.append(('/etc/sfatables/processors/', processor_files)) +processor_subdirs = [d for d in glob('sfatables/processors/*') if os.path.isdir(d)] +for d in processor_subdirs: + etc_dir = os.path.join("/etc/sfatables/processors", os.path.basename(d)) + d_files = [f for f in glob(d + '/*') if os.path.isfile(f)] + data_files.append((etc_dir, processor_files)) + +initscripts = [ '/etc/init.d/sfa', '/etc/init.d/sfa-cm' ] + +if sys.argv[1] in ['uninstall', 'remove', 'delete', 'clean']: + python_path = sys.path + site_packages_path = [ os.path.join(p,'sfa') for p in python_path if p.endswith('site-packages')] + site_packages_path += [ os.path.join(p,'sfatables') for p in python_path if p.endswith('site-packages')] + remove_dirs = ['/etc/sfa/', '/etc/sfatables'] + site_packages_path + remove_bins = [ '/usr/bin/' + os.path.basename(bin) for bin in bins ] + remove_files = remove_bins + initscripts + + # remove files + for filepath in remove_files: + print "removing", filepath, "...", + try: + os.remove(filepath) + print "success" + except: print "failed" + # remove directories + for directory in remove_dirs: + print "removing", directory, "...", + try: + shutil.rmtree(directory) + print "success" + except: print "failed" +else: + # avoid repeating what's in the specfile already + setup(name='sfa', + packages = package_dirs, + data_files = data_files, + ext_modules = [], + py_modules = [], + scripts = bins) + diff --git a/sfa.spec b/sfa.spec new file mode 100644 index 00000000..6834fc3c --- /dev/null +++ b/sfa.spec @@ -0,0 +1,321 @@ +# +# $Id: sfa.spec 18704 2010-09-07 18:24:17Z tmack $ +# + +%define url $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa.spec $ + +%define name sfa +%define version 0.9 +%define taglevel 17 + +%define release %{taglevel}%{?pldistro:.%{pldistro}}%{?date:.%{date}} +%global python_sitearch %( python -c "from distutils.sysconfig import get_python_lib; print get_python_lib(1)" ) +%{!?python_sitelib: %define python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} + +Name: %{name} +Version: %{version} +Release: %{release} +Source0: %{name}-%{version}.tar.bz2 +License: GPL +Group: Applications/System +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot + +Vendor: PlanetLab +Packager: PlanetLab Central +Distribution: PlanetLab %{plrelease} +URL: %(echo %{url} | cut -d ' ' -f 2) +Summary: the SFA python libraries +Group: Applications/System + +BuildRequires: make +Requires: python >= 2.5 +Requires: m2crypto +Requires: xmlsec1-openssl-devel +Requires: libxslt-python +Requires: python-ZSI +# xmlbuilder depends on lxml +Requires: python-lxml +Requires: python-setuptools +Requires: python-dateutil + +# python 2.5 has uuid module added, for python 2.4 we still need it. +# we can't really check for if we can load uuid as a python module, +# it'll be installed by "devel.pkgs". we have the epel repository so +# python-uuid will be provided. but we can test for the python +# version. +# %define has_py24 %( python -c "import sys;sys.exit(sys.version_info[0:2] == (2,4))" 2> /dev/null; echo $? ) +# %if %has_py24 +# +# this also didn't work very well. I'll just check for distroname - baris +#%if %{distroname} == "centos5" +#Requires: python-uuid +#%endif + +%package cm +Summary: the SFA wrapper around MyPLC's NodeManager +Group: Applications/System +Requires: sfa +Requires: pyOpenSSL >= 0.6 + +%package plc +Summary: the SFA wrapper arounf MyPLC +Group: Applications/System +Requires: sfa +Requires: python-psycopg2 +Requires: myplc-config +Requires: pyOpenSSL >= 0.7 + +%package client +Summary: the SFA experimenter-side CLI +Group: Applications/System +Requires: sfa +Requires: pyOpenSSL >= 0.7 + +%package sfatables +Summary: sfatables policy tool for SFA +Group: Applications/System +Requires: sfa + +%description +This package provides the python libraries that the SFA implementation requires + +%description cm +This package implements the SFA interface which serves as a layer +between the existing PlanetLab NodeManager interfaces and the SFA API. + +%description plc +This package implements the SFA interface which serves as a layer +between the existing PlanetLab interfaces and the SFA API. + +%description client +This package provides the client side of the SFA API, in particular +sfi.py, together with other utilities. + +%description sfatables +sfatables is a tool for defining access and admission control policies +in an SFA network, in much the same way as iptables is for ip +networks. This is the command line interface to manage sfatables + +%prep +%setup -q + +%build +make + +%install +rm -rf $RPM_BUILD_ROOT +make install DESTDIR="$RPM_BUILD_ROOT" + +%clean +rm -rf $RPM_BUILD_ROOT + +%files +# sfa and sfatables depend each other. +%{_bindir}/sfa-server.py* +/etc/sfatables/* +%{python_sitelib}/* +%{_bindir}/keyconvert.py* +/var/www/html/wsdl/*.wsdl + +%files cm +/etc/init.d/sfa-cm +%{_bindir}/sfa_component_setup.py* +# cron jobs here + +%files plc +%defattr(-,root,root) +%config /etc/sfa/default_config.xml +%config (noreplace) /etc/sfa/aggregates.xml +%config (noreplace) /etc/sfa/registries.xml +/etc/init.d/sfa +/etc/sfa/pl.rng +%{_bindir}/sfa-config-tty +%{_bindir}/sfa-import-plc.py* +%{_bindir}/sfa-clean-peer-records.py* +%{_bindir}/sfa-nuke-plc.py* +%{_bindir}/gen-sfa-cm-config.py* +%{_bindir}/sfa-ca.py* + +%files client +%config (noreplace) /etc/sfa/sfi_config +%{_bindir}/sfi* +%{_bindir}/getNodes.py* +%{_bindir}/getRecord.py* +%{_bindir}/setRecord.py* +%{_bindir}/sfadump.py* + +%files sfatables +%{_bindir}/sfatables + +%pre plc +[ -f %{_sysconfdir}/init.d/sfa ] && service sfa stop ||: + +%pre cm +[ -f %{_sysconfdir}/init.d/sfa-cm ] && service sfa-cm stop ||: + +%post plc +chkconfig --add sfa + +%post cm +chkconfig --add sfa-cm + +%changelog +* Thu Sep 16 2010 Tony Mack - sfa-0.9-17 +- fixed bugs is sfa/util/namespace.py, sfa/plc/network.py and sfa/managers/aggregate_manager_pl.py + +* Tue Sep 07 2010 Tony Mack - sfa-0.9-16 +- truncate login base of external (ProtoGeni, etc) slices to 20 characters + to avoid returning a PLCAPI exception that might confuse users. +- Enhance PLC aggregate performace by using a better filter when querying SliceTags. +- fix build errors. + +* Tue Aug 24 2010 Tony Mack - sfa-0.9-15 +- (Architecture) Credential format changed to match ProtoGENI xml format +- (Architecture) All interfaces export a new set of methods that are compatible + with the ProtoGeni Aggregate spec. These new methods are considered a + replacement for the pervious methods exported by the interfaces. All + previous methods are still exported and work as normal, but they are + considered deprecated and will not be supported in future releases. +- (Architecture) SFI has been updated to use the new interface methods. +- (Architecture) Changed keyconvet implementation from c to python. +- (Architecture) Slice Manager now attempts looks for a delegated credential + provided by the client before using its own server credential. +- (Archiceture) Slice Interface no longers stores cache of resources on disk. + This cache now exists only in memory and is cleared when service is restarted + or cache lifetime is exceeded. +- (Performance) SliceManager sends request to Aggregates in parallel instead + of sequentially. +- (Bug fix) SFA tickets now support the new rspec format. +- (Bug fix) SFI only uses cahced credential if they aren't expired. +- (Bug fix) Cerdential delegation modified to work with new credential format. +- (Enhancement) SFI -a --aggregatge option now sends requests directly to the + Aggregate instead of relaying through the Slice Manager. +- (Enhancement) Simplified caching. Accociated a global cache instance with + the api handler on every new server request, making it easier to access the + cache and use in more general ways. + +%changelog +* Thu May 11 2010 Tony Mack - sfa-0.9-11 +- SfaServer now uses a pool of threads to handle requests concurrently +- sfa.util.rspec no longer used to process/manage rspecs (deprecated). This is now handled by sfa.plc.network and is not backwards compatible +- PIs can now get a slice credential for any slice at their site without having to be a member of the slice +- Registry records for federated peers (defined in registries.xml, aggregates.xml) updated when sfa service is started +- Interfaces will try to fetch and install gids from peers listed in registries.xml/aggregates.xml if gid is not found in /etc/sfa/trusted_roots dir +- Component manager does not install gid files if slice already has them +- Server automatically fetches and installs peer certificats (defined in registries/aggregates.xml) when service is restarted. +- fix credential verification exploit (verify that the trusted signer is a parent of the object it it signed) +- made it easier for root authorities to sign their sub's certifiacate using the sfa-ca.py (sfa/server/sfa-ca.py) tool + +* Thu Jan 21 2010 anil vengalil - sfa-0.9-10 +- This tag is quite same as the previous one (sfa-0.9-9) except that the vini and max aggregate managers are also updated for urn support. Other features are: +- - sfa-config-tty now has the same features like plc-config-tty +- - Contains code to support both urn and hrn +- - Cleaned up request_hash related stuff +- - SM, AM and Registry code is organized under respective managers +- - Site and Slice synchronization across federated aggregates +- - Script to generate sfa_component_config + +* Fri Jan 15 2010 anil vengalil - sfa-0.9-9 +- sfa-config-tty now has the same features like plc-config-tty +- Contains code to support both urn and hrn +- Cleaned up request_hash related stuff +- SM, AM and Registry code is organized under respective managers +- Slice synchronization across federated aggregates +- some bugs are fixed + +* Wed Jan 06 2010 Thierry Parmentelat - sfa-0.9-8 +- checkpoint with fewer mentions of geni + +* Tue Jan 05 2010 Thierry Parmentelat - sfa-0.9-7 +- checkpointing +- this is believed to pass the tests; among other things: +- reworked configuration based on the myplc config with xml skeleton (no more sfa_config) + +* Mon Nov 16 2009 anil vengalil - sfa-0.9-6 +- This tag includes: +- - Sfatables +- - Preliminary version of hash based authentication +- - Initial code for Component Manager +- - Authority structure is moved to /var/lib/sfa/ +- - some bug-fixes + +* Fri Oct 09 2009 anil vengalil - sfa-0.9-5 +- Create_slice and get_resources methods are connected to sfatables. +- Other features include compatibility with RP, handling remote objects created as part of federation, preliminary version of sfatables, call tracability and logging. + +* Wed Oct 07 2009 anil vengalil - sfa-0.9-4 +- Bug fix on update and remove_peer_object methods +- Compatibility with RP, preliminiary version of sfatables, call tracability and logging + +* Mon Oct 05 2009 anil vengalil - sfa-0.9-3 +- Compatibility with RP, two additional methods to handle remote objects, call tracability and logging, PLCDB now has single table for sfa records, preliminary version of sfatables (still under development) + +* Fri Sep 18 2009 Thierry Parmentelat - sfa-0.9-2 +- compatibility with RefreshPeer +- incremental mechanism for importing PLC records into SFA tables +- unified single database (still inside the underlying PLC db postgresql server) +- includes/improves call traceability and logging features +- several bug fixes + +* Thu Sep 17 2009 Baris Metin +- added libxslt-python dependency + +* Thu Sep 10 2009 Thierry Parmentelat - sfa-0.9-1 +- unified single SFA database in the PLC-DB +- upcalls from PLCAPI to SFA methods +- SFA call traceability and logging features +- many bug fixes +- includes first/rough version of sfatables for policy implementation + +* Thu Jul 23 2009 Thierry Parmentelat - geniwrapper-0.8-6 +- snapshot after the GEC5 demo +- should be the last tag set in the geniwrapper module, are we are now moving to the sfa module + +* Wed Jul 15 2009 Thierry Parmentelat - geniwrapper-0.8-5 +- snapshot july 15 - has gone through superficial manual testing +- hopefully a good basis for gec5 demo +- multi-dir sfi client tested as well + +* Wed Jul 08 2009 Thierry Parmentelat - geniwrapper-0.8-4 +- rename geniwrapper.spec into sfa.spec + +* Wed Jul 08 2009 Thierry Parmentelat - geniwrapper-0.8-3 +- clean up in xmlrpc/soap, --protocol option to chose between both +- keyconvert packaged in /usr/bin, no /usr/share/keyconvert anymore +- hopefully more helpful context in case of crashes when importing +- bugfixes for using only /etc/sfa for site-dep files +- bugfixes in wsdl generation + +* Mon Jul 06 2009 Thierry Parmentelat - geniwrapper-0.8-2 +- cleanup of the config area; no dependency to a PLC config anymore as sfa can be run in standalone +- config variables in sfa_config now start with SFA_ and not GENI_ +- config.py can be loaded even with no config present + +* Sun Jul 05 2009 Thierry Parmentelat - geniwrapper-0.8-1 +- first step for cleanup and reorganization +- mass-renaming from geni to sfa (some are still needed) +- sfa/trust implements the security architecture + +* Wed Jul 01 2009 Thierry Parmentelat - geniwrapper-0.2-7 +- snapshot for reproducible builds + +* Thu Jun 25 2009 Thierry Parmentelat - geniwrapper-0.2-6 +- snapshot for the convenience of alpha users + +* Tue Jun 16 2009 Thierry Parmentelat - geniwrapper-0.2-5 +- build fix - keyconvert was getting installed in /usr/share/keyconvert/keyconvert + +* Tue Jun 16 2009 Thierry Parmentelat - geniwrapper-0.2-4 +- ongoing work - snapshot for 4.3-rc9 + +* Wed Jun 03 2009 Thierry Parmentelat - geniwrapper-0.2-3 +- various fixes + +* Sat May 30 2009 Thierry Parmentelat - geniwrapper-0.2-2 +- bugfixes - still a work in progress + +* Fri May 18 2009 Baris Metin +- initial package + + +%define module_current_branch 0.2 diff --git a/sfa/Makefile b/sfa/Makefile new file mode 100644 index 00000000..06d3355c --- /dev/null +++ b/sfa/Makefile @@ -0,0 +1,5 @@ +tags: + find . -name '*.py' | grep -v '/\.svn/' | xargs etags +.PHONY: tags + + diff --git a/sfa/__init__.py b/sfa/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfa/client/__init__.py b/sfa/client/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfa/client/getNodes.py b/sfa/client/getNodes.py new file mode 100644 index 00000000..b87fa407 --- /dev/null +++ b/sfa/client/getNodes.py @@ -0,0 +1,84 @@ +#!/usr/bin/python + +import sys +import os +from optparse import OptionParser +from pprint import pprint +from types import StringTypes + +from sfa.util.rspec import RSpec + +def create_parser(): + command = sys.argv[0] + argv = sys.argv[1:] + usage = "%(command)s [options]" % locals() + description = """getNodes will open a rspec file and print all key/values, or filter results based on a given key or set of keys.""" + parser = OptionParser(usage=usage,description=description) + parser.add_option("-i", "--infile", dest="infile", default=None, help = "input rspec file") + parser.add_option("-t", "--tag", dest="tag", default=None, help = "filter rspec for this tag") + parser.add_option("-a", "--attribute", dest="attribute", default=None, help = "comma separated list of attributes to display") + parser.add_option("-r", "--recursive", dest="print_children", default=False, action="store_true", help = "print the tag's child nodes") + + return parser + + +def print_dict(rdict, options, counter=1): + print_children = options.print_children + attributes = [] + if options.attribute: + attributes = options.attribute.split(',') + lists = [] + tab = " " + + if not isinstance(rdict, dict): + raise "%s not a dict" % rdict + for (key, value) in rdict.items(): + if isinstance(value, StringTypes): + if (attributes and key in attributes) or not attributes: + print tab * counter + "%s: %s" % (key, value) + elif isinstance(value, list): + for listitem in value: + if isinstance(listitem, dict): + lists.append((key, listitem)) + elif isinstance(value, dict): + lists.append((key, value)) + + if counter == 1 or print_children: + for (key, listitem) in lists: + if isinstance(listitem, dict): + print tab * (counter - 1) + key + print_dict(listitem, options, counter+1) + elif not attributes or (attributes and 'children' in attributes): + keys = set([key for (key, listitem) in lists]) + if keys: print tab * (counter) + "(children: %s)" % (",".join(keys)) + + +def main(): + parser = create_parser(); + (options, args) = parser.parse_args() + if not options.infile: + print "RSpec file not specified" + return + + rspec = RSpec() + try: + rspec.parseFile(options.infile) + except: + print "Error reading rspec file" + + if options.tag: + tag_name = options.tag + rspec_dicts = rspec.getDictsByTagName(tag_name) + rspec_dict = {tag_name: rspec_dicts} + else: + rspec_dict = rspec.toDict() + + print_dict(rspec_dict, options) + + return + +if __name__ == '__main__': + try: main() + except Exception, e: + raise + print e diff --git a/sfa/client/getRecord.py b/sfa/client/getRecord.py new file mode 100755 index 00000000..3926027d --- /dev/null +++ b/sfa/client/getRecord.py @@ -0,0 +1,91 @@ +#!/usr/bin/python + +""" +Filters/Prints record objects + + +faiyaza at cs dot princeton dot edu +Copyright (c) 2009 Board of Trustees, Princeton University + +$Id: getRecord.py 14252 2009-07-03 14:40:59Z thierry $ +$HeadURL$ +""" + +import sys +import os +from optparse import OptionParser +from pprint import pprint +from xml.parsers.expat import ExpatError + +from sfa.util.rspec import RecordSpec + + +def create_parser(): + command = sys.argv[0] + argv = sys.argv[1:] + usage = "%(command)s [options]" % locals() + description = """getRecord will parse a supplied (via stdin) record and print all values or key/values, and filter results based on a given key or set of keys.""" + parser = OptionParser(usage=usage,description=description) + parser.add_option("-d", "--debug", dest="DEBUG", action="store_true", + default=False, help = "record file path") + parser.add_option("-k", "--key", dest="withkey", action="store_true", + default=False, help = "print SSH keys and certificates") + parser.add_option("-p", "--plinfo", dest="plinfo", action="store_true", + default=False, help = "print PlanetLab specific internal fields") + + return parser + + +def printRec(record, filters, options): + line = "" + if len(filters): + for filter in filters: + if options.DEBUG: print "Filtering on %s" %filter + line += "%s: %s\n" % (filter, + printVal(record.dict["record"].get(filter, None))) + print line + else: + # print the wole thing + for (key, value) in record.dict["record"].iteritems(): + if (not options.withkey and key in ('gid', 'keys')) or\ + (not options.plinfo and key == 'pl_info'): + continue + line += "%s: %s\n" % (key, printVal(value)) + print line + + +# fix the iteratable values +def printVal(value): + line = "" + if type(value) in (tuple, list): + for i in value: + line += "%s " % i + elif value != None: + line += value + return line.rstrip("\n") + + +def main(): + parser = create_parser(); + (options, args) = parser.parse_args() + + stdin = sys.stdin.read() + + record = RecordSpec(xml = stdin) + + if not record.dict.has_key("record"): + raise "RecordError", "Input record does not have 'record' tag." + + if options.DEBUG: + record.pprint() + print "#####################################################" + + printRec(record, args, options) + +if __name__ == '__main__': + try: main() + except ExpatError, e: + print "RecordError. Is your record valid XML?" + print e + except Exception, e: + print e diff --git a/sfa/client/setRecord.py b/sfa/client/setRecord.py new file mode 100755 index 00000000..15911285 --- /dev/null +++ b/sfa/client/setRecord.py @@ -0,0 +1,112 @@ +#!/usr/bin/python + +""" +Updates record objects + + +faiyaza at cs dot princeton dot edu +Copyright (c) 2009 Board of Trustees, Princeton University + +$Id: setRecord.py 16200 2009-12-16 04:44:09Z thierry $ +$HeadURL$ +""" + +import sys +sys.path.append('.') +import os +from optparse import OptionParser +from pprint import pprint + +from sfa.util.rspec import RecordSpec + + +def create_parser(): + command = sys.argv[0] + argv = sys.argv[1:] + usage = "%(command)s [options]" % locals() + description = """setRecord will edit a record (from stdin), modify its contents, then print the new record to stdout""" + parser = OptionParser(usage=usage,description=description) + parser.add_option("-d", "--debug", dest="DEBUG", action="store_true", + default=False, help = "print debug info") + + return parser + + +def editDict(args, recordDict, options): + """ + Takes the arg list, seperates into tag/value, creates a dict, then munges args. + """ + # find out if its iterable. + for vect in args: + if vect.count("+="): + # append value + modDict({vect.split("+=")[0]: returnVal(vect.split("+=")[1])}, + recordDict, options) + + elif vect.count("="): + # reassign value + replaceDict({vect.split("=")[0]: returnVal("=".join(vect.split("=")[1:]))}, + recordDict, options) + else: + if vect in recordDict: + del recordDict[vect] + else: + raise TypeError, "Argument error: Records are updated with \n" \ + "key=val1,val2,valN or\n" \ + "key+=val1,val2,valN \n%s Unknown key/val" % vect + + +def replaceDict(newval, recordDict, options): + """ + Replaces field in dict + """ + # Check type of old field matches type of new field + for (key, val) in newval.iteritems(): + recordDict[key] = val + +def modDict(newval, recordDict, options): + """ + Checks type of existing field, addends new field + """ + for (key, val) in newval.iteritems(): + if (type(recordDict[key]) == list): + if (type(val) == list): + recordDict[key] = recordDict[key] + val + else: + recordDict[key].append(val) + elif type(val) == list: + val.append(recordDict[key]) + recordDict[key] = val + else: + recordDict[key] = [recordDict[key], val] + + +def returnVal(arg): + """ + if given input has ",", then its assumed to be a list. + """ + if arg.count(","): + return list(arg.split(",")) + else: + return arg + +def main(): + parser = create_parser(); + (options, args) = parser.parse_args() + + record = RecordSpec(xml = sys.stdin.read()) + + if args: + editDict(args, record.dict["record"], options) + if options.DEBUG: + print "New Record:\n%s" % record.dict + record.pprint() + + record.parseDict(record.dict) + s = record.toxml() + sys.stdout.write(s) + +if __name__ == '__main__': + try: main() + except Exception, e: + print e diff --git a/sfa/client/sfadump.py b/sfa/client/sfadump.py new file mode 100644 index 00000000..9d96da7f --- /dev/null +++ b/sfa/client/sfadump.py @@ -0,0 +1,94 @@ +#! /usr/bin/env python +# $Id: sfadump.py 16477 2010-01-05 16:31:37Z thierry $ +# $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/client/sfadump.py $ +from __future__ import with_statement + +import sys +import os, os.path +import tempfile +import xmlrpclib +from types import StringTypes, ListType +from optparse import OptionParser + +from sfa.trust.certificate import Certificate +from sfa.trust.credential import Credential +from sfa.util.record import SfaRecord +from sfa.util.rspec import RSpec + +def determine_sfa_filekind(fn): + cert = Certificate(filename = fn) + + data = cert.get_data() + if data: + dict = xmlrpclib.loads(data)[0][0] + else: + dict = {} + + if "gidCaller" in dict: + return "credential" + + if "uuid" in dict: + return "gid" + + return "unknown" + +def save_gid(gid): + hrn = gid.get_hrn() + lastpart = hrn.split(".")[-1] + filename = lastpart + ".gid" + + if os.path.exists(filename): + print filename, ": already exists... skipping" + return + + print filename, ": extracting gid of", hrn + + gid.save_to_file(filename, save_parents = True) + +def extract_gids(cred, extract_parents): + gidCaller = cred.get_gid_caller() + if gidCaller: + save_gid(gidCaller) + + gidObject = cred.get_gid_object() + if gidObject and ((gidCaller == None) or (gidCaller.get_hrn() != gidObject.get_hrn())): + save_gid(gidObject) + + if extract_parents: + parent = cred.get_parent() + if parent: + extract_gids(parent, extract_parents) + +def create_parser(): + # Generate command line parser + parser = OptionParser(usage="%prog [options] filename") + + parser.add_option("-e", "--extractgids", action="store_true", dest="extract_gids", default=False, help="Extract GIDs from credentials") + parser.add_option("-p", "--dumpparents", action="store_true", dest="dump_parents", default=False, help="Show parents") + + return parser + +def main(): + parser = create_parser() + (options, args) = parser.parse_args() + + if len(args) <= 0: + print "No filename given. Use -h for help." + return -1 + + filename = args[0] + kind = determine_sfa_filekind(filename) + + if kind=="credential": + cred = Credential(filename = filename) + cred.dump(dump_parents = options.dump_parents) + if options.extract_gids: + extract_gids(cred, extract_parents = options.dump_parents) + elif kind=="gid": + gid = Gid(filename = filename) + gid.dump(dump_parents = options.dump_parents) + else: + print "unknown filekind", kind + +if __name__=="__main__": + main() diff --git a/sfa/client/sfi.py b/sfa/client/sfi.py new file mode 100755 index 00000000..d299b89b --- /dev/null +++ b/sfa/client/sfi.py @@ -0,0 +1,937 @@ +#! /usr/bin/env python + +# sfi -- slice-based facility interface + +import sys +sys.path.append('.') +import os, os.path +import tempfile +import traceback +import socket +import random +import datetime +from lxml import etree +from StringIO import StringIO +from types import StringTypes, ListType +from optparse import OptionParser +from sfa.trust.certificate import Keypair, Certificate +from sfa.trust.credential import Credential +from sfa.util.sfaticket import SfaTicket +from sfa.util.record import * +from sfa.util.namespace import * +from sfa.util.xmlrpcprotocol import ServerException +import sfa.util.xmlrpcprotocol as xmlrpcprotocol +from sfa.util.config import Config +import zlib + +AGGREGATE_PORT=12346 +CM_PORT=12346 + +# utility methods here +# display methods +def display_rspec(rspec, format='rspec'): + if format in ['dns']: + tree = etree.parse(StringIO(rspec)) + root = tree.getroot() + result = root.xpath("./network/site/node/hostname/text()") + elif format in ['ip']: + # The IP address is not yet part of the new RSpec + # so this doesn't do anything yet. + tree = etree.parse(StringIO(rspec)) + root = tree.getroot() + result = root.xpath("./network/site/node/ipv4/text()") + else: + result = rspec + + print result + return + +def display_list(results): + for result in results: + print result + +def display_records(recordList, dump=False): + ''' Print all fields in the record''' + for record in recordList: + display_record(record, dump) + +def display_record(record, dump=False): + if dump: + record.dump() + else: + info = record.getdict() + print "%s (%s)" % (info['hrn'], info['type']) + return + + +def filter_records(type, records): + filtered_records = [] + for record in records: + if (record['type'] == type) or (type == "all"): + filtered_records.append(record) + return filtered_records + + +# save methods +def save_rspec_to_file(rspec, filename): + if not filename.endswith(".rspec"): + filename = filename + ".rspec" + + f = open(filename, 'w') + f.write(rspec) + f.close() + return + +def save_records_to_file(filename, recordList): + index = 0 + for record in recordList: + if index > 0: + save_record_to_file(filename + "." + str(index), record) + else: + save_record_to_file(filename, record) + index = index + 1 + +def save_record_to_file(filename, record): + if record['type'] in ['user']: + record = UserRecord(dict=record) + elif record['type'] in ['slice']: + record = SliceRecord(dict=record) + elif record['type'] in ['node']: + record = NodeRecord(dict=record) + elif record['type'] in ['authority', 'ma', 'sa']: + record = AuthorityRecord(dict=record) + else: + record = SfaRecord(dict=record) + str = record.save_to_string() + file(filename, "w").write(str) + return + + +# load methods +def load_record_from_file(filename): + str = file(filename, "r").read() + record = SfaRecord(string=str) + return record + + + +class Sfi: + + slicemgr = None + registry = None + user = None + authority = None + options = None + hashrequest = False + + def create_cmd_parser(self, command, additional_cmdargs=None): + cmdargs = {"list": "name", + "show": "name", + "remove": "name", + "add": "record", + "update": "record", + "aggregates": "[name]", + "registries": "[name]", + "get_gid": [], + "get_trusted_certs": "cred", + "slices": "", + "resources": "[name]", + "create": "name rspec", + "get_ticket": "name rspec", + "redeem_ticket": "ticket", + "delete": "name", + "reset": "name", + "start": "name", + "stop": "name", + "delegate": "name", + "status": "name", + "renew": "name", + "shutdown": "name", + "version": "", + } + + if additional_cmdargs: + cmdargs.update(additional_cmdargs) + + if command not in cmdargs: + print "Invalid command\n" + print "Commands: ", + for key in cmdargs.keys(): + print key + ",", + print "" + sys.exit(2) + + parser = OptionParser(usage="sfi [sfi_options] %s [options] %s" \ + % (command, cmdargs[command])) + + # user specifies remote aggregate/sm/component + if command in ("resources", "slices", "create", "delete", "start", "stop", "restart", "get_ticket", "redeem_ticket"): + parser.add_option("-a", "--aggregate", dest="aggregate", + default=None, help="aggregate host") + parser.add_option("-p", "--port", dest="port", + default=AGGREGATE_PORT, help="aggregate port") + parser.add_option("-c", "--component", dest="component", default=None, + help="component hrn") + + # registy filter option + if command in ("list", "show", "remove"): + parser.add_option("-t", "--type", dest="type", type="choice", + help="type filter ([all]|user|slice|authority|node|aggregate)", + choices=("all", "user", "slice", "authority", "node", "aggregate"), + default="all") + # display formats + if command in ("resources"): + parser.add_option("-f", "--format", dest="format", type="choice", + help="display format ([xml]|dns|ip)", default="xml", + choices=("xml", "dns", "ip")) + + if command in ("resources", "show", "list"): + parser.add_option("-o", "--output", dest="file", + help="output XML to file", metavar="FILE", default=None) + + if command in ("show", "list"): + parser.add_option("-f", "--format", dest="format", type="choice", + help="display format ([text]|xml)", default="text", + choices=("text", "xml")) + + if command in ("delegate"): + parser.add_option("-u", "--user", + action="store_true", dest="delegate_user", default=False, + help="delegate user credential") + parser.add_option("-s", "--slice", dest="delegate_slice", + help="delegate slice credential", metavar="HRN", default=None) + + return parser + + + def create_parser(self): + + # Generate command line parser + parser = OptionParser(usage="sfi [options] command [command_options] [command_args]", + description="Commands: gid,list,show,remove,add,update,nodes,slices,resources,create,delete,start,stop,reset") + parser.add_option("-r", "--registry", dest="registry", + help="root registry", metavar="URL", default=None) + parser.add_option("-s", "--slicemgr", dest="sm", + help="slice manager", metavar="URL", default=None) + default_sfi_dir = os.path.expanduser("~/.sfi/") + parser.add_option("-d", "--dir", dest="sfi_dir", + help="config & working directory - default is " + default_sfi_dir, + metavar="PATH", default=default_sfi_dir) + parser.add_option("-u", "--user", dest="user", + help="user name", metavar="HRN", default=None) + parser.add_option("-a", "--auth", dest="auth", + help="authority name", metavar="HRN", default=None) + parser.add_option("-v", "--verbose", + action="store_true", dest="verbose", default=False, + help="verbose mode") + parser.add_option("-D", "--debug", + action="store_true", dest="debug", default=False, + help="Debug (xml-rpc) protocol messages") + parser.add_option("-p", "--protocol", + dest="protocol", default="xmlrpc", + help="RPC protocol (xmlrpc or soap)") + parser.add_option("-k", "--hashrequest", + action="store_true", dest="hashrequest", default=False, + help="Create a hash of the request that will be authenticated on the server") + parser.disable_interspersed_args() + + return parser + + + # + # Establish Connection to SliceMgr and Registry Servers + # + def set_servers(self): + config_file = self.options.sfi_dir + os.sep + "sfi_config" + try: + config = Config (config_file) + except: + print "Failed to read configuration file", config_file + print "Make sure to remove the export clauses and to add quotes" + if not self.options.verbose: + print "Re-run with -v for more details" + else: + traceback.print_exc() + sys.exit(1) + + errors = 0 + # Set SliceMgr URL + if (self.options.sm is not None): + sm_url = self.options.sm + elif hasattr(config, "SFI_SM"): + sm_url = config.SFI_SM + else: + print "You need to set e.g. SFI_SM='http://your.slicemanager.url:12347/' in %s" % config_file + errors += 1 + + # Set Registry URL + if (self.options.registry is not None): + reg_url = self.options.registry + elif hasattr(config, "SFI_REGISTRY"): + reg_url = config.SFI_REGISTRY + else: + print "You need to set e.g. SFI_REGISTRY='http://your.registry.url:12345/' in %s" % config_file + errors += 1 + + + # Set user HRN + if (self.options.user is not None): + self.user = self.options.user + elif hasattr(config, "SFI_USER"): + self.user = config.SFI_USER + else: + print "You need to set e.g. SFI_USER='plc.princeton.username' in %s" % config_file + errors += 1 + + # Set authority HRN + if (self.options.auth is not None): + self.authority = self.options.auth + elif hasattr(config, "SFI_AUTH"): + self.authority = config.SFI_AUTH + else: + print "You need to set e.g. SFI_AUTH='plc.princeton' in %s" % config_file + errors += 1 + + if errors: + sys.exit(1) + + if self.options.verbose : + print "Contacting Slice Manager at:", sm_url + print "Contacting Registry at:", reg_url + + # Get key and certificate + key_file = self.get_key_file() + cert_file = self.get_cert_file(key_file) + self.key = Keypair(filename=key_file) + self.key_file = key_file + self.cert_file = cert_file + self.cert = Certificate(filename=cert_file) + # Establish connection to server(s) + self.registry = xmlrpcprotocol.get_server(reg_url, key_file, cert_file, self.options.debug) + self.slicemgr = xmlrpcprotocol.get_server(sm_url, key_file, cert_file, self.options.debug) + + return + + # + # Get various credential and spec files + # + # Establishes limiting conventions + # - conflates MAs and SAs + # - assumes last token in slice name is unique + # + # Bootstraps credentials + # - bootstrap user credential from self-signed certificate + # - bootstrap authority credential from user credential + # - bootstrap slice credential from user credential + # + + + def get_key_file(self): + file = os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".pkey") + #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".pkey") + if (os.path.isfile(file)): + return file + else: + print "Key file", file, "does not exist" + sys.exit(-1) + return + + def get_cert_file(self, key_file): + + #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cert") + file = os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".cert") + if (os.path.isfile(file)): + return file + else: + k = Keypair(filename=key_file) + cert = Certificate(subject=self.user) + cert.set_pubkey(k) + cert.set_issuer(k, self.user) + cert.sign() + if self.options.verbose : + print "Writing self-signed certificate to", file + cert.save_to_file(file) + return file + + def get_cached_gid(self, file): + """ + Return a cached gid + """ + gid = None + if (os.path.isfile(file)): + gid = GID(filename=file) + return gid + + def get_gid(self, opts, args): + hrn = None + if args: + hrn = args[0] + gid = self._get_gid(hrn) + print gid.save_to_string(save_parents=True) + return gid + + def _get_gid(self, hrn=None): + if not hrn: + hrn = self.user + + gidfile = os.path.join(self.options.sfi_dir, hrn + ".gid") + gid = self.get_cached_gid(gidfile) + if not gid: + user_cred = self.get_user_cred() + records = self.registry.Resolve(hrn, user_cred.save_to_string(save_parents=True)) + if not records: + raise RecordNotFound(args[0]) + gid = GID(string=records[0]['gid']) + if self.options.verbose: + print "Writing gid to ", gidfile + gid.save_to_file(filename=gidfile) + return gid + + + def get_cached_credential(self, file): + """ + Return a cached credential only if it hasn't expired. + """ + if (os.path.isfile(file)): + credential = Credential(filename=file) + # make sure it isnt expired + if not credential.get_lifetime or \ + datetime.datetime.today() < credential.get_lifetime(): + return credential + return None + + def get_user_cred(self): + #file = os.path.join(self.options.sfi_dir, get_leaf(self.user) + ".cred") + file = os.path.join(self.options.sfi_dir, self.user.replace(self.authority + '.', '') + ".cred") + return self.get_cred(file, 'user', self.user) + + def get_auth_cred(self): + if not self.authority: + print "no authority specified. Use -a or set SF_AUTH" + sys.exit(-1) + file = os.path.join(self.options.sfi_dir, get_leaf("authority") + ".cred") + return self.get_cred(file, 'authority', self.authority) + + def get_slice_cred(self, name): + file = os.path.join(self.options.sfi_dir, "slice_" + get_leaf(name) + ".cred") + return self.get_cred(file, 'slice', name) + + def get_cred(self, file, type, hrn): + # attempt to load a cached credential + cred = self.get_cached_credential(file) + if not cred: + if type in ['user']: + cert_string = self.cert.save_to_string(save_parents=True) + user_name = self.user.replace(self.authority + ".", '') + if user_name.count(".") > 0: + user_name = user_name.replace(".", '_') + self.user = self.authority + "." + user_name + cred_str = self.registry.get_self_credential(cert_string, "user", hrn) + else: + # bootstrap slice credential from user credential + user_cred = self.get_user_cred().save_to_string(save_parents=True) + cred_str = self.registry.get_credential(user_cred, type, hrn) + + if not cred_str: + print "Failed to get %s credential" % (type) + sys.exit(-1) + + cred = Credential(string=cred_str) + cred.save_to_file(file, save_parents=True) + if self.options.verbose: + print "Writing %s credential to %s" %(type, file) + + return cred + + + def get_rspec_file(self, rspec): + if (os.path.isabs(rspec)): + file = rspec + else: + file = os.path.join(self.options.sfi_dir, rspec) + if (os.path.isfile(file)): + return file + else: + print "No such rspec file", rspec + sys.exit(1) + + def get_record_file(self, record): + if (os.path.isabs(record)): + file = record + else: + file = os.path.join(self.options.sfi_dir, record) + if (os.path.isfile(file)): + return file + else: + print "No such registry record file", record + sys.exit(1) + + def load_publickey_string(self, fn): + f = file(fn, "r") + key_string = f.read() + + # if the filename is a private key file, then extract the public key + if "PRIVATE KEY" in key_string: + outfn = tempfile.mktemp() + cmd = "openssl rsa -in " + fn + " -pubout -outform PEM -out " + outfn + os.system(cmd) + f = file(outfn, "r") + key_string = f.read() + os.remove(outfn) + + return key_string + + def get_component_server_from_hrn(self, hrn): + # direct connection to the nodes component manager interface + user_cred = self.get_user_cred().save_to_string(save_parents=True) + records = self.registry.Resolve(hrn, user_cred) + records = filter_records('node', records) + if not records: + print "No such component:", opts.component + record = records[0] + + return self.get_server(record['hostname'], CM_PORT, self.key_file, \ + self.cert_file, self.options.debug) + + def get_server(self, host, port, keyfile, certfile, debug): + """ + Return an instnace of an xmlrpc server connection + """ + url = "http://%s:%s" % (host, port) + return xmlrpcprotocol.get_server(url, keyfile, certfile, debug) + + def get_server_from_opts(self, opts): + """ + Return instance of an xmlrpc connection to a slice manager, aggregate + or component server depending on the specified opts + """ + server = self.slicemgr + # direct connection to an aggregate + if hasattr(opts, 'aggregate') and opts.aggregate: + server = self.get_server(opts.aggregate, opts.port, self.key_file, \ + self.cert_file, self.options.debug) + # direct connection to the nodes component manager interface + if hasattr(opts, 'component') and opts.component: + server = self.get_component_server_from_hrn(opts.component) + + return server + #========================================================================== + # Following functions implement the commands + # + # Registry-related commands + #========================================================================== + + def dispatch(self, command, cmd_opts, cmd_args): + getattr(self, command)(cmd_opts, cmd_args) + + # list entires in named authority registry + def list(self, opts, args): + user_cred = self.get_user_cred().save_to_string(save_parents=True) + hrn = args[0] + try: + list = self.registry.List(hrn, user_cred) + except IndexError: + raise Exception, "Not enough parameters for the 'list' command" + + # filter on person, slice, site, node, etc. + # THis really should be in the self.filter_records funct def comment... + list = filter_records(opts.type, list) + for record in list: + print "%s (%s)" % (record['hrn'], record['type']) + if opts.file: + file = opts.file + if not file.startswith(os.sep): + file = os.path.join(self.options.sfi_dir, file) + save_records_to_file(file, list) + return + + # show named registry record + def show(self, opts, args): + user_cred = self.get_user_cred().save_to_string(save_parents=True) + hrn = args[0] + records = self.registry.Resolve(hrn, user_cred) + records = filter_records(opts.type, records) + if not records: + print "No record of type", opts.type + for record in records: + if record['type'] in ['user']: + record = UserRecord(dict=record) + elif record['type'] in ['slice']: + record = SliceRecord(dict=record) + elif record['type'] in ['node']: + record = NodeRecord(dict=record) + elif record['type'] in ['authority', 'ma', 'sa']: + record = AuthorityRecord(dict=record) + else: + record = SfaRecord(dict=record) + if (opts.format == "text"): + record.dump() + else: + print record.save_to_string() + + if opts.file: + file = opts.file + if not file.startswith(os.sep): + file = os.path.join(self.options.sfi_dir, file) + save_records_to_file(file, records) + return + + def delegate(self, opts, args): + + delegee_hrn = args[0] + if opts.delegate_user: + user_cred = self.get_user_cred() + cred = self.delegate_cred(user_cred, delegee_hrn) + elif opts.delegate_slice: + slice_cred = self.get_slice_cred(opts.delegate_slice) + cred = self.delegate_cred(slice_cred, delegee_hrn) + else: + print "Must specify either --user or --slice " + return + delegated_cred = Credential(string=cred) + object_hrn = delegated_cred.get_gid_object().get_hrn() + if opts.delegate_user: + dest_fn = os.path.join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_" + + get_leaf(object_hrn) + ".cred") + elif opts.delegate_slice: + dest_fn = os.path.join(self.options.sfi_dir, get_leaf(delegee_hrn) + "_slice_" + + get_leaf(object_hrn) + ".cred") + + delegated_cred.save_to_file(dest_fn, save_parents=True) + + print "delegated credential for", object_hrn, "to", delegee_hrn, "and wrote to", dest_fn + + def delegate_cred(self, object_cred, hrn): + # the gid and hrn of the object we are delegating + if isinstance(object_cred, str): + object_cred = Credential(string=object_cred) + object_gid = object_cred.get_gid_object() + object_hrn = object_gid.get_hrn() + + if not object_cred.get_privileges().get_all_delegate(): + print "Error: Object credential", object_hrn, "does not have delegate bit set" + return + + # the delegating user's gid + caller_gid = self._get_gid(self.user) + caller_gidfile = os.path.join(self.options.sfi_dir, self.user + ".gid") + + # the gid of the user who will be delegated to + delegee_gid = self._get_gid(hrn) + delegee_hrn = delegee_gid.get_hrn() + delegee_gidfile = os.path.join(self.options.sfi_dir, delegee_hrn + ".gid") + delegee_gid.save_to_file(filename=delegee_gidfile) + dcred = object_cred.delegate(delegee_gidfile, self.get_key_file(), caller_gidfile) + return dcred.save_to_string(save_parents=True) + + # removed named registry record + # - have to first retrieve the record to be removed + def remove(self, opts, args): + auth_cred = self.get_auth_cred().save_to_string(save_parents=True) + hrn = args[0] + type = opts.type + if type in ['all']: + type = '*' + return self.registry.Remove(hrn, auth_cred, type) + + # add named registry record + def add(self, opts, args): + auth_cred = self.get_auth_cred().save_to_string(save_parents=True) + record_filepath = args[0] + rec_file = self.get_record_file(record_filepath) + record = load_record_from_file(rec_file).as_dict() + return self.registry.Register(record, auth_cred) + + # update named registry entry + def update(self, opts, args): + user_cred = self.get_user_cred() + rec_file = self.get_record_file(args[0]) + record = load_record_from_file(rec_file) + if record['type'] == "user": + if record.get_name() == user_cred.get_gid_object().get_hrn(): + cred = user_cred.save_to_string(save_parents=True) + else: + cred = self.get_auth_cred().save_to_string(save_parents=True) + elif record['type'] in ["slice"]: + try: + cred = self.get_slice_cred(record.get_name()).save_to_string(save_parents=True) + except ServerException, e: + # XXX smbaker -- once we have better error return codes, update this + # to do something better than a string compare + if "Permission error" in e.args[0]: + cred = self.get_auth_cred().save_to_string(save_parents=True) + else: + raise + elif record.get_type() in ["authority"]: + cred = self.get_auth_cred().save_to_string(save_parents=True) + elif record.get_type() == 'node': + cred = self.get_auth_cred().save_to_string(save_parents=True) + else: + raise "unknown record type" + record.get_type() + record = record.as_dict() + return self.registry.Update(record, cred) + + def get_trusted_certs(self, opts, args): + """ + return uhe trusted certs at this interface + """ + trusted_certs = self.registry.get_trusted_certs() + for trusted_cert in trusted_certs: + cert = Certificate(string=trusted_cert) + print cert.get_subject() + return + + def aggregates(self, opts, args): + """ + return a list of details about known aggregates + """ + user_cred = self.get_user_cred().save_to_string(save_parents=True) + hrn = None + if args: + hrn = args[0] + + result = self.registry.get_aggregates(user_cred, hrn) + display_list(result) + return + + def registries(self, opts, args): + """ + return a list of details about known registries + """ + user_cred = self.get_user_cred().save_to_string(save_parents=True) + hrn = None + if args: + hrn = args[0] + result = self.registry.get_registries(user_cred, hrn) + display_list(result) + return + + + # ================================================================== + # Slice-related commands + # ================================================================== + + + def version(self, opts, args): + server = self.get_server_from_opts(opts) + + print server.GetVersion() + + # list instantiated slices + def slices(self, opts, args): + """ + list instantiated slices + """ + user_cred = self.get_user_cred().save_to_string(save_parents=True) + delegated_cred = self.delegate_cred(user_cred, get_authority(self.authority)) + creds = [user_cred, delegated_cred] + server = self.get_server_from_opts(opts) + results = server.ListSlices(creds) + display_list(results) + return + + # show rspec for named slice + def resources(self, opts, args): + user_cred = self.get_user_cred().save_to_string(save_parents=True) + server = self.slicemgr + call_options = {} + server = self.get_server_from_opts(opts) + + if args: + cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) + hrn = args[0] + call_options = {'geni_slice_urn': hrn_to_urn(hrn, 'slice')} + else: + cred = user_cred + hrn = None + + delegated_cred = self.delegate_cred(cred, get_authority(self.authority)) + creds = [cred, delegated_cred] + result = server.ListResources(creds, call_options) + format = opts.format + display_rspec(result, format) + if (opts.file is not None): + file = opts.file + if not file.startswith(os.sep): + file = os.path.join(self.options.sfi_dir, file) + save_rspec_to_file(result, file) + return + + # created named slice with given rspec + def create(self, opts, args): + slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + user_cred = self.get_user_cred() + slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) + delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) + creds = [slice_cred, delegated_cred] + rspec_file = self.get_rspec_file(args[1]) + rspec = open(rspec_file).read() + server = self.get_server_from_opts(opts) + result = server.CreateSliver(slice_urn, creds, rspec, []) + print result + return result + + # get a ticket for the specified slice + def get_ticket(self, opts, args): + slice_hrn, rspec_path = args[0], args[1] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + user_cred = self.get_user_cred() + slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) + delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) + creds = [slice_cred, delegated_cred] + rspec_file = self.get_rspec_file(rspec_path) + rspec = open(rspec_file).read() + server = self.get_server_from_opts(opts) + ticket_string = server.GetTicket(slice_urn, creds, rspec, []) + file = os.path.join(self.options.sfi_dir, get_leaf(slice_hrn) + ".ticket") + print "writing ticket to ", file + ticket = SfaTicket(string=ticket_string) + ticket.save_to_file(filename=file, save_parents=True) + + def redeem_ticket(self, opts, args): + ticket_file = args[0] + + # get slice hrn from the ticket + # use this to get the right slice credential + ticket = SfaTicket(filename=ticket_file) + ticket.decode() + slice_hrn = ticket.gidObject.get_hrn() + slice_urn = hrn_to_urn(slice_hrn, 'slice') + #slice_hrn = ticket.attributes['slivers'][0]['hrn'] + user_cred = self.get_user_cred() + slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) + + # get a list of node hostnames from the RSpec + tree = etree.parse(StringIO(ticket.rspec)) + root = tree.getroot() + hostnames = root.xpath("./network/site/node/hostname/text()") + + # create an xmlrpc connection to the component manager at each of these + # components and gall redeem_ticket + connections = {} + for hostname in hostnames: + try: + print "Calling redeem_ticket at %(hostname)s " % locals(), + server = self.get_server(hostname, CM_PORT, self.key_file, \ + self.cert_file, self.options.debug) + server.RedeemTicket(ticket.save_to_string(save_parents=True), slice_cred) + print "Success" + except socket.gaierror: + print "Failed:", + print "Componet Manager not accepting requests" + except Exception, e: + print "Failed:", e.message + return + + # delete named slice + def delete(self, opts, args): + slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) + delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) + creds = [slice_cred, delegated_cred] + server = self.get_server_from_opts(opts) + return server.DeleteSliver(slice_urn, creds) + + # start named slice + def start(self, opts, args): + slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) + delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) + creds = [slice_cred, delegated_cred] + server = self.get_server_from_opts(opts) + return server.Start(slice_urn, creds) + + # stop named slice + def stop(self, opts, args): + slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) + delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) + creds = [slice_cred, delegated_cred] + server = self.get_server_from_opts(opts) + return server.Stop(slice_urn, creds) + + # reset named slice + def reset(self, opts, args): + slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + server = self.get_server_from_opts(opts) + slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) + delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) + creds = [slice_cred, delegated_cred] + return server.reset_slice(creds, slice_urn) + + def renew(self, opts, args): + slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + server = self.get_server_from_opts(opts) + slice_cred = self.get_slice_cred(args[0]).save_to_string(save_parents=True) + delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) + creds = [slice_cred, delegated_cred] + time = args[1] + return server.RenewSliver(slice_urn, creds, time) + + + def status(self, opts, args): + slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) + delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) + creds = [slice_cred, delegated_cred] + server = self.get_server_from_opts(opts) + print server.SliverStatus(slice_urn, creds) + + + def shutdown(self, opts, args): + slice_hrn = args[0] + slice_urn = hrn_to_urn(slice_hrn, 'slice') + slice_cred = self.get_slice_cred(slice_hrn).save_to_string(save_parents=True) + delegated_cred = self.delegate_cred(slice_cred, get_authority(self.authority)) + + server = self.get_server_from_opts(opts) + return server.Shutdown(slice_urn, [slice_cred]) + + # + # Main: parse arguments and dispatch to command + # + def main(self): + parser = self.create_parser() + (options, args) = parser.parse_args() + self.options = options + + if options.hashrequest: + self.hashrequest = True + + if len(args) <= 0: + print "No command given. Use -h for help." + return - 1 + + command = args[0] + (cmd_opts, cmd_args) = self.create_cmd_parser(command).parse_args(args[1:]) + if self.options.verbose : + print "Registry %s, sm %s, dir %s, user %s, auth %s" % (options.registry, options.sm, + options.sfi_dir, options.user, + options.auth) + print "Command %s" % command + if command in ("resources"): + print "resources cmd_opts %s" % cmd_opts.format + elif command in ("list", "show", "remove"): + print "cmd_opts.type %s" % cmd_opts.type + print "cmd_args %s" % cmd_args + + self.set_servers() + + try: + self.dispatch(command, cmd_opts, cmd_args) + except KeyError: + raise + print "Command not found:", command + sys.exit(1) + + return + +if __name__ == "__main__": + Sfi().main() diff --git a/sfa/client/sfiAddAttribute.py b/sfa/client/sfiAddAttribute.py new file mode 100755 index 00000000..33b94a3a --- /dev/null +++ b/sfa/client/sfiAddAttribute.py @@ -0,0 +1,36 @@ +#! /usr/bin/env python + +import sys +from sfa.util.rspecHelper import RSpec, Commands + +command = Commands(usage="%prog [options] [node1 node2...]", + description="Add sliver attributes to the RSpec. " + + "This command reads in an RSpec and outputs a modified " + + "RSpec. Use this to add attributes to individual nodes " + + "in your slice. If no nodes are specified, the " + + "attributes will be added to ALL nodes.", + epilog="NOTE: Only admins can actually set these " + + "attributes, with the exception of --delegations") +command.add_nodefile_option() +command.add_attribute_options() +command.prep() + +attrs = command.get_attribute_dict() +for name in attrs: + for value in attrs[name]: + if not command.nodes: + try: + command.rspec.add_default_sliver_attribute(name, value) + except: + print >> sys.stderr, "FAILED: on all nodes: %s=%s" % (name, value) + else: + for node in command.nodes: + try: + command.rspec.add_sliver_attribute(node, name, value) + except: + print >> sys.stderr, "FAILED: on node %s: %s=%s" % (node, name, value) + +print command.rspec + + + diff --git a/sfa/client/sfiAddSliver.py b/sfa/client/sfiAddSliver.py new file mode 100755 index 00000000..be1c51c2 --- /dev/null +++ b/sfa/client/sfiAddSliver.py @@ -0,0 +1,22 @@ +#! /usr/bin/env python + +import sys +from sfa.util.rspecHelper import RSpec, Commands + +command = Commands(usage="%prog [options] node1 node2...", + description="Add slivers to the RSpec. " + + "This command reads in an RSpec and outputs a modified " + + "RSpec. Use this to add nodes to your slice.") +command.add_nodefile_option() +command.prep() + +for node in command.nodes: + try: + command.rspec.add_sliver(node) + except: + print >> sys.stderr, "FAILED: %s" % node + +print command.rspec + + + diff --git a/sfa/client/sfiDeleteAttribute.py b/sfa/client/sfiDeleteAttribute.py new file mode 100755 index 00000000..8e8f0a28 --- /dev/null +++ b/sfa/client/sfiDeleteAttribute.py @@ -0,0 +1,37 @@ +#! /usr/bin/env python + +import sys +from sfa.util.rspecHelper import RSpec, Commands + +command = Commands(usage="%prog [options] [node1 node2...]", + description="Delete sliver attributes from the RSpec. " + + "This command reads in an RSpec and outputs a modified " + + "RSpec. Use this to remove attributes from nodes " + + "in your slice. If no nodes are specified, the " + + "attributes will be removed from ALL nodes.", + epilog="NOTE: Only admins can actually set these " + + "attributes, with the exception of --delegations") +command.add_nodefile_option() +command.add_attribute_options() +command.prep() + +attrs = command.get_attribute_dict() +for name in attrs: + print >> sys.stderr, name, attrs[name] + for value in attrs[name]: + if not command.nodes: + try: + command.rspec.remove_default_sliver_attribute(name, value) + except: + print >> sys.stderr, "FAILED: on all nodes: %s=%s" % (name, value) + else: + for node in command.nodes: + try: + command.rspec.remove_sliver_attribute(node, name, value) + except: + print >> sys.stderr, "FAILED: on node %s: %s=%s" % (node, name, value) + +print command.rspec + + + diff --git a/sfa/client/sfiDeleteSliver.py b/sfa/client/sfiDeleteSliver.py new file mode 100755 index 00000000..c8e769aa --- /dev/null +++ b/sfa/client/sfiDeleteSliver.py @@ -0,0 +1,22 @@ +#! /usr/bin/env python + +import sys +from sfa.util.rspecHelper import RSpec, Commands + +command = Commands(usage="%prog [options] node1 node2...", + description="Delete slivers from the RSpec. " + + "This command reads in an RSpec and outputs a modified " + + "RSpec. Use this to remove nodes from your slice.") +command.add_nodefile_option() +command.prep() + +for node in command.nodes: + try: + command.rspec.remove_sliver(node) + except: + print >> sys.stderr, "FAILED: %s" % node + +print command.rspec + + + diff --git a/sfa/client/sfiListNodes.py b/sfa/client/sfiListNodes.py new file mode 100755 index 00000000..df14fe38 --- /dev/null +++ b/sfa/client/sfiListNodes.py @@ -0,0 +1,17 @@ +#! /usr/bin/env python + +import sys +from sfa.util.rspecHelper import RSpec, Commands + +command = Commands(usage="%prog [options]", + description="List all nodes in the RSpec. " + + "Use this to display the list of nodes on which it is " + + "possible to create a slice.") +command.prep() + +nodes = command.rspec.get_node_list() +for node in nodes: + print node + + + diff --git a/sfa/client/sfiListSlivers.py b/sfa/client/sfiListSlivers.py new file mode 100755 index 00000000..685521ca --- /dev/null +++ b/sfa/client/sfiListSlivers.py @@ -0,0 +1,28 @@ +#! /usr/bin/env python + +import sys +from sfa.util.rspecHelper import RSpec, Commands + +command = Commands(usage="%prog [options]", + description="List all slivers in the RSpec. " + + "Use this to display the list of nodes belonging to " + + "the slice.") +command.add_show_attributes_option() +command.prep() + +nodes = command.rspec.get_sliver_list() +if command.opts.showatt: + defaults = command.rspec.get_default_sliver_attributes() + if defaults: + print "ALL NODES" + for (name, value) in defaults: + print " %s: %s" % (name, value) + +for node in nodes: + print node + if command.opts.showatt: + atts = command.rspec.get_sliver_attributes(node) + for (name, value) in atts: + print " %s: %s" % (name, value) + + diff --git a/sfa/cron.d/sfa.cron b/sfa/cron.d/sfa.cron new file mode 100644 index 00000000..c92afb6d --- /dev/null +++ b/sfa/cron.d/sfa.cron @@ -0,0 +1,8 @@ +SHELL=/bin/bash +PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin +MAILTO=server-msgs@planet-lab.org +HOME=/ +# +# minute hour day-of-month month day-of-week user command +0 * * * * /usr/bin/sfa-import-plc.py > /dev/null 2>&1 +0 0 * * * /usr/bin/sfa-clean-peer-records.py > /dev/null 2>&1 diff --git a/sfa/init.d/sfa b/sfa/init.d/sfa new file mode 100755 index 00000000..77490c74 --- /dev/null +++ b/sfa/init.d/sfa @@ -0,0 +1,113 @@ +#!/bin/bash +# +# sfa Wraps PLCAPI into the SFA compliant API +# +# chkconfig: 2345 5 99 +# +# description: Wraps PLCAPI into the SFA compliant API +# +# $Id: sfa 18662 2010-08-24 16:53:40Z tmack $ +# $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/init.d/sfa $ +# + +# Source config +[ -f /etc/sfa/sfa_config ] && . /etc/sfa/sfa_config + +# source function library +. /etc/init.d/functions + +# Regenerate configuration files - almost verbatim from plc.init +reload () +{ + force=$1 + + # Regenerate the main configuration file from default values + # overlaid with site-specific and current values. + # Thierry -- 2007-07-05 : values in plc_config.xml are *not* taken into account here + files=( + /etc/sfa/default_config.xml + /etc/sfa/configs/site.xml + ) + for file in "${files[@]}" ; do + if [ -n "$force" -o $file -nt /etc/sfa/sfa_config.xml ] ; then + tmp=$(mktemp /tmp/sfa_config.xml.XXXXXX) + plc-config --xml "${files[@]}" >$tmp + if [ $? -eq 0 ] ; then + mv $tmp /etc/sfa/sfa_config.xml + chmod 444 /etc/sfa/sfa_config.xml + else + echo "SFA: Warning: Invalid configuration file(s) detected" + rm -f $tmp + fi + break + fi + done + + # Convert configuration to various formats + if [ -n "$force" -o /etc/sfa/sfa_config.xml -nt /etc/sfa/sfa_config ] ; then + plc-config --shell /etc/sfa/sfa_config.xml >/etc/sfa/sfa_config + fi + if [ -n "$force" -o /etc/sfa/sfa_config.xml -nt /etc/sfa/sfa_config.py ] ; then + plc-config --python /etc/sfa/sfa_config.xml >/etc/sfa/sfa_config.py + fi +# if [ -n "$force" -o /etc/sfa/sfa_config.xml -nt /etc/sfa/php/sfa_config.php ] ; then +# mkdir -p /etc/sfa/php +# plc-config --php /etc/sfa/sfa_config.xml >/etc/sfa/php/sfa_config.php +# fi + + # [re]generate the sfa_component_config + gen-sfa-cm-config.py +} + +start() { + + reload + + if [ "$SFA_REGISTRY_ENABLED" ]; then + action $"SFA Registry" daemon /usr/bin/sfa-server.py -r -d $OPTIONS + fi + + if [ "$SFA_AGGREGATE_ENABLED" ]; then + action $"SFA Aggregate" daemon /usr/bin/sfa-server.py -a -d $OPTIONS + fi + + if [ "$SFA_SM_ENABLED" ]; then + action "SFA SliceMgr" daemon /usr/bin/sfa-server.py -s -d $OPTIONS + fi + + RETVAL=$? + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/sfa + +} + +stop() { + action $"Shutting down SFA" killproc sfa-server.py + RETVAL=$? + + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sfa +} + + +case "$1" in + start) start ;; + stop) stop ;; + reload) reload force ;; + restart) stop; start ;; + condrestart) + if [ -f /var/lock/subsys/sfa ]; then + stop + start + fi + ;; + status) + status sfa + RETVAL=$? + ;; + *) + echo $"Usage: $0 {start|stop|reload|restart|condrestart|status}" + exit 1 + ;; +esac + +exit $RETVAL + diff --git a/sfa/init.d/sfa-cm b/sfa/init.d/sfa-cm new file mode 100755 index 00000000..e3bbd966 --- /dev/null +++ b/sfa/init.d/sfa-cm @@ -0,0 +1,80 @@ +#!/bin/bash +# +# sfa Wraps PLCAPI into the SFA compliant API +# +# chkconfig: 2345 5 99 +# +# description: Wraps PLCAPI into the SFA compliant API +# +# $Id: sfa 14304 2009-07-06 20:19:51Z thierry $ +# $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/init.d/sfa $ +# + +# Source config +. /etc/sfa/sfa_config + +# source function library +. /etc/init.d/functions + +init_key() { + # if key doesnt exist use sfa_componenet_setup to get it + if [ ! -f /var/lib/sfa/server.key ]; then + /usr/bin/sfa_component_setup.py -k + fi +} + +start() { + echo -n $"Starting SFA: " + + if [ "$SFA_CM_ENABLED" ]; then + echo "Component Mgr" + # make sure server key (nodes private key) exists first + init_key + /usr/bin/sfa-server.py -c -d $OPTIONS + fi + + RETVAL=$? + echo + [ $RETVAL -eq 0 ] && touch /var/lock/subsys/sfa + +} + +stop() { + echo -n $"Shutting down SFA: " + killproc sfa-server.py + RETVAL=$? + + echo + [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/sfa +} + + + +case "$1" in + start) + start + ;; + stop) + stop + ;; + restart|reload) + stop + start + ;; + condrestart) + if [ -f /var/lock/subsys/sfa ]; then + stop + start + fi + ;; + status) + status sfa + RETVAL=$? + ;; + *) + echo $"Usage: $0 {start|stop|restart|condrestart|status}" + exit 1 +esac + +exit $RETVAL + diff --git a/sfa/managers/__init__.py b/sfa/managers/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfa/managers/aggregate_manager_pl.py b/sfa/managers/aggregate_manager_pl.py new file mode 100644 index 00000000..f0338775 --- /dev/null +++ b/sfa/managers/aggregate_manager_pl.py @@ -0,0 +1,326 @@ +### $Id: slices.py 15842 2009-11-22 09:56:13Z anil $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/plc/slices.py $ + +import datetime +import time +import traceback +import sys + +from types import StringTypes +from sfa.util.namespace import * +from sfa.util.rspec import * +from sfa.util.specdict import * +from sfa.util.faults import * +from sfa.util.record import SfaRecord +from sfa.util.policy import Policy +from sfa.util.record import * +from sfa.util.sfaticket import SfaTicket +from sfa.util.debug import log +from sfa.plc.slices import Slices +from sfa.trust.credential import Credential +import sfa.plc.peers as peers +from sfa.plc.network import * +from sfa.plc.api import SfaAPI +from sfa.plc.slices import * + + +def __get_registry_objects(slice_xrn, creds, users): + """ + + """ + hrn, type = urn_to_hrn(slice_xrn) + + hrn_auth = get_authority(hrn) + + # Build up objects that an SFA registry would return if SFA + # could contact the slice's registry directly + reg_objects = None + + if users: + reg_objects = {} + + site = {} + site['site_id'] = 0 + site['name'] = 'geni.%s' % hrn_auth[:20] + site['enabled'] = True + site['max_slices'] = 100 + + # Note: + # Is it okay if this login base is the same as one already at this myplc site? + # Do we need uniqueness? Should use hrn_auth instead of just the leaf perhaps? + site['login_base'] = hrn_auth[:20] + site['abbreviated_name'] = hrn_auth[:20] + site['max_slivers'] = 1000 + reg_objects['site'] = site + + slice = {} + slice['expires'] = int(time.mktime(Credential(string=creds[0]).get_lifetime().timetuple())) + slice['hrn'] = hrn + slice['name'] = site['login_base'] + "_" + get_leaf(hrn) + slice['url'] = hrn + slice['description'] = hrn + slice['pointer'] = 0 + reg_objects['slice_record'] = slice + + reg_objects['users'] = {} + for user in users: + user['key_ids'] = [] + hrn, _ = urn_to_hrn(user['urn']) + user['email'] = hrn + "@geni.net" + user['first_name'] = hrn + user['last_name'] = hrn + reg_objects['users'][user['email']] = user + + return reg_objects + +def __get_hostnames(nodes): + hostnames = [] + for node in nodes: + hostnames.append(node.hostname) + return hostnames + +def get_version(): + version = {} + version['geni_api'] = 1 + version['sfa'] = 1 + return version + +def slice_status(api, slice_xrn, creds): + result = {} + result['geni_urn'] = slice_xrn + result['geni_status'] = 'unknown' + result['geni_resources'] = {} + return result + +def create_slice(api, slice_xrn, creds, rspec, users): + """ + Create the sliver[s] (slice) at this aggregate. + Verify HRN and initialize the slice record in PLC if necessary. + """ + + reg_objects = __get_registry_objects(slice_xrn, creds, users) + + hrn, type = urn_to_hrn(slice_xrn) + peer = None + slices = Slices(api) + peer = slices.get_peer(hrn) + sfa_peer = slices.get_sfa_peer(hrn) + registry = api.registries[api.hrn] + credential = api.getCredential() + site_id, remote_site_id = slices.verify_site(registry, credential, hrn, + peer, sfa_peer, reg_objects) + + slice_record = slices.verify_slice(registry, credential, hrn, site_id, + remote_site_id, peer, sfa_peer, reg_objects) + + network = Network(api) + + slice = network.get_slice(api, hrn) + slice.peer_id = slice_record['peer_slice_id'] + current = __get_hostnames(slice.get_nodes()) + + network.addRSpec(rspec, api.config.SFA_AGGREGATE_RSPEC_SCHEMA) + request = __get_hostnames(network.nodesWithSlivers()) + + # remove nodes not in rspec + deleted_nodes = list(set(current).difference(request)) + + # add nodes from rspec + added_nodes = list(set(request).difference(current)) + + if peer: + api.plshell.UnBindObjectFromPeer(api.plauth, 'slice', slice.id, peer) + + api.plshell.AddSliceToNodes(api.plauth, slice.name, added_nodes) + api.plshell.DeleteSliceFromNodes(api.plauth, slice.name, deleted_nodes) + + network.updateSliceTags() + + if peer: + api.plshell.BindObjectToPeer(api.plauth, 'slice', slice.id, peer, + slice.peer_id) + + # print network.toxml() + + return True + + +def renew_slice(api, xrn, creds, exipration_time): + hrn, type = urn_to_hrn(xrn) + slicename = hrn_to_pl_slicename(hrn) + slices = api.plshell.GetSlices(api.plauth, {'name': slicename}, ['slice_id']) + if not slices: + raise RecordNotFound(hrn) + slice = slices[0] + slice['expires'] = expiration_time + api.plshell.UpdateSlice(api.plauth, slice['slice_id'], slice) + return 1 + +def start_slice(api, xrn, creds): + hrn, type = urn_to_hrn(xrn) + slicename = hrn_to_pl_slicename(hrn) + slices = api.plshell.GetSlices(api.plauth, {'name': slicename}, ['slice_id']) + if not slices: + raise RecordNotFound(hrn) + slice_id = slices[0]['slice_id'] + slice_tags = api.plshell.GetSliceTags(api.plauth, {'slice_id': slice_id, 'tagname': 'enabled'}, ['slice_tag_id']) + # just remove the tag if it exists + if slice_tags: + api.plshell.DeleteSliceTag(api.plauth, slice_tags[0]['slice_tag_id']) + + return 1 + +def stop_slice(api, xrn, creds): + hrn, type = urn_to_hrn(xrn) + slicename = hrn_to_pl_slicename(hrn) + slices = api.plshell.GetSlices(api.plauth, {'name': slicename}, ['slice_id']) + if not slices: + raise RecordNotFound(hrn) + slice_id = slices[0]['slice_id'] + slice_tags = api.plshell.GetSliceTags(api.plauth, {'slice_id': slice_id, 'tagname': 'enabled'}) + if not slice_tags: + api.plshell.AddSliceTag(api.plauth, slice_id, 'enabled', '0') + elif slice_tags[0]['value'] != "0": + tag_id = attributes[0]['slice_tag_id'] + api.plshell.UpdateSliceTag(api.plauth, tag_id, '0') + return 1 + +def reset_slice(api, xrn): + # XX not implemented at this interface + return 1 + +def delete_slice(api, xrn, creds): + hrn, type = urn_to_hrn(xrn) + slicename = hrn_to_pl_slicename(hrn) + slices = api.plshell.GetSlices(api.plauth, {'name': slicename}) + if not slices: + return 1 + slice = slices[0] + + # determine if this is a peer slice + peer = peers.get_peer(api, hrn) + if peer: + api.plshell.UnBindObjectFromPeer(api.plauth, 'slice', slice['slice_id'], peer) + api.plshell.DeleteSliceFromNodes(api.plauth, slicename, slice['node_ids']) + if peer: + api.plshell.BindObjectToPeer(api.plauth, 'slice', slice['slice_id'], peer, slice['peer_slice_id']) + return 1 + +def get_slices(api, creds): + # look in cache first + if api.cache: + slices = api.cache.get('slices') + if slices: + return slices + + # get data from db + slices = api.plshell.GetSlices(api.plauth, {'peer_id': None}, ['name']) + slice_hrns = [slicename_to_hrn(api.hrn, slice['name']) for slice in slices] + slice_urns = [hrn_to_urn(slice_hrn, 'slice') for slice_hrn in slice_hrns] + + # cache the result + if api.cache: + api.cache.add('slices', slice_urns) + + return slice_urns + +def get_rspec(api, creds, options): + # get slice's hrn from options + xrn = options.get('geni_slice_urn', None) + hrn, type = urn_to_hrn(xrn) + + # look in cache first + if api.cache and not xrn: + rspec = api.cache.get('nodes') + if rspec: + return rspec + + network = Network(api) + if (hrn): + if network.get_slice(api, hrn): + network.addSlice() + + rspec = network.toxml() + + # cache the result + if api.cache and not xrn: + api.cache.add('nodes', rspec) + + return rspec + + +def get_ticket(api, xrn, creds, rspec, users): + + reg_objects = __get_registry_objects(xrn, creds, users) + + slice_hrn, type = urn_to_hrn(xrn) + slices = Slices(api) + peer = slices.get_peer(slice_hrn) + sfa_peer = slices.get_sfa_peer(slice_hrn) + + # get the slice record + registry = api.registries[api.hrn] + credential = api.getCredential() + records = registry.Resolve(xrn, credential) + + # similar to create_slice, we must verify that the required records exist + # at this aggregate before we can issue a ticket + site_id, remote_site_id = slices.verify_site(registry, credential, slice_hrn, + peer, sfa_peer, reg_objects) + slice = slices.verify_slice(registry, credential, slice_hrn, site_id, + remote_site_id, peer, sfa_peer, reg_objects) + + # make sure we get a local slice record + record = None + for tmp_record in records: + if tmp_record['type'] == 'slice' and \ + not tmp_record['peer_authority']: + record = SliceRecord(dict=tmp_record) + if not record: + raise RecordNotFound(slice_hrn) + + # get sliver info + slivers = Slices(api).get_slivers(slice_hrn) + if not slivers: + raise SliverDoesNotExist(slice_hrn) + + # get initscripts + initscripts = [] + data = { + 'timestamp': int(time.time()), + 'initscripts': initscripts, + 'slivers': slivers + } + + # create the ticket + object_gid = record.get_gid_object() + new_ticket = SfaTicket(subject = object_gid.get_subject()) + new_ticket.set_gid_caller(api.auth.client_gid) + new_ticket.set_gid_object(object_gid) + new_ticket.set_issuer(key=api.key, subject=api.hrn) + new_ticket.set_pubkey(object_gid.get_pubkey()) + new_ticket.set_attributes(data) + new_ticket.set_rspec(rspec) + #new_ticket.set_parent(api.auth.hierarchy.get_auth_ticket(auth_hrn)) + new_ticket.encode() + new_ticket.sign() + + return new_ticket.save_to_string(save_parents=True) + + + +def main(): + api = SfaAPI() + """ + rspec = get_rspec(api, "plc.princeton.sapan", None) + #rspec = get_rspec(api, "plc.princeton.coblitz", None) + #rspec = get_rspec(api, "plc.pl.sirius", None) + print rspec + """ + f = open(sys.argv[1]) + xml = f.read() + f.close() + create_slice(api, "plc.princeton.sapan", xml) + +if __name__ == "__main__": + main() diff --git a/sfa/managers/component_manager_default.py b/sfa/managers/component_manager_default.py new file mode 100644 index 00000000..e6482d4a --- /dev/null +++ b/sfa/managers/component_manager_default.py @@ -0,0 +1,22 @@ + +def start_slice(api, slicename): + return + +def stop_slice(api, slicename): + return + +def delete_slice(api, slicename): + return + +def reset_slice(api, slicename): + return + +def get_slices(api): + return + +def reboot(): + return + +def redeem_ticket(api, ticket_string): + return + diff --git a/sfa/managers/component_manager_pl.py b/sfa/managers/component_manager_pl.py new file mode 100644 index 00000000..c26ca4d2 --- /dev/null +++ b/sfa/managers/component_manager_pl.py @@ -0,0 +1,73 @@ +import os +import xmlrpclib +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.sfaticket import SfaTicket + +def init_server(): + from sfa.server import sfa_component_setup + # get current trusted gids + try: + sfa_component_setup.get_trusted_certs() + except: + # our keypair may be old, try refreshing + sfa_component_setup.get_node_key() + sfa_component_setup.get_credential(force=True) + sfa_component_setup.get_trusted_certs() + +def get_version(): + version = {} + version['geni_api'] = 1 + return version + +def slice_status(api, slice_xrn, creds): + result = {} + result['geni_urn'] = slice_xrn + result['geni_status'] = 'unknown' + result['geni_resources'] = {} + return result + +def start_slice(api, xrn, creds): + hrn, type = urn_to_hrn(xrn) + slicename = hrn_to_pl_slicename(hrn) + api.nodemanger.Start(slicename) + +def stop_slice(api, xrn, creds): + hrn, type = urn_to_hrn(xrn) + slicename = hrn_to_pl_slicename(hrn) + api.nodemanager.Stop(slicename) + +def delete_slice(api, xrn, creds): + hrn, type = urn_to_hrn(xrn) + slicename = hrn_to_pl_slicename(hrn) + api.nodemanager.Destroy(slicename) + +def reset_slice(api, xrn): + hrn, type = urn_to_hrn(xrn) + slicename = hrn_to_pl_slicename(hrn) + if not api.sliver_exists(slicename): + raise SliverDoesNotExist(slicename) + api.nodemanager.ReCreate(slicename) + +def get_slices(api): + # this returns a tuple, the data we want is at index 1 + xids = api.nodemanager.GetXIDs() + # unfortunately the data we want is given to us as + # a string but we really want it as a dict + # lets eval it + slices = eval(xids[1]) + return slices.keys() + +def redeem_ticket(api, ticket_string): + ticket = SfaTicket(string=ticket_string) + ticket.decode() + hrn = ticket.attributes['slivers'][0]['hrn'] + slicename = hrn_to_pl_slicename(hrn) + if not api.sliver_exists(slicename): + raise SliverDoesNotExist(slicename) + + # convert ticket to format nm is used to + nm_ticket = xmlrpclib.dumps((ticket.attributes,), methodresponse=True) + api.nodemanager.AdminTicket(nm_ticket) + + diff --git a/sfa/managers/eucalyptus/eucalyptus.rnc b/sfa/managers/eucalyptus/eucalyptus.rnc new file mode 100644 index 00000000..271ca812 --- /dev/null +++ b/sfa/managers/eucalyptus/eucalyptus.rnc @@ -0,0 +1,89 @@ +start = RSpec +RSpec = element RSpec { + attribute type { xsd:NMTOKEN }, + cloud +} +cloud = element cloud { + attribute id { xsd:NMTOKEN }, + user_info?, + ipv4, + keypairs, + images, + cluster+ +} +user_info = element user_info { + credential +} +keypairs = element keypairs { keypair+ } +images = element images { image+ } +image = element image { + attribute id { xsd:ID }, + type, + arch, + state, + location +} +cluster = element cluster { + attribute id { xsd:ID }, + ipv4, + vm_types +} +vm_types = element vm_types { vm_type+ } +vm_type = element vm_type { + attribute name { xsd:ID }, + free_slots, + max_instances, + cores, + memory, + disk_space, + request?, + euca_instances? +} +request = element request { + instances, + kernel_image, + ramdisk, + disk_image, + keypair +} +euca_instances = element euca_instances { + euca_instance+ +} +euca_instance = element euca_instance { + attribute id { xsd:ID }, + state, + public_dns, + keypair +} +credential = element credential { text } +ipv4 = element ipv4 { text } +keypair = element keypair { text } +type = element type { text } +arch = element arch { text } +state = element state { text } +location = element location { text } +free_slots = element free_slots { text } +max_instances = element max_instances { text } +cores = element cores { text } +public_dns = element public_dns { text } +memory = element memory { + attribute unit { xsd:NMTOKEN }, + text +} +disk_space = element disk_space { + attribute unit { xsd:NMTOKEN }, + text +} +instances = element instances { xsd:unsignedInt } +kernel_image = element kernel_image { + attribute id { xsd:IDREF }, + empty +} +ramdisk = element ramdisk { + attribute id { xsd:IDREF }?, + empty +} +disk_image = element disk_image { + attribute id { xsd:IDREF }, + empty +} diff --git a/sfa/managers/eucalyptus/eucalyptus.rng b/sfa/managers/eucalyptus/eucalyptus.rng new file mode 100644 index 00000000..43c3f9a7 --- /dev/null +++ b/sfa/managers/eucalyptus/eucalyptus.rng @@ -0,0 +1,222 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfa/managers/eucalyptus/eucalyptus.xml b/sfa/managers/eucalyptus/eucalyptus.xml new file mode 100644 index 00000000..9aca652b --- /dev/null +++ b/sfa/managers/eucalyptus/eucalyptus.xml @@ -0,0 +1,76 @@ + + + + + + foobarbaz + + 155.98.39.85 + + cortex + mykey + + + + machine + x86_64 + available + images/ttylinux.img.manifest.xml + + + kernel + x86_64 + available + images/vmlinuz-2.6.16.33-xen.manifest.xml + + + + 10.1.1.2 + + + 2 + 2 + 1 + 128 + 2 + + + 1 + + + + cortex + + + + 1 + 2 + 1 + 256 + 5 + + + 0 + 1 + 2 + 512 + 10 + + + 0 + 1 + 2 + 1024 + 20 + + + 0 + 0 + 4 + 2048 + 20 + + + + + diff --git a/sfa/managers/max/max.xml b/sfa/managers/max/max.xml new file mode 100644 index 00000000..f549ab7d --- /dev/null +++ b/sfa/managers/max/max.xml @@ -0,0 +1,90 @@ + + + geni.maxgigapop.net + Example MAX RSpec + + 1279848020 + 1280712039 + + + +

    206.196.176.55
    + + generic + 2.0GHz + 1 + 256MB + 16GB + + + Ethernet + eth1 + 100Mbps + 10.10.10.2/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab2:interface=eth1.any_1 + + + Ethernet + eth1 + 100Mbps + 10.10.30.1/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab5:interface=eth1.any_2 + + + +
    206.196.176.138
    + + generic + 2.0GHz + 1 + 256MB + 16GB + + + Ethernet + eth1 + 100Mbps + 10.10.20.2/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab2:interface=eth1.any_3 + + + Ethernet + eth1 + 100Mbps + 10.10.30.2/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab3:interface=eth1.any_2 + +
    + +
    206.196.176.133
    + + generic + 2.0GHz + 1 + 256MB + 16GB + + + Ethernet + eth1 + 100Mbps + 10.10.10.1/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab3:interface=eth1.any_1 + + + Ethernet + eth1 + 100Mbps + 10.10.20.1/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab5:interface=eth1.any_3 + +
    + + diff --git a/sfa/managers/pl/pl.rnc b/sfa/managers/pl/pl.rnc new file mode 100644 index 00000000..098aa2e2 --- /dev/null +++ b/sfa/managers/pl/pl.rnc @@ -0,0 +1,56 @@ +start = RSpec +RSpec = element RSpec { + attribute type { xsd:NMTOKEN }, + ( network | request ) +} +network = element network { + attribute name { xsd:NMTOKEN }, + attribute slice { xsd:NMTOKEN }?, + sliver_defaults?, + site+ +} +sliver_defaults = element sliver_defaults { + sliver_elements +} +site = element site { + attribute id { xsd:ID }, + element name { text }, + node* +} +node = element node { + attribute id { xsd:ID }, + element hostname { text }, + element bw_limit { attribute units { xsd:NMTOKEN }, text }?, + sliver* +} +request = element request { + attribute name { xsd:NMTOKEN }, + sliver_defaults?, + sliver* +} +sliver = element sliver { + attribute nodeid { xsd:ID }?, + sliver_elements +} +sliver_elements = ( + element capabilities { text }? + & element codemux { text }* + & element cpu_pct { text }? + & element cpu_share { text }? + & element delegations { text }? + & element disk_max { text }? + & element initscript { text }? + & element ip_addresses {text }* + & element net_i2_max_kbyte { text }? + & element net_i2_max_rate { text }? + & element net_i2_min_rate { text }? + & element net_i2_share { text }? + & element net_i2_thresh_kbyte { text }? + & element net_max_kbyte { text }? + & element net_max_rate { text }? + & element net_min_rate { text }? + & element net_share { text }? + & element net_thresh_kbyte { text }? + & element vsys {text}* + & element vsys_vnet { text }? +) diff --git a/sfa/managers/pl/pl.rng b/sfa/managers/pl/pl.rng new file mode 100644 index 00000000..3b46f885 --- /dev/null +++ b/sfa/managers/pl/pl.rng @@ -0,0 +1,201 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfa/managers/pl/pl.xml b/sfa/managers/pl/pl.xml new file mode 100644 index 00000000..3824f30a --- /dev/null +++ b/sfa/managers/pl/pl.xml @@ -0,0 +1,3420 @@ + + + + + HU Berlin - IWI + + planetlab1.wiwi.hu-berlin.de + + + planetlab2.wiwi.hu-berlin.de + + + + Williams College + + planetlab1.williams.edu + + + planetlab2.williams.edu + + + planetlab3.williams.edu + + + planetlab4.williams.edu + + + planetlab5.williams.edu + + + + Kentucky + + planetlab1.netlab.uky.edu + 100000 + + + planetlab2.netlab.uky.edu + 100000 + + + + UCSD + + planetlab1.ucsd.edu + + + planetlab2.ucsd.edu + + + planetlab3.ucsd.edu + + + + Arizona + + planetlab1.arizona-gigapop.net + + + planetlab2.arizona-gigapop.net + + + + LBL + + node1.lbnl.nodes.planet-lab.org + 10000 + + + node2.lbnl.nodes.planet-lab.org + 10000 + + + + UPenn + + planetlab1.cis.upenn.edu + 1000 + + + planetlab2.cis.upenn.edu + 1000 + + + + IRP + + planet1.pittsburgh.intel-research.net + 1000 + + + planet2.pittsburgh.intel-research.net + 1000 + + + planet3.pittsburgh.intel-research.net + 1000 + + + + IRB + + planet4.berkeley.intel-research.net + + + planet5.berkeley.intel-research.net + + + planet6.berkeley.intel-research.net + + + + Cambridge + + planetlab1.xeno.cl.cam.ac.uk + 10000 + + + planetlab2.xeno.cl.cam.ac.uk + 10000 + + + planetlab3.xeno.cl.cam.ac.uk + 10000 + + + + Harvard + + lefthand.eecs.harvard.edu + 10000 + + + righthand.eecs.harvard.edu + 10000 + + + + Wash + + planetlab01.cs.washington.edu + + + planetlab02.cs.washington.edu + + + planetlab03.cs.washington.edu + + + planetlab04.cs.washington.edu + + + planetlab05.cs.washington.edu + + + planetlab06.cs.washington.edu + + + + CarnegieMellon + + planetlab-1.cmcl.cs.cmu.edu + 5000 + + + planetlab-2.cmcl.cs.cmu.edu + 5000 + + + planetlab-3.cmcl.cs.cmu.edu + 5000 + + + + Michigan Technological University + + mtuplanetlab1.cs.mtu.edu + 500000 + + + mtuplanetlab2.cs.mtu.edu + + + + Duke + + planetlab1.cs.duke.edu + 10000 + + + planetlab2.cs.duke.edu + 10000 + + + planetlab3.cs.duke.edu + 10000 + + + planetlab4.cs.duke.edu + + + planetlab5.cs.duke.edu + + + planetlab6.cs.duke.edu + + + planetlab7.cs.duke.edu + + + + ISI + + planetlab1.postel.org + 10000 + + + planetlab2.postel.org + 10000 + + + planetlab3.postel.org + 1000 + + + planetlab4.postel.org + 1000 + + + + Kansas + + kupl1.ittc.ku.edu + 10000 + + + kupl2.ittc.ku.edu + 10000 + + + + WashU + + vn4.cse.wustl.edu + 100000 + + + vn5.cse.wustl.edu + 100000 + + + + Michigan + + planetlab1.eecs.umich.edu + 10000 + + + planetlab2.eecs.umich.edu + 10000 + + + planetlab3.eecs.umich.edu + + + planetlab4.eecs.umich.edu + + + planetlab5.eecs.umich.edu + + + + UCSB + + planet1.cs.ucsb.edu + 10000 + + + planet2.cs.ucsb.edu + 10000 + + + planet3.cs.ucsb.edu + 100000 + + + planet4.cs.ucsb.edu + 100000 + + + + MIT + + planetlab1.csail.mit.edu + 10000 + + + planetlab3.csail.mit.edu + 10000 + + + planetlab2.csail.mit.edu + 10000 + + + planetlab6.csail.mit.edu + 10000 + + + planetlab5.csail.mit.edu + 10000 + + + planetlab7.csail.mit.edu + 10000 + + + planetlab4.csail.mit.edu + 10000 + + + + UCB + + planetlab4.millennium.berkeley.edu + 10000 + + + planetlab12.millennium.berkeley.edu + 10000 + + + planetlab5.millennium.berkeley.edu + 10000 + + + planetlab13.millennium.berkeley.edu + 10000 + + + planetlab14.millennium.berkeley.edu + 10000 + + + planetlab6.millennium.berkeley.edu + 10000 + + + planetlab7.millennium.berkeley.edu + 10000 + + + planetlab10.millennium.berkeley.edu + 10000 + + + planetlab11.millennium.berkeley.edu + 10000 + + + planetlab9.millennium.berkeley.edu + 10000 + + + planetlab8.millennium.berkeley.edu + 10000 + + + planetlab3.millennium.berkeley.edu + 10000 + + + planetlab1.millennium.berkeley.edu + 10000 + + + planetlab2.millennium.berkeley.edu + 10000 + + + planetlab15.millennium.berkeley.edu + 10000 + + + planetlab16.millennium.berkeley.edu + 10000 + + + + Rice + + ricepl-1.cs.rice.edu + 10000 + + + ricepl-2.cs.rice.edu + 10000 + + + ricepl-3.cs.rice.edu + 10000 + + + ricepl-4.cs.rice.edu + 10000 + + + ricepl-5.cs.rice.edu + 10000 + + + + Kent State University + + pl1.planet.cs.kent.edu + + + pl2.planet.cs.kent.edu + + + pl3.planet.cs.kent.edu + + + + Bologna + + planetlab1.cs.unibo.it + 10000 + + + planetlab2.cs.unibo.it + 10000 + + + + Austin + + planetlab2.csres.utexas.edu + 10000 + + + planetlab1.csres.utexas.edu + 10000 + + + planetlab3.csres.utexas.edu + 10000 + + + planetlab4.csres.utexas.edu + + + planetlab5.csres.utexas.edu + + + planetlab6.csres.utexas.edu + + + planetlab7.csres.utexas.edu + + + + Utah + + planetlab4.flux.utah.edu + 10000 + + + planetlab5.flux.utah.edu + 10000 + + + planetlab6.flux.utah.edu + + + planetlab7.flux.utah.edu + + + + UCLA + + planetlab1.cs.ucla.edu + 10000 + + + planetlab2.cs.ucla.edu + 10000 + + + + Cornell + + planetlab2.cs.cornell.edu + 10000 + + + planetlab1.cs.cornell.edu + 10000 + + + planetlab3-dsl.cs.cornell.edu + + + planetlab4-dsl.cs.cornell.edu + + + planetlab5.cs.cornell.edu + + + planetlab6.cs.cornell.edu + + + + Tennessee + + pl1.eecs.utk.edu + 10000 + + + pl2.eecs.utk.edu + 10000 + + + + CalTech + + planlab1.cs.caltech.edu + 10000 + + + planlab2.cs.caltech.edu + 10000 + + + + UMass + + planetlab1.cs.umass.edu + 5000 + + + planetlab2.cs.umass.edu + 5000 + + + + Emory University + + node1.planetlab.mathcs.emory.edu + + + node2.planetlab.mathcs.emory.edu + + + + Universidad de Buenos Aires + + planet-lab1.uba.ar + + + planet-lab2.uba.ar + + + + Kookmin University + + netapp6.cs.kookmin.ac.kr + + + netapp7.cs.kookmin.ac.kr + + + dplab03.kookmin.ac.kr + 10000 + + + + Canterbury + + planetlab1.cosc.canterbury.ac.nz + + + planetlab2.cosc.canterbury.ac.nz + + + + UT Dallas + + planetlab1.utdallas.edu + + + planetlab2.utdallas.edu + + + + CUHK + + planetlab1.ie.cuhk.edu.hk + + + planetlab2.ie.cuhk.edu.hk + + + planetlab3.ie.cuhk.edu.hk + + + planetlab4.ie.cuhk.edu.hk + + + planetlab5.ie.cuhk.edu.hk + + + + WayneState + + planetlab1.cs.wayne.edu + 100000 + + + planetlab2.cs.wayne.edu + 100000 + + + + Osaka City University + + planetlab1.n.info.eng.osaka-cu.ac.jp + 1000 + + + planetlab2.n.info.eng.osaka-cu.ac.jp + 1000 + + + planetlab3.n.info.eng.osaka-cu.ac.jp + 1000 + + + planetlab4.n.info.eng.osaka-cu.ac.jp + 1000 + + + + Berlin + + planetlab01.tkn.tu-berlin.de + + + planetlab02.tkn.tu-berlin.de + + + + Maryland + + salt.planetlab.cs.umd.edu + + + osiris.planetlab.cs.umd.edu + + + whitefall.planetlab.cs.umd.edu + + + miranda.planetlab.cs.umd.edu + 1000000 + + + + Toronto + + pl2.csl.utoronto.ca + 5000 + + + pl1.csl.utoronto.ca + 5000 + + + + Koc University + + planet1.ku.edu.tr + 2000 + + + planet2.ku.edu.tr + 2000 + + + + RIT + + planet1.cs.rit.edu + + + planet2.cs.rit.edu + + + + Northwestern + + planetlab1.eecs.northwestern.edu + 10000 + + + planetlab2.eecs.northwestern.edu + 10000 + + + planetlab3.eecs.northwestern.edu + 10000 + + + + ChapelHill + + planetlab1.cs.unc.edu + + + planetlab2.cs.unc.edu + + + + Illinois + + planetlab2.cs.uiuc.edu + + + planetlab1.cs.uiuc.edu + + + planetlab3.cs.uiuc.edu + + + planetlab4.cs.uiuc.edu + + + planetlab5.cs.uiuc.edu + + + planetlab6.cs.uiuc.edu + + + + London + + planetlab1.cs.ucl.ac.uk + + + planetlab2.cs.ucl.ac.uk + + + + University of Patras + + planetlab1.ceid.upatras.gr + + + planetlab2.ceid.upatras.gr + + + + Toyohashi Univ of Tech + + pl1.planetlab.ics.tut.ac.jp + + + pl2.planetlab.ics.tut.ac.jp + + + + NTHU + + pads23.cs.nthu.edu.tw + 10000 + + + pads21.cs.nthu.edu.tw + 10000 + + + + Rochester + + planet2.cs.rochester.edu + 10000 + + + planet1.cs.rochester.edu + 10000 + + + + Purdue + + planetlab1.cs.purdue.edu + 10000 + + + planetlab2.cs.purdue.edu + 10000 + + + + Rutgers + + planetlab2.rutgers.edu + + + planetlab1.rutgers.edu + + + + HPLabs + + pli1-pa-4.hpl.hp.com + 10000 + + + pli1-pa-5.hpl.hp.com + 10000 + + + pli1-pa-6.hpl.hp.com + + + + MichState + + planetlab1.cse.msu.edu + + + planetlab2.cse.msu.edu + + + + Hopkins + + planetlab1.cnds.jhu.edu + 10000 + + + planetlab2.cnds.jhu.edu + 10000 + + + planetlab3.cnds.jhu.edu + + + planetlab4.cnds.jhu.edu + + + + SRI International + + pl-node-0.csl.sri.com + 524 + + + pl-node-1.csl.sri.com + 524 + + + + University of Ottawa + + pl1.rcc.uottawa.ca + + + pl2.rcc.uottawa.ca + + + + NotreDame + + planetlab2.cse.nd.edu + + + planetlab1.cse.nd.edu + + + planetlab3.cse.nd.edu + + + planetlab4.cse.nd.edu + + + + GT + + planet1.cc.gt.atl.ga.us + 100000 + + + planet2.cc.gt.atl.ga.us + 100000 + + + planet3.cc.gt.atl.ga.us + 100000 + + + planet4.cc.gt.atl.ga.us + 100000 + + + + SBU + + pl1.cewit.stonybrook.edu + 1000 + + + pl2.cewit.stonybrook.edu + 1000 + + + + UFMG + + planetlab1.pop-mg.rnp.br + 1000000 + + + planetlab2.pop-mg.rnp.br + 1000000 + + + + Vrije + + planetlab2.cs.vu.nl + + + planetlab1.cs.vu.nl + + + + Columbia + + planetlab1.cs.columbia.edu + 10000 + + + planetlab2.cs.columbia.edu + 10000 + + + planetlab3.cs.columbia.edu + 10000 + + + + McGill + + node-1.mcgillplanetlab.org + + + node-2.mcgillplanetlab.org + + + + TAMU + + planetlab1.tamu.edu + 100000 + + + planetlab2.tamu.edu + 10000 + + + + NICT + + planetlab1.koganei.wide.ad.jp + 10000 + + + planetlab2.koganei.wide.ad.jp + 10000 + + + planetlab1.nvlab.org + 10000 + + + + DePaul + + planetlab2.mnlab.cti.depaul.edu + 10000 + + + planetlab1.mnlab.cti.depaul.edu + + + + Universidade Federal do ABC + + planet-lab1.ufabc.edu.br + 2000 + + + planet-lab2.ufabc.edu.br + 1000 + + + + HPLabsI2 + + pli2-pa-1.hpl.hp.com + + + pli2-pa-2.hpl.hp.com + + + pli2-pa-3.hpl.hp.com + + + + UCD + + planetlab2.ece.ucdavis.edu + 10000 + + + planetlab1.ece.ucdavis.edu + 10000 + + + + kaist + + csplanetlab1.kaist.ac.kr + 10000 + + + csplanetlab2.kaist.ac.kr + 10000 + + + csplanetlab4.kaist.ac.kr + 10000 + + + csplanetlab3.kaist.ac.kr + 10000 + + + + UTokyo + + planetlab1.iii.u-tokyo.ac.jp + + + planetlab2.iii.u-tokyo.ac.jp + + + + UOregon + + planetlab4.cs.uoregon.edu + + + planetlab2.cs.uoregon.edu + + + planetlab3.cs.uoregon.edu + + + planetlab1.cs.uoregon.edu + + + + HP Labs, Bristol + + pli1-br-2.hpl.hp.com + 10000 + + + pli1-br-3.hpl.hp.com + 10000 + + + pli1-br-1.hpl.hp.com + 10000 + + + pli2-br-2.hpl.hp.com + + + pli2-br-1.hpl.hp.com + + + pli1-tlnx.hpl.hp.com + 10000 + + + + Eurecom + + planetlab2.eurecom.fr + 500 + + + planetlab1.eurecom.fr + 500 + + + + Technion + + ds-pl3.technion.ac.il + 2000 + + + ds-pl1.technion.ac.il + 2000 + + + ds-pl2.technion.ac.il + 2000 + + + + TU Madrid + + planetlab1.ls.fi.upm.es + 10000 + + + planetlab2.ls.fi.upm.es + 10000 + + + + Ben-Gurion + + planetlab1.bgu.ac.il + 10000 + + + planetlab2.bgu.ac.il + 10000 + + + + National Taiwan + + planetlab1.ntu.nodes.planet-lab.org + 2000 + + + planetlab2.ntu.nodes.planet-lab.org + 2000 + + + + SNU + + arari.snu.ac.kr + 10000 + + + recall.snu.ac.kr + 10000 + + + + NCSU + + planet02.csc.ncsu.edu + 10000 + + + planet03.csc.ncsu.edu + 10000 + + + planet11.csc.ncsu.edu + 10000 + + + planet12.csc.ncsu.edu + 10000 + + + + UCSC + + planetslug3.cse.ucsc.edu + 10000 + + + planetslug4.cse.ucsc.edu + + + planetslug5.cse.ucsc.edu + + + planetslug6.cse.ucsc.edu + + + planetslug7.cse.ucsc.edu + + + + Nebraska + + planetlab1.unl.edu + + + planetlab2.unl.edu + + + + SICS + + planetlab1.sics.se + 10000 + + + planetlab2.sics.se + 10000 + + + + Dartmouth + + planetlab1.cs.dartmouth.edu + 10000 + + + planetlab2.cs.dartmouth.edu + 5000 + + + + Warsaw + + planetlab3.mini.pw.edu.pl + + + planetlab4.mini.pw.edu.pl + + + + Stanford + + planet1.scs.stanford.edu + 10000 + + + planet2.scs.stanford.edu + 10000 + + + + StevensTech + + planetlab2.cs.stevens-tech.edu + 10000 + + + planetlab1.cs.stevens-tech.edu + 10000 + + + + NYU + + planet1.scs.cs.nyu.edu + 10000 + + + planet2.scs.cs.nyu.edu + 10000 + + + planetx.scs.cs.nyu.edu + 10000 + + + + ICS-Forth + + planetlab1.ics.forth.gr + 104857 + + + planetlab2.ics.forth.gr + 104857 + + + + Passau + + dschinni.planetlab.extranet.uni-passau.de + 1000 + + + aladdin.planetlab.extranet.uni-passau.de + + + + Polito + + planetlab1.polito.it + 1000 + + + planetlab2.polito.it + 1000 + + + + Howard + + nodeb.howard.edu + 10000 + + + nodea.howard.edu + 10000 + + + + Torino + + planetlab1.di.unito.it + + + planetlab2.di.unito.it + + + + PLA Univ of Sci and Tech + + plnodeb.plaust.edu.cn + + + plnodea.plaust.edu.cn + + + + Delft + + planetlab1.ewi.tudelft.nl + 5000 + + + planetlab2.ewi.tudelft.nl + 5000 + + + + ICU + + planetlab5.kaist.ac.kr + 10000 + + + planetlab6.kaist.ac.kr + 10000 + + + + St Andrews + + planetlab3.cs.st-andrews.ac.uk + + + planetlab4.cs.st-andrews.ac.uk + + + + CSLAB-ICCS at NTUA + + planetlab1.cslab.ece.ntua.gr + 104857 + + + planetlab2.cslab.ece.ntua.gr + 104857 + + + planetlab3.cslab.ece.ntua.gr + 104857 + + + planetlab4.cslab.ece.ntua.gr + 104857 + + + + Kaiserslautern + + planetlab1.informatik.uni-kl.de + 10000 + + + planetlab2.informatik.uni-kl.de + 10000 + + + + Victoria + + pl1.planetlab.uvic.ca + 1000000 + + + pl2.planetlab.uvic.ca + 1000000 + + + pl3.planetlab.uvic.ca + 1000000 + + + pl4.planetlab.uvic.ca + 1000000 + + + pl5.planetlab.uvic.ca + 1000000 + + + + nus + + planetlab1.comp.nus.edu.sg + 10000 + + + planetlab2.comp.nus.edu.sg + 10000 + + + planetlab3.comp.nus.edu.sg + 10000 + + + + KIT + + iraplab1.iralab.uni-karlsruhe.de + 10000 + + + iraplab2.iralab.uni-karlsruhe.de + 10000 + + + + UST-HK + + plab1.cs.ust.hk + 10000 + + + plab2.cs.ust.hk + 10000 + + + + Tromso + + planetlab1.cs.uit.no + + + planetlab2.cs.uit.no + + + + KJIST + + planetlab1.netmedia.gist.ac.kr + 100000 + + + planetlab2.netmedia.gist.ac.kr + 100000 + + + planetlab3.netmedia.gist.ac.kr + 100000 + + + + Cincinnati + + planetlab1.uc.edu + 10000 + + + planetlab2.uc.edu + 10000 + + + + Polytechnic + + planetlab1.poly.edu + 2000 + + + planetlab2.poly.edu + 2000 + + + + University of Minnesota + + planetlab1.dtc.umn.edu + 10000 + + + planetlab2.dtc.umn.edu + 10000 + + + + ATT + + planet2.att.nodes.planet-lab.org + 10000 + + + planet1.att.nodes.planet-lab.org + 10000 + + + + TRLabs + + planetlab1.win.trlabs.ca + 10000 + + + planetlab2.win.trlabs.ca + 10000 + + + + EPFL + + lsirextpc01.epfl.ch + + + lsirextpc02.epfl.ch + + + + Brown + + saturn.cs.brown.edu + 10000 + + + jupiter.cs.brown.edu + 10000 + + + pluto.cs.brown.edu + 10000 + + + earth.cs.brown.edu + 10000 + + + + University of Melbourne - CSSE + + plnode01.cs.mu.oz.au + 500 + + + plnode02.cs.mu.oz.au + 500 + + + + UiO + + planetlab2.ifi.uio.no + + + planetlab1.ifi.uio.no + + + + RNP + + planetlab1.pop-pa.rnp.br + + + planetlab2.pop-pa.rnp.br + + + + RNP - CE + + planetlab1.pop-ce.rnp.br + 10000 + + + planetlab2.pop-ce.rnp.br + 10000 + + + + RNP - RJ + + planetlab1.pop-rj.rnp.br + + + planetlab2.pop-rj.rnp.br + + + + RNP - RS + + planetlab1.pop-rs.rnp.br + 10000 + + + planetlab2.pop-rs.rnp.br + 10000 + + + + Simula Research Laboratory + + planetlab1.simula.no + + + planetlab2.simula.no + + + + NCCU + + ent1.cs.nccu.edu.tw + 10000 + + + ent2.cs.nccu.edu.tw + 10000 + + + + Wuerzburg + + planetlab2.informatik.uni-wuerzburg.de + 10000 + + + planetlab1.informatik.uni-wuerzburg.de + 10000 + + + + Hannover L3S + + planet1.l3s.uni-hannover.de + 10000 + + + planet2.l3s.uni-hannover.de + 10000 + + + + Wisconsin + + planetlab2.cs.wisc.edu + 10000 + + + planetlab3.wail.wisc.edu + + + planetlab4.wail.wisc.edu + + + + UChicago + + planetlab1.cs.uchicago.edu + 10000 + + + planetlab2.cs.uchicago.edu + 10000 + + + planetlab3.cs.uchicago.edu + 10000 + + + planetlab4.cs.uchicago.edu + 10000 + + + + National University of Kaohsiung + + planetlab1.csie.nuk.edu.tw + 10000 + + + planetlab2.csie.nuk.edu.tw + 10000 + + + + Taiwan + + planetlab1.iis.sinica.edu.tw + 10000 + + + planetlab2.iis.sinica.edu.tw + 10000 + + + + BostonU + + planetlab-01.bu.edu + + + planetlab-02.bu.edu + + + + Princeton + + alice.cs.princeton.edu + 10000 + + + planetlab-9.cs.princeton.edu + 10000 + + + delta.cs.princeton.edu + + + echo.cs.princeton.edu + + + hptest-1.cs.princeton.edu + + + planetlab-01.cs.princeton.edu + + + planetlab-02.cs.princeton.edu + + + planetlab-03.cs.princeton.edu + + + planetlab-04.cs.princeton.edu + + + planetlab-05.cs.princeton.edu + + + planetlab-06.cs.princeton.edu + + + hp-dl320-g6-loaner.cs.princeton.edu + + + + SUNY Binghamton + + pluto.cs.binghamton.edu + + + charon.cs.binghamton.edu + + + + NECLabs + + plab2.nec-labs.com + + + plab1.nec-labs.com + + + + UVA + + planetlab01.sys.virginia.edu + 500 + + + planetlab02.sys.virginia.edu + 500 + + + + JHU Info Security + + planetlab1.isi.jhu.edu + + + planetlab2.isi.jhu.edu + + + + Instituto Tecnologico Buenos Aires + + planet-lab1.itba.edu.ar + 256000 + + + planet-lab2.itba.edu.ar + 256000 + + + + Cal Poly SLO + + planetlab-1.calpoly-netlab.net + + + planetlab-2.calpoly-netlab.net + + + + Doshisha University + + nis-planet1.doshisha.ac.jp + + + nis-planet2.doshisha.ac.jp + + + + University of Waterloo + + plink.cs.uwaterloo.ca + + + plonk.cs.uwaterloo.ca + + + + UFPR/C3SL + + planetlab1.c3sl.ufpr.br + + + planetlab2.c3sl.ufpr.br + + + + University of Otago + + planetlab1.cs.otago.ac.nz + + + planetlab2.cs.otago.ac.nz + + + + University of Oklahoma + + roam1.cs.ou.edu + + + roam2.cs.ou.edu + + + + MLab - NUQ01 + + + MLab - ORD01 + + + MLab - MIA01 + + + MLab - LAX01 + + + MLab - LGA01 + + + MLab - DFW01 + + + MLab - ATL01 + + + SUNY Albany + + node1.planetlab.albany.edu + 6291 + + + node2.planetlab.albany.edu + 6291 + + + + University of Nevada, Reno + + planetlab1.scsr.nevada.edu + + + planetlab2.scsr.nevada.edu + + + + Cleveland State University + + planetlab2.csuohio.edu + + + planetlab1.csuohio.edu + + + + Tokyo Institute of Technology + + node1.planet-lab.titech.ac.jp + + + node2.planet-lab.titech.ac.jp + + + node3.planet-lab.titech.ac.jp + + + node4.planet-lab.titech.ac.jp + + + + Colgate University + + flow.colgate.edu + + + ebb.colgate.edu + + + + Ege University + + planetlab1.plab.ege.edu.tr + 10000 + + + planetlab2.plab.ege.edu.tr + 10000 + + + + MLab - LGA02 + + + MLab - SEA01 + + + Huawei Technologies + + pn1-planetlab.huawei.com + + + pn2-planetlab.huawei.com + + + + Peking University + + pl1.pku.edu.cn + + + pl3.pku.edu.cn + + + pl2.pku.edu.cn + + + + University of Auckland + + planetlab-1.cs.auckland.ac.nz + + + planetlab-2.cs.auckland.ac.nz + + + + Loyola University Chicago + + node0.planetlab.etl.luc.edu + 1000 + + + node1.planetlab.etl.luc.edu + 1000 + + + + MLab - AMS01 + + + MLab - AMS02 + + + MLab - LHR01 + + + MLab - PAR01 + + + MLab - HAM01 + + + Nile University + + planetlab2.nileu.edu.eg + 1024 + + + planetlab1.nileu.edu.eg + 1024 + + + + University of Illinois at Chicago + + planetlab-1.cs.uic.edu + 1000 + + + planetlab-2.cs.uic.edu + 1000 + + + + Suffolk University + + metis.mcs.suffolk.edu + 10000 + + + adrastea.mcs.suffolk.edu + 10000 + + + + National Chung Cheng University + + planetlab-1.webedu.ccu.edu.tw + + + planetlab-2.webedu.ccu.edu.tw + + + + Shanghai Jiaotong University + + planetlab-1.sjtu.edu.cn + + + planetlab-2.sjtu.edu.cn + + + + Jordan University of Science and Technology + + planetlab1.just.edu.jo + + + planetlab2.just.edu.jo + + + + Hellenic Telecommunications and Post Commission + + mlab1.gr-ix.gr + + + mlab2.gr-ix.gr + + + mlab3.gr-ix.gr + + + + Nanyang Technological University + + pnode2.pdcc-ntu.singaren.net.sg + + + pnode1.pdcc-ntu.singaren.net.sg + + + + MLab - ATH01 + + + Stanford OpenFlow + + + Monash University + + pl1.eng.monash.edu.au + + + pl2.eng.monash.edu.au + + + + Pusan National University + + mnc1.pusan.ac.kr + + + mnc2.pusan.ac.kr + + + + BBN Technologies + + plnode-01.gpolab.bbn.com + 1000 + + + plnode-02.gpolab.bbn.com + 1000 + + + plnode-03.gpolab.bbn.com + + + + Hiroshima City University + + pl1.sos.info.hiroshima-cu.ac.jp + + + pl2.sos.info.hiroshima-cu.ac.jp + + + + National University of Defense Technology + + planetlab-2.pdl.nudt.edu.cn + + + planetlab-1.pdl.nudt.edu.cn + + + + MLab - SYD01 + + + CWRU + + planetlab-4.EECS.CWRU.Edu + + + planetlab-5.EECS.CWRU.Edu + + + + NEU + + planetlabone.ccs.neu.edu + 1000000 + + + planetlabtwo.ccs.neu.edu + 1000000 + + + + Intel IT - Folsom + + planetdev02.fm.intel.com + + + planetdev01.fm.intel.com + + + planetdev04.fm.intel.com + + + planetdev05.fm.intel.com + + + + University of Colorado + + planetlab1.cs.colorado.edu + 500 + + + planetlab2.cs.colorado.edu + + + + HIIT + + planetlab1.hiit.fi + + + planetlab2.hiit.fi + + + planetlab3.hiit.fi + + + planetlab4.hiit.fi + + + + Georgetown + + planetlab1.georgetown.edu + 10000 + + + planetlab2.georgetown.edu + 10000 + + + + UDel + + planetlab1.pc.cis.udel.edu + 10000 + + + planetlab2.pc.cis.udel.edu + 10000 + + + + Neuchatel + + planetlab1.unineuchatel.ch + + + planetlab2.unineuchatel.ch + 1000 + + + + University of Zurich + + planetlab1.csg.uzh.ch + + + planetlab2.csg.uzh.ch + + + + Fraunhofer Institut + + planetlab2.itwm.fhg.de + + + planetlab1.itwm.fhg.de + + + planetlab3.itwm.fraunhofer.de + + + planetlab4.itwm.fraunhofer.de + + + planetlab5.itwm.fraunhofer.de + + + + Iowa State ECE + + planetlab-1.ece.iastate.edu + 5000 + + + planetlab-2.ece.iastate.edu + 5000 + + + planetlab-3.ece.iastate.edu + 5000 + + + planetlab-4.ece.iastate.edu + 5000 + + + Planetlab-6.ece.iastate.edu + + + planetlab-5.ece.iastate.edu + 5000 + + + + Darmstadt University of Technology + + host1.planetlab.informatik.tu-darmstadt.de + + + host2.planetlab.informatik.tu-darmstadt.de + + + host3.planetlab.informatik.tu-darmstadt.de + + + + Simon Fraser University + + cs-planetlab3.cs.surrey.sfu.ca + 500 + + + cs-planetlab4.cs.surrey.sfu.ca + + + + UConn + + planetlab1.engr.uconn.edu + + + planetlab2.engr.uconn.edu + + + + TUM + + planetlab2.lkn.ei.tum.de + 1000 + + + planetlab1.lkn.ei.tum.de + 10000 + + + + University of Florida + + planetlab1.acis.ufl.edu + 10000 + + + planetlab2.acis.ufl.edu + 10000 + + + + GMU + + plgmu1.ite.gmu.edu + 2000 + + + plgmu2.ite.gmu.edu + 2000 + + + plgmu3.ite.gmu.edu + 2000 + + + plgmu4.ite.gmu.edu + 2000 + + + + Universitat Rovira i Virgili + + planetlab.urv.net + + + planetlab2.urv.net + + + + University of Pittsburgh + + planetlab1.cs.pitt.edu + + + planetlab2.cs.pitt.edu + + + + UNC Charlotte + + planetlab02.uncc.edu + 1000 + + + planetlab01.uncc.edu + 1000 + + + planetlab03.uncc.edu + + + planetlab04.uncc.edu + + + + Telekomunikacja Polska + + planetlab2.warsaw.rd.tp.pl + 10000 + + + + Imperial College London + + planetlab-1.imperial.ac.uk + 10000 + + + planetlab-2.imperial.ac.uk + 10000 + + + planetlab-3.imperial.ac.uk + 10000 + + + planetlab-4.imperial.ac.uk + 10000 + + + + FAU Erlangen + + planetlab1.informatik.uni-erlangen.de + + + planetlab2.informatik.uni-erlangen.de + + + + KTH + + planetlab-1.ssvl.kth.se + 10000 + + + planetlab-2.ssvl.kth.se + 10000 + + + + NAIST + + planetlab-01.naist.jp + 100000 + + + planetlab-02.naist.jp + 100000 + + + planetlab-03.naist.jp + 100000 + + + planetlab-04.naist.jp + 100000 + + + + Telekomunikacja Polska - Swidnik + + + Duisburg-Essen + + planetlab1.exp-math.uni-essen.de + 3000 + + + planetlab2.exp-math.uni-essen.de + 3000 + + + + Colorado State University + + planetlab-1.cs.colostate.edu + 10000 + + + planetlab-2.cs.colostate.edu + 10000 + + + + The University of Hong Kong + + planetlab1.eee.hku.hk + 10000 + + + planetlab2.eee.hku.hk + 10000 + + + + UOI + + planetlab2.cs.uoi.gr + 500 + + + planetlab1.cs.uoi.gr + 500 + + + + Technical University Ilmenau + + planet1.prakinf.tu-ilmenau.de + + + planet2.prakinf.tu-ilmenau.de + + + planet3.prakinf.tu-ilmenau.de + + + + ADETTI/ISCTE + + planetlab-1.iscte.pt + + + planetlab-2.iscte.pt + + + + Brigham Young University + + planetlab1.byu.edu + 5000 + + + planetlab2.byu.edu + 5000 + + + + MPISWS + + planetlab01.mpi-sws.mpg.de + + + planetlab02.mpi-sws.mpg.de + + + planetlab03.mpi-sws.mpg.de + + + planetlab04.mpi-sws.mpg.de + + + planetlab05.mpi-sws.mpg.de + + + planetlab06.mpi-sws.mpg.de + + + + University of Toronto + + planetlab01.erin.utoronto.ca + 500 + + + planetlab02.erin.utoronto.ca + 500 + + + + Indiana + + pl1.ucs.indiana.edu + + + pl2.ucs.indiana.edu + + + + University of Bern, IAM + + planetlab01.cnds.unibe.ch + 100000 + + + planetlab02.cnds.unibe.ch + 100000 + + + planetlab03.cnds.unibe.ch + 100000 + + + planetlab04.cnds.unibe.ch + 100000 + + + + Collegium Budapest + + planet1.colbud.hu + + + planet2.colbud.hu + + + + Politecnico di Milano + + planetlab1.elet.polimi.it + + + planetlab2.elet.polimi.it + + + + Jacobs University Bremen + + planetlab1.eecs.jacobs-university.de + 500 + + + planetlab2.eecs.jacobs-university.de + 500 + + + + University of South Florida + + planetlab1.csee.usf.edu + + + planetlab2.csee.usf.edu + + + planetlab3.csee.usf.edu + + + planetlab4.csee.usf.edu + + + planetlab5.csee.usf.edu + + + planetlab6.csee.usf.edu + + + + Orbit + + orbpl1.rutgers.edu + 5000 + + + orbpl2.rutgers.edu + 5000 + + + + UC Riverside + + planet-lab1.cs.ucr.edu + + + planet-lab2.cs.ucr.edu + + + + Ohio State University + + planetlab-1.cse.ohio-state.edu + 1000 + + + planetlab-2.cse.ohio-state.edu + 1000 + + + + University of Goettingen + + planetlab1.informatik.uni-goettingen.de + + + planetlab2.informatik.uni-goettingen.de + + + + University of Cyprus + + planetlab-1.cs.ucy.ac.cy + 1000 + + + planetlab-2.cs.ucy.ac.cy + 1000 + + + + University of Puerto Rico at Mayaguez + + planetlab-01.ece.uprm.edu + + + planetlab-02.ece.uprm.edu + + + + University of Texas at El Paso + + planetlab1.utep.edu + + + planetlab2.utep.edu + + + + Osaka University + + pl2-higashi.ics.es.osaka-u.ac.jp + + + pl1-higashi.ics.es.osaka-u.ac.jp + + + pub1-s.ane.cmc.osaka-u.ac.jp + + + pub2-s.ane.cmc.osaka-u.ac.jp + + + int-pl1.ise.eng.osaka-u.ac.jp + + + int-pl2.ise.eng.osaka-u.ac.jp + + + + Fraunhofer HHI + + planet01.hhi.fraunhofer.de + 500 + + + planet02.hhi.fraunhofer.de + 500 + + + + Trinity College Dublin + + planetlab01.cs.tcd.ie + 10000 + + + planetlab02.cs.tcd.ie + 10000 + + + + University of California, Irvine + + planetlab-1a.ics.uci.edu + + + planetlab-2a.ics.uci.edu + + + planetlab-3.ics.uci.edu + + + + JAIST + + planet0.jaist.ac.jp + + + planet1.jaist.ac.jp + + + + University of Saskatchewan + + planetlab-1.usask.ca + + + planetlab-2.usask.ca + + + + Queen Mary, University of London + + planetlab1.nrl.dcs.qmul.ac.uk + 1000000 + + + planetlab2.nrl.dcs.qmul.ac.uk + 1000000 + + + + San Jose State University + + plab1.engr.sjsu.edu + 500 + + + plab2.engr.sjsu.edu + 500 + + + + IIT-Chicago + + server1.planetlab.iit-tech.net + 10485 + + + server2.planetlab.iit-tech.net + 10485 + + + server3.planetlab.iit-tech.net + 10485 + + + server4.planetlab.iit-tech.net + 10485 + + + + Wroclaw University of Technology + + planetlab2.ci.pwr.wroc.pl + + + planetlab1.ci.pwr.wroc.pl + + + + LARC - University of Sao Paulo + + plab1.larc.usp.br + + + plab2.larc.usp.br + + + + vanderbilt + + planetlab-1.vuse.vanderbilt.edu + 1000 + + + planetlab-2.vuse.vanderbilt.edu + 1000 + + + + Washington State University + + planetlab1.eecs.wsu.edu + 5000 + + + planetlab2.eecs.wsu.edu + 5000 + + + + Kansas State University + + plab4.eece.ksu.edu + + + plab3.eece.ksu.edu + + + + Universita + + planetlab-1.dis.uniroma1.it + 500 + + + planetlab-2.dis.uniroma1.it + 500 + + + + FeM TU-Ilmenau + + planetlab1.fem.tu-ilmenau.de + + + planetlab2.fem.tu-ilmenau.de + + + + Keio University + + planetlab1.sfc.wide.ad.jp + + + planetlab2.sfc.wide.ad.jp + + + + University of Missouri Kansas City + + kc-sce-plab1.umkc.edu + 1000 + + + kc-sce-plab2.umkc.edu + 1000 + + + + Klagenfurt University + + plab1-itec.uni-klu.ac.at + 1000 + + + plab2-itec.uni-klu.ac.at + 1000 + + + + University of Central Florida + + planetlab1.eecs.ucf.edu + + + planetlab2.eecs.ucf.edu + + + + Technische Universitaet Dresden + + planet1.inf.tu-dresden.de + + + planet2.inf.tu-dresden.de + + + + UTA + + planetlab1.uta.edu + + + planetlab2.uta.edu + + + + CESNET + + planetlab1.cesnet.cz + 10000 + + + planetlab2.cesnet.cz + + + planetlab1.fit.vutbr.cz + + + + University of Lisbon + + planetlab-1.di.fc.ul.pt + 500 + + + planetlab-2.di.fc.ul.pt + 500 + + + + Beijing Institute of Technology + + planetlab1.iin-bit.com.cn + 500 + + + planetlab2.iin-bit.com.cn + + + + Singapore AREN + + planetlab1.singaren.net.sg + + + planetlab2.singaren.net.sg + + + planetlab3.singaren.net.sg + + + planetlab4.singaren.net.sg + + + + WIDE Project + + planetlab0.otemachi.wide.ad.jp + + + planetlab1.otemachi.wide.ad.jp + + + planetlab0.dojima.wide.ad.jp + + + planetlab1.dojima.wide.ad.jp + + + + PL Colo - TP Warsaw + + + IST + + planetlab-1.tagus.ist.utl.pt + 10000 + + + planetlab-2.tagus.ist.utl.pt + 10000 + + + + CeCalCULA + + fobos.cecalc.ula.ve + + + deimos.cecalc.ula.ve + + + + National Taiwan University EE + + adam.ee.ntu.edu.tw + + + eve.ee.ntu.edu.tw + + + + RWTH Aachen + + freedom.informatik.rwth-aachen.de + + + peace.informatik.rwth-aachen.de + + + + Worcester Polytechnic Institute + + 75-130-96-12.static.oxfr.ma.charter.com + + + 75-130-96-13.static.oxfr.ma.charter.com + + + + Aston University + + planetlab1.aston.ac.uk + + + planetlab2.aston.ac.uk + + + + Zuse Institute Berlin + + planet1.zib.de + + + planet2.zib.de + + + + University of Innsbruck, Austria. + + plab1-c703.uibk.ac.at + 1000 + + + plab2-c703.uibk.ac.at + 1000 + + + + University of Stuttgart + + planetvs1.informatik.uni-stuttgart.de + 550 + + + planetvs2.informatik.uni-stuttgart.de + 550 + + + + University of Konstanz + + dannan.disy.inf.uni-konstanz.de + + + chronos.disy.inf.uni-konstanz.de + + + + Universidade do Algarve + + planetlab1.fct.ualg.pt + + + planetlab2.fct.ualg.pt + + + + University of Vienna + + planetlab2.ani.univie.ac.at + + + planetlab3.ani.univie.ac.at + + + planetlab4.ani.univie.ac.at + + + + Waseda University + + planetlab4.goto.info.waseda.ac.jp + + + planetlab5.goto.info.waseda.ac.jp + + + planetlab6.goto.info.waseda.ac.jp + + + + University of Houston + + planetlab-1.cs.uh.edu + 1000 + + + planetlab-2.cs.uh.edu + 1000 + + + + IRISA + + peeramidion.irisa.fr + + + peeramide.irisa.fr + + + + Arizona State University + + planetlab2.eas.asu.edu + + + planetlab1.eas.asu.edu + + + + University of Ljubljana + + planetlab1.fri.uni-lj.si + + + planetlab2.fri.uni-lj.si + + + + The Citadel + + planetlab1.citadel.edu + + + planetlab2.citadel.edu + + + + BME + + planetlab1.tmit.bme.hu + + + planetlab2.tmit.bme.hu + + + + Poznan Supercomputing + + planetlab-1.man.poznan.pl + + + planetlab-2.man.poznan.pl + + + + Lahore University of Management Pakistan + + planetlab01.lums.edu.pk + 500 + + + planetlab02.lums.edu.pk + 500 + + + + Universidad Publica de Navarra + + planetlab1.tlm.unavarra.es + + + planetlab2.tlm.unavarra.es + + + + ETH Zuerich - CS + + planetlab1.inf.ethz.ch + + + planetlab2.inf.ethz.ch + + + planetlab3.inf.ethz.ch + + + planetlab4.inf.ethz.ch + + + + Seoul National University - MMLAB + + pl1snu.koren21.net + 1000000 + + + pl2snu.koren21.net + 1000000 + + + + Virginia Tech + + planetlab-01.vt.nodes.planet-lab.org + + + planetlab-02.vt.nodes.planet-lab.org + + + planetlab-03.vt.nodes.planet-lab.org + + + planetlab-04.vt.nodes.planet-lab.org + + + + Facultad de Ingenieria - Univ. de la Republica + + planetlab-1.fing.edu.uy + + + planetlab-2.fing.edu.uy + + + + HAW Hamburg + + merkur.planetlab.haw-hamburg.de + + + mars.planetlab.haw-hamburg.de + + + + TU MIET + + mercury.silicon-valley.ru + + + venus.silicon-valley.ru + + + + DoCoMo Labs USA + + planetlabnode-1.docomolabs-usa.com + + + planetlabnode-2.docomolabs-usa.com + + + + PL Colo - CLARA Santiago + + planetlab1-santiago.lan.redclara.net + + + planetlab2-santiago.lan.redclara.net + + + + PL Colo - CLARA Sao Paulo + + planetlab1-saopaulo.lan.redclara.net + + + planetlab2-saopaulo.lan.redclara.net + + + + PL Colo - CLARA Buenos Aires + + planetlab1-buenosaires.lan.redclara.net + + + planetlab2-buenosaires.lan.redclara.net + + + + PL Colo - CLARA Tijuana + + planetlab1-tijuana.lan.redclara.net + + + planetlab2-tijuana.lan.redclara.net + + + + CWI + + 146-179.surfsnel.dsl.internl.net + 100000 + + + 147-179.surfsnel.dsl.internl.net + + + + Space Monitoring Data Center SINP MSU + + plab-1.sinp.msu.ru + 1000 + + + plab-2.sinp.msu.ru + 1000 + + + + RRC Kurchatovskiy Instutute + + pl1.grid.kiae.ru + + + pl2.grid.kiae.ru + + + + NETMODE Lab of NTUA + + vicky.planetlab.ntua.gr + + + stella.planetlab.ntua.gr + + + + diff --git a/sfa/managers/registry_manager_pl.py b/sfa/managers/registry_manager_pl.py new file mode 100644 index 00000000..1636eda3 --- /dev/null +++ b/sfa/managers/registry_manager_pl.py @@ -0,0 +1,421 @@ +import types +import time +from sfa.util.prefixTree import prefixTree +from sfa.util.record import SfaRecord +from sfa.util.table import SfaTable +from sfa.util.record import SfaRecord +from sfa.trust.gid import GID +from sfa.util.namespace import * +from sfa.trust.credential import * +from sfa.trust.certificate import * +from sfa.util.faults import * + +def get_version(api): + version = {} + version['geni_api'] = 1 + version['sfa'] = 1 + return version + +def get_credential(api, xrn, type, is_self=False): + # convert xrn to hrn + if type: + hrn = urn_to_hrn(xrn)[0] + else: + hrn, type = urn_to_hrn(xrn) + + # Is this a root or sub authority + auth_hrn = api.auth.get_authority(hrn) + if not auth_hrn or hrn == api.config.SFA_INTERFACE_HRN: + auth_hrn = hrn + # get record info + auth_info = api.auth.get_auth_info(auth_hrn) + table = SfaTable() + records = table.findObjects({'type': type, 'hrn': hrn}) + if not records: + raise RecordNotFound(hrn) + record = records[0] + + # verify_cancreate_credential requires that the member lists + # (researchers, pis, etc) be filled in + api.fill_record_info(record) + if record['type']=='user': + if not record['enabled']: + raise AccountNotEnabled(": PlanetLab account %s is not enabled. Please contact your site PI" %(record['email'])) + + # get the callers gid + # if this is a self cred the record's gid is the caller's gid + if is_self: + caller_hrn = hrn + caller_gid = record.get_gid_object() + else: + caller_gid = api.auth.client_cred.get_gid_caller() + caller_hrn = caller_gid.get_hrn() + + object_hrn = record.get_gid_object().get_hrn() + rights = api.auth.determine_user_rights(caller_hrn, record) + # make sure caller has rights to this object + if rights.is_empty(): + raise PermissionError(caller_hrn + " has no rights to " + record['name']) + + object_gid = GID(string=record['gid']) + new_cred = Credential(subject = object_gid.get_subject()) + new_cred.set_gid_caller(caller_gid) + new_cred.set_gid_object(object_gid) + new_cred.set_issuer_keys(auth_info.get_privkey_filename(), auth_info.get_gid_filename()) + #new_cred.set_pubkey(object_gid.get_pubkey()) + new_cred.set_privileges(rights) + new_cred.get_privileges().delegate_all_privileges(True) + auth_kind = "authority,ma,sa" + # Parent not necessary, verify with certs + #new_cred.set_parent(api.auth.hierarchy.get_auth_cred(auth_hrn, kind=auth_kind)) + new_cred.encode() + new_cred.sign() + + return new_cred.save_to_string(save_parents=True) + + +# The GENI GetVersion call +def GetVersion(): + version = {} + version['geni_api'] = 1 + return version + +def resolve(api, xrns, type=None, full=True): + + # load all know registry names into a prefix tree and attempt to find + # the longest matching prefix + if not isinstance(xrns, types.ListType): + xrns = [xrns] + hrns = [urn_to_hrn(xrn)[0] for xrn in xrns] + # create a dict whre key is an registry hrn and its value is a + # hrns at that registry (determined by the known prefix tree). + xrn_dict = {} + registries = api.registries + tree = prefixTree() + registry_hrns = registries.keys() + tree.load(registry_hrns) + for xrn in xrns: + registry_hrn = tree.best_match(urn_to_hrn(xrn)[0]) + if registry_hrn not in xrn_dict: + xrn_dict[registry_hrn] = [] + xrn_dict[registry_hrn].append(xrn) + + records = [] + for registry_hrn in xrn_dict: + # skip the hrn without a registry hrn + # XX should we let the user know the authority is unknown? + if not registry_hrn: + continue + + # if the best match (longest matching hrn) is not the local registry, + # forward the request + xrns = xrn_dict[registry_hrn] + if registry_hrn != api.hrn: + credential = api.getCredential() + peer_records = registries[registry_hrn].Resolve(xrns, credential) + records.extend([SfaRecord(dict=record).as_dict() for record in peer_records]) + + # try resolving the remaining unfound records at the local registry + remaining_hrns = set(hrns).difference([record['hrn'] for record in records]) + # convert set to list + remaining_hrns = [hrn for hrn in remaining_hrns] + table = SfaTable() + local_records = table.findObjects({'hrn': remaining_hrns}) + if full: + api.fill_record_info(local_records) + + # convert local record objects to dicts + records.extend([dict(record) for record in local_records]) + if not records: + raise RecordNotFound(str(hrns)) + + if type: + records = filter(lambda rec: rec['type'] in [type], records) + + return records + +def list(api, xrn, origin_hrn=None): + hrn, type = urn_to_hrn(xrn) + # load all know registry names into a prefix tree and attempt to find + # the longest matching prefix + records = [] + registries = api.registries + registry_hrns = registries.keys() + tree = prefixTree() + tree.load(registry_hrns) + registry_hrn = tree.best_match(hrn) + + #if there was no match then this record belongs to an unknow registry + if not registry_hrn: + raise MissingAuthority(xrn) + + # if the best match (longest matching hrn) is not the local registry, + # forward the request + records = [] + if registry_hrn != api.hrn: + credential = api.getCredential() + record_list = registries[registry_hrn].list(credential, xrn, origin_hrn) + records = [SfaRecord(dict=record).as_dict() for record in record_list] + + # if we still havnt found the record yet, try the local registry + if not records: + if not api.auth.hierarchy.auth_exists(hrn): + raise MissingAuthority(hrn) + + table = SfaTable() + records = table.find({'authority': hrn}) + + return records + + +def register(api, record): + + hrn, type = record['hrn'], record['type'] + urn = hrn_to_urn(hrn,type) + # validate the type + if type not in ['authority', 'slice', 'node', 'user']: + raise UnknownSfaType(type) + + # check if record already exists + table = SfaTable() + existing_records = table.find({'type': type, 'hrn': hrn}) + if existing_records: + raise ExistingRecord(hrn) + + record = SfaRecord(dict = record) + record['authority'] = get_authority(record['hrn']) + type = record['type'] + hrn = record['hrn'] + api.auth.verify_object_permission(hrn) + auth_info = api.auth.get_auth_info(record['authority']) + pub_key = None + # make sure record has a gid + if 'gid' not in record: + uuid = create_uuid() + pkey = Keypair(create=True) + if 'key' in record and record['key']: + if isinstance(record['key'], types.ListType): + pub_key = record['key'][0] + else: + pub_key = record['key'] + pkey = convert_public_key(pub_key) + + gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey) + gid = gid_object.save_to_string(save_parents=True) + record['gid'] = gid + record.set_gid(gid) + + if type in ["authority"]: + # update the tree + if not api.auth.hierarchy.auth_exists(hrn): + api.auth.hierarchy.create_auth(hrn_to_urn(hrn,'authority')) + + # get the GID from the newly created authority + gid = auth_info.get_gid_object() + record.set_gid(gid.save_to_string(save_parents=True)) + pl_record = api.sfa_fields_to_pl_fields(type, hrn, record) + sites = api.plshell.GetSites(api.plauth, [pl_record['login_base']]) + if not sites: + pointer = api.plshell.AddSite(api.plauth, pl_record) + else: + pointer = sites[0]['site_id'] + + record.set_pointer(pointer) + record['pointer'] = pointer + + elif (type == "slice"): + acceptable_fields=['url', 'instantiation', 'name', 'description'] + pl_record = api.sfa_fields_to_pl_fields(type, hrn, record) + for key in pl_record.keys(): + if key not in acceptable_fields: + pl_record.pop(key) + slices = api.plshell.GetSlices(api.plauth, [pl_record['name']]) + if not slices: + pointer = api.plshell.AddSlice(api.plauth, pl_record) + else: + pointer = slices[0]['slice_id'] + record.set_pointer(pointer) + record['pointer'] = pointer + + elif (type == "user"): + persons = api.plshell.GetPersons(api.plauth, [record['email']]) + if not persons: + pointer = api.plshell.AddPerson(api.plauth, dict(record)) + else: + pointer = persons[0]['person_id'] + + if 'enabled' in record and record['enabled']: + api.plshell.UpdatePerson(api.plauth, pointer, {'enabled': record['enabled']}) + # add this persons to the site only if he is being added for the first + # time by sfa and doesont already exist in plc + if not persons or not persons[0]['site_ids']: + login_base = get_leaf(record['authority']) + api.plshell.AddPersonToSite(api.plauth, pointer, login_base) + + # What roles should this user have? + api.plshell.AddRoleToPerson(api.plauth, 'user', pointer) + # Add the user's key + if pub_key: + api.plshell.AddPersonKey(api.plauth, pointer, {'key_type' : 'ssh', 'key' : pub_key}) + + elif (type == "node"): + pl_record = api.sfa_fields_to_pl_fields(type, hrn, record) + login_base = hrn_to_pl_login_base(record['authority']) + nodes = api.plshell.GetNodes(api.plauth, [pl_record['hostname']]) + if not nodes: + pointer = api.plshell.AddNode(api.plauth, login_base, pl_record) + else: + pointer = nodes[0]['node_id'] + + record['pointer'] = pointer + record.set_pointer(pointer) + record_id = table.insert(record) + record['record_id'] = record_id + + # update membership for researchers, pis, owners, operators + api.update_membership(None, record) + + return record.get_gid_object().save_to_string(save_parents=True) + +def update(api, record_dict): + new_record = SfaRecord(dict = record_dict) + type = new_record['type'] + hrn = new_record['hrn'] + urn = hrn_to_urn(hrn,type) + api.auth.verify_object_permission(hrn) + table = SfaTable() + # make sure the record exists + records = table.findObjects({'type': type, 'hrn': hrn}) + if not records: + raise RecordNotFound(hrn) + record = records[0] + record['last_updated'] = time.gmtime() + + # Update_membership needs the membership lists in the existing record + # filled in, so it can see if members were added or removed + api.fill_record_info(record) + + # Use the pointer from the existing record, not the one that the user + # gave us. This prevents the user from inserting a forged pointer + pointer = record['pointer'] + # update the PLC information that was specified with the record + + if (type == "authority"): + api.plshell.UpdateSite(api.plauth, pointer, new_record) + + elif type == "slice": + pl_record=api.sfa_fields_to_pl_fields(type, hrn, new_record) + if 'name' in pl_record: + pl_record.pop('name') + api.plshell.UpdateSlice(api.plauth, pointer, pl_record) + + elif type == "user": + # SMBAKER: UpdatePerson only allows a limited set of fields to be + # updated. Ideally we should have a more generic way of doing + # this. I copied the field names from UpdatePerson.py... + update_fields = {} + all_fields = new_record + for key in all_fields.keys(): + if key in ['first_name', 'last_name', 'title', 'email', + 'password', 'phone', 'url', 'bio', 'accepted_aup', + 'enabled']: + update_fields[key] = all_fields[key] + api.plshell.UpdatePerson(api.plauth, pointer, update_fields) + + if 'key' in new_record and new_record['key']: + # must check this key against the previous one if it exists + persons = api.plshell.GetPersons(api.plauth, [pointer], ['key_ids']) + person = persons[0] + keys = person['key_ids'] + keys = api.plshell.GetKeys(api.plauth, person['key_ids']) + key_exists = False + if isinstance(new_record['key'], types.ListType): + new_key = new_record['key'][0] + else: + new_key = new_record['key'] + + # Delete all stale keys + for key in keys: + if new_record['key'] != key['key']: + api.plshell.DeleteKey(api.plauth, key['key_id']) + else: + key_exists = True + if not key_exists: + api.plshell.AddPersonKey(api.plauth, pointer, {'key_type': 'ssh', 'key': new_key}) + + # update the openssl key and gid + pkey = convert_public_key(new_key) + uuid = create_uuid() + gid_object = api.auth.hierarchy.create_gid(urn, uuid, pkey) + gid = gid_object.save_to_string(save_parents=True) + record['gid'] = gid + record = SfaRecord(dict=record) + table.update(record) + + elif type == "node": + api.plshell.UpdateNode(api.plauth, pointer, new_record) + + else: + raise UnknownSfaType(type) + + # update membership for researchers, pis, owners, operators + api.update_membership(record, new_record) + + return 1 + +def remove(api, xrn, type, origin_hrn=None): + # convert xrn to hrn + if type: + hrn = urn_to_hrn(xrn)[0] + else: + hrn, type = urn_to_hrn(xrn) + + table = SfaTable() + filter = {'hrn': hrn} + if type and type not in ['all', '*']: + filter['type'] = type + records = table.find(filter) + if not records: + raise RecordNotFound(hrn) + record = records[0] + type = record['type'] + + credential = api.getCredential() + registries = api.registries + + # Try to remove the object from the PLCDB of federated agg. + # This is attempted before removing the object from the local agg's PLCDB and sfa table + if hrn.startswith(api.hrn) and type in ['user', 'slice', 'authority']: + for registry in registries: + if registry not in [api.hrn]: + try: + result=registries[registry].remove_peer_object(credential, record, origin_hrn) + except: + pass + if type == "user": + persons = api.plshell.GetPersons(api.plauth, record['pointer']) + # only delete this person if he has site ids. if he doesnt, it probably means + # he was just removed from a site, not actually deleted + if persons and persons[0]['site_ids']: + api.plshell.DeletePerson(api.plauth, record['pointer']) + elif type == "slice": + if api.plshell.GetSlices(api.plauth, record['pointer']): + api.plshell.DeleteSlice(api.plauth, record['pointer']) + elif type == "node": + if api.plshell.GetNodes(api.plauth, record['pointer']): + api.plshell.DeleteNode(api.plauth, record['pointer']) + elif type == "authority": + if api.plshell.GetSites(api.plauth, record['pointer']): + api.plshell.DeleteSite(api.plauth, record['pointer']) + else: + raise UnknownSfaType(type) + + table.remove(record) + + return 1 + +def remove_peer_object(api, record, origin_hrn=None): + pass + +def register_peer_object(api, record, origin_hrn=None): + pass diff --git a/sfa/managers/slice_manager_pl.py b/sfa/managers/slice_manager_pl.py new file mode 100644 index 00000000..42309781 --- /dev/null +++ b/sfa/managers/slice_manager_pl.py @@ -0,0 +1,308 @@ +### $Id: slices.py 15842 2009-11-22 09:56:13Z anil $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/plc/slices.py $ + +import datetime +import time +import traceback +import sys +from copy import deepcopy +from lxml import etree +from StringIO import StringIO +from types import StringTypes +from sfa.util.rspecHelper import merge_rspecs +from sfa.util.namespace import * +from sfa.util.rspec import * +from sfa.util.specdict import * +from sfa.util.faults import * +from sfa.util.record import SfaRecord +from sfa.util.policy import Policy +from sfa.util.prefixTree import prefixTree +from sfa.util.sfaticket import * +from sfa.trust.credential import Credential +from sfa.util.threadmanager import ThreadManager +import sfa.util.xmlrpcprotocol as xmlrpcprotocol +from sfa.util.debug import log +import sfa.plc.peers as peers +from copy import copy + +def get_version(): + version = {} + version['geni_api'] = 1 + version['sfa'] = 1 + return version + +def slice_status(api, slice_xrn, creds ): + result = {} + result['geni_urn'] = slice_xrn + result['geni_status'] = 'unknown' + result['geni_resources'] = {} + return result + +def create_slice(api, xrn, creds, rspec, users): + hrn, type = urn_to_hrn(xrn) + + # Validate the RSpec against PlanetLab's schema --disabled for now + # The schema used here needs to aggregate the PL and VINI schemas + # schema = "/var/www/html/schemas/pl.rng" + schema = None + if schema: + try: + tree = etree.parse(StringIO(rspec)) + except etree.XMLSyntaxError: + message = str(sys.exc_info()[1]) + raise InvalidRSpec(message) + + relaxng_doc = etree.parse(schema) + relaxng = etree.RelaxNG(relaxng_doc) + + if not relaxng(tree): + error = relaxng.error_log.last_error + message = "%s (line %s)" % (error.message, error.line) + raise InvalidRSpec(message) + + # attempt to use delegated credential first + credential = api.getDelegatedCredential(creds) + if not credential: + credential = api.getCredential() + threads = ThreadManager() + for aggregate in api.aggregates: + # Just send entire RSpec to each aggregate + server = api.aggregates[aggregate] + threads.run(server.CreateSliver, xrn, credential, rspec, users) + + results = threads.get_results() + merged_rspec = merge_rspecs(results) + return merged_rspec + +def renew_slice(api, xrn, creds, expiration_time): + # attempt to use delegated credential first + credential = api.getDelegatedCredential(creds) + if not credential: + credential = api.getCredential() + threads = ThreadManager() + for aggregate in api.aggregates: + server = api.aggregates[aggregate] + threads.run(server.RenewSliver, xrn, credential, expiration_time) + threads.get_results() + return 1 + +def get_ticket(api, xrn, creds, rspec, users): + slice_hrn, type = urn_to_hrn(xrn) + # get the netspecs contained within the clients rspec + aggregate_rspecs = {} + tree= etree.parse(StringIO(rspec)) + elements = tree.findall('./network') + for element in elements: + aggregate_hrn = element.values()[0] + aggregate_rspecs[aggregate_hrn] = rspec + + # attempt to use delegated credential first + credential = api.getDelegatedCredential(creds) + if not credential: + credential = api.getCredential() + threads = ThreadManager() + for aggregate, aggregate_rspec in aggregate_rspecs.items(): + server = None + if aggregate in api.aggregates: + server = api.aggregates[aggregate] + else: + net_urn = hrn_to_urn(aggregate, 'authority') + # we may have a peer that knows about this aggregate + for agg in api.aggregates: + target_aggs = api.aggregates[agg].get_aggregates(credential, net_urn) + if not target_aggs or not 'hrn' in target_aggs[0]: + continue + # send the request to this address + url = target_aggs[0]['url'] + server = xmlrpcprotocol.get_server(url, api.key_file, api.cert_file) + # aggregate found, no need to keep looping + break + if server is None: + continue + threads.run(server.GetTicket, xrn, credential, aggregate_rspec, users) + + results = threads.get_results() + + # gather information from each ticket + rspecs = [] + initscripts = [] + slivers = [] + object_gid = None + for result in results: + agg_ticket = SfaTicket(string=result) + attrs = agg_ticket.get_attributes() + if not object_gid: + object_gid = agg_ticket.get_gid_object() + rspecs.append(agg_ticket.get_rspec()) + initscripts.extend(attrs.get('initscripts', [])) + slivers.extend(attrs.get('slivers', [])) + + # merge info + attributes = {'initscripts': initscripts, + 'slivers': slivers} + merged_rspec = merge_rspecs(rspecs) + + # create a new ticket + ticket = SfaTicket(subject = slice_hrn) + ticket.set_gid_caller(api.auth.client_gid) + ticket.set_issuer(key=api.key, subject=api.hrn) + ticket.set_gid_object(object_gid) + ticket.set_pubkey(object_gid.get_pubkey()) + #new_ticket.set_parent(api.auth.hierarchy.get_auth_ticket(auth_hrn)) + ticket.set_attributes(attributes) + ticket.set_rspec(merged_rspec) + ticket.encode() + ticket.sign() + return ticket.save_to_string(save_parents=True) + + +def delete_slice(api, xrn, creds): + # attempt to use delegated credential first + credential = api.getDelegatedCredential(creds) + if not credential: + credential = api.getCredential() + threads = ThreadManager() + for aggregate in api.aggregates: + server = api.aggregates[aggregate] + threads.run(server.DeleteSliver, xrn, credential) + threads.get_results() + return 1 + +def start_slice(api, xrn, creds): + # attempt to use delegated credential first + credential = api.getDelegatedCredential(creds) + if not credential: + credential = api.getCredential() + threads = ThreadManager() + for aggregate in api.aggregates: + server = api.aggregates[aggregate] + threads.run(server.Start, xrn, credential) + threads.get_results() + return 1 + +def stop_slice(api, xrn, creds): + # attempt to use delegated credential first + credential = api.getDelegatedCredential(creds) + if not credential: + credential = api.getCredential() + threads = ThreadManager() + for aggregate in api.aggregates: + server = api.aggregates[aggregate] + threads.run(server.Stop, xrn, credential) + threads.get_results() + return 1 + +def reset_slice(api, xrn): + """ + Not implemented + """ + return 1 + +def shutdown(api, xrn, creds): + """ + Not implemented + """ + return 1 + +def status(api, xrn, creds): + """ + Not implemented + """ + return 1 + +def get_slices(api, creds): + # look in cache first + if api.cache: + slices = api.cache.get('slices') + if slices: + return slices + + # attempt to use delegated credential first + credential = api.getDelegatedCredential(creds) + if not credential: + credential = api.getCredential() + threads = ThreadManager() + # fetch from aggregates + for aggregate in api.aggregates: + server = api.aggregates[aggregate] + threads.run(server.ListSlices, credential) + + # combime results + results = threads.get_results() + slices = [] + for result in results: + slices.extend(result) + + # cache the result + if api.cache: + api.cache.add('slices', slices) + + return slices + +def get_rspec(api, creds, options): + # get slice's hrn from options + xrn = options.get('geni_slice_urn', None) + hrn, type = urn_to_hrn(xrn) + + # get hrn of the original caller + origin_hrn = options.get('origin_hrn', None) + if not origin_hrn: + origin_hrn = Credential(string=creds[0]).get_gid_caller().get_hrn() + + # look in cache first + if api.cache and not xrn: + rspec = api.cache.get('nodes') + if rspec: + return rspec + + hrn, type = urn_to_hrn(xrn) + rspec = None + + # attempt to use delegated credential first + credential = api.getDelegatedCredential(creds) + if not credential: + credential = api.getCredential() + threads = ThreadManager() + for aggregate in api.aggregates: + # get the rspec from the aggregate + server = api.aggregates[aggregate] + my_opts = copy(options) + my_opts['geni_compressed'] = False + threads.run(server.ListResources, credential, my_opts) + #threads.run(server.get_resources, cred, xrn, origin_hrn) + + results = threads.get_results() + # combine the rspecs into a single rspec + for agg_rspec in results: + try: + tree = etree.parse(StringIO(agg_rspec)) + except etree.XMLSyntaxError: + message = str(agg_rspec) + ": " + str(sys.exc_info()[1]) + raise InvalidRSpec(message) + + root = tree.getroot() + if root.get("type") in ["SFA"]: + if rspec == None: + rspec = root + else: + for network in root.iterfind("./network"): + rspec.append(deepcopy(network)) + for request in root.iterfind("./request"): + rspec.append(deepcopy(request)) + + rspec = etree.tostring(rspec, xml_declaration=True, pretty_print=True) + # cache the result + if api.cache and not xrn: + api.cache.add('nodes', rspec) + + return rspec + +def main(): + r = RSpec() + r.parseFile(sys.argv[1]) + rspec = r.toDict() + create_slice(None,'plc.princeton.tmacktestslice',rspec) + +if __name__ == "__main__": + main() + diff --git a/sfa/managers/vini/__init__.py b/sfa/managers/vini/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfa/managers/vini/request.xml b/sfa/managers/vini/request.xml new file mode 100644 index 00000000..111f7b0e --- /dev/null +++ b/sfa/managers/vini/request.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfa/managers/vini/topology.py b/sfa/managers/vini/topology.py new file mode 100755 index 00000000..cb65fb50 --- /dev/null +++ b/sfa/managers/vini/topology.py @@ -0,0 +1,38 @@ +#!/usr/bin/python + +# $Id: topology.py 14181 2009-07-01 19:46:07Z acb $ +# $URL: https://svn.planet-lab.org/svn/NodeManager-topo/trunk/topology.py $ + +# +# Links in the physical topology, gleaned from looking at the Internet2 +# and NLR topology maps. Link (a, b) connects sites with IDs a and b. +# +PhysicalLinks = [(2, 12), # I2 Princeton - New York + (4, 5), # NLR Chicago - Houston + (4, 6), # NLR Chicago - Atlanta + (4, 7), # NLR Chicago - Seattle + (4, 9), # NLR Chicago - New York + (4, 10), # NLR Chicago - Wash DC + (5, 6), # NLR Houston - Atlanta + (5, 8), # NLR Houston - Los Angeles + (6, 10), # NLR Atlanta - Wash DC + (6, 14), # NLR Atlanta - Ga Tech + (7, 8), # NLR Seattle - Los Angeles + (9, 10), # NLR New York - Wash DC + (11, 13), # I2 Chicago - Wash DC + (11, 15), # I2 Chicago - Atlanta + (11, 16), # I2 Chicago - CESNET + (11, 17), # I2 Chicago - Kansas City + (12, 13), # I2 New York - Wash DC + (13, 15), # I2 Wash DC - Atlanta + (14, 15), # Ga Tech - I2 Atlanta + (15, 19), # I2 Atlanta - Houston + (17, 19), # I2 Kansas City - Houston + (17, 22), # I2 Kansas City - Salt Lake City + (17, 24), # I2 Kansas City - UMKC + (19, 20), # I2 Houston - Los Angeles + (20, 21), # I2 Los Angeles - Seattle + (20, 22), # I2 Los Angeles - Salt Lake City + (21, 22)] # I2 Seattle - Salt Lake City + + diff --git a/sfa/managers/vini/utils.py b/sfa/managers/vini/utils.py new file mode 100644 index 00000000..b0d7e51e --- /dev/null +++ b/sfa/managers/vini/utils.py @@ -0,0 +1,719 @@ +from __future__ import with_statement +import re +import socket +from sfa.util.faults import * +from sfa.managers.vini.topology import PhysicalLinks +from xmlbuilder import XMLBuilder +from lxml import etree +import sys +from StringIO import StringIO + +VINI_RELAXNG_SCHEMA = "/var/www/html/schemas/vini.rng" + +# Taken from bwlimit.py +# +# See tc_util.c and http://physics.nist.gov/cuu/Units/binary.html. Be +# warned that older versions of tc interpret "kbps", "mbps", "mbit", +# and "kbit" to mean (in this system) "kibps", "mibps", "mibit", and +# "kibit" and that if an older version is installed, all rates will +# be off by a small fraction. +suffixes = { + "": 1, + "bit": 1, + "kibit": 1024, + "kbit": 1000, + "mibit": 1024*1024, + "mbit": 1000000, + "gibit": 1024*1024*1024, + "gbit": 1000000000, + "tibit": 1024*1024*1024*1024, + "tbit": 1000000000000, + "bps": 8, + "kibps": 8*1024, + "kbps": 8000, + "mibps": 8*1024*1024, + "mbps": 8000000, + "gibps": 8*1024*1024*1024, + "gbps": 8000000000, + "tibps": 8*1024*1024*1024*1024, + "tbps": 8000000000000 +} + + +def get_tc_rate(s): + """ + Parses an integer or a tc rate string (e.g., 1.5mbit) into bits/second + """ + + if type(s) == int: + return s + m = re.match(r"([0-9.]+)(\D*)", s) + if m is None: + return -1 + suffix = m.group(2).lower() + if suffixes.has_key(suffix): + return int(float(m.group(1)) * suffixes[suffix]) + else: + return -1 + +def format_tc_rate(rate): + """ + Formats a bits/second rate into a tc rate string + """ + + if rate >= 1000000000 and (rate % 1000000000) == 0: + return "%.0fgbit" % (rate / 1000000000.) + elif rate >= 1000000 and (rate % 1000000) == 0: + return "%.0fmbit" % (rate / 1000000.) + elif rate >= 1000: + return "%.0fkbit" % (rate / 1000.) + else: + return "%.0fbit" % rate + + +class Node: + def __init__(self, node, bps = 1000 * 1000000): + self.id = node['node_id'] + self.idtag = "n%s" % self.id + self.hostname = node['hostname'] + self.name = self.shortname = self.hostname.replace('.vini-veritas.net', '') + self.site_id = node['site_id'] + self.ipaddr = socket.gethostbyname(self.hostname) + self.bps = bps + self.links = set() + self.sliver = False + + def get_link_id(self, remote): + if self.id < remote.id: + link = (self.id<<7) + remote.id + else: + link = (remote.id<<7) + self.id + return link + + def get_iface_id(self, remote): + if self.id < remote.id: + iface = 1 + else: + iface = 2 + return iface + + def get_virt_ip(self, remote): + link = self.get_link_id(remote) + iface = self.get_iface_id(remote) + first = link >> 6 + second = ((link & 0x3f)<<2) + iface + return "192.168.%d.%d" % (first, second) + + def get_virt_net(self, remote): + link = self.get_link_id(remote) + first = link >> 6 + second = (link & 0x3f)<<2 + return "192.168.%d.%d/30" % (first, second) + + def get_site(self, sites): + return sites[self.site_id] + + def get_topo_rspec(self, link): + if link.end1 == self: + remote = link.end2 + elif link.end2 == self: + remote = link.end1 + else: + raise Error("Link does not connect to Node") + + my_ip = self.get_virt_ip(remote) + remote_ip = remote.get_virt_ip(self) + net = self.get_virt_net(remote) + bw = format_tc_rate(link.bps) + return (remote.id, remote.ipaddr, bw, my_ip, remote_ip, net) + + def add_link(self, link): + self.links.add(link) + + def add_tag(self, sites): + s = self.get_site(sites) + words = self.hostname.split(".") + index = words[0].replace("node", "") + if index.isdigit(): + self.tag = s.tag + index + else: + self.tag = None + + # Assumes there is at most one Link between two sites + def get_sitelink(self, node, sites): + site1 = sites[self.site_id] + site2 = sites[node.site_id] + sl = site1.links.intersection(site2.links) + if len(sl): + return sl.pop() + return None + + def add_sliver(self): + self.sliver = True + + def toxml(self, xml, hrn): + if not self.tag: + return + with xml.node(id = self.idtag): + with xml.hostname: + xml << self.hostname + with xml.kbps: + xml << str(int(self.bps/1000)) + if self.sliver: + with xml.sliver: + pass + + +class Link: + def __init__(self, end1, end2, bps = 1000 * 1000000, parent = None): + self.end1 = end1 + self.end2 = end2 + self.bps = bps + self.parent = parent + self.children = [] + + end1.add_link(self) + end2.add_link(self) + + if self.parent: + self.parent.children.append(self) + + def toxml(self, xml): + end_ids = "%s %s" % (self.end1.idtag, self.end2.idtag) + + if self.parent: + element = xml.vlink(endpoints=end_ids) + else: + element = xml.link(endpoints=end_ids) + + with element: + with xml.description: + xml << "%s -- %s" % (self.end1.name, self.end2.name) + with xml.kbps: + xml << str(int(self.bps/1000)) + for child in self.children: + child.toxml(xml) + + +class Site: + def __init__(self, site): + self.id = site['site_id'] + self.idtag = "s%s" % self.id + self.node_ids = site['node_ids'] + self.name = site['abbreviated_name'].replace(" ", "_") + self.tag = site['login_base'] + self.public = site['is_public'] + self.enabled = site['enabled'] + self.links = set() + + def get_sitenodes(self, nodes): + n = [] + for i in self.node_ids: + n.append(nodes[i]) + return n + + def add_link(self, link): + self.links.add(link) + + def toxml(self, xml, hrn, nodes): + if not (self.public and self.enabled and self.node_ids): + return + with xml.site(id = self.idtag): + with xml.name: + xml << self.name + + for node in self.get_sitenodes(nodes): + node.toxml(xml, hrn) + + +class Slice: + def __init__(self, slice): + self.id = slice['slice_id'] + self.name = slice['name'] + self.node_ids = set(slice['node_ids']) + self.slice_tag_ids = slice['slice_tag_ids'] + + def get_tag(self, tagname, slicetags, node = None): + for i in self.slice_tag_ids: + tag = slicetags[i] + if tag.tagname == tagname: + if (not node) or (node.id == tag.node_id): + return tag + else: + return None + + def get_nodes(self, nodes): + n = [] + for id in self.node_ids: + n.append(nodes[id]) + return n + + + # Add a new slice tag + def add_tag(self, tagname, value, slicetags, node = None): + record = {'slice_tag_id':None, 'slice_id':self.id, 'tagname':tagname, 'value':value} + if node: + record['node_id'] = node.id + else: + record['node_id'] = None + tag = Slicetag(record) + slicetags[tag.id] = tag + self.slice_tag_ids.append(tag.id) + tag.changed = True + tag.updated = True + return tag + + # Update a slice tag if it exists, else add it + def update_tag(self, tagname, value, slicetags, node = None): + tag = self.get_tag(tagname, slicetags, node) + if tag and tag.value == value: + value = "no change" + elif tag: + tag.value = value + tag.changed = True + else: + tag = self.add_tag(tagname, value, slicetags, node) + tag.updated = True + + def assign_egre_key(self, slicetags): + if not self.get_tag('egre_key', slicetags): + try: + key = free_egre_key(slicetags) + self.update_tag('egre_key', key, slicetags) + except: + # Should handle this case... + pass + return + + def turn_on_netns(self, slicetags): + tag = self.get_tag('netns', slicetags) + if (not tag) or (tag.value != '1'): + self.update_tag('netns', '1', slicetags) + return + + def turn_off_netns(self, slicetags): + tag = self.get_tag('netns', slicetags) + if tag and (tag.value != '0'): + tag.delete() + return + + def add_cap_net_admin(self, slicetags): + tag = self.get_tag('capabilities', slicetags) + if tag: + caps = tag.value.split(',') + for cap in caps: + if cap == "CAP_NET_ADMIN": + return + else: + newcaps = "CAP_NET_ADMIN," + tag.value + self.update_tag('capabilities', newcaps, slicetags) + else: + self.add_tag('capabilities', 'CAP_NET_ADMIN', slicetags) + return + + def remove_cap_net_admin(self, slicetags): + tag = self.get_tag('capabilities', slicetags) + if tag: + caps = tag.value.split(',') + newcaps = [] + for cap in caps: + if cap != "CAP_NET_ADMIN": + newcaps.append(cap) + if newcaps: + value = ','.join(newcaps) + self.update_tag('capabilities', value, slicetags) + else: + tag.delete() + return + + # Update the vsys/setup-link and vsys/setup-nat slice tags. + def add_vsys_tags(self, slicetags): + link = nat = False + for i in self.slice_tag_ids: + tag = slicetags[i] + if tag.tagname == 'vsys': + if tag.value == 'setup-link': + link = True + elif tag.value == 'setup-nat': + nat = True + if not link: + self.add_tag('vsys', 'setup-link', slicetags) + if not nat: + self.add_tag('vsys', 'setup-nat', slicetags) + return + + +class Slicetag: + newid = -1 + def __init__(self, tag): + self.id = tag['slice_tag_id'] + if not self.id: + # Make one up for the time being... + self.id = Slicetag.newid + Slicetag.newid -= 1 + self.slice_id = tag['slice_id'] + self.tagname = tag['tagname'] + self.value = tag['value'] + self.node_id = tag['node_id'] + self.updated = False + self.changed = False + self.deleted = False + + # Mark a tag as deleted + def delete(self): + self.deleted = True + self.updated = True + + def write(self, api): + if self.changed: + if int(self.id) > 0: + api.plshell.UpdateSliceTag(api.plauth, self.id, self.value) + else: + api.plshell.AddSliceTag(api.plauth, self.slice_id, + self.tagname, self.value, self.node_id) + elif self.deleted and int(self.id) > 0: + api.plshell.DeleteSliceTag(api.plauth, self.id) + + +""" +A topology is a compound object consisting of: +* a dictionary mapping site IDs to Site objects +* a dictionary mapping node IDs to Node objects +* the Site objects are connected via SiteLink objects representing + the physical topology and available bandwidth +* the Node objects are connected via Link objects representing + the requested or assigned virtual topology of a slice +""" +class Topology: + def __init__(self, api): + self.api = api + self.sites = get_sites(api) + self.nodes = get_nodes(api) + self.tags = get_slice_tags(api) + self.sitelinks = [] + self.nodelinks = [] + + for (s1, s2) in PhysicalLinks: + self.sitelinks.append(Link(self.sites[s1], self.sites[s2])) + + for id in self.nodes: + self.nodes[id].add_tag(self.sites) + + for t in self.tags: + tag = self.tags[t] + if tag.tagname == 'topo_rspec': + node1 = self.nodes[tag.node_id] + l = eval(tag.value) + for (id, realip, bw, lvip, rvip, vnet) in l: + allocbps = get_tc_rate(bw) + node1.bps -= allocbps + try: + node2 = self.nodes[id] + if node1.id < node2.id: + sl = node1.get_sitelink(node2, self.sites) + sl.bps -= allocbps + except: + pass + + + """ Lookup site based on id or idtag value """ + def lookupSite(self, id): + val = None + if isinstance(id, basestring): + id = int(id.lstrip('s')) + try: + val = self.sites[id] + except: + raise KeyError("site ID %s not found" % id) + return val + + def getSites(self): + sites = [] + for s in self.sites: + sites.append(self.sites[s]) + return sites + + """ Lookup node based on id or idtag value """ + def lookupNode(self, id): + val = None + if isinstance(id, basestring): + id = int(id.lstrip('n')) + try: + val = self.nodes[id] + except: + raise KeyError("node ID %s not found" % id) + return val + + def getNodes(self): + nodes = [] + for n in self.nodes: + nodes.append(self.nodes[n]) + return nodes + + def nodesInTopo(self): + nodes = [] + for n in self.nodes: + node = self.nodes[n] + if node.sliver: + nodes.append(node) + return nodes + + def lookupSliceTag(self, id): + val = None + try: + val = self.tags[id] + except: + raise KeyError("slicetag ID %s not found" % id) + return val + + def getSliceTags(self): + tags = [] + for t in self.tags: + tags.append(self.tags[t]) + return tags + + def lookupSiteLink(self, node1, node2): + site1 = self.sites[node1.site_id] + site2 = self.sites[node2.site_id] + for link in self.sitelinks: + if site1 == link.end1 and site2 == link.end2: + return link + if site2 == link.end1 and site1 == link.end2: + return link + return None + + + def __add_vlink(self, vlink, slicenodes, parent = None): + n1 = n2 = None + endpoints = vlink.get("endpoints") + if endpoints: + (end1, end2) = endpoints.split() + n1 = self.lookupNode(end1) + n2 = self.lookupNode(end2) + elif parent: + """ Try to infer the endpoints for the virtual link """ + site_endpoints = parent.get("endpoints") + (n1, n2) = self.__infer_endpoints(site_endpoints, slicenodes) + else: + raise Error("no endpoints given") + + #print "Added virtual link: %s -- %s" % (n1.tag, n2.tag) + bps = int(vlink.findtext("kbps")) * 1000 + sitelink = self.lookupSiteLink(n1, n2) + if not sitelink: + raise PermissionError("nodes %s and %s not adjacent" % + (n1.idtag, n2.idtag)) + self.nodelinks.append(Link(n1, n2, bps, sitelink)) + return + + """ + Infer the endpoints of the virtual link. If the slice exists on + only a single node at each end of the physical link, we'll assume that + the user wants the virtual link to terminate at these nodes. + """ + def __infer_endpoints(self, endpoints, slicenodes): + n = [] + ends = endpoints.split() + for end in ends: + found = 0 + site = self.lookupSite(end) + for id in site.node_ids: + if id in slicenodes: + n.append(slicenodes[id]) + found += 1 + if found != 1: + raise Error("could not infer endpoint for site %s" % site.id) + #print "Inferred endpoints: %s %s" % (n[0].idtag, n[1].idtag) + return n + + def nodeTopoFromRSpec(self, xml): + if self.nodelinks: + raise Error("virtual topology already present") + + nodedict = {} + for node in self.getNodes(): + nodedict[node.idtag] = node + + slicenodes = {} + + tree = etree.parse(StringIO(xml)) + + # Validate the incoming request against the RelaxNG schema + relaxng_doc = etree.parse(VINI_RELAXNG_SCHEMA) + relaxng = etree.RelaxNG(relaxng_doc) + + if not relaxng(tree): + error = relaxng.error_log.last_error + message = "%s (line %s)" % (error.message, error.line) + raise InvalidRSpec(message) + + rspec = tree.getroot() + + """ + Handle requests where the user has annotated a description of the + physical resources (nodes and links) with virtual ones (slivers + and vlinks). + """ + # Find slivers under node elements + for sliver in rspec.iterfind("./network/site/node/sliver"): + elem = sliver.getparent() + node = nodedict[elem.get("id")] + slicenodes[node.id] = node + node.add_sliver() + + # Find vlinks under link elements + for vlink in rspec.iterfind("./network/link/vlink"): + link = vlink.getparent() + self.__add_vlink(vlink, slicenodes, link) + + """ + Handle requests where the user has listed the virtual resources only + """ + # Find slivers that specify nodeid + for sliver in rspec.iterfind("./request/sliver[@nodeid]"): + node = nodedict[sliver.get("nodeid")] + slicenodes[node.id] = node + node.add_sliver() + + # Find vlinks that specify endpoints + for vlink in rspec.iterfind("./request/vlink[@endpoints]"): + self.__add_vlink(vlink, slicenodes) + + return + + def nodeTopoFromSliceTags(self, slice): + if self.nodelinks: + raise Error("virtual topology already present") + + for node in slice.get_nodes(self.nodes): + node.sliver = True + linktag = slice.get_tag('topo_rspec', self.tags, node) + if linktag: + l = eval(linktag.value) + for (id, realip, bw, lvip, rvip, vnet) in l: + if node.id < id: + bps = get_tc_rate(bw) + remote = self.lookupNode(id) + sitelink = self.lookupSiteLink(node, remote) + self.nodelinks.append(Link(node,remote,bps,sitelink)) + + def updateSliceTags(self, slice): + if not self.nodelinks: + return + + slice.update_tag('vini_topo', 'manual', self.tags) + slice.assign_egre_key(self.tags) + slice.turn_on_netns(self.tags) + slice.add_cap_net_admin(self.tags) + + for node in slice.get_nodes(self.nodes): + linkdesc = [] + for link in node.links: + linkdesc.append(node.get_topo_rspec(link)) + if linkdesc: + topo_str = "%s" % linkdesc + slice.update_tag('topo_rspec', topo_str, self.tags, node) + + # Update slice tags in database + for tag in self.getSliceTags(): + if tag.slice_id == slice.id: + if tag.tagname == 'topo_rspec' and not tag.updated: + tag.delete() + tag.write(self.api) + + """ + Check the requested topology against the available topology and capacity + """ + def verifyNodeTopo(self, hrn, topo): + for link in self.nodelinks: + if link.bps <= 0: + raise GeniInvalidArgument(bw, "BW") + + n1 = link.end1 + n2 = link.end2 + sitelink = self.lookupSiteLink(n1, n2) + if not sitelink: + raise PermissionError("%s: nodes %s and %s not adjacent" % (hrn, n1.tag, n2.tag)) + if sitelink.bps < link.bps: + raise PermissionError("%s: insufficient capacity between %s and %s" % (hrn, n1.tag, n2.tag)) + + """ + Produce XML directly from the topology specification. + """ + def toxml(self, hrn = None): + xml = XMLBuilder(format = True, tab_step = " ") + with xml.RSpec(type="VINI"): + if hrn: + element = xml.network(name="Public_VINI", slice=hrn) + else: + element = xml.network(name="Public_VINI") + + with element: + for site in self.getSites(): + site.toxml(xml, hrn, self.nodes) + for link in self.sitelinks: + link.toxml(xml) + + header = '\n' + return header + str(xml) + +""" +Create a dictionary of site objects keyed by site ID +""" +def get_sites(api): + tmp = [] + for site in api.plshell.GetSites(api.plauth): + t = site['site_id'], Site(site) + tmp.append(t) + return dict(tmp) + + +""" +Create a dictionary of node objects keyed by node ID +""" +def get_nodes(api): + tmp = [] + for node in api.plshell.GetNodes(api.plauth): + t = node['node_id'], Node(node) + tmp.append(t) + return dict(tmp) + +""" +Create a dictionary of slice objects keyed by slice ID +""" +def get_slice(api, slicename): + slice = api.plshell.GetSlices(api.plauth, [slicename]) + if slice: + return Slice(slice[0]) + else: + return None + +""" +Create a dictionary of slicetag objects keyed by slice tag ID +""" +def get_slice_tags(api): + tmp = [] + for tag in api.plshell.GetSliceTags(api.plauth): + t = tag['slice_tag_id'], Slicetag(tag) + tmp.append(t) + return dict(tmp) + +""" +Find a free EGRE key +""" +def free_egre_key(slicetags): + used = set() + for i in slicetags: + tag = slicetags[i] + if tag.tagname == 'egre_key': + used.add(int(tag.value)) + + for i in range(1, 256): + if i not in used: + key = i + break + else: + raise KeyError("No more EGRE keys available") + + return "%s" % key + diff --git a/sfa/managers/vini/vini.rnc b/sfa/managers/vini/vini.rnc new file mode 100644 index 00000000..0be7640a --- /dev/null +++ b/sfa/managers/vini/vini.rnc @@ -0,0 +1,70 @@ +start = RSpec +RSpec = element RSpec { + attribute type { xsd:NMTOKEN }, + ( network | request ) +} +network = element network { + attribute name { xsd:NMTOKEN }, + attribute slice { xsd:NMTOKEN }?, + sliver_defaults?, + site+, + link* +} +sliver_defaults = element sliver_defaults { + sliver_elements +} +site = element site { + attribute id { xsd:ID }, + element name { text }, + node* +} +node = element node { + attribute id { xsd:ID }, + element hostname { text }, + element bw_unallocated { attribute units { xsd:NMTOKEN }, text }?, + element bw_limit { attribute units { xsd:NMTOKEN }, text }?, + sliver* +} +link = element link { + attribute endpoints { xsd:IDREFS }, + element description { text }?, + element bw_unallocated { attribute units { xsd:NMTOKEN }, text }, + vlink* +} +request = element request { + attribute name { xsd:NMTOKEN }, + sliver_defaults?, + sliver*, + vlink* +} +sliver = element sliver { + attribute nodeid { xsd:ID }?, + sliver_elements +} +sliver_elements = ( + element capabilities { text }? + & element codemux { text }* + & element cpu_pct { text }? + & element cpu_share { text }? + & element delegations { text }? + & element disk_max { text }? + & element initscript { text }? + & element ip_addresses {text }* + & element net_i2_max_kbyte { text }? + & element net_i2_max_rate { text }? + & element net_i2_min_rate { text }? + & element net_i2_share { text }? + & element net_i2_thresh_kbyte { text }? + & element net_max_kbyte { text }? + & element net_max_rate { text }? + & element net_min_rate { text }? + & element net_share { text }? + & element net_thresh_kbyte { text }? + & element vsys {text}* + & element vsys_vnet { text }? +) +vlink = element vlink { + attribute endpoints { xsd:IDREFS }?, + element description { text }?, + element kbps { text }? +} diff --git a/sfa/managers/vini/vini.rng b/sfa/managers/vini/vini.rng new file mode 100644 index 00000000..1545cb5b --- /dev/null +++ b/sfa/managers/vini/vini.rng @@ -0,0 +1,255 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfa/managers/vini/vini.xml b/sfa/managers/vini/vini.xml new file mode 100644 index 00000000..eb0049b3 --- /dev/null +++ b/sfa/managers/vini/vini.xml @@ -0,0 +1,373 @@ + + + + + Princeton + + node1.princeton.vini-veritas.net + 999000 + 1000000 + + + + PSG + + node1.psg.vini-veritas.net + 1000000 + 1000000 + + + node2.psg.vini-veritas.net + 1000000 + 1000000 + + + + NLR Chicago + + node1.chic.nlr.vini-veritas.net + 1000000 + 1000000 + + + node2.chic.nlr.vini-veritas.net + 1000000 + 1000000 + + + + NLR Houston + + node1.hous.nlr.vini-veritas.net + 1000000 + 1000000 + + + node2.hous.nlr.vini-veritas.net + 1000000 + 1000000 + + + + NLR Atlanta + + node1.atla.nlr.vini-veritas.net + 1000000 + 1000000 + + + node2.atla.nlr.vini-veritas.net + 1000000 + 1000000 + + + + NLR Seattle + + node1.seat.nlr.vini-veritas.net + 1000000 + 1000000 + + + node2.seat.nlr.vini-veritas.net + 1000000 + 1000000 + + + + NLR Los Angeles + + node1.losa.nlr.vini-veritas.net + 1000000 + 1000000 + + + node2.losa.nlr.vini-veritas.net + 1000000 + 1000000 + + + + NLR New York + + node1.newy.nlr.vini-veritas.net + 1000000 + 1000000 + + + node2.newy.nlr.vini-veritas.net + 1000000 + 1000000 + + + + NLR Wash DC + + node1.wash.nlr.vini-veritas.net + 1000000 + 1000000 + + + node2.wash.nlr.vini-veritas.net + 1000000 + 1000000 + + + + I2 Chicago + + node1.chic.internet2.vini-veritas.net + 963000 + 1000000 + + + node2.chic.internet2.vini-veritas.net + 1000000 + 1000000 + + + + I2 New York + + node1.newy.internet2.vini-veritas.net + 988000 + 1000000 + + + node2.newy.internet2.vini-veritas.net + 1000000 + 1000000 + + + + I2 Wash DC + + node1.wash.internet2.vini-veritas.net + 964000 + 1000000 + + + node2.wash.internet2.vini-veritas.net + 1000000 + 1000000 + + + + Georgia Tech + + node1.gatech.vini-veritas.net + 999000 + 1000000 + + + + I2 Atlanta + + node1.atla.internet2.vini-veritas.net + 964000 + 1000000 + + + node2.atla.internet2.vini-veritas.net + 1000000 + 1000000 + + + + CESNET + + node1.cesnet.vini-veritas.net + 1000000 + 1000000 + + + node2.cesnet.vini-veritas.net + 1000000 + + + + I2 Kansas City + + node1.kans.internet2.vini-veritas.net + 961000 + 1000000 + + + node2.kans.internet2.vini-veritas.net + 1000000 + 1000000 + + + + I2 Houston + + node1.hous.internet2.vini-veritas.net + 964000 + 1000000 + + + node2.hous.internet2.vini-veritas.net + 1000000 + 1000000 + + + + I2 Los Angeles + + node1.losa.internet2.vini-veritas.net + 964000 + 1000000 + + + node2.losa.internet2.vini-veritas.net + 1000000 + 1000000 + + + + I2 Seattle + + node1.seat.internet2.vini-veritas.net + 975000 + 1000000 + + + node2.seat.internet2.vini-veritas.net + 1000000 + 1000000 + + + + I2 Salt Lake + + node1.salt.internet2.vini-veritas.net + 962000 + 1000000 + + + node2.salt.internet2.vini-veritas.net + 1000000 + 1000000 + + + + UMKC + + node1.umkc.vini-veritas.net + 999000 + + + node2.umkc.vini-veritas.net + 1000000 + + + + Princeton -- I2 New York + 1000000 + + + NLR Chicago -- NLR Houston + 1000000 + + + NLR Chicago -- NLR Atlanta + 1000000 + + + NLR Chicago -- NLR Seattle + 1000000 + + + NLR Chicago -- NLR New York + 1000000 + + + NLR Chicago -- NLR Wash DC + 1000000 + + + NLR Houston -- NLR Atlanta + 1000000 + + + NLR Houston -- NLR Los Angeles + 1000000 + + + NLR Atlanta -- NLR Wash DC + 1000000 + + + NLR Atlanta -- Georgia Tech + 1000000 + + + NLR Seattle -- NLR Los Angeles + 1000000 + + + NLR New York -- NLR Wash DC + 1000000 + + + I2 Chicago -- I2 Wash DC + 988000 + + + I2 Chicago -- I2 Atlanta + 988000 + + + I2 Chicago -- CESNET + 1000000 + + + I2 Chicago -- I2 Kansas City + 987000 + + + I2 New York -- I2 Wash DC + 988000 + + + I2 Wash DC -- I2 Atlanta + 988000 + + + Georgia Tech -- I2 Atlanta + 1000000 + + + I2 Atlanta -- I2 Houston + 988000 + + + I2 Kansas City -- I2 Houston + 988000 + + + I2 Kansas City -- I2 Salt Lake + 987000 + + + I2 Kansas City -- UMKC + 999000 + + + I2 Houston -- I2 Los Angeles + 988000 + + + I2 Los Angeles -- I2 Seattle + 988000 + + + I2 Los Angeles -- I2 Salt Lake + 988000 + + + I2 Seattle -- I2 Salt Lake + 987000 + + + diff --git a/sfa/managers/vini/vini_network.py b/sfa/managers/vini/vini_network.py new file mode 100644 index 00000000..26d8a338 --- /dev/null +++ b/sfa/managers/vini/vini_network.py @@ -0,0 +1,469 @@ +from __future__ import with_statement +from sfa.util.faults import * +from xmlbuilder import XMLBuilder +from lxml import etree +import sys +from sfa.plc.network import * +from sfa.managers.vini.topology import PhysicalLinks + +# Taken from bwlimit.py +# +# See tc_util.c and http://physics.nist.gov/cuu/Units/binary.html. Be +# warned that older versions of tc interpret "kbps", "mbps", "mbit", +# and "kbit" to mean (in this system) "kibps", "mibps", "mibit", and +# "kibit" and that if an older version is installed, all rates will +# be off by a small fraction. +suffixes = { + "": 1, + "bit": 1, + "kibit": 1024, + "kbit": 1000, + "mibit": 1024*1024, + "mbit": 1000000, + "gibit": 1024*1024*1024, + "gbit": 1000000000, + "tibit": 1024*1024*1024*1024, + "tbit": 1000000000000, + "bps": 8, + "kibps": 8*1024, + "kbps": 8000, + "mibps": 8*1024*1024, + "mbps": 8000000, + "gibps": 8*1024*1024*1024, + "gbps": 8000000000, + "tibps": 8*1024*1024*1024*1024, + "tbps": 8000000000000 +} + + +def get_tc_rate(s): + """ + Parses an integer or a tc rate string (e.g., 1.5mbit) into bits/second + """ + + if type(s) == int: + return s + m = re.match(r"([0-9.]+)(\D*)", s) + if m is None: + return -1 + suffix = m.group(2).lower() + if suffixes.has_key(suffix): + return int(float(m.group(1)) * suffixes[suffix]) + else: + return -1 + +def format_tc_rate(rate): + """ + Formats a bits/second rate into a tc rate string + """ + + if rate >= 1000000000 and (rate % 1000000000) == 0: + return "%.0fgbit" % (rate / 1000000000.) + elif rate >= 1000000 and (rate % 1000000) == 0: + return "%.0fmbit" % (rate / 1000000.) + elif rate >= 1000: + return "%.0fkbit" % (rate / 1000.) + else: + return "%.0fbit" % rate + + +class ViniNode(Node): + def __init__(self, network, node, bps = 1000 * 1000000): + Node.__init__(self, network, node) + self.bps = bps + self.links = set() + self.name = self.hostname.replace('.vini-veritas.net', '') + + def get_link_id(self, remote): + if self.id < remote.id: + link = (self.id<<7) + remote.id + else: + link = (remote.id<<7) + self.id + return link + + def get_iface_id(self, remote): + if self.id < remote.id: + iface = 1 + else: + iface = 2 + return iface + + def get_virt_ip(self, remote): + link = self.get_link_id(remote) + iface = self.get_iface_id(remote) + first = link >> 6 + second = ((link & 0x3f)<<2) + iface + return "192.168.%d.%d" % (first, second) + + def get_virt_net(self, remote): + link = self.get_link_id(remote) + first = link >> 6 + second = (link & 0x3f)<<2 + return "192.168.%d.%d/30" % (first, second) + + def get_topo_rspec(self, link): + if link.end1 == self: + remote = link.end2 + elif link.end2 == self: + remote = link.end1 + else: + raise Error("Link does not connect to Node") + + my_ip = self.get_virt_ip(remote) + remote_ip = remote.get_virt_ip(self) + net = self.get_virt_net(remote) + bw = format_tc_rate(link.bps) + ipaddr = remote.get_primary_iface().ipv4 + return (remote.id, ipaddr, bw, my_ip, remote_ip, net) + + def add_link(self, link): + self.links.add(link) + + # Assumes there is at most one Link between two sites + def get_sitelink(self, node): + site1 = self.network.sites[self.site_id] + site2 = self.network.sites[node.site_id] + sl = site1.links.intersection(site2.links) + if len(sl): + return sl.pop() + return None + + def toxml(self, xml): + slice = self.network.slice + if self.whitelist and not self.sliver: + if not slice or slice.id not in self.whitelist: + return + + with xml.node(id = self.idtag): + with xml.hostname: + xml << self.hostname + with xml.bw_unallocated(units="kbps"): + xml << str(int(self.bps/1000)) + self.get_primary_iface().toxml(xml) + if self.sliver: + self.sliver.toxml(xml) + + +class ViniSite(Site): + def __init__(self, network, site): + Site.__init__(self, network, site) + self.links = set() + + def add_link(self, link): + self.links.add(link) + +class ViniSlice(Slice): + def assign_egre_key(self): + tag = self.get_tag('egre_key') + if not tag: + try: + key = self.network.free_egre_key() + except: + raise InvalidRSpec("ran out of EGRE keys!") + tag = self.update_tag('egre_key', key, None, 10) + return + + def turn_on_netns(self): + tag = self.get_tag('netns') + if (not tag) or (tag.value != '1'): + tag = self.update_tag('netns', '1', None, 10) + return + + def turn_off_netns(self): + tag = self.get_tag('netns') + if tag and (tag.value != '0'): + tag.delete() + return + + def add_cap_net_admin(self): + tag = self.get_tag('capabilities') + if tag: + caps = tag.value.split(',') + for cap in caps: + if cap == "CAP_NET_ADMIN": + newcaps = tag.value + break + else: + newcaps = "CAP_NET_ADMIN," + tag.value + self.update_tag('capabilities', newcaps, None, 10) + else: + tag = self.add_tag('capabilities', 'CAP_NET_ADMIN', None, 10) + return + + def remove_cap_net_admin(self): + tag = self.get_tag('capabilities') + if tag: + caps = tag.value.split(',') + newcaps = [] + for cap in caps: + if cap != "CAP_NET_ADMIN": + newcaps.append(cap) + if newcaps: + value = ','.join(newcaps) + self.update_tag('capabilities', value, None, 10) + else: + tag.delete() + return + +class Link: + def __init__(self, end1, end2, bps = 1000 * 1000000, parent = None): + self.end1 = end1 + self.end2 = end2 + self.bps = bps + self.parent = parent + self.children = [] + + end1.add_link(self) + end2.add_link(self) + + if self.parent: + self.parent.children.append(self) + + def toxml(self, xml): + end_ids = "%s %s" % (self.end1.idtag, self.end2.idtag) + + if self.parent: + with xml.vlink(endpoints=end_ids): + with xml.description: + xml << "%s -- %s" % (self.end1.name, self.end2.name) + with xml.kbps: + xml << str(int(self.bps/1000)) + else: + with xml.link(endpoints=end_ids): + with xml.description: + xml << "%s -- %s" % (self.end1.name, self.end2.name) + with xml.bw_unallocated(units="kbps"): + xml << str(int(self.bps/1000)) + for child in self.children: + child.toxml(xml) + + + +class ViniNetwork(Network): + def __init__(self, api, type = "SFA"): + Network.__init__(self, api, type) + self.sitelinks = [] + self.nodelinks = [] + + for (s1, s2) in PhysicalLinks: + self.sitelinks.append(Link(self.sites[s1], self.sites[s2])) + + for t in self.tags: + tag = self.tags[t] + if tag.tagname == 'topo_rspec': + node1 = self.nodes[tag.node_id] + l = eval(tag.value) + for (id, realip, bw, lvip, rvip, vnet) in l: + allocbps = get_tc_rate(bw) + node1.bps -= allocbps + try: + node2 = self.nodes[id] + if node1.id < node2.id: + sl = node1.get_sitelink(node2) + sl.bps -= allocbps + except: + pass + + def lookupSiteLink(self, node1, node2): + site1 = self.sites[node1.site_id] + site2 = self.sites[node2.site_id] + for link in self.sitelinks: + if site1 == link.end1 and site2 == link.end2: + return link + if site2 == link.end1 and site1 == link.end2: + return link + return None + + + """ + Check the requested topology against the available topology and capacity + """ + def verifyTopology(self): + for link in self.nodelinks: + if link.bps <= 0: + raise InvalidRSpec("must request positive bandwidth") + + n1 = link.end1 + n2 = link.end2 + sitelink = self.lookupSiteLink(n1, n2) + if not sitelink: + raise InvalidRSpec("nodes %s and %s are not adjacent" % + (n1.idtag, n2.idtag)) + if sitelink.bps < link.bps: + raise InvalidRSpec("not enough capacity between %s and %s" % + (n1.idtag, n2.idtag)) + + def __add_vlink(self, vlink, parent = None): + n1 = n2 = None + endpoints = vlink.get("endpoints") + if endpoints: + (end1, end2) = endpoints.split() + n1 = self.lookupNode(end1) + n2 = self.lookupNode(end2) + elif parent: + """ Try to infer the endpoints for the virtual link """ + site_endpoints = parent.get("endpoints") + (n1, n2) = self.__infer_endpoints(site_endpoints) + else: + raise InvalidRSpec("no endpoints given") + + #print "Added virtual link: %s -- %s" % (n1.tag, n2.tag) + bps = int(vlink.findtext("kbps")) * 1000 + sitelink = self.lookupSiteLink(n1, n2) + if not sitelink: + raise InvalidRSpec("nodes %s and %s are not adjacent" % + (n1.idtag, n2.idtag)) + self.nodelinks.append(Link(n1, n2, bps, sitelink)) + return + + """ + Infer the endpoints of the virtual link. If the slice exists on + only a single node at each end of the physical link, we'll assume that + the user wants the virtual link to terminate at these nodes. + """ + def __infer_endpoints(self, endpoints): + n = [] + ends = endpoints.split() + for end in ends: + found = 0 + site = self.lookupSite(end) + for id in site.node_ids: + if id in self.nodedict: + n.append(self.nodedict[id]) + found += 1 + if found != 1: + raise InvalidRSpec("could not infer endpoint for site %s" % + site.idtag) + #print "Inferred endpoints: %s %s" % (n[0].idtag, n[1].idtag) + return n + + def addRSpec(self, xml, schema = None): + Network.addRSpec(self, xml, schema) + self.nodedict = {} + for node in self.nodesWithSlivers(): + self.nodedict[node.id] = node + + # Find vlinks under link elements + for vlink in self.rspec.iterfind("./network/link/vlink"): + link = vlink.getparent() + self.__add_vlink(vlink, link) + + # Find vlinks that specify endpoints + for vlink in self.rspec.iterfind("./request/vlink[@endpoints]"): + self.__add_vlink(vlink) + + + def addSlice(self): + Network.addSlice(self) + + for node in self.slice.get_nodes(): + linktag = self.slice.get_tag('topo_rspec', node) + if linktag: + l = eval(linktag.value) + for (id, realip, bw, lvip, rvip, vnet) in l: + if node.id < id: + bps = get_tc_rate(bw) + remote = self.lookupNode(id) + sitelink = self.lookupSiteLink(node, remote) + self.nodelinks.append(Link(node,remote,bps,sitelink)) + + + def updateSliceTags(self): + slice = self.slice + + tag = slice.update_tag('vini_topo', 'manual', None, 10) + slice.assign_egre_key() + slice.turn_on_netns() + slice.add_cap_net_admin() + + for node in self.nodesWithSlivers(): + linkdesc = [] + for link in node.links: + linkdesc.append(node.get_topo_rspec(link)) + if linkdesc: + topo_str = "%s" % linkdesc + tag = slice.update_tag('topo_rspec', topo_str, node, 10) + + # Expire the un-updated topo_rspec tags + for tag in self.getSliceTags(): + if tag.tagname in ['topo_rspec']: + if not tag.was_updated(): + tag.delete() + + Network.updateSliceTags(self) + + """ + Find a free EGRE key + """ + def free_egre_key(self): + used = set() + for tag in self.getSliceTags(): + if tag.tagname == 'egre_key': + used.add(int(tag.value)) + + for i in range(1, 256): + if i not in used: + key = i + break + else: + raise KeyError("No more EGRE keys available") + + return str(key) + + """ + Produce XML directly from the topology specification. + """ + def toxml(self): + xml = XMLBuilder(format = True, tab_step = " ") + with xml.RSpec(type=self.type): + if self.slice: + element = xml.network(name=self.api.hrn, slice=self.slice.hrn) + else: + element = xml.network(name=self.api.hrn) + + with element: + if self.slice: + self.slice.toxml(xml) + for site in self.getSites(): + site.toxml(xml) + for link in self.sitelinks: + link.toxml(xml) + + header = '\n' + return header + str(xml) + + """ + Create a dictionary of ViniSite objects keyed by site ID + """ + def get_sites(self, api): + tmp = [] + for site in api.plshell.GetSites(api.plauth, {'peer_id': None}): + t = site['site_id'], ViniSite(self, site) + tmp.append(t) + return dict(tmp) + + + """ + Create a dictionary of ViniNode objects keyed by node ID + """ + def get_nodes(self, api): + tmp = [] + for node in api.plshell.GetNodes(api.plauth, {'peer_id': None}): + t = node['node_id'], ViniNode(self, node) + tmp.append(t) + return dict(tmp) + + """ + Return a ViniSlice object for a single slice + """ + def get_slice(self, api, hrn): + slicename = hrn_to_pl_slicename(hrn) + slice = api.plshell.GetSlices(api.plauth, [slicename]) + if slice: + self.slice = ViniSlice(self, slicename, slice[0]) + return self.slice + else: + return None + + + diff --git a/sfa/methods/CreateSliver.py b/sfa/methods/CreateSliver.py new file mode 100644 index 00000000..c21ceb4f --- /dev/null +++ b/sfa/methods/CreateSliver.py @@ -0,0 +1,52 @@ +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.sfatablesRuntime import run_sfatables +import sys +from sfa.trust.credential import Credential +from sfa.util.sfalogging import logger + +class CreateSliver(Method): + """ + Allocate resources to a slice. This operation is expected to + start the allocated resources asynchornously after the operation + has successfully completed. Callers can check on the status of + the resources using SliverStatus. + + @param slice_urn (string) URN of slice to allocate to + @param credentials ([string]) of credentials + @param rspec (string) rspec to allocate + + """ + interfaces = ['aggregate', 'slicemgr'] + accepts = [ + Parameter(str, "Slice URN"), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + Parameter(str, "RSpec"), + Parameter(type([]), "List of user information") + ] + returns = Parameter(str, "Allocated RSpec") + + def call(self, slice_xrn, creds, rspec, users): + hrn, type = urn_to_hrn(slice_xrn) + + self.api.logger.info("interface: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, hrn, self.name)) + + # Find the valid credentials + valid_creds = self.api.auth.checkCredentials(creds, 'createsliver', hrn) + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + + manager = self.api.get_interface_manager() + + # flter rspec through sfatables + if self.api.interface in ['aggregate']: + chain_name = 'OUTGOING' + elif self.api.interface in ['slicemgr']: + chain_name = 'FORWARD-OUTGOING' + rspec = run_sfatables(chain_name, hrn, origin_hrn, rspec) + allocated = manager.create_slice(self.api, slice_xrn, creds, rspec, users) + + return rspec + diff --git a/sfa/methods/DeleteSliver.py b/sfa/methods/DeleteSliver.py new file mode 100644 index 00000000..3ed3b47b --- /dev/null +++ b/sfa/methods/DeleteSliver.py @@ -0,0 +1,41 @@ +### $Id: stop_slice.py 17732 2010-04-19 21:10:45Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/stop_slice.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.auth import Auth +from sfa.trust.credential import Credential + +class DeleteSliver(Method): + """ + Remove the slice from all nodes and free the allocated resources + + @param xrn human readable name of slice to instantiate (hrn or urn) + @param cred credential string specifying the rights of the caller + @return 1 is successful, faults otherwise + """ + + interfaces = ['aggregate', 'slicemgr', 'component'] + + accepts = [ + Parameter(str, "Human readable name of slice to delete (hrn or urn)"), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + ] + + returns = Parameter(int, "1 if successful") + + def call(self, xrn, creds): + hrn, type = urn_to_hrn(xrn) + valid_creds = self.api.auth.checkCredentials(creds, 'deletesliver', hrn) + + #log the call + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name)) + + manager = self.api.get_interface_manager() + manager.delete_slice(self.api, xrn, creds) + + return 1 diff --git a/sfa/methods/GetCredential.py b/sfa/methods/GetCredential.py new file mode 100644 index 00000000..df6e8688 --- /dev/null +++ b/sfa/methods/GetCredential.py @@ -0,0 +1,55 @@ +### $Id: get_credential.py 17576 2010-04-05 20:56:15Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/get_credential.py $ + +from sfa.trust.credential import * +from sfa.trust.rights import * +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.debug import log +from sfa.trust.credential import Credential + +class GetCredential(Method): + """ + Retrive a credential for an object + If cred == Nonee then the behavior reverts to get_self_credential + + @param hrn human readable name of object (hrn or urn) + @param cred credential object specifying rights of the caller + @param type type of object (user | slice | node | authority ) + + @return the string representation of a credential object + """ + + interfaces = ['registry'] + + accepts = [ + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + Parameter(str, "Human readable name (hrn or urn)"), + Mixed(Parameter(str, "Record type"), + Parameter(None, "Type not specified")), + ] + + returns = Parameter(str, "String representation of a credential object") + + def call(self, creds, xrn, type): + + if type: + hrn = urn_to_hrn(xrn)[0] + else: + hrn, type = urn_to_hrn(xrn) + + # check creds + valid_creds = self.api.auth.checkCredentials(creds, 'getcredential') + self.api.auth.verify_object_belongs_to_me(hrn) + + #log the call + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name)) + + manager = self.api.get_interface_manager() + + return manager.get_credential(self.api, xrn, type) + diff --git a/sfa/methods/GetGids.py b/sfa/methods/GetGids.py new file mode 100644 index 00000000..37ad7967 --- /dev/null +++ b/sfa/methods/GetGids.py @@ -0,0 +1,47 @@ +from sfa.util.faults import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.auth import Auth +from sfa.trust.gid import GID +from sfa.trust.certificate import Certificate +from sfa.trust.credential import Credential + +class GetGids(Method): + """ + Get a list of record information (hrn, gid and type) for + the specified hrns. + + @param cred credential string + @param cert certificate string + @return + """ + + interfaces = ['registry'] + + accepts = [ + Mixed(Parameter(str, "Human readable name (hrn or xrn)"), + Parameter(type([str]), "List of Human readable names (hrn or xrn)")), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + ] + + returns = [Parameter(dict, "Dictionary of gids keyed on hrn")] + + def call(self, xrns, creds): + # validate the credential + valid_creds = self.api.auth.checkCredentials(creds, 'getgids') + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + + # resolve the record + manager = self.api.get_interface_manager() + records = manager.resolve(self.api, xrns, full = False) + if not records: + raise RecordNotFound(hrns) + + gids = [] + allowed_fields = ['hrn', 'type', 'gid'] + for record in records: + for key in record.keys(): + if key not in allowed_fields: + del(record[key]) + return records diff --git a/sfa/methods/GetSelfCredential.py b/sfa/methods/GetSelfCredential.py new file mode 100644 index 00000000..a5c7d400 --- /dev/null +++ b/sfa/methods/GetSelfCredential.py @@ -0,0 +1,75 @@ +### $Id: get_credential.py 15321 2009-10-15 05:01:21Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/get_credential.py $ + +from sfa.trust.credential import * +from sfa.trust.rights import * +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.record import SfaRecord +from sfa.util.debug import log +from sfa.trust.certificate import Certificate + +class GetSelfCredential(Method): + """ + Retrive a credential for an object + @param cert certificate string + @param type type of object (user | slice | sa | ma | node) + @param hrn human readable name of object (hrn or urn) + + @return the string representation of a credential object + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "certificate"), + Parameter(str, "Human readable name (hrn or urn)"), + Mixed(Parameter(str, "Record type"), + Parameter(None, "Type not specified")), + ] + + returns = Parameter(str, "String representation of a credential object") + + def call(self, cert, xrn, type): + """ + get_self_credential a degenerate version of get_credential used by a client + to get his initial credential when de doesnt have one. This is the same as + get_credetial(..., cred = None, ...) + + The registry ensures that the client is the principal that is named by + (type, name) by comparing the public key in the record's GID to the + private key used to encrypt the client side of the HTTPS connection. Thus + it is impossible for one principal to retrive another principal's + credential without having the appropriate private key. + + @param type type of object (user | slice | sa | ma | node) + @param hrn human readable name of authority to list + @return string representation of a credential object + """ + if type: + hrn = urn_to_hrn(xrn)[0] + else: + hrn, type = urn_to_hrn(xrn) + self.api.auth.verify_object_belongs_to_me(hrn) + + origin_hrn = Certificate(string=cert).get_subject() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name)) + + manager = self.api.get_interface_manager() + + # authenticate the gid + records = manager.resolve(self.api, xrn, type) + if not records: + raise RecordNotFound(hrn) + record = SfaRecord(dict=records[0]) + gid = record.get_gid_object() + gid_str = gid.save_to_string(save_parents=True) + self.api.auth.authenticateGid(gid_str, [cert, type, hrn]) + # authenticate the certificate against the gid in the db + certificate = Certificate(string=cert) + if not certificate.is_pubkey(gid.get_pubkey()): + raise ConnectionKeyGIDMismatch(gid.get_subject()) + + return manager.get_credential(self.api, xrn, type, is_self=True) diff --git a/sfa/methods/GetTicket.py b/sfa/methods/GetTicket.py new file mode 100644 index 00000000..119ae48d --- /dev/null +++ b/sfa/methods/GetTicket.py @@ -0,0 +1,64 @@ +### $Id: get_ticket.py 17732 2010-04-19 21:10:45Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/get_ticket.py $ +import time +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.auth import Auth +from sfa.util.config import Config +from sfa.trust.credential import Credential +from sfa.util.sfatablesRuntime import run_sfatables + +class GetTicket(Method): + """ + Retrieve a ticket. This operation is currently implemented on PLC + only (see SFA, engineering decisions); it is not implemented on + components. + + The ticket is filled in with information from the PLC database. This + information includes resources, and attributes such as user keys and + initscripts. + + @param cred credential string + @param name name of the slice to retrieve a ticket for (hrn or urn) + @param rspec resource specification dictionary + + @return the string representation of a ticket object + """ + + interfaces = ['aggregate', 'slicemgr'] + + accepts = [ + Parameter(str, "Human readable name of slice to retrive a ticket for (hrn or urn)"), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + Parameter(str, "Resource specification (rspec)"), + Parameter(type([]), "List of user information") + ] + + returns = Parameter(str, "String represeneation of a ticket object") + + def call(self, xrn, creds, rspec, users): + hrn, type = urn_to_hrn(xrn) + # Find the valid credentials + valid_creds = self.api.auth.checkCredentials(creds, 'getticket', hrn) + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + + #log the call + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name)) + + manager = self.api.get_interface_manager() + + # flter rspec through sfatables + if self.api.interface in ['aggregate']: + chain_name = 'OUTGOING' + elif self.api.interface in ['slicemgr']: + chain_name = 'FORWARD-OUTGOING' + rspec = run_sfatables(chain_name, hrn, origin_hrn, rspec) + + # remove nodes that are not available at this interface from the rspec + ticket = manager.get_ticket(self.api, xrn, creds, rspec, users) + + return ticket + diff --git a/sfa/methods/GetVersion.py b/sfa/methods/GetVersion.py new file mode 100644 index 00000000..8552daf7 --- /dev/null +++ b/sfa/methods/GetVersion.py @@ -0,0 +1,21 @@ +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter + + +class GetVersion(Method): + """ + Returns this GENI Aggregate Manager's Version Information + @return version + """ + interfaces = ['registry','aggregate', 'slicemgr', 'component'] + accepts = [] + returns = Parameter(dict, "Version information") + + def call(self): + self.api.logger.info("interface: %s\tmethod-name: %s" % (self.api.interface, self.name)) + manager = self.api.get_interface_manager() + + return manager.get_version() + diff --git a/sfa/methods/List.py b/sfa/methods/List.py new file mode 100644 index 00000000..0730f2bb --- /dev/null +++ b/sfa/methods/List.py @@ -0,0 +1,38 @@ +### $Id: list.py 16588 2010-01-13 17:53:44Z anil $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/list.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.record import SfaRecord +from sfa.trust.credential import Credential + +class List(Method): + """ + List the records in an authority. + + @param cred credential string specifying the rights of the caller + @param hrn human readable name of authority to list (hrn or urn) + @return list of record dictionaries + """ + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Human readable name (hrn or urn)"), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + ] + + returns = [SfaRecord] + + def call(self, xrn, creds): + hrn, type = urn_to_hrn(xrn) + valid_creds = self.api.auth.checkCredentials(creds, 'list') + + #log the call + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name)) + + manager = self.api.get_interface_manager() + return manager.list(self.api, xrn) diff --git a/sfa/methods/ListResources.py b/sfa/methods/ListResources.py new file mode 100644 index 00000000..80b483e1 --- /dev/null +++ b/sfa/methods/ListResources.py @@ -0,0 +1,55 @@ +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.credential import Credential +from sfa.util.sfatablesRuntime import run_sfatables +import sys +import zlib + +class ListResources(Method): + """ + Returns information about available resources or resources allocated to this slice + @param credential list + @param options dictionary + @return string + """ + interfaces = ['aggregate', 'slicemgr'] + accepts = [ + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + Parameter(dict, "Options") + ] + returns = Parameter(str, "List of resources") + + def call(self, creds, options): + self.api.logger.info("interface: %s\tmethod-name: %s" % (self.api.interface, self.name)) + + # get slice's hrn from options + xrn = options.get('geni_slice_urn', None) + hrn, _ = urn_to_hrn(xrn) + + # Find the valid credentials + valid_creds = self.api.auth.checkCredentials(creds, 'listnodes', hrn) + + # get hrn of the original caller + origin_hrn = options.get('origin_hrn', None) + if not origin_hrn: + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + # get manager for this interface + manager = self.api.get_interface_manager() + rspec = manager.get_rspec(self.api, creds, options) + + # filter rspec through sfatables + if self.api.interface in ['aggregate']: + chain_name = 'OUTGOING' + elif self.api.interface in ['slicemgr']: + chain_name = 'FORWARD-OUTGOING' + filtered_rspec = run_sfatables(chain_name, hrn, origin_hrn, rspec) + + if options.has_key('geni_compressed') and options['geni_compressed'] == True: + filtered_rspec = zlib.compress(filtered_rspec).encode('base64') + + return filtered_rspec + + diff --git a/sfa/methods/ListSlices.py b/sfa/methods/ListSlices.py new file mode 100644 index 00000000..236d34f9 --- /dev/null +++ b/sfa/methods/ListSlices.py @@ -0,0 +1,37 @@ +### $Id: stop_slice.py 17732 2010-04-19 21:10:45Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/stop_slice.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.auth import Auth +from sfa.trust.credential import Credential + +class ListSlices(Method): + """ + List the slices instantiated at this interface + + @param cred credential string specifying the rights of the caller + @return 1 is successful, faults otherwise + """ + + interfaces = ['aggregate', 'slicemgr', 'component'] + + accepts = [ + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + ] + + returns = Parameter(list, "List of slice names") + + def call(self, creds): + valid_creds = self.api.auth.checkCredentials(creds, 'listslices') + + #log the call + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, self.name)) + + manager = self.api.get_interface_manager() + return manager.get_slices(self.api, creds) + diff --git a/sfa/methods/RedeemTicket.py b/sfa/methods/RedeemTicket.py new file mode 100644 index 00000000..c471d5a6 --- /dev/null +++ b/sfa/methods/RedeemTicket.py @@ -0,0 +1,35 @@ +### $Id: reset_slice.py 15428 2009-10-23 15:28:03Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfacomponent/methods/reset_slice.py $ +import xmlrpclib +from sfa.util.faults import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed + +class RedeemTicket(Method): + """ + Deprecated. Use RedeemTicket instead. + + @param cred credential string specifying the rights of the caller + @param ticket + @return 1 is successful, faults otherwise + """ + + interfaces = ['component'] + + accepts = [ + Parameter(str, "Ticket string representation of SFA ticket"), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + ] + + returns = [Parameter(int, "1 if successful")] + + def call(self, ticket, creds): + valid_creds = self.api.auth.checkCredentials(cred, 'redeemticket') + self.api.auth.check_ticket(ticket) + + + # send the call to the right manager + manager = self.api.get_interface_manager() + manager.redeem_ticket(self.api, ticket) + return 1 diff --git a/sfa/methods/Register.py b/sfa/methods/Register.py new file mode 100644 index 00000000..4f5a452c --- /dev/null +++ b/sfa/methods/Register.py @@ -0,0 +1,51 @@ +### $Id: register.py 16477 2010-01-05 16:31:37Z thierry $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/register.py $ + +from sfa.trust.certificate import Keypair, convert_public_key +from sfa.trust.gid import * +from sfa.util.faults import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.record import SfaRecord +from sfa.util.debug import log +from sfa.trust.auth import Auth +from sfa.trust.gid import create_uuid +from sfa.trust.credential import Credential + +class Register(Method): + """ + Register an object with the registry. In addition to being stored in the + SFA database, the appropriate records will also be created in the + PLC databases + + @param cred credential string + @param record_dict dictionary containing record fields + + @return gid string representation + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(dict, "Record dictionary containing record fields"), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + ] + + returns = Parameter(int, "String representation of gid object") + + def call(self, record, creds): + + valid_creds = self.api.auth.checkCredentials(creds, 'register') + + #log the call + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + + hrn = None + if 'hrn' in record: + hrn = record['hrn'] + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name)) + + manager = self.api.get_interface_manager() + + return manager.register(self.api, record) diff --git a/sfa/methods/RegisterPeerObject.py b/sfa/methods/RegisterPeerObject.py new file mode 100644 index 00000000..68b3105c --- /dev/null +++ b/sfa/methods/RegisterPeerObject.py @@ -0,0 +1,73 @@ +### $Id: register.py 15001 2009-09-11 20:18:54Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/register.py $ + +from sfa.trust.certificate import Keypair, convert_public_key +from sfa.trust.gid import * + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.record import SfaRecord +from sfa.util.table import SfaTable +from sfa.util.debug import log +from sfa.trust.auth import Auth +from sfa.trust.gid import create_uuid +from sfa.trust.credential import Credential + +class register_peer_object(Method): + """ + Register a peer object with the registry. In addition to being stored in the + SFA database, the appropriate records will also be created in the + PLC databases + + @param cred credential string + @param record_dict dictionary containing record fields + @return gid string representation + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(dict, "Record dictionary containing record fields"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, cred, record_dict, origin_hrn=None): + user_cred = Credential(string=cred) + + #log the call + if not origin_hrn: + origin_hrn = user_cred.get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, None, self.name)) + + # validate the cred + self.api.auth.check(cred, "register") + + # make sure this is a peer record + if 'peer_authority' not in record_dict or \ + not record_dict['peer_authority']: + raise SfaInvalidArgument, "peer_authority must be specified" + + record = SfaRecord(dict = record_dict) + type, hrn, peer_authority = record['type'], record['hrn'], record['peer_authority'] + record['authority'] = get_authority(record['hrn']) + # verify permissions + self.api.auth.verify_cred_is_me(cred) + + # check if record already exists + table = SfaTable() + existing_records = table.find({'type': type, 'hrn': hrn, 'peer_authority': peer_authority}) + if existing_records: + for existing_record in existing_records: + if existing_record['pointer'] != record['pointer']: + record['record_id'] = existing_record['record_id'] + table.update(record) + else: + record_id = table.insert(record) + + return 1 diff --git a/sfa/methods/Remove.py b/sfa/methods/Remove.py new file mode 100644 index 00000000..82050b40 --- /dev/null +++ b/sfa/methods/Remove.py @@ -0,0 +1,52 @@ +### $Id: remove.py 16497 2010-01-07 03:33:24Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/remove.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.debug import log +from sfa.trust.credential import Credential + +class Remove(Method): + """ + Remove an object from the registry. If the object represents a PLC object, + then the PLC records will also be removed. + + @param cred credential string + @param type record type + @param xrn human readable name of record to remove (hrn or urn) + + @return 1 if successful, faults otherwise + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Human readable name of slice to instantiate (hrn or urn)"), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + Mixed(Parameter(str, "Record type"), + Parameter(None, "Type not specified")), + ] + + returns = Parameter(int, "1 if successful") + + def call(self, xrn, creds, type): + if not type: + hrn = urn_to_hrn(xrn)[0] + else: + hrn, type = urn_to_hrn(xrn) + + # validate the cred + valid_creds = self.api.auth.checkCredentials(creds, "remove") + self.api.auth.verify_object_permission(hrn) + + #log the call + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name)) + + + manager = self.api.get_interface_manager() + + return manager.remove(self.api, xrn, type) diff --git a/sfa/methods/RemovePeerObject.py b/sfa/methods/RemovePeerObject.py new file mode 100644 index 00000000..ed46ea71 --- /dev/null +++ b/sfa/methods/RemovePeerObject.py @@ -0,0 +1,103 @@ +from sfa.util.faults 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 SfaRecord +from sfa.util.table import SfaTable +from sfa.util.debug import log +from sfa.trust.credential import Credential +from types import StringTypes + +class remove_peer_object(Method): + """ + Remove an peer object from the PLC records of a local aggregate. + This method will be called by registry.remove() while removing + a record from the local aggreage's PLCDB and sfa table. This + method need not be directly called by end-user. + + @param cred credential string + @param record record as stored in the local registry + + @return 1 if successful, faults otherwise + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(dict, "Record dictionary"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, cred, record, origin_hrn=None): + user_cred = Credential(string=cred) + + #log the call + if not origin_hrn: + origin_hrn = user_cred.get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, record['hrn'], self.name)) + + self.api.auth.check(cred, "remove") + + # Only allow the local interface or record owner to delete peer_records + try: self.api.auth.verify_object_permission(record['hrn']) + except: self.api.auth.verify_cred_is_me(cred) + + table = SfaTable() + hrn, type = record['hrn'], record['type'] + records = table.find({'hrn': hrn, 'type': type }) + for record in records: + if record['peer_authority']: + self.remove_plc_record(record) + table.remove(record) + + return 1 + + def remove_plc_record(self, record): + type = record['type'] + if type == "user": + persons = self.api.plshell.GetPersons(self.api.plauth, {'person_id' : record['pointer']}) + if not persons: + return 1 + person = persons[0] + if person['peer_id']: + peer = self.get_peer_name(person['peer_id']) + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'person', person['person_id'], peer) + self.api.plshell.DeletePerson(self.api.plauth, person['person_id']) + + elif type == "slice": + slices=self.api.plshell.GetSlices(self.api.plauth, {'slice_id' : record['pointer']}) + if not slices: + return 1 + slice=slices[0] + if slice['peer_id']: + peer = self.get_peer_name(slice['peer_id']) + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'slice', slice['slice_id'], peer) + self.api.plshell.DeleteSlice(self.api.plauth, slice['slice_id']) + elif type == "authority": + sites=self.api.plshell.GetSites(self.api.plauth, {'site_id' : record['pointer']}) + if not sites: + return 1 + site=sites[0] + if site['peer_id']: + peer = self.get_peer_name(site['peer_id']) + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'site', site['site_id'], peer) + self.api.plshell.DeleteSite(self.api.plauth, site['site_id']) + + else: + raise UnknownSfaType(type) + + return 1 + + def get_peer_name(self, peer_id): + peers = self.api.plshell.GetPeers(self.api.plauth, [peer_id], ['peername', 'shortname', 'hrn_root']) + if not peers: + raise SfaInvalidArgument, "No such peer" + peer = peers[0] + return peer['shortname'] + + + diff --git a/sfa/methods/RenewSliver.py b/sfa/methods/RenewSliver.py new file mode 100644 index 00000000..efce45dd --- /dev/null +++ b/sfa/methods/RenewSliver.py @@ -0,0 +1,41 @@ +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter +from sfa.trust.credential import Credential +from dateutil.parser import parse + +class RenewSliver(Method): + """ + Renews the resources in a sliver, extending the lifetime of the slice. + @param slice_urn (string) URN of slice to renew + @param credentials ([string]) of credentials + @param expiration_time (string) requested time of expiration + + """ + interfaces = ['aggregate', 'slicemgr'] + accepts = [ + Parameter(str, "Slice URN"), + Parameter(type([str]), "List of credentials"), + Parameter(str, "Expiration time in RFC 3339 format") + ] + returns = Parameter(bool, "Success or Failure") + + def call(self, slice_xrn, creds, expiration_time): + hrn, type = urn_to_hrn(slice_xrn) + + self.api.logger.info("interface: %s\ttarget-hrn: %s\tcaller-creds: %s\tmethod-name: %s"%(self.api.interface, hrn, creds, self.name)) + + # Find the valid credentials + valid_creds = self.api.auth.checkCredentials(creds, 'renewsliver', hrn) + + # Validate that the time does not go beyond the credential's expiration time + requested_time = parse(expiration_time) + if requested_time > Credential(string=valid_creds[0]).get_lifetime(): + raise InsufficientRights('SliverStatus: Credential expires before requested expiration time') + + manager = self.api.get_interface_manager() + manager.renew_slice(self.api, xrn, valid_creds, requested_time) + + return 1 + diff --git a/sfa/methods/Resolve.py b/sfa/methods/Resolve.py new file mode 100644 index 00000000..ec47e41b --- /dev/null +++ b/sfa/methods/Resolve.py @@ -0,0 +1,50 @@ +### $Id: resolve.py 17157 2010-02-21 04:19:34Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/resolve.py $ +import traceback +import types +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.debug import log +from sfa.trust.credential import Credential +from sfa.util.record import SfaRecord + +class Resolve(Method): + """ + Resolve a record. + + @param cred credential string authorizing the caller + @param hrn human readable name to resolve (hrn or urn) + @return a list of record dictionaries or empty list + """ + + interfaces = ['registry'] + + accepts = [ + Mixed(Parameter(str, "Human readable name (hrn or urn)"), + Parameter(list, "List of Human readable names ([hrn])")), + Mixed(Parameter(str, "Credential string"), + Parameter(list, "List of credentials)")) + ] + + returns = [SfaRecord] + + def call(self, xrns, creds): + if not isinstance(xrns, types.ListType): + xrns=[xrns] + hrns = [urn_to_hrn(xrn)[0] for xrn in xrns] + + #find valid credentials + valid_creds = self.api.auth.checkCredentials(creds, 'resolve') + + #log the call + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrns, self.name)) + + # send the call to the right manager + manager = self.api.get_interface_manager() + return manager.resolve(self.api, xrns) + + + diff --git a/sfa/methods/ResolveGENI.py b/sfa/methods/ResolveGENI.py new file mode 100644 index 00000000..c223bbe8 --- /dev/null +++ b/sfa/methods/ResolveGENI.py @@ -0,0 +1,30 @@ +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter +from sfa.trust.credential import Credential + +class Resolve(Method): + """ + Lookup a URN and return information about the corresponding object. + @param urn + """ + + interfaces = ['registry'] + accepts = [ + Parameter(str, "URN"), + Parameter(type([str]), "List of credentials"), + ] + returns = Parameter(bool, "Success or Failure") + + def call(self, xrn): + + manager_base = 'sfa.managers' + + if self.api.interface in ['registry']: + mgr_type = self.api.config.SFA_REGISTRY_TYPE + manager_module = manager_base + ".registry_manager_%s" % mgr_type + manager = __import__(manager_module, fromlist=[manager_base]) + return manager.Resolve(self.api, xrn, '') + + return {} diff --git a/sfa/methods/Shutdown.py b/sfa/methods/Shutdown.py new file mode 100644 index 00000000..f8e32942 --- /dev/null +++ b/sfa/methods/Shutdown.py @@ -0,0 +1,25 @@ +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter +from sfa.methods.Stop import Stop + +class Shutdown(Stop): + """ + Perform an emergency shut down of a sliver. This operation is intended for administrative use. + The sliver is shut down but remains available for further forensics. + + @param slice_urn (string) URN of slice to renew + @param credentials ([string]) of credentials + """ + interfaces = ['aggregate', 'slicemgr'] + accepts = [ + Parameter(str, "Slice URN"), + Parameter(type([str]), "List of credentials"), + ] + returns = Parameter(bool, "Success or Failure") + + def call(self, slice_xrn, creds): + + return Stop.call(self, slice_xrn, creds) + diff --git a/sfa/methods/SliverStatus.py b/sfa/methods/SliverStatus.py new file mode 100644 index 00000000..2233b702 --- /dev/null +++ b/sfa/methods/SliverStatus.py @@ -0,0 +1,31 @@ +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed + +class SliverStatus(Method): + """ + Get the status of a sliver + + @param slice_urn (string) URN of slice to allocate to + + """ + interfaces = ['aggregate', 'slicemgr', 'component'] + accepts = [ + Parameter(str, "Slice URN"), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + ] + returns = Parameter(dict, "Status details") + + def call(self, slice_xrn, creds): + hrn, type = urn_to_hrn(slice_xrn) + valid_creds = self.api.auth.checkCredentials(creds, 'sliverstatus', hrn) + + self.api.logger.info("interface: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, hrn, self.name)) + + manager = self.api.get_interface_manager() + status = manager.slice_status(self.api, hrn, valid_creds) + + return status + diff --git a/sfa/methods/Start.py b/sfa/methods/Start.py new file mode 100644 index 00000000..958e34fa --- /dev/null +++ b/sfa/methods/Start.py @@ -0,0 +1,41 @@ +### $Id: stop_slice.py 17732 2010-04-19 21:10:45Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/stop_slice.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.auth import Auth +from sfa.trust.credential import Credential + +class Start(Method): + """ + Start the specified slice + + @param xrn human readable name of slice to instantiate (hrn or urn) + @param cred credential string specifying the rights of the caller + @return 1 is successful, faults otherwise + """ + + interfaces = ['aggregate', 'slicemgr', 'component'] + + accepts = [ + Parameter(str, "Human readable name of slice to start (hrn or urn)"), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + ] + + returns = Parameter(int, "1 if successful") + + def call(self, xrn, creds): + hrn, type = urn_to_hrn(xrn) + valid_creds = self.api.auth.checkCredentials(creds, 'startslice', hrn) + + #log the call + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name)) + + manager = self.api.get_interface_manager() + manager.start_slice(self.api, xrn, creds) + + return 1 diff --git a/sfa/methods/Stop.py b/sfa/methods/Stop.py new file mode 100644 index 00000000..c871e05b --- /dev/null +++ b/sfa/methods/Stop.py @@ -0,0 +1,41 @@ +### $Id: stop_slice.py 17732 2010-04-19 21:10:45Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/stop_slice.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.auth import Auth +from sfa.trust.credential import Credential + +class Stop(Method): + """ + Stop the specified slice + + @param cred credential string specifying the rights of the caller + @param xrn human readable name of slice to instantiate (hrn or urn) + @return 1 is successful, faults otherwise + """ + + interfaces = ['aggregate', 'slicemgr', 'component'] + + accepts = [ + Parameter(str, "Human readable name of slice to instantiate (hrn or urn)"), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + ] + + returns = Parameter(int, "1 if successful") + + def call(self, xrn, creds): + hrn, type = urn_to_hrn(xrn) + valid_creds = self.api.auth.checkCredentials(creds, 'stopslice', hrn) + + #log the call + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, hrn, self.name)) + + manager = self.api.get_interface_manager() + manager.stop_slice(self.api, xrn, creds) + + return 1 diff --git a/sfa/methods/Update.py b/sfa/methods/Update.py new file mode 100644 index 00000000..3b8b55a2 --- /dev/null +++ b/sfa/methods/Update.py @@ -0,0 +1,41 @@ +### $Id: update.py 16477 2010-01-05 16:31:37Z thierry $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/update.py $ + +import time +from sfa.util.faults import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.debug import log +from sfa.trust.credential import Credential + +class Update(Method): + """ + Update an object in the registry. Currently, this only updates the + PLC information associated with the record. The SFA fields (name, type, + GID) are fixed. + + @param cred credential string specifying rights of the caller + @param record a record dictionary to be updated + + @return 1 if successful, faults otherwise + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(dict, "Record dictionary to be updated"), + Parameter(str, "Credential string"), + ] + + returns = Parameter(int, "1 if successful") + + def call(self, record_dict, creds): + # validate the cred + valid_creds = self.api.auth.checkCredentials(creds, "update") + origin_hrn = Credential(string=valid_creds[0]).get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, None, self.name)) + + manager = self.api.get_interface_manager() + + return manager.update(self.api, record_dict) + diff --git a/sfa/methods/UpdateSliver.py b/sfa/methods/UpdateSliver.py new file mode 100644 index 00000000..37252f20 --- /dev/null +++ b/sfa/methods/UpdateSliver.py @@ -0,0 +1,35 @@ +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +import sys +from sfa.methods.CreateSliver import CreateSliver + +class UpdateSliver(CreateSliver): + """ + Allocate resources to a slice. This operation is expected to + start the allocated resources asynchornously after the operation + has successfully completed. Callers can check on the status of + the resources using SliverStatus. + + @param slice_urn (string) URN of slice to allocate to + @param credentials ([string]) of credentials + @param rspec (string) rspec to allocate + + """ + interfaces = ['aggregate', 'slicemgr'] + accepts = [ + Parameter(str, "Slice URN"), + Mixed(Parameter(str, "Credential string"), + Parameter(type([str]), "List of credentials")), + Parameter(str, "RSpec"), + Parameter(type([]), "List of user information") + ] + returns = Parameter(str, "Allocated RSpec") + + + + def call(self, slice_xrn, creds, rspec, users): + + return CreateSliver.call(self, slice_xrn, creds, rspec, users) + diff --git a/sfa/methods/__init__.py b/sfa/methods/__init__.py new file mode 100644 index 00000000..2bd195fd --- /dev/null +++ b/sfa/methods/__init__.py @@ -0,0 +1,45 @@ +## Please use make index to update this file +all = """ +create_slice +delete_slice +get_aggregates +get_credential +get_gids +get_key +get_registries +get_resources +get_self_credential +get_slices +get_ticket +get_trusted_certs +list +List +redeem_ticket +RedeemTicket +register +Register +register_peer_object +remove +Remove +reset_slice +resolve +Resolve +start_slice +stop_slice +update +Update +remove_peer_object +GetTicket +GetVersion +RedeemTicket +ListResources +ListSlices +CreateSliver +UpdateSliver +DeleteSliver +SliverStatus +RenewSliver +Start +Stop +Shutdown +""".split() diff --git a/sfa/methods/create_slice.py b/sfa/methods/create_slice.py new file mode 100644 index 00000000..cee2c4dc --- /dev/null +++ b/sfa/methods/create_slice.py @@ -0,0 +1,35 @@ +### $Id: create_slice.py 18560 2010-08-03 21:13:46Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/create_slice.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.CreateSliver import CreateSliver + +class create_slice(CreateSliver): + """ + Deprecated. Use CreateSliver instead. + Instantiate the specified slice according to whats defined in the specified rspec + + @param cred credential string specifying the rights of the caller + @param hrn human readable name of slice to instantiate (hrn or xrn) + @param rspec resource specification + @return 1 is successful, faults otherwise + """ + + interfaces = ['aggregate', 'slicemgr'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(str, "Human readable name of slice to instantiate (hrn or xrn)"), + Parameter(str, "Resource specification"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, cred, xrn, requested_rspec, origin_hrn=None): + + return CreateSliver.call(self, xrn, cred, requested_rspec, []) diff --git a/sfa/methods/delete_slice.py b/sfa/methods/delete_slice.py new file mode 100644 index 00000000..06005ec4 --- /dev/null +++ b/sfa/methods/delete_slice.py @@ -0,0 +1,34 @@ +### $Id: delete_slice.py 18565 2010-08-03 22:24:09Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/delete_slice.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.DeleteSliver import DeleteSliver + +class delete_slice(DeleteSliver): + """ + Deprecated. Use delete instead. + + Remove the slice from all nodes. + + @param cred credential string specifying the rights of the caller + @param xrn human readable name specifying the slice to delete (hrn or urn) + @return 1 if successful, faults otherwise + """ + + interfaces = ['aggregate', 'slicemgr', 'component'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(str, "Human readable name of slice to delete (hrn or urn)"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, cred, xrn, origin_hrn=None): + + return DeleteSliver.call(self, xrn, cred) diff --git a/sfa/methods/get_aggregates.py b/sfa/methods/get_aggregates.py new file mode 100644 index 00000000..c9609744 --- /dev/null +++ b/sfa/methods/get_aggregates.py @@ -0,0 +1,36 @@ +### $Id: get_slices.py 14387 2009-07-08 18:19:11Z faiyaza $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/get_aggregates.py $ +from types import StringTypes +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.auth import Auth +from sfa.server.aggregate import Aggregates + +class get_aggregates(Method): + """ + Get a list of connection information for all known aggregates. + + @param cred credential string specifying the rights of the caller + @param a Human readable name (hrn or urn), or list of hrns or None + @return list of dictionaries with aggregate information. + """ + + interfaces = ['registry', 'aggregate', 'slicemgr'] + + accepts = [ + Parameter(str, "Credential string"), + Mixed(Parameter(str, "Human readable name (hrn or urn)"), + Parameter(None, "hrn not specified")) + ] + + returns = [Parameter(dict, "Aggregate interface information")] + + def call(self, cred, xrn = None): + hrn, type = urn_to_hrn(xrn) + self.api.auth.check(cred, 'list') + aggregates = Aggregates(self.api).interfaces.values() + if hrn: + aggregates = [agg for agg in aggregates if agg['hrn'] == hrn] + return aggregates diff --git a/sfa/methods/get_credential.py b/sfa/methods/get_credential.py new file mode 100644 index 00000000..aa5c4c66 --- /dev/null +++ b/sfa/methods/get_credential.py @@ -0,0 +1,37 @@ +### $Id: get_credential.py 18596 2010-08-06 20:58:41Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/get_credential.py $ + +from sfa.trust.credential import * +from sfa.trust.rights import * +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.GetCredential import GetCredential + +class get_credential(GetCredential): + """ + Deprecated. Use GetCredential instead. + + Retrive a credential for an object + If cred == Nonee then the behavior reverts to get_self_credential + + @param cred credential object specifying rights of the caller + @param type type of object (user | slice | sa | ma | node) + @param hrn human readable name of object (hrn or urn) + + @return the string representation of a credential object + """ + + interfaces = ['registry'] + + accepts = [ + Mixed(Parameter(str, "credential"), + Parameter(None, "No credential")), + Parameter(str, "Human readable name (hrn or urn)") + ] + + returns = Parameter(str, "String representation of a credential object") + + def call(self, cred, type, xrn, origin_hrn=None): + return GetCredential.call(self, cred, xrn, type) diff --git a/sfa/methods/get_gids.py b/sfa/methods/get_gids.py new file mode 100644 index 00000000..c54af0a3 --- /dev/null +++ b/sfa/methods/get_gids.py @@ -0,0 +1,30 @@ +from sfa.util.faults import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.GetGids import GetGids + +class get_gids(GetGids): + """ + Deprecated. Use GetGids instead. + + Get a list of record information (hrn, gid and type) for + the specified hrns. + + @param cred credential string + @param cert certificate string + @return + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Certificate string"), + Mixed(Parameter(str, "Human readable name (hrn or xrn)"), + Parameter(type([str]), "List of Human readable names (hrn or xrn)")) + ] + + returns = [Parameter(dict, "Dictionary of gids keyed on hrn")] + + def call(self, cred, xrns): + + return GetGids.call(self, xrns, cred) diff --git a/sfa/methods/get_key.py b/sfa/methods/get_key.py new file mode 100644 index 00000000..46af3695 --- /dev/null +++ b/sfa/methods/get_key.py @@ -0,0 +1,88 @@ +### $Id: $ +### $URL: $ +import os +import tempfile +import commands +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.auth import Auth +from sfa.util.table import SfaTable +from sfa.trust.certificate import Keypair +from sfa.trust.gid import create_uuid + +class get_key(Method): + """ + Generate a new keypair and gid for requesting caller (component). + @return 1 If successful + """ + + interfaces = ['registry'] + + accepts = [] + + returns = Parameter(int, "1 if successful, faults otherwise") + + def call(self): + # verify that the callers's ip address exist in the db and is an inteface + # for a node in the db + (ip, port) = self.api.remote_addr + interfaces = self.api.plshell.GetInterfaces(self.api.plauth, {'ip': ip}, ['node_id']) + if not interfaces: + raise NonExistingRecord("no such ip %(ip)s" % locals()) + nodes = self.api.plshell.GetNodes(self.api.plauth, [interfaces[0]['node_id']], ['node_id', 'hostname']) + if not nodes: + raise NonExistingRecord("no such node using ip %(ip)s" % locals()) + node = nodes[0] + + # look up the sfa record + table = SfaTable() + records = table.findObjects({'type': 'node', 'pointer': node['node_id']}) + if not records: + raise RecordNotFound("pointer:" + str(node['node_id'])) + record = records[0] + + # generate a new keypair and gid + uuid = create_uuid() + pkey = Keypair(create=True) + urn = hrn_to_urn(record['hrn'], record['type']) + gid_object = self.api.auth.hierarchy.create_gid(urn, uuid, pkey) + gid = gid_object.save_to_string(save_parents=True) + record['gid'] = gid + record.set_gid(gid) + + # update the record + table.update(record) + + # attempt the scp the key + # and gid onto the node + # this will only work for planetlab based components + (kfd, key_filename) = tempfile.mkstemp() + (gfd, gid_filename) = tempfile.mkstemp() + pkey.save_to_file(key_filename) + gid_object.save_to_file(gid_filename, save_parents=True) + host = node['hostname'] + key_dest="/etc/sfa/node.key" + gid_dest="/etc/sfa/node.gid" + scp = "/usr/bin/scp" + #identity = "/etc/planetlab/root_ssh_key.rsa" + identity = "/etc/sfa/root_ssh_key" + scp_options=" -i %(identity)s " % locals() + scp_options+="-o StrictHostKeyChecking=no " % locals() + scp_key_command="%(scp)s %(scp_options)s %(key_filename)s root@%(host)s:%(key_dest)s" %\ + locals() + scp_gid_command="%(scp)s %(scp_options)s %(gid_filename)s root@%(host)s:%(gid_dest)s" %\ + locals() + + all_commands = [scp_key_command, scp_gid_command] + + for command in all_commands: + (status, output) = commands.getstatusoutput(command) + if status: + raise Exception, output + + for filename in [key_filename, gid_filename]: + os.unlink(filename) + + return 1 diff --git a/sfa/methods/get_registries.py b/sfa/methods/get_registries.py new file mode 100644 index 00000000..358874c8 --- /dev/null +++ b/sfa/methods/get_registries.py @@ -0,0 +1,36 @@ +### $Id: get_slices.py 14387 2009-07-08 18:19:11Z faiyaza $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/get_registries.py $ +from types import StringTypes +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.auth import Auth +from sfa.server.registry import Registries + +class get_registries(Method): + """ + Get a list of connection information for all known registries. + + @param cred credential string specifying the rights of the caller + @param a Human readable name (hrn or urn), or list of names or None + @return list of dictionaries with aggregate information. + """ + + interfaces = ['registry', 'aggregate', 'slicemgr'] + + accepts = [ + Parameter(str, "Credential string"), + Mixed(Parameter(str, "Human readable name (hrn or urn)"), + Parameter(None, "hrn not specified")) + ] + + returns = [Parameter(dict, "Registry interface information")] + + def call(self, cred, xrn = None): + hrn, type = urn_to_hrn(xrn) + self.api.auth.check(cred, 'list') + registries = Registries(self.api).interfaces.values() + if hrn: + registries = [reg for reg in registries if reg['hrn'] == hrn] + return registries diff --git a/sfa/methods/get_resources.py b/sfa/methods/get_resources.py new file mode 100644 index 00000000..79065e1a --- /dev/null +++ b/sfa/methods/get_resources.py @@ -0,0 +1,40 @@ +### $Id: get_resources.py 18562 2010-08-03 21:15:52Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/get_resources.py $ + +from sfa.util.faults import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.ListResources import ListResources +# RSpecManager_pl is not used. This line is a check that ensures that everything is in place for the import to work. +import sfa.rspecs.aggregates.rspec_manager_pl + +class get_resources(ListResources): + """ + Deprecated. Use ListResources instead. + + Get an resource specification (rspec). The rspec may describe the resources + available at an authority or the resources being used by a slice. + + @param cred credential string specifying the rights of the caller + @param hrn human readable name of the slice we are interesed in or None + for an authority. + """ + + interfaces = ['aggregate', 'slicemgr'] + + accepts = [ + Parameter(str, "Credential string"), + Mixed(Parameter(str, "Human readable name (hrn or urn)"), + Parameter(None, "hrn not specified")), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(str, "String representatin of an rspec") + + def call(self, cred, xrn=None, origin_hrn=None): + options = {'geni_slice_urn': xrn, + 'origin_hrn': origin_hrn + } + + return ListResources.call(self, cred, options) diff --git a/sfa/methods/get_self_credential.py b/sfa/methods/get_self_credential.py new file mode 100644 index 00000000..3bdaecc7 --- /dev/null +++ b/sfa/methods/get_self_credential.py @@ -0,0 +1,53 @@ +### $Id: get_credential.py 15321 2009-10-15 05:01:21Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/get_credential.py $ + +from sfa.trust.credential import * +from sfa.trust.rights import * +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.record import SfaRecord +from sfa.util.debug import log +from sfa.methods.GetSelfCredential import GetSelfCredential + +class get_self_credential(GetSelfCredential): + """ + Deprecated. Use GetSelfCredential instead. + + Retrive a credential for an object + @param cert certificate string + @param type type of object (user | slice | sa | ma | node) + @param hrn human readable name of object (hrn or urn) + + @return the string representation of a credential object + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Human readable name (hrn or urn)"), + Parameter(str, "certificate"), + Mixed(Parameter(str, "Request hash"), + Parameter(None, "Request hash not specified")) + ] + + returns = Parameter(str, "String representation of a credential object") + + def call(self, cert, type, xrn, origin_hrn=None): + """ + get_self_credential a degenerate version of get_credential used by a client + to get his initial credential when de doesnt have one. This is the same as + get_credetial(..., cred = None, ...) + + The registry ensures that the client is the principal that is named by + (type, name) by comparing the public key in the record's GID to the + private key used to encrypt the client side of the HTTPS connection. Thus + it is impossible for one principal to retrive another principal's + credential without having the appropriate private key. + + @param type type of object (user | slice | sa | ma | node) + @param hrn human readable name of authority to list + @return string representation of a credential object + """ + return GetSelfCredential.call(self, cert, xrn, type) diff --git a/sfa/methods/get_slices.py b/sfa/methods/get_slices.py new file mode 100644 index 00000000..7b65b30b --- /dev/null +++ b/sfa/methods/get_slices.py @@ -0,0 +1,30 @@ +### $Id: get_slices.py 18582 2010-08-05 02:37:55Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/get_slices.py $ + +from sfa.util.faults import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.ListSlices import ListSlices + +class get_slices(ListSlices): + """ + Deprecated. Use ListSlices instead. + Get a list of instantiated slices at this authority. + + @param cred credential string specifying the rights of the caller + @return list of human readable slice names (hrn). + """ + + interfaces = ['aggregate', 'slicemgr', 'component'] + + accepts = [ + Parameter(str, "Credential string"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = [Parameter(str, "Human readable slice name (hrn)")] + + def call(self, cred, origin_hrn=None): + + return ListSlices.call(self, cred) diff --git a/sfa/methods/get_ticket.py b/sfa/methods/get_ticket.py new file mode 100644 index 00000000..bd984565 --- /dev/null +++ b/sfa/methods/get_ticket.py @@ -0,0 +1,43 @@ +### $Id: get_ticket.py 18584 2010-08-05 22:46:52Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/get_ticket.py $ +import time +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.GetTicket import GetTicket + +class get_ticket(GetTicket): + """ + Deprecated. Use GetTicket instead. + + Retrieve a ticket. This operation is currently implemented on PLC + only (see SFA, engineering decisions); it is not implemented on + components. + + The ticket is filled in with information from the PLC database. This + information includes resources, and attributes such as user keys and + initscripts. + + @param cred credential string + @param name name of the slice to retrieve a ticket for (hrn or urn) + @param rspec resource specification dictionary + + @return the string representation of a ticket object + """ + + interfaces = ['aggregate', 'slicemgr'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(str, "Human readable name of slice to retrive a ticket for (hrn or urn)"), + Parameter(str, "Resource specification (rspec)"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(str, "String represeneation of a ticket object") + + def call(self, cred, xrn, rspec, origin_hrn=None): + + return GetTicket.call(self, xrn, cred, rspec, None) diff --git a/sfa/methods/get_trusted_certs.py b/sfa/methods/get_trusted_certs.py new file mode 100644 index 00000000..6ae4d50e --- /dev/null +++ b/sfa/methods/get_trusted_certs.py @@ -0,0 +1,42 @@ + +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/reset_slices.py $ + +from sfa.util.faults import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.auth import Auth +from sfa.trust.credential import Credential + +class get_trusted_certs(Method): + """ + @param cred credential string specifying the rights of the caller + @return list of gid strings + """ + + interfaces = ['registry', 'aggregate', 'slicemgr'] + + accepts = [ + Mixed(Parameter(str, "Credential string"), + Parameter(None, "Credential not specified")) + ] + + returns = Parameter(type([str]), "List of GID strings") + + def call(self, cred = None): + # If cred is not specified just return the gid for this interface. + # This is true when when a peer is attempting to initiate federation + # with this interface + print cred + if not cred: + gid_strings = [] + for gid in self.api.auth.trusted_cert_list: + if gid.get_hrn() == self.api.config.SFA_INTERFACE_HRN: + gid_strings.append(gid.save_to_string(save_parents=True)) + return gid_strings + + # authenticate the cred + self.api.auth.check(cred, 'gettrustedcerts') + gid_strings = [gid.save_to_string(save_parents=True) for \ + gid in self.api.auth.trusted_cert_list] + + return gid_strings diff --git a/sfa/methods/list.py b/sfa/methods/list.py new file mode 100644 index 00000000..0da6c077 --- /dev/null +++ b/sfa/methods/list.py @@ -0,0 +1,34 @@ +### $Id: list.py 18601 2010-08-06 21:20:23Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/list.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.record import SfaRecord +from sfa.methods.List import List + +class list(List): + """ + Deprecated. Use List instead. + + List the records in an authority. + + @param cred credential string specifying the rights of the caller + @param hrn human readable name of authority to list (hrn or urn) + @return list of record dictionaries + """ + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(str, "Human readable name (hrn or urn)"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = [SfaRecord] + + def call(self, cred, xrn, origin_hrn=None): + + return List.call(self, xrn, cred) diff --git a/sfa/methods/redeem_ticket.py b/sfa/methods/redeem_ticket.py new file mode 100644 index 00000000..82985e7c --- /dev/null +++ b/sfa/methods/redeem_ticket.py @@ -0,0 +1,31 @@ +### $Id: reset_slice.py 15428 2009-10-23 15:28:03Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfacomponent/methods/reset_slice.py $ +import xmlrpclib +from sfa.util.faults import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.RedeemTicket import RedeemTicket + +class redeem_ticket(RedeemTicket): + """ + Deprecated. Use RedeemTicket instead. + + Redeem a approved set of resource allocations (ticket). + + @param cred credential string specifying the rights of the caller + @param ticket + @return 1 is successful, faults otherwise + """ + + interfaces = ['component'] + + accepts = [ + Parameter(str, "Credential string representation of SFA credential"), + Parameter(str, "Ticket string representation of SFA ticket") + ] + + returns = [Parameter(int, "1 if successful")] + + def call(self, cred, ticket): + + return RedeemTicket.call(self, ticket, cred) diff --git a/sfa/methods/register.py b/sfa/methods/register.py new file mode 100644 index 00000000..f71bfbff --- /dev/null +++ b/sfa/methods/register.py @@ -0,0 +1,36 @@ +### $Id: register.py 18605 2010-08-06 21:43:22Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/register.py $ + +from sfa.trust.certificate import Keypair, convert_public_key +from sfa.trust.gid import * +from sfa.util.faults import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.Register import Register + +class register(Register): + """ + Deprecated. Used Register instead. + + Register an object with the registry. In addition to being stored in the + SFA database, the appropriate records will also be created in the + PLC databases + + @param cred credential string + @param record_dict dictionary containing record fields + + @return gid string representation + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(dict, "Record dictionary containing record fields") + ] + + returns = Parameter(int, "String representation of gid object") + + def call(self, cred, record, origin_hrn=None): + + return Register.call(self, record, cred) diff --git a/sfa/methods/register_peer_object.py b/sfa/methods/register_peer_object.py new file mode 100644 index 00000000..68b3105c --- /dev/null +++ b/sfa/methods/register_peer_object.py @@ -0,0 +1,73 @@ +### $Id: register.py 15001 2009-09-11 20:18:54Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/register.py $ + +from sfa.trust.certificate import Keypair, convert_public_key +from sfa.trust.gid import * + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.record import SfaRecord +from sfa.util.table import SfaTable +from sfa.util.debug import log +from sfa.trust.auth import Auth +from sfa.trust.gid import create_uuid +from sfa.trust.credential import Credential + +class register_peer_object(Method): + """ + Register a peer object with the registry. In addition to being stored in the + SFA database, the appropriate records will also be created in the + PLC databases + + @param cred credential string + @param record_dict dictionary containing record fields + @return gid string representation + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(dict, "Record dictionary containing record fields"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, cred, record_dict, origin_hrn=None): + user_cred = Credential(string=cred) + + #log the call + if not origin_hrn: + origin_hrn = user_cred.get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, None, self.name)) + + # validate the cred + self.api.auth.check(cred, "register") + + # make sure this is a peer record + if 'peer_authority' not in record_dict or \ + not record_dict['peer_authority']: + raise SfaInvalidArgument, "peer_authority must be specified" + + record = SfaRecord(dict = record_dict) + type, hrn, peer_authority = record['type'], record['hrn'], record['peer_authority'] + record['authority'] = get_authority(record['hrn']) + # verify permissions + self.api.auth.verify_cred_is_me(cred) + + # check if record already exists + table = SfaTable() + existing_records = table.find({'type': type, 'hrn': hrn, 'peer_authority': peer_authority}) + if existing_records: + for existing_record in existing_records: + if existing_record['pointer'] != record['pointer']: + record['record_id'] = existing_record['record_id'] + table.update(record) + else: + record_id = table.insert(record) + + return 1 diff --git a/sfa/methods/remove.py b/sfa/methods/remove.py new file mode 100644 index 00000000..5d239394 --- /dev/null +++ b/sfa/methods/remove.py @@ -0,0 +1,38 @@ +### $Id: remove.py 18606 2010-08-06 21:57:54Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/remove.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.Remove import Remove + +class remove(Remove): + """ + Deprecated. Use Remove instead. + + Remove an object from the registry. If the object represents a PLC object, + then the PLC records will also be removed. + + @param cred credential string + @param type record type + @param xrn human readable name of record to remove (hrn or urn) + + @return 1 if successful, faults otherwise + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(str, "Record type"), + Parameter(str, "Human readable name of slice to instantiate (hrn or urn)"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, cred, type, xrn, origin_hrn=None): + + return Remove.call(self, xrn, cred, type) diff --git a/sfa/methods/remove_peer_object.py b/sfa/methods/remove_peer_object.py new file mode 100644 index 00000000..ed46ea71 --- /dev/null +++ b/sfa/methods/remove_peer_object.py @@ -0,0 +1,103 @@ +from sfa.util.faults 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 SfaRecord +from sfa.util.table import SfaTable +from sfa.util.debug import log +from sfa.trust.credential import Credential +from types import StringTypes + +class remove_peer_object(Method): + """ + Remove an peer object from the PLC records of a local aggregate. + This method will be called by registry.remove() while removing + a record from the local aggreage's PLCDB and sfa table. This + method need not be directly called by end-user. + + @param cred credential string + @param record record as stored in the local registry + + @return 1 if successful, faults otherwise + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(dict, "Record dictionary"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, cred, record, origin_hrn=None): + user_cred = Credential(string=cred) + + #log the call + if not origin_hrn: + origin_hrn = user_cred.get_gid_caller().get_hrn() + self.api.logger.info("interface: %s\tcaller-hrn: %s\ttarget-hrn: %s\tmethod-name: %s"%(self.api.interface, origin_hrn, record['hrn'], self.name)) + + self.api.auth.check(cred, "remove") + + # Only allow the local interface or record owner to delete peer_records + try: self.api.auth.verify_object_permission(record['hrn']) + except: self.api.auth.verify_cred_is_me(cred) + + table = SfaTable() + hrn, type = record['hrn'], record['type'] + records = table.find({'hrn': hrn, 'type': type }) + for record in records: + if record['peer_authority']: + self.remove_plc_record(record) + table.remove(record) + + return 1 + + def remove_plc_record(self, record): + type = record['type'] + if type == "user": + persons = self.api.plshell.GetPersons(self.api.plauth, {'person_id' : record['pointer']}) + if not persons: + return 1 + person = persons[0] + if person['peer_id']: + peer = self.get_peer_name(person['peer_id']) + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'person', person['person_id'], peer) + self.api.plshell.DeletePerson(self.api.plauth, person['person_id']) + + elif type == "slice": + slices=self.api.plshell.GetSlices(self.api.plauth, {'slice_id' : record['pointer']}) + if not slices: + return 1 + slice=slices[0] + if slice['peer_id']: + peer = self.get_peer_name(slice['peer_id']) + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'slice', slice['slice_id'], peer) + self.api.plshell.DeleteSlice(self.api.plauth, slice['slice_id']) + elif type == "authority": + sites=self.api.plshell.GetSites(self.api.plauth, {'site_id' : record['pointer']}) + if not sites: + return 1 + site=sites[0] + if site['peer_id']: + peer = self.get_peer_name(site['peer_id']) + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'site', site['site_id'], peer) + self.api.plshell.DeleteSite(self.api.plauth, site['site_id']) + + else: + raise UnknownSfaType(type) + + return 1 + + def get_peer_name(self, peer_id): + peers = self.api.plshell.GetPeers(self.api.plauth, [peer_id], ['peername', 'shortname', 'hrn_root']) + if not peers: + raise SfaInvalidArgument, "No such peer" + peer = peers[0] + return peer['shortname'] + + + diff --git a/sfa/methods/reset_slice.py b/sfa/methods/reset_slice.py new file mode 100644 index 00000000..cd9026c4 --- /dev/null +++ b/sfa/methods/reset_slice.py @@ -0,0 +1,52 @@ +### $Id: reset_slices.py 15428 2009-10-23 15:28:03Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/reset_slices.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.trust.auth import Auth +from sfa.plc.slices import Slices + +class reset_slice(Method): + """ + Reset the specified slice + + @param cred credential string specifying the rights of the caller + @param xrn human readable name of slice to instantiate (hrn or urn) + @return 1 is successful, faults otherwise + """ + + interfaces = ['aggregate', 'slicemgr', 'component'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(str, "Human readable name of slice to instantiate (hrn or urn)"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, cred, xrn, origin_hrn=None): + hrn, type = urn_to_hrn(xrn) + self.api.auth.check(cred, 'resetslice', hrn) + # send the call to the right manager + manager_base = 'sfa.managers' + if self.api.interface in ['component']: + mgr_type = self.api.config.SFA_CM_TYPE + manager_module = manager_base + ".component_manager_%s" % mgr_type + manager = __import__(manager_module, fromlist=[manager_base]) + manager.reset_slice(self.api, xrn) + elif self.api.interface in ['aggregate']: + mgr_type = self.api.config.SFA_AGGREGATE_TYPE + manager_module = manager_base + ".aggregate_manager_%s" % mgr_type + manager = __import__(manager_module, fromlist=[manager_base]) + manager.reset_slice(self.api, xrn) + elif self.api.interface in ['slicemgr']: + mgr_type = self.api.config.SFA_SM_TYPE + manager_module = manager_base + ".slice_manager_%s" % mgr_type + manager = __import__(manager_module, fromlist=[manager_base]) + manager.reset_slice(self.api, xrn) + + return 1 diff --git a/sfa/methods/resolve.py b/sfa/methods/resolve.py new file mode 100644 index 00000000..84f12081 --- /dev/null +++ b/sfa/methods/resolve.py @@ -0,0 +1,36 @@ +### $Id: resolve.py 18594 2010-08-06 20:00:50Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/resolve.py $ +import traceback +import types +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.util.record import SfaRecord +from sfa.methods.Resolve import Resolve + +class resolve(Resolve): + """ + Deprecated. Use Resolve instead + Resolve a record. + + @param cred credential string authorizing the caller + @param hrn human readable name to resolve (hrn or urn) + @return a list of record dictionaries or empty list + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Credential string"), + Mixed(Parameter(str, "Human readable name (hrn or urn)"), + Parameter(list, "List of Human readable names ([hrn])")) + ] + + returns = [SfaRecord] + + def call(self, cred, xrns, origin_hrn=None): + return Resolve.call(self, xrns, cred) + + + diff --git a/sfa/methods/start_slice.py b/sfa/methods/start_slice.py new file mode 100644 index 00000000..bfb741ce --- /dev/null +++ b/sfa/methods/start_slice.py @@ -0,0 +1,34 @@ +### $Id: start_slice.py 18566 2010-08-03 22:24:42Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/start_slice.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.Start import Start + +class start_slice(Start): + """ + Deprecated. Use Start instead + + Start the specified slice + + @param cred credential string specifying the rights of the caller + @param hrn human readable name of slice to instantiate (urn or hrn) + @return 1 is successful, faults otherwise + """ + + interfaces = ['aggregate', 'slicemgr', 'component'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(str, "Human readable name of slice to instantiate (urn or hrn)"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = [Parameter(int, "1 if successful")] + + def call(self, cred, xrn, origin_hrn=None): + + return Start.call(self, xrn, cred) diff --git a/sfa/methods/stop_slice.py b/sfa/methods/stop_slice.py new file mode 100644 index 00000000..a711c0b0 --- /dev/null +++ b/sfa/methods/stop_slice.py @@ -0,0 +1,33 @@ +### $Id: stop_slice.py 18567 2010-08-03 22:25:05Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/stop_slice.py $ + +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.Stop import Stop + +class stop_slice(Stop): + """ + Deprecated. Use Stop instead + Stop the specified slice + + @param cred credential string specifying the rights of the caller + @param xrn human readable name of slice to instantiate (hrn or urn) + @return 1 is successful, faults otherwise + """ + + interfaces = ['aggregate', 'slicemgr', 'component'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(str, "Human readable name of slice to instantiate (hrn or urn)"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, cred, xrn, origin_hrn=None): + + return Stop.call(self, xrn, cred) diff --git a/sfa/methods/update.py b/sfa/methods/update.py new file mode 100644 index 00000000..56b8ff59 --- /dev/null +++ b/sfa/methods/update.py @@ -0,0 +1,38 @@ +### $Id: update.py 18606 2010-08-06 21:57:54Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/methods/update.py $ + +import time +from sfa.util.faults import * +from sfa.util.method import Method +from sfa.util.parameter import Parameter, Mixed +from sfa.methods.Update import Update + +class update(Update): + """ + Deprecated. Use Update instead. + + Update an object in the registry. Currently, this only updates the + PLC information associated with the record. The SFA fields (name, type, + GID) are fixed. + + @param cred credential string specifying rights of the caller + @param record a record dictionary to be updated + + @return 1 if successful, faults otherwise + """ + + interfaces = ['registry'] + + accepts = [ + Parameter(str, "Credential string"), + Parameter(dict, "Record dictionary to be updated"), + Mixed(Parameter(str, "Human readable name of the original caller"), + Parameter(None, "Origin hrn not specified")) + ] + + returns = Parameter(int, "1 if successful") + + def call(self, cred, record_dict, origin_hrn=None): + + return Update.call(self, record_dict, cred) + diff --git a/sfa/plc/__init__.py b/sfa/plc/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfa/plc/api-dev.py b/sfa/plc/api-dev.py new file mode 100644 index 00000000..29b0cc80 --- /dev/null +++ b/sfa/plc/api-dev.py @@ -0,0 +1,562 @@ +# +# SFA XML-RPC and SOAP interfaces +# +### $Id: api.py 17793 2010-04-26 21:40:57Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/plc/api.py $ +# + +import sys +import os +import traceback +import string +import xmlrpclib +from sfa.trust.auth import Auth +from sfa.util.config import * +from sfa.util.faults import * +from sfa.util.debug import * +from sfa.trust.rights import * +from sfa.trust.credential import * +from sfa.trust.certificate import * +from sfa.util.namespace import * +from sfa.util.api import * +from sfa.util.nodemanager import NodeManager +from sfa.util.sfalogging import * +from collections import defaultdict + + +class RecordInfo(): + + shell = None + auth = None + + # pl records + sites = {} + slices = {} + persons = {} + nodes = {} + keys = {} + + # sfa records + sfa_authorities = {} + sfa_slices = {} + sfa_users = {} + sfa_nodes = {} + + records = [] + + def __init__(self, api, records): + self.api = api + self.shell = api.plshell + self.auth = api.plauth + + site_ids = [] + slice_ids = [] + person_ids = [] + node_ids = [] + + # put records into groups based on types + for record in records: + pointer = record['pointer'] + if record['type'] == 'authority': + self.sfa_authorities[pointer] = record + self.records.append(record) + site_ids.append(record['pointer']) + elif record['type'] == 'slice': + self.sfa_slices[pointer] = record + self.records.append(record) + slice_ids.append(record['pointer']) + elif record['type'] == 'user': + self.sfa_users[pointer] = record + self.records.append(record) + person_ids.append(record['pointer']) + elif record['type'] == 'node': + self.sfa_nodes[pointer] = record + self.records.append(record) + node_ids.append(record['pointer']) + + # get pl info for these records + self.update_pl_sites(site_ids) + self.update_pl_slices(slice_ids) + self.update_pl_persons(person_ids) + self.update_pl_nodes(node_ids) + + site_ids = [] + slice_ids = [] + person_ids = [] + node_ids = [] + # now get pl records for all ids associated with + # these records + for record in records: + if 'site_id' in record: + site_ids.append(record['site_id']) + if 'site_ids' in records: + site_ids.extend(record['site_ids']) + if 'person_ids' in record: + person_ids.extend(record['person_ids']) + if 'slice_ids' in record: + slice_ids.extend(record['slice_ids']) + if 'node_ids' in record: + node_ids.extend(record['node_ids']) + + # get pl info for these records + self.update_pl_sites(site_ids) + self.update_pl_slices(slice_ids) + self.update_pl_persons(person_ids) + self.update_pl_nodes(node_ids) + + # convert pl ids to hrns + self.update_hrns() + + # update sfa info + self.update_sfa_info(person_ids) + + def update_pl_sites(self, site_ids): + """ + Update site records with PL info + """ + if not site_ids: + return + sites = self.shell.GetSites(self.auth, site_ids) + for site in sites: + site_id = site['site_id'] + self.sites[site_id] = site + if site_id in self.sfa_authorities: + self.sfa_authorities[site_id].update(site) + + def update_pl_slices(self, slice_ids): + """ + Update slice records with PL info + """ + if not slice_ids: + return + slices = self.shell.GetSlices(self.auth, slice_ids) + for slice in slices: + slice_id = slice['slice_id'] + self.slices[slice_id] = slice + if slice_id in self.sfa_slices: + self.sfa_slices[slice_id].update(slice) + + def update_pl_persons(self, person_ids): + """ + Update person records with PL info + """ + key_ids = [] + if not person_ids: + return + persons = self.shell.GetPersons(self.auth, person_ids) + for person in persons: + person_id = person['person_id'] + self.persons[person_id] = person + key_ids.extend(person['key_ids']) + if person_id in self.sfa_users: + self.sfa_users[person_id].update(person) + self.update_pl_keys(key_ids) + + def update_pl_keys(self, key_ids): + """ + Update user records with PL public key info + """ + if not key_ids: + return + keys = self.shell.GetKeys(self.auth, key_ids) + for key in keys: + person_id = key['person_id'] + self.keys[key['key_id']] = key + if person_id in self.sfa_users: + person = self.sfa_users[person_id] + if not 'keys' in person: + person['keys'] = [key['key']] + else: + person['keys'].append(key['key']) + + def update_pl_nodes(self, node_ids): + """ + Update node records with PL info + """ + if not node_ids: + return + nodes = self.shell.GetNodes(self.auth, node_ids) + for node in nodes: + node_id = node['node_id'] + self.nodes[node['node_id']] = node + if node_id in self.sfa_nodes: + self.sfa_nodes[node_id].update(node) + + + def update_hrns(self): + """ + Convert pl ids to hrns + """ + for record in self.records: + # get all necessary data + type = record['type'] + pointer = record['pointer'] + auth_hrn = self.api.hrn + login_base = '' + if pointer == -1: + continue + + if 'site_id' in record: + site = self.sites[record['site_id']] + login_base = site['login_base'] + record['site'] = ".".join([auth_hrn, login_base]) + if 'person_ids' in record: + emails = [self.persons[person_id]['email'] for person_id in record['person_ids'] \ + if person_id in self.persons] + usernames = [email.split('@')[0] for email in emails] + person_hrns = [".".join([auth_hrn, login_base, username]) for username in usernames] + record['persons'] = person_hrns + if 'slice_ids' in record: + slicenames = [self.slices[slice_id]['name'] for slice_id in record['slice_ids'] \ + if slice_id in self.slices] + slice_hrns = [slicename_to_hrn(auth_hrn, slicename) for slicename in slicenames] + record['slices'] = slice_hrns + if 'node_ids' in record: + hostnames = [self.nodes[node_id]['hostname'] for node_id in record['node_ids'] \ + if node_id in self.nodes] + node_hrns = [hostname_to_hrn(auth_hrn, login_base, hostname) for hostname in hostnames] + record['nodes'] = node_hrns + if 'site_ids' in record: + login_bases = [self.sites[site_id]['login_base'] for site_id in record['site_ids'] \ + if site_id in self.sites] + site_hrns = [".".join([auth_hrn, lbase]) for lbase in login_bases] + record['sites'] = site_hrns + + def update_sfa_info(self, person_ids): + from sfa.util.table import SfaTable + table = SfaTable() + persons = table.find({'type': 'user', 'pointer': person_ids}) + # create a hrns keyed on the sfa record's pointer. + # Its possible for multiple records to have the same pointer so + # the dict's value will be a list of hrns. + person_dict = defaultdict(list) + for person in persons: + person_dict[person['pointer']].append(person['hrn']) + + def startswith(prefix, values): + return [value for value in values if value.startswith(prefix)] + + for record in self.records: + authority = record['authority'] + if record['pointer'] == -1: + continue + + if record['type'] == 'slice': + # all slice users are researchers + record['PI'] = [] + record['researchers'] = [] + for person_id in record['person_ids']: + record['researchers'].extend(person_dict[person_id]) + # also add the pis at the slice's site + site = self.sites[record['site_id']] + for person_id in site['person_ids']: + person = self.persons[person_id] + if 'pi' in person['roles']: + # PLCAPI doesn't support per site roles + # (a pi has the pi role at every site he belongs to). + # We shouldnt allow this in SFA + record['PI'].extend(startswith(authority, person_dict[person_id])) + + elif record['type'] == 'authority': + record['PI'] = [] + record['operator'] = [] + record['owner'] = [] + for person_id in record['person_ids']: + person = self.persons[person_id] + if 'pi' in person['roles']: + # only get PI's at this site + record['PI'].extend(startswith(record['hrn'], person_dict[person_id])) + if 'tech' in person['roles']: + # only get PI's at this site + record['operator'].extend(startswith(record['hrn'], person_dict[person_id])) + if 'admin' in person['roles']: + record['owner'].extend(startswith(record['hrn'], person_dict[person_id])) + + elif record['type'] == 'node': + record['dns'] = record['hostname'] + + elif record['type'] == 'user': + record['email'] = record['email'] + + + + + + def get_records(self): + return self.records + + +class SfaAPI(BaseAPI): + + # flat list of method names + import sfa.methods + methods = sfa.methods.all + + def __init__(self, config = "/etc/sfa/sfa_config.py", encoding = "utf-8", + methods='sfa.methods', peer_cert = None, interface = None, + key_file = None, cert_file = None, cache = None): + BaseAPI.__init__(self, config=config, encoding=encoding, methods=methods, \ + peer_cert=peer_cert, interface=interface, key_file=key_file, \ + cert_file=cert_file, cache=cache) + + self.encoding = encoding + + from sfa.util.table import SfaTable + self.SfaTable = SfaTable + # Better just be documenting the API + if config is None: + return + + # Load configuration + self.config = Config(config) + self.auth = Auth(peer_cert) + self.interface = interface + self.key_file = key_file + self.key = Keypair(filename=self.key_file) + self.cert_file = cert_file + self.cert = Certificate(filename=self.cert_file) + self.credential = None + # Initialize the PLC shell only if SFA wraps a myPLC + rspec_type = self.config.get_aggregate_type() + if (rspec_type == 'pl' or rspec_type == 'vini'): + self.plshell = self.getPLCShell() + self.plshell_version = "4.3" + + self.hrn = self.config.SFA_INTERFACE_HRN + self.time_format = "%Y-%m-%d %H:%M:%S" + self.logger=get_sfa_logger() + + def getPLCShell(self): + self.plauth = {'Username': self.config.SFA_PLC_USER, + 'AuthMethod': 'password', + 'AuthString': self.config.SFA_PLC_PASSWORD} + + self.plshell_type = 'xmlrpc' + # connect via xmlrpc + url = self.config.SFA_PLC_URL + shell = xmlrpclib.Server(url, verbose = 0, allow_none = True) + return shell + + def getCredential(self): + if self.interface in ['registry']: + return self.getCredentialFromLocalRegistry() + else: + return self.getCredentialFromRegistry() + + def getCredentialFromRegistry(self): + """ + Get our credential from a remote registry + """ + type = 'authority' + path = self.config.SFA_DATA_DIR + filename = ".".join([self.interface, self.hrn, type, "cred"]) + cred_filename = path + os.sep + filename + try: + credential = Credential(filename = cred_filename) + return credential.save_to_string(save_parents=True) + except IOError: + from sfa.server.registry import Registries + registries = Registries(self) + registry = registries[self.hrn] + cert_string=self.cert.save_to_string(save_parents=True) + # get self credential + self_cred = registry.get_self_credential(cert_string, type, self.hrn) + # get credential + cred = registry.get_credential(self_cred, type, self.hrn) + + # save cred to file + Credential(string=cred).save_to_file(cred_filename, save_parents=True) + return cred + + def getCredentialFromLocalRegistry(self): + """ + Get our current credential directly from the local registry. + """ + + hrn = self.hrn + auth_hrn = self.auth.get_authority(hrn) + + # is this a root or sub authority + if not auth_hrn or hrn == self.config.SFA_INTERFACE_HRN: + auth_hrn = hrn + auth_info = self.auth.get_auth_info(auth_hrn) + table = self.SfaTable() + records = table.findObjects(hrn) + if not records: + raise RecordNotFound + record = records[0] + type = record['type'] + object_gid = record.get_gid_object() + new_cred = Credential(subject = object_gid.get_subject()) + new_cred.set_gid_caller(object_gid) + new_cred.set_gid_object(object_gid) + new_cred.set_issuer(key=auth_info.get_pkey_object(), subject=auth_hrn) + new_cred.set_pubkey(object_gid.get_pubkey()) + r1 = determine_rights(type, hrn) + new_cred.set_privileges(r1) + + auth_kind = "authority,ma,sa" + + new_cred.set_parent(self.auth.hierarchy.get_auth_cred(auth_hrn, kind=auth_kind)) + + new_cred.encode() + new_cred.sign() + + return new_cred.save_to_string(save_parents=True) + + + def loadCredential (self): + """ + Attempt to load credential from file if it exists. If it doesnt get + credential from registry. + """ + + # see if this file exists + # XX This is really the aggregate's credential. Using this is easier than getting + # the registry's credential from iteslf (ssl errors). + ma_cred_filename = self.config.SFA_DATA_DIR + os.sep + self.interface + self.hrn + ".ma.cred" + try: + self.credential = Credential(filename = ma_cred_filename) + except IOError: + self.credential = self.getCredentialFromRegistry() + + ## + # Convert SFA fields to PLC fields for use when registering up updating + # registry record in the PLC database + # + # @param type type of record (user, slice, ...) + # @param hrn human readable name + # @param sfa_fields dictionary of SFA fields + # @param pl_fields dictionary of PLC fields (output) + + def sfa_fields_to_pl_fields(self, type, hrn, record): + + def convert_ints(tmpdict, int_fields): + for field in int_fields: + if field in tmpdict: + tmpdict[field] = int(tmpdict[field]) + + pl_record = {} + #for field in record: + # pl_record[field] = record[field] + + if type == "slice": + if not "instantiation" in pl_record: + pl_record["instantiation"] = "plc-instantiated" + pl_record["name"] = hrn_to_pl_slicename(hrn) + if "url" in record: + pl_record["url"] = record["url"] + if "description" in record: + pl_record["description"] = record["description"] + if "expires" in record: + pl_record["expires"] = int(record["expires"]) + + elif type == "node": + if not "hostname" in pl_record: + if not "hostname" in record: + raise MissingSfaInfo("hostname") + pl_record["hostname"] = record["hostname"] + if not "model" in pl_record: + pl_record["model"] = "geni" + + elif type == "authority": + pl_record["login_base"] = hrn_to_pl_login_base(hrn) + + if not "name" in pl_record: + pl_record["name"] = hrn + + if not "abbreviated_name" in pl_record: + pl_record["abbreviated_name"] = hrn + + if not "enabled" in pl_record: + pl_record["enabled"] = True + + if not "is_public" in pl_record: + pl_record["is_public"] = True + + return pl_record + + + def fill_record_info(self, records): + """ + Given a SFA record, fill in the PLC specific and SFA specific + fields in the record. + """ + if not isinstance(records, list): + records = [records] + + record_info = RecordInfo(self, records) + return record_info.get_records() + + def update_membership_list(self, oldRecord, record, listName, addFunc, delFunc): + # get a list of the HRNs tht are members of the old and new records + if oldRecord: + oldList = oldRecord.get(listName, []) + else: + oldList = [] + newList = record.get(listName, []) + + # if the lists are the same, then we don't have to update anything + if (oldList == newList): + return + + # build a list of the new person ids, by looking up each person to get + # their pointer + newIdList = [] + table = self.SfaTable() + records = table.find({'type': 'user', 'hrn': newList}) + for rec in records: + newIdList.append(rec['pointer']) + + # build a list of the old person ids from the person_ids field + if oldRecord: + oldIdList = oldRecord.get("person_ids", []) + containerId = oldRecord.get_pointer() + else: + # if oldRecord==None, then we are doing a Register, instead of an + # update. + oldIdList = [] + containerId = record.get_pointer() + + # add people who are in the new list, but not the oldList + for personId in newIdList: + if not (personId in oldIdList): + addFunc(self.plauth, personId, containerId) + + # remove people who are in the old list, but not the new list + for personId in oldIdList: + if not (personId in newIdList): + delFunc(self.plauth, personId, containerId) + + def update_membership(self, oldRecord, record): + if record.type == "slice": + self.update_membership_list(oldRecord, record, 'researcher', + self.plshell.AddPersonToSlice, + self.plshell.DeletePersonFromSlice) + elif record.type == "authority": + # xxx TODO + pass + + + +class ComponentAPI(BaseAPI): + + def __init__(self, config = "/etc/sfa/sfa_config.py", encoding = "utf-8", methods='sfa.methods', + peer_cert = None, interface = None, key_file = None, cert_file = None): + + BaseAPI.__init__(self, config=config, encoding=encoding, methods=methods, peer_cert=peer_cert, + interface=interface, key_file=key_file, cert_file=cert_file) + self.encoding = encoding + + # Better just be documenting the API + if config is None: + return + + self.nodemanager = NodeManager(self.config) + + def sliver_exists(self): + sliver_dict = self.nodemanager.GetXIDs() + if slicename in sliver_dict.keys(): + return True + else: + return False diff --git a/sfa/plc/api.py b/sfa/plc/api.py new file mode 100644 index 00000000..b93f3712 --- /dev/null +++ b/sfa/plc/api.py @@ -0,0 +1,678 @@ +# +# SFA XML-RPC and SOAP interfaces +# +### $Id: api.py 18708 2010-09-07 21:35:41Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/plc/api.py $ +# + +import sys +import os +import traceback +import string +import xmlrpclib +import sfa.util.xmlrpcprotocol as xmlrpcprotocol +from sfa.trust.auth import Auth +from sfa.util.config import * +from sfa.util.faults import * +from sfa.util.debug import * +from sfa.trust.rights import * +from sfa.trust.credential import * +from sfa.trust.certificate import * +from sfa.util.namespace import * +from sfa.util.api import * +from sfa.util.nodemanager import NodeManager +from sfa.util.sfalogging import * +try: + from collections import defaultdict +except: + class defaultdict(dict): + def __init__(self, default_factory=None, *a, **kw): + if (default_factory is not None and + not hasattr(default_factory, '__call__')): + raise TypeError('first argument must be callable') + dict.__init__(self, *a, **kw) + self.default_factory = default_factory + def __getitem__(self, key): + try: + return dict.__getitem__(self, key) + except KeyError: + return self.__missing__(key) + def __missing__(self, key): + if self.default_factory is None: + raise KeyError(key) + self[key] = value = self.default_factory() + return value + def __reduce__(self): + if self.default_factory is None: + args = tuple() + else: + args = self.default_factory, + return type(self), args, None, None, self.items() + def copy(self): + return self.__copy__() + def __copy__(self): + return type(self)(self.default_factory, self) + def __deepcopy__(self, memo): + import copy + return type(self)(self.default_factory, + copy.deepcopy(self.items())) + def __repr__(self): + return 'defaultdict(%s, %s)' % (self.default_factory, + dict.__repr__(self)) +## end of http://code.activestate.com/recipes/523034/ }}} + +def list_to_dict(recs, key): + """ + convert a list of dictionaries into a dictionary keyed on the + specified dictionary key + """ + keys = [rec[key] for rec in recs] + return dict(zip(keys, recs)) + +class SfaAPI(BaseAPI): + + # flat list of method names + import sfa.methods + methods = sfa.methods.all + + def __init__(self, config = "/etc/sfa/sfa_config.py", encoding = "utf-8", + methods='sfa.methods', peer_cert = None, interface = None, + key_file = None, cert_file = None, cache = None): + BaseAPI.__init__(self, config=config, encoding=encoding, methods=methods, \ + peer_cert=peer_cert, interface=interface, key_file=key_file, \ + cert_file=cert_file, cache=cache) + + self.encoding = encoding + from sfa.util.table import SfaTable + self.SfaTable = SfaTable + # Better just be documenting the API + if config is None: + return + + # Load configuration + self.config = Config(config) + self.auth = Auth(peer_cert) + self.interface = interface + self.key_file = key_file + self.key = Keypair(filename=self.key_file) + self.cert_file = cert_file + self.cert = Certificate(filename=self.cert_file) + self.credential = None + # Initialize the PLC shell only if SFA wraps a myPLC + rspec_type = self.config.get_aggregate_type() + if (rspec_type == 'pl' or rspec_type == 'vini' or rspec_type == 'eucalyptus'): + self.plshell = self.getPLCShell() + self.plshell_version = "4.3" + + self.hrn = self.config.SFA_INTERFACE_HRN + self.time_format = "%Y-%m-%d %H:%M:%S" + self.logger=get_sfa_logger() + + def getPLCShell(self): + self.plauth = {'Username': self.config.SFA_PLC_USER, + 'AuthMethod': 'password', + 'AuthString': self.config.SFA_PLC_PASSWORD} + try: + sys.path.append(os.path.dirname(os.path.realpath("/usr/bin/plcsh"))) + self.plshell_type = 'direct' + import PLC.Shell + shell = PLC.Shell.Shell(globals = globals()) + except: + self.plshell_type = 'xmlrpc' + url = self.config.SFA_PLC_URL + shell = xmlrpclib.Server(url, verbose = 0, allow_none = True) + + return shell + + def getCredential(self): + """ + Retrun a valid credential for this interface. + """ + if self.interface in ['registry']: + return self.getCredentialFromLocalRegistry() + else: + return self.getCredentialFromRegistry() + + def getDelegatedCredential(self, creds): + """ + Attempt to find a credential delegated to us in + the specified list of creds. + """ + if creds and not isinstance(creds, list): + creds = [creds] + delegated_creds = filter_creds_by_caller(creds,self.hrn) + if not delegated_creds: + return None + return delegated_creds[0] + + def getCredentialFromRegistry(self): + """ + Get our credential from a remote registry + """ + type = 'authority' + path = self.config.SFA_DATA_DIR + filename = ".".join([self.interface, self.hrn, type, "cred"]) + cred_filename = path + os.sep + filename + try: + credential = Credential(filename = cred_filename) + return credential.save_to_string(save_parents=True) + except IOError: + from sfa.server.registry import Registries + registries = Registries(self) + registry = registries[self.hrn] + cert_string=self.cert.save_to_string(save_parents=True) + # get self credential + self_cred = registry.get_self_credential(cert_string, type, self.hrn) + # get credential + cred = registry.get_credential(self_cred, type, self.hrn) + + # save cred to file + Credential(string=cred).save_to_file(cred_filename, save_parents=True) + return cred + + def getCredentialFromLocalRegistry(self): + """ + Get our current credential directly from the local registry. + """ + + hrn = self.hrn + auth_hrn = self.auth.get_authority(hrn) + + # is this a root or sub authority + if not auth_hrn or hrn == self.config.SFA_INTERFACE_HRN: + auth_hrn = hrn + auth_info = self.auth.get_auth_info(auth_hrn) + table = self.SfaTable() + records = table.findObjects(hrn) + if not records: + raise RecordNotFound + record = records[0] + type = record['type'] + object_gid = record.get_gid_object() + new_cred = Credential(subject = object_gid.get_subject()) + new_cred.set_gid_caller(object_gid) + new_cred.set_gid_object(object_gid) + new_cred.set_issuer_keys(auth_info.get_privkey_filename(), auth_info.get_gid_filename()) + + r1 = determine_rights(type, hrn) + new_cred.set_privileges(r1) + + auth_kind = "authority,ma,sa" + + new_cred.set_parent(self.auth.hierarchy.get_auth_cred(auth_hrn, kind=auth_kind)) + + new_cred.encode() + new_cred.sign() + + return new_cred.save_to_string(save_parents=True) + + + def loadCredential (self): + """ + Attempt to load credential from file if it exists. If it doesnt get + credential from registry. + """ + + # see if this file exists + # XX This is really the aggregate's credential. Using this is easier than getting + # the registry's credential from iteslf (ssl errors). + ma_cred_filename = self.config.SFA_DATA_DIR + os.sep + self.interface + self.hrn + ".ma.cred" + try: + self.credential = Credential(filename = ma_cred_filename) + except IOError: + self.credential = self.getCredentialFromRegistry() + + ## + # Convert SFA fields to PLC fields for use when registering up updating + # registry record in the PLC database + # + # @param type type of record (user, slice, ...) + # @param hrn human readable name + # @param sfa_fields dictionary of SFA fields + # @param pl_fields dictionary of PLC fields (output) + + def sfa_fields_to_pl_fields(self, type, hrn, record): + + def convert_ints(tmpdict, int_fields): + for field in int_fields: + if field in tmpdict: + tmpdict[field] = int(tmpdict[field]) + + pl_record = {} + #for field in record: + # pl_record[field] = record[field] + + if type == "slice": + if not "instantiation" in pl_record: + pl_record["instantiation"] = "plc-instantiated" + pl_record["name"] = hrn_to_pl_slicename(hrn) + if "url" in record: + pl_record["url"] = record["url"] + if "description" in record: + pl_record["description"] = record["description"] + if "expires" in record: + pl_record["expires"] = int(record["expires"]) + + elif type == "node": + if not "hostname" in pl_record: + if not "hostname" in record: + raise MissingSfaInfo("hostname") + pl_record["hostname"] = record["hostname"] + if not "model" in pl_record: + pl_record["model"] = "geni" + + elif type == "authority": + pl_record["login_base"] = hrn_to_pl_login_base(hrn) + + if not "name" in pl_record: + pl_record["name"] = hrn + + if not "abbreviated_name" in pl_record: + pl_record["abbreviated_name"] = hrn + + if not "enabled" in pl_record: + pl_record["enabled"] = True + + if not "is_public" in pl_record: + pl_record["is_public"] = True + + return pl_record + + def fill_record_pl_info(self, records): + """ + Fill in the planetlab specific fields of a SFA record. This + involves calling the appropriate PLC method to retrieve the + database record for the object. + + PLC data is filled into the pl_info field of the record. + + @param record: record to fill in field (in/out param) + """ + # get ids by type + node_ids, site_ids, slice_ids = [], [], [] + person_ids, key_ids = [], [] + type_map = {'node': node_ids, 'authority': site_ids, + 'slice': slice_ids, 'user': person_ids} + + for record in records: + for type in type_map: + if type == record['type']: + type_map[type].append(record['pointer']) + + # get pl records + nodes, sites, slices, persons, keys = {}, {}, {}, {}, {} + if node_ids: + node_list = self.plshell.GetNodes(self.plauth, node_ids) + nodes = list_to_dict(node_list, 'node_id') + if site_ids: + site_list = self.plshell.GetSites(self.plauth, site_ids) + sites = list_to_dict(site_list, 'site_id') + if slice_ids: + slice_list = self.plshell.GetSlices(self.plauth, slice_ids) + slices = list_to_dict(slice_list, 'slice_id') + if person_ids: + person_list = self.plshell.GetPersons(self.plauth, person_ids) + persons = list_to_dict(person_list, 'person_id') + for person in persons: + key_ids.extend(persons[person]['key_ids']) + + pl_records = {'node': nodes, 'authority': sites, + 'slice': slices, 'user': persons} + + if key_ids: + key_list = self.plshell.GetKeys(self.plauth, key_ids) + keys = list_to_dict(key_list, 'key_id') + + # fill record info + for record in records: + # records with pointer==-1 do not have plc info. + # for example, the top level authority records which are + # authorities, but not PL "sites" + if record['pointer'] == -1: + continue + + for type in pl_records: + if record['type'] == type: + if record['pointer'] in pl_records[type]: + record.update(pl_records[type][record['pointer']]) + break + # fill in key info + if record['type'] == 'user': + pubkeys = [keys[key_id]['key'] for key_id in record['key_ids'] if key_id in keys] + record['keys'] = pubkeys + + # fill in record hrns + records = self.fill_record_hrns(records) + + return records + + def fill_record_hrns(self, records): + """ + convert pl ids to hrns + """ + + # get ids + slice_ids, person_ids, site_ids, node_ids = [], [], [], [] + for record in records: + if 'site_id' in record: + site_ids.append(record['site_id']) + if 'site_ids' in records: + site_ids.extend(record['site_ids']) + if 'person_ids' in record: + person_ids.extend(record['person_ids']) + if 'slice_ids' in record: + slice_ids.extend(record['slice_ids']) + if 'node_ids' in record: + node_ids.extend(record['node_ids']) + + # get pl records + slices, persons, sites, nodes = {}, {}, {}, {} + if site_ids: + site_list = self.plshell.GetSites(self.plauth, site_ids, ['site_id', 'login_base']) + sites = list_to_dict(site_list, 'site_id') + if person_ids: + person_list = self.plshell.GetPersons(self.plauth, person_ids, ['person_id', 'email']) + persons = list_to_dict(person_list, 'person_id') + if slice_ids: + slice_list = self.plshell.GetSlices(self.plauth, slice_ids, ['slice_id', 'name']) + slices = list_to_dict(slice_list, 'slice_id') + if node_ids: + node_list = self.plshell.GetNodes(self.plauth, node_ids, ['node_id', 'hostname']) + nodes = list_to_dict(node_list, 'node_id') + + # convert ids to hrns + for record in records: + + # get all relevant data + type = record['type'] + pointer = record['pointer'] + auth_hrn = self.hrn + login_base = '' + if pointer == -1: + continue + + if 'site_id' in record: + site = sites[record['site_id']] + login_base = site['login_base'] + record['site'] = ".".join([auth_hrn, login_base]) + if 'person_ids' in record: + emails = [persons[person_id]['email'] for person_id in record['person_ids'] \ + if person_id in persons] + usernames = [email.split('@')[0] for email in emails] + person_hrns = [".".join([auth_hrn, login_base, username]) for username in usernames] + record['persons'] = person_hrns + if 'slice_ids' in record: + slicenames = [slices[slice_id]['name'] for slice_id in record['slice_ids'] \ + if slice_id in slices] + slice_hrns = [slicename_to_hrn(auth_hrn, slicename) for slicename in slicenames] + record['slices'] = slice_hrns + if 'node_ids' in record: + hostnames = [nodes[node_id]['hostname'] for node_id in record['node_ids'] \ + if node_id in nodes] + node_hrns = [hostname_to_hrn(auth_hrn, login_base, hostname) for hostname in hostnames] + record['nodes'] = node_hrns + if 'site_ids' in record: + login_bases = [sites[site_id]['login_base'] for site_id in record['site_ids'] \ + if site_id in sites] + site_hrns = [".".join([auth_hrn, lbase]) for lbase in login_bases] + record['sites'] = site_hrns + + return records + + def fill_record_sfa_info(self, records): + + def startswith(prefix, values): + return [value for value in values if value.startswith(prefix)] + + # get person ids + person_ids = [] + site_ids = [] + for record in records: + person_ids.extend(record.get("person_ids", [])) + site_ids.extend(record.get("site_ids", [])) + if 'site_id' in record: + site_ids.append(record['site_id']) + + # get all pis from the sites we've encountered + # and store them in a dictionary keyed on site_id + site_pis = {} + if site_ids: + pi_filter = {'|roles': ['pi'], '|site_ids': site_ids} + pi_list = self.plshell.GetPersons(self.plauth, pi_filter, ['person_id', 'site_ids']) + for pi in pi_list: + # we will need the pi's hrns also + person_ids.append(pi['person_id']) + + # we also need to keep track of the sites these pis + # belong to + for site_id in pi['site_ids']: + if site_id in site_pis: + site_pis[site_id].append(pi) + else: + site_pis[site_id] = [pi] + + # get sfa records for all records associated with these records. + # we'll replace pl ids (person_ids) with hrns from the sfa records + # we obtain + + # get the sfa records + table = self.SfaTable() + person_list, persons = [], {} + person_list = table.find({'type': 'user', 'pointer': person_ids}) + # create a hrns keyed on the sfa record's pointer. + # Its possible for multiple records to have the same pointer so + # the dict's value will be a list of hrns. + persons = defaultdict(list) + for person in person_list: + persons[person['pointer']].append(person) + + # get the pl records + pl_person_list, pl_persons = [], {} + pl_person_list = self.plshell.GetPersons(self.plauth, person_ids, ['person_id', 'roles']) + pl_persons = list_to_dict(pl_person_list, 'person_id') + + # fill sfa info + for record in records: + # skip records with no pl info (top level authorities) + if record['pointer'] == -1: + continue + sfa_info = {} + type = record['type'] + if (type == "slice"): + # all slice users are researchers + record['PI'] = [] + record['researcher'] = [] + for person_id in record['person_ids']: + hrns = [person['hrn'] for person in persons[person_id]] + record['researcher'].extend(hrns) + + # pis at the slice's site + pl_pis = site_pis[record['site_id']] + pi_ids = [pi['person_id'] for pi in pl_pis] + for person_id in pi_ids: + hrns = [person['hrn'] for person in persons[person_id]] + record['PI'].extend(hrns) + record['geni_urn'] = hrn_to_urn(record['hrn'], 'slice') + record['geni_creator'] = record['PI'] + + elif (type == "authority"): + record['PI'] = [] + record['operator'] = [] + record['owner'] = [] + for pointer in record['person_ids']: + if pointer not in persons or pointer not in pl_persons: + # this means there is not sfa or pl record for this user + continue + hrns = [person['hrn'] for person in persons[pointer]] + roles = pl_persons[pointer]['roles'] + if 'pi' in roles: + record['PI'].extend(hrns) + if 'tech' in roles: + record['operator'].extend(hrns) + if 'admin' in roles: + record['owner'].extend(hrns) + # xxx TODO: OrganizationName + elif (type == "node"): + sfa_info['dns'] = record.get("hostname", "") + # xxx TODO: URI, LatLong, IP, DNS + + elif (type == "user"): + sfa_info['email'] = record.get("email", "") + sfa_info['geni_urn'] = hrn_to_urn(record['hrn'], 'user') + sfa_info['geni_certificate'] = record['gid'] + # xxx TODO: PostalAddress, Phone + record.update(sfa_info) + + def fill_record_info(self, records): + """ + Given a SFA record, fill in the PLC specific and SFA specific + fields in the record. + """ + if not isinstance(records, list): + records = [records] + + self.fill_record_pl_info(records) + self.fill_record_sfa_info(records) + + def update_membership_list(self, oldRecord, record, listName, addFunc, delFunc): + # get a list of the HRNs tht are members of the old and new records + if oldRecord: + oldList = oldRecord.get(listName, []) + else: + oldList = [] + newList = record.get(listName, []) + + # if the lists are the same, then we don't have to update anything + if (oldList == newList): + return + + # build a list of the new person ids, by looking up each person to get + # their pointer + newIdList = [] + table = self.SfaTable() + records = table.find({'type': 'user', 'hrn': newList}) + for rec in records: + newIdList.append(rec['pointer']) + + # build a list of the old person ids from the person_ids field + if oldRecord: + oldIdList = oldRecord.get("person_ids", []) + containerId = oldRecord.get_pointer() + else: + # if oldRecord==None, then we are doing a Register, instead of an + # update. + oldIdList = [] + containerId = record.get_pointer() + + # add people who are in the new list, but not the oldList + for personId in newIdList: + if not (personId in oldIdList): + addFunc(self.plauth, personId, containerId) + + # remove people who are in the old list, but not the new list + for personId in oldIdList: + if not (personId in newIdList): + delFunc(self.plauth, personId, containerId) + + def update_membership(self, oldRecord, record): + if record.type == "slice": + self.update_membership_list(oldRecord, record, 'researcher', + self.plshell.AddPersonToSlice, + self.plshell.DeletePersonFromSlice) + elif record.type == "authority": + # xxx TODO + pass + + + +class ComponentAPI(BaseAPI): + + def __init__(self, config = "/etc/sfa/sfa_config.py", encoding = "utf-8", methods='sfa.methods', + peer_cert = None, interface = None, key_file = None, cert_file = None): + + BaseAPI.__init__(self, config=config, encoding=encoding, methods=methods, peer_cert=peer_cert, + interface=interface, key_file=key_file, cert_file=cert_file) + self.encoding = encoding + + # Better just be documenting the API + if config is None: + return + + self.nodemanager = NodeManager(self.config) + + def sliver_exists(self): + sliver_dict = self.nodemanager.GetXIDs() + if slicename in sliver_dict.keys(): + return True + else: + return False + + def get_registry(self): + addr, port = self.config.SFA_REGISTRY_HOST, self.config.SFA_REGISTRY_PORT + url = "http://%(addr)s:%(port)s" % locals() + server = xmlrpcprotocol.get_server(url, self.key_file, self.cert_file) + return server + + def get_node_key(self): + # this call requires no authentication, + # so we can generate a random keypair here + subject="component" + (kfd, keyfile) = tempfile.mkstemp() + (cfd, certfile) = tempfile.mkstemp() + key = Keypair(create=True) + key.save_to_file(keyfile) + cert = Certificate(subject=subject) + cert.set_issuer(key=key, subject=subject) + cert.set_pubkey(key) + cert.sign() + cert.save_to_file(certfile) + registry = self.get_registry() + # the registry will scp the key onto the node + registry.get_key() + + def getCredential(self): + """ + Get our credential from a remote registry + """ + path = self.config.SFA_DATA_DIR + config_dir = self.config.config_path + cred_filename = path + os.sep + 'node.cred' + try: + credential = Credential(filename = cred_filename) + return credential.save_to_string(save_parents=True) + except IOError: + node_pkey_file = config_dir + os.sep + "node.key" + node_gid_file = config_dir + os.sep + "node.gid" + cert_filename = path + os.sep + 'server.cert' + if not os.path.exists(node_pkey_file) or \ + not os.path.exists(node_gid_file): + self.get_node_key() + + # get node's hrn + gid = GID(filename=node_gid_file) + hrn = gid.get_hrn() + # get credential from registry + cert_str = Certificate(filename=cert_filename).save_to_string(save_parents=True) + registry = self.get_registry() + cred = registry.get_self_credential(cert_str, 'node', hrn) + Credential(string=cred).save_to_file(credfile, save_parents=True) + + return cred + + def clean_key_cred(self): + """ + remove the existing keypair and cred and generate new ones + """ + files = ["server.key", "server.cert", "node.cred"] + for f in files: + filepath = KEYDIR + os.sep + f + if os.path.isfile(filepath): + os.unlink(f) + + # install the new key pair + # get_credential will take care of generating the new keypair + # and credential + self.get_node_key() + self.getCredential() + + diff --git a/sfa/plc/network.py b/sfa/plc/network.py new file mode 100644 index 00000000..1553e3ba --- /dev/null +++ b/sfa/plc/network.py @@ -0,0 +1,594 @@ +from __future__ import with_statement +import re +import socket +from sfa.util.namespace import * +from sfa.util.faults import * +from xmlbuilder import XMLBuilder +from lxml import etree +import sys +from StringIO import StringIO + + +class Sliver: + def __init__(self, node): + self.node = node + self.network = node.network + self.slice = node.network.slice + + def toxml(self, xml): + with xml.sliver: + self.slice.tags_to_xml(xml, self.node) + + +class Iface: + def __init__(self, network, iface): + self.network = network + self.id = iface['interface_id'] + self.idtag = "i%s" % self.id + self.ipv4 = iface['ip'] + self.bwlimit = iface['bwlimit'] + self.hostname = iface['hostname'] + self.primary = iface['is_primary'] + + """ + Just print out bwlimit right now + """ + def toxml(self, xml): + if self.bwlimit: + with xml.bw_limit(units="kbps"): + xml << str(self.bwlimit / 1000) + + +class Node: + def __init__(self, network, node): + self.network = network + self.id = node['node_id'] + self.idtag = "n%s" % self.id + self.hostname = node['hostname'] + self.site_id = node['site_id'] + self.iface_ids = node['interface_ids'] + self.sliver = None + self.whitelist = node['slice_ids_whitelist'] + + def get_primary_iface(self): + for id in self.iface_ids: + iface = self.network.lookupIface(id) + if iface.primary: + return iface + return None + + def get_site(self): + return self.network.lookupSite(self.site_id) + + def add_sliver(self): + self.sliver = Sliver(self) + + def toxml(self, xml): + slice = self.network.slice + if self.whitelist and not self.sliver: + if not slice or slice.id not in self.whitelist: + return + + with xml.node(id = self.idtag): + with xml.hostname: + xml << self.hostname + iface = self.get_primary_iface() + if iface: + iface.toxml(xml) + if self.sliver: + self.sliver.toxml(xml) + + +class Site: + def __init__(self, network, site): + self.network = network + self.id = site['site_id'] + self.idtag = "s%s" % self.id + self.node_ids = site['node_ids'] + self.node_ids.sort() + self.name = site['abbreviated_name'] + self.tag = site['login_base'] + self.public = site['is_public'] + self.enabled = site['enabled'] + self.links = set() + self.whitelist = False + + def get_sitenodes(self): + n = [] + for i in self.node_ids: + n.append(self.network.lookupNode(i)) + return n + + def toxml(self, xml): + if not (self.public and self.enabled and self.node_ids): + return + with xml.site(id = self.idtag): + with xml.name: + xml << self.name + for node in self.get_sitenodes(): + node.toxml(xml) + + +class Slice: + def __init__(self, network, hrn, slice): + self.hrn = hrn + self.network = network + self.id = slice['slice_id'] + self.name = slice['name'] + self.peer_id = slice['peer_id'] + self.node_ids = set(slice['node_ids']) + self.slice_tag_ids = slice['slice_tag_ids'] + + """ + Use with tags that can have more than one instance + """ + def get_multi_tag(self, tagname, node = None): + tags = [] + for i in self.slice_tag_ids: + try: + tag = self.network.lookupSliceTag(i) + if tag.tagname == tagname: + if not (node and node.id != tag.node_id): + tags.append(tag) + except InvalidRSpec, e: + # As they're not needed, we ignore some tag types from + # GetSliceTags call. See Slicetag.ignore_tags + pass + return tags + + """ + Use with tags that have only one instance + """ + def get_tag(self, tagname, node = None): + try: + for i in self.slice_tag_ids: + tag = self.network.lookupSliceTag(i) + if tag.tagname == tagname: + if (not node) or (node.id == tag.node_id): + return tag + except InvalidRSpec, e: + # As they're not needed, we ignore some tag types from + # GetSliceTags call. See Slicetag.ignore_tags + pass + return None + + def get_nodes(self): + n = [] + for id in self.node_ids: + if id in self.network.nodes: + n.append(self.network.nodes[id]) + return n + + # Add a new slice tag + def add_tag(self, tagname, value, node = None, role_id = 40): + tt = self.network.lookupTagType(tagname) + if not tt.permit_update(role_id): + raise InvalidRSpec("permission denied to modify '%s' tag" % tagname) + tag = Slicetag() + tag.initialize(tagname, value, node, self.network) + self.network.tags[tag.id] = tag + self.slice_tag_ids.append(tag.id) + return tag + + # Update a slice tag if it exists, else add it + def update_tag(self, tagname, value, node = None, role_id = 40): + tag = self.get_tag(tagname, node) + if tag: + if not tag.permit_update(role_id, value): + raise InvalidRSpec("permission denied to modify '%s' tag" % tagname) + tag.change(value) + else: + tag = self.add_tag(tagname, value, node, role_id) + return tag + + def update_multi_tag(self, tagname, value, node = None, role_id = 40): + tags = self.get_multi_tag(tagname, node) + for tag in tags: + if tag and tag.value == value: + break + else: + tag = self.add_tag(tagname, value, node, role_id) + return tag + + def tags_to_xml(self, xml, node = None): + tagtypes = self.network.getTagTypes() + for tt in tagtypes: + if tt.in_rspec: + if tt.multi: + tags = self.get_multi_tag(tt.tagname, node) + for tag in tags: + if not tag.was_deleted(): ### Debugging + xml << (tag.tagname, tag.value) + else: + tag = self.get_tag(tt.tagname, node) + if tag: + if not tag.was_deleted(): ### Debugging + xml << (tag.tagname, tag.value) + + def toxml(self, xml): + with xml.sliver_defaults: + self.tags_to_xml(xml) + + +class Slicetag: + newid = -1 + filter_fields = ['slice_tag_id','slice_id','tagname','value','node_id','category','min_role_id'] + ignore_tags = ['hmac','ssh_key'] + def __init__(self, tag = None): + if not tag: + return + self.id = tag['slice_tag_id'] + self.slice_id = tag['slice_id'] + self.tagname = tag['tagname'] + self.value = tag['value'] + self.node_id = tag['node_id'] + self.category = tag['category'] + self.min_role_id = tag['min_role_id'] + self.status = None + + # Create a new slicetag that will be written to the DB later + def initialize(self, tagname, value, node, network): + tt = network.lookupTagType(tagname) + self.id = Slicetag.newid + Slicetag.newid -=1 + self.slice_id = network.slice.id + self.tagname = tagname + self.value = value + if node: + self.node_id = node.id + else: + self.node_id = None + self.category = tt.category + self.min_role_id = tt.min_role_id + self.status = "new" + + def permit_update(self, role_id, value = None): + if value and self.value == value: + return True + if role_id > self.min_role_id: + return False + return True + + def change(self, value): + if self.value != value: + self.value = value + self.status = "change" + else: + self.status = "updated" + + # Mark a tag as deleted + def delete(self): + self.status = "delete" + + def was_added(self): + return (self.id < 0) + + def was_changed(self): + return (self.status == "change") + + def was_deleted(self): + return (self.status == "delete") + + def was_updated(self): + return (self.status != None) + + def write(self, api): + if self.was_added(): + api.plshell.AddSliceTag(api.plauth, self.slice_id, + self.tagname, self.value, self.node_id) + elif self.was_changed(): + api.plshell.UpdateSliceTag(api.plauth, self.id, self.value) + elif self.was_deleted(): + api.plshell.DeleteSliceTag(api.plauth, self.id) + + +class TagType: + ignore_tags = ['hmac','ssh_key'] + def __init__(self, tagtype): + self.id = tagtype['tag_type_id'] + self.category = tagtype['category'] + self.tagname = tagtype['tagname'] + self.min_role_id = tagtype['min_role_id'] + self.multi = False + self.in_rspec = False + if self.category == 'slice/rspec': + self.in_rspec = True + if self.tagname in ['codemux', 'ip_addresses', 'vsys']: + self.multi = True + + def permit_update(self, role_id): + if role_id > self.min_role_id: + return False + return True + + +class Network: + """ + A Network is a compound object consisting of: + * a dictionary mapping site IDs to Site objects + * a dictionary mapping node IDs to Node objects + * a dictionary mapping interface IDs to Iface objects + """ + def __init__(self, api, type = "SFA"): + self.api = api + self.type = type + self.sites = self.get_sites(api) + self.nodes = self.get_nodes(api) + self.ifaces = self.get_ifaces(api) + self.tags = self.get_slice_tags(api) + self.tagtypes = self.get_tag_types(api) + self.slice = None + + def lookupSite(self, id): + """ Lookup site based on id or idtag value """ + val = None + if isinstance(id, basestring): + id = int(id.lstrip('s')) + try: + val = self.sites[id] + except: + raise InvalidRSpec("site ID %s not found" % id) + return val + + def getSites(self): + sites = [] + for s in self.sites: + sites.append(self.sites[s]) + return sites + + def lookupNode(self, id): + """ Lookup node based on id or idtag value """ + val = None + if isinstance(id, basestring): + id = int(id.lstrip('n')) + try: + val = self.nodes[id] + except: + raise InvalidRSpec("node ID %s not found" % id) + return val + + def getNodes(self): + nodes = [] + for n in self.nodes: + nodes.append(self.nodes[n]) + return nodes + + def lookupIface(self, id): + """ Lookup iface based on id or idtag value """ + val = None + if isinstance(id, basestring): + id = int(id.lstrip('i')) + try: + val = self.ifaces[id] + except: + raise InvalidRSpec("interface ID %s not found" % id) + return val + + def getIfaces(self): + ifaces = [] + for i in self.ifaces: + ifaces.append(self.ifaces[i]) + return ifaces + + def nodesWithSlivers(self): + nodes = [] + for n in self.nodes: + node = self.nodes[n] + if node.sliver: + nodes.append(node) + return nodes + + def lookupSliceTag(self, id): + val = None + try: + val = self.tags[id] + except: + raise InvalidRSpec("slicetag ID %s not found" % id) + return val + + def getSliceTags(self): + tags = [] + for t in self.tags: + tags.append(self.tags[t]) + return tags + + def lookupTagType(self, name): + val = None + try: + val = self.tagtypes[name] + except: + raise InvalidRSpec("tag %s not found" % name) + return val + + def getTagTypes(self): + tags = [] + for t in self.tagtypes: + tags.append(self.tagtypes[t]) + return tags + + def __process_attributes(self, element, node=None): + """ + Process the elements under or + """ + if element is None: + return + + tagtypes = self.getTagTypes() + for tt in tagtypes: + if tt.in_rspec: + if tt.multi: + for e in element.iterfind("./" + tt.tagname): + self.slice.update_multi_tag(tt.tagname, e.text, node) + else: + e = element.find("./" + tt.tagname) + if e is not None: + self.slice.update_tag(tt.tagname, e.text, node) + + def addRSpec(self, xml, schema=None): + """ + Annotate the objects in the Network with information from the RSpec + """ + try: + tree = etree.parse(StringIO(xml)) + except etree.XMLSyntaxError: + message = str(sys.exc_info()[1]) + raise InvalidRSpec(message) + + # Filter out stuff that's not for us + rspec = tree.getroot() + for network in rspec.iterfind("./network"): + if network.get("name") != self.api.hrn: + rspec.remove(network) + for request in rspec.iterfind("./request"): + if request.get("name") != self.api.hrn: + rspec.remove(request) + + if schema: + # Validate the incoming request against the RelaxNG schema + relaxng_doc = etree.parse(schema) + relaxng = etree.RelaxNG(relaxng_doc) + + if not relaxng(tree): + error = relaxng.error_log.last_error + message = "%s (line %s)" % (error.message, error.line) + raise InvalidRSpec(message) + + self.rspec = rspec + + defaults = rspec.find(".//sliver_defaults") + self.__process_attributes(defaults) + + # Find slivers under node elements + for sliver in rspec.iterfind("./network/site/node/sliver"): + elem = sliver.getparent() + try: + node = self.lookupNode(elem.get("id")) + except: + # Don't worry about nodes from other aggregates + pass + else: + node.add_sliver() + self.__process_attributes(sliver, node) + + # Find slivers that specify nodeid + for sliver in rspec.iterfind("./request/sliver[@nodeid]"): + try: + node = self.lookupNode(sliver.get("nodeid")) + except: + # Don't worry about nodes from other aggregates + pass + else: + node.add_sliver() + self.__process_attributes(sliver, node) + + return + + def addSlice(self): + """ + Annotate the objects in the Network with information from the slice + """ + slice = self.slice + if not slice: + raise InvalidRSpec("no slice associated with network") + + for node in slice.get_nodes(): + node.add_sliver() + + def updateSliceTags(self): + """ + Write any slice tags that have been added or modified back to the DB + """ + for tag in self.getSliceTags(): + if tag.category == 'slice/rspec' and not tag.was_updated() and tag.permit_update(None, 40): + # The user wants to delete this tag + tag.delete() + + # Update slice tags in database + for tag in self.getSliceTags(): + if tag.slice_id == self.slice.id: + tag.write(self.api) + + def toxml(self): + """ + Produce XML directly from the topology specification. + """ + xml = XMLBuilder(format = True, tab_step = " ") + with xml.RSpec(type=self.type): + if self.slice: + element = xml.network(name=self.api.hrn, slice=self.slice.hrn) + else: + element = xml.network(name=self.api.hrn) + + with element: + if self.slice: + self.slice.toxml(xml) + for site in self.getSites(): + site.toxml(xml) + + header = '\n' + return header + str(xml) + + def get_sites(self, api): + """ + Create a dictionary of site objects keyed by site ID + """ + tmp = [] + for site in api.plshell.GetSites(api.plauth, {'peer_id': None}): + t = site['site_id'], Site(self, site) + tmp.append(t) + return dict(tmp) + + + def get_nodes(self, api): + """ + Create a dictionary of node objects keyed by node ID + """ + tmp = [] + for node in api.plshell.GetNodes(api.plauth, {'peer_id': None}): + t = node['node_id'], Node(self, node) + tmp.append(t) + return dict(tmp) + + def get_ifaces(self, api): + """ + Create a dictionary of node objects keyed by node ID + """ + tmp = [] + for iface in api.plshell.GetInterfaces(api.plauth): + t = iface['interface_id'], Iface(self, iface) + tmp.append(t) + return dict(tmp) + + def get_slice_tags(self, api): + """ + Create a dictionary of slicetag objects keyed by slice tag ID + """ + tmp = [] + for tag in api.plshell.GetSliceTags(api.plauth, {'~tagname':Slicetag.ignore_tags}, Slicetag.filter_fields): + t = tag['slice_tag_id'], Slicetag(tag) + tmp.append(t) + return dict(tmp) + + def get_tag_types(self, api): + """ + Create a list of tagtype obects keyed by tag name + """ + tmp = [] + for tag in api.plshell.GetTagTypes(api.plauth, {'~tagname':TagType.ignore_tags}): + t = tag['tagname'], TagType(tag) + tmp.append(t) + return dict(tmp) + + def get_slice(self, api, hrn): + """ + Return a Slice object for a single slice + """ + slicename = hrn_to_pl_slicename(hrn) + slice = api.plshell.GetSlices(api.plauth, [slicename]) + if len(slice): + self.slice = Slice(self, slicename, slice[0]) + return self.slice + else: + return None + + diff --git a/sfa/plc/peers.py b/sfa/plc/peers.py new file mode 100644 index 00000000..455c682a --- /dev/null +++ b/sfa/plc/peers.py @@ -0,0 +1,36 @@ +from sfa.util.namespace import * +from types import StringTypes + +def get_peer(api, hrn): + # Becaues of myplc federation, we first need to determine if this + # slice belongs to out local plc or a myplc peer. We will assume it + # is a local site, unless we find out otherwise + peer = None + + # get this slice's authority (site) + slice_authority = get_authority(hrn) + + # get this site's authority (sfa root authority or sub authority) + site_authority = get_authority(slice_authority).lower() + # check if we are already peered with this site_authority, if so + peers = api.plshell.GetPeers(api.plauth, {}, \ + ['peer_id', 'peername', 'shortname', 'hrn_root']) + for peer_record in peers: + names = [name.lower() for name in peer_record.values() if isinstance(name, StringTypes)] + if site_authority in names: + peer = peer_record['shortname'] + + return peer + + +def get_sfa_peer(api, hrn): + # return the authority for this hrn or None if we are the authority + sfa_peer = None + slice_authority = get_authority(hrn) + site_authority = get_authority(slice_authority) + + if site_authority != api.hrn: + sfa_peer = site_authority + + return sfa_peer + diff --git a/sfa/plc/remoteshell.py b/sfa/plc/remoteshell.py new file mode 100644 index 00000000..1241aefa --- /dev/null +++ b/sfa/plc/remoteshell.py @@ -0,0 +1,107 @@ +# remoteshell.py +# +# interface to the PLC api via xmlrpc +# +# RemoteShell() exports an API that looks identical to that exported by +# PLC.Shell.Shell(). It's meant to be a drop in replacement for running +# SFA on a different machine than PLC. + +### $Id: remoteshell.py 16477 2010-01-05 16:31:37Z thierry $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/plc/remoteshell.py $ + +import xmlrpclib + +class RemoteShell: + def __init__(self): + self.servers = {} + + def call(self, name, pl_auth, *args): + + key = pl_auth["Url"] + "#" + pl_auth["Username"] + + if not (key in self.servers): + server = xmlrpclib.Server(pl_auth["Url"], verbose = 0, allow_none=True) + #server.AdmAuthCheck(pl_auth) + server.AuthCheck(pl_auth) + self.servers[key] = server + + server = self.servers[key] + + arglist = ["pl_auth"] + for arg in args: + arglist.append(repr(arg)) + + str = "server." + name + "(" + ",".join(arglist) + ")" + result = eval(str) + + return result + + # TODO: there's probably an automatic way to import all these stubs + + def AddInitScript(self, pl_auth, *args): + return self.call("AddInitScript", pl_auth, *args) + + def AddNode(self, pl_auth, *args): + return self.call("AddNode", pl_auth, *args) + + def AddPerson(self, pl_auth, *args): + return self.call("AddPerson", pl_auth, *args) + + def AddPersonToSlice(self, pl_auth, *args): + return self.call("AddPersonToSlice", pl_auth, *args) + + def AddSite(self, pl_auth, *args): + return self.call("AddSite", pl_auth, *args) + + def AddSlice(self, pl_auth, *args): + return self.call("AddSlice", pl_auth, *args) + + def DeleteNode(self, pl_auth, *args): + return self.call("DeleteNode", pl_auth, *args) + + def DeletePerson(self, pl_auth, *args): + return self.call("DeletePerson", pl_auth, *args) + + def DeletePersonFromSlice(self, pl_auth, *args): + return self.call("DeletePersonFromSlice", pl_auth, *args) + + def DeleteSite(self, pl_auth, *args): + return self.call("DeleteSite", pl_auth, *args) + + def DeleteSlice(self, pl_auth, *args): + return self.call("DeleteSlice", pl_auth, *args) + + def GetInitScripts(self, pl_auth, *args): + return self.call("GetInitScripts", pl_auth, *args) + + def GetKeys(self, pl_auth, *args): + return self.call("GetKeys", pl_auth, *args) + + def GetNodes(self, pl_auth, *args): + return self.call("GetNodes", pl_auth, *args) + + def GetPersons(self, pl_auth, *args): + return self.call("GetPersons", pl_auth, *args) + + def GetSites(self, pl_auth, *args): + return self.call("GetSites", pl_auth, *args) + + def GetSliceAttributes(self, pl_auth, *args): + return self.call("GetSliceAttributes", pl_auth, *args) + + def GetSlices(self, pl_auth, *args): + return self.call("GetSlices", pl_auth, *args) + + def UpdateNode(self, pl_auth, *args): + return self.call("UpdateNode", pl_auth, *args) + + def UpdatePerson(self, pl_auth, *args): + return self.call("UpdatePerson", pl_auth, *args) + + def UpdateSite(self, pl_auth, *args): + return self.call("UpdateSite", pl_auth, *args) + + def UpdateSlice(self, pl_auth, *args): + return self.call("UpdateSlice", pl_auth, *args) + + diff --git a/sfa/plc/sfa-import-plc.py b/sfa/plc/sfa-import-plc.py new file mode 100755 index 00000000..a89eefad --- /dev/null +++ b/sfa/plc/sfa-import-plc.py @@ -0,0 +1,273 @@ +#!/usr/bin/python +# +### $Id: sfa-import-plc.py 18534 2010-07-27 16:49:53Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/plc/sfa-import-plc.py $ +# +## +# Import PLC records into the SFA database. It is indended that this tool be +# run once to create SFA records that reflect the current state of the +# planetlab database. +# +# The import tool assumes that the existing PLC hierarchy should all be part +# of "planetlab.us" (see the root_auth and level1_auth variables below). +# +# Public keys are extracted from the users' SSH keys automatically and used to +# create GIDs. This is relatively experimental as a custom tool had to be +# written to perform conversion from SSH to OpenSSL format. It only supports +# RSA keys at this time, not DSA keys. +## + +import getopt +import sys +import tempfile +import logging.handlers +import logging +from sfa.util.record import * +from sfa.util.table import SfaTable +from sfa.util.namespace import * +from sfa.util.config import Config +from sfa.trust.certificate import convert_public_key, Keypair +from sfa.trust.trustedroot import * +from sfa.trust.hierarchy import * +from sfa.plc.api import * +from sfa.trust.gid import create_uuid +from sfa.plc.sfaImport import * +from sfa.util.report import trace, error + +def process_options(): + global hrn + + (options, args) = getopt.getopt(sys.argv[1:], '', []) + for opt in options: + name = opt[0] + val = opt[1] + + +def load_keys(filename): + keys = {} + tmp_dict = {} + try: + execfile(filename, tmp_dict) + if 'keys' in tmp_dict: + keys = tmp_dict['keys'] + return keys + except: + return keys + +def save_keys(filename, keys): + f = open(filename, 'w') + f.write("keys = %s" % str(keys)) + f.close() + +def main(): + # setup the logger + LOGFILE='/var/log/sfa_import_plc.log' + logging.basicConfig(level=logging.INFO, + format='%(asctime)s - %(message)s', + filename=LOGFILE) + rotate_handler = logging.handlers.RotatingFileHandler(LOGFILE, maxBytes=1000000, backupCount=5) + logger = logging.getLogger() + logger.addHandler(rotate_handler) + + process_options() + config = Config() + if not config.SFA_REGISTRY_ENABLED: + sys.exit(0) + root_auth = config.SFA_REGISTRY_ROOT_AUTH + interface_hrn = config.SFA_INTERFACE_HRN + keys_filename = config.config_path + os.sep + 'person_keys.py' + sfaImporter = sfaImport(logger) + shell = sfaImporter.shell + plc_auth = sfaImporter.plc_auth + AuthHierarchy = sfaImporter.AuthHierarchy + TrustedRoots = sfaImporter.TrustedRoots + table = SfaTable() + + if not table.exists(): + table.create() + + # create root authority + sfaImporter.create_top_level_auth_records(root_auth) + if not root_auth == interface_hrn: + sfaImporter.create_top_level_auth_records(interface_hrn) + + trace("Import: adding " + interface_hrn + " to trusted list", logger) + authority = AuthHierarchy.get_auth_info(interface_hrn) + TrustedRoots.add_gid(authority.get_gid_object()) + + if ".vini" in interface_hrn and interface_hrn.endswith('vini'): + # create a fake internet2 site first + i2site = {'name': 'Internet2', 'abbreviated_name': 'I2', + 'login_base': 'internet2', 'site_id': -1} + sfaImporter.import_site(interface_hrn, i2site) + + # create dict of all existing sfa records + existing_records = {} + existing_hrns = [] + key_ids = [] + person_keys = {} + results = table.find() + for result in results: + existing_records[(result['hrn'], result['type'])] = result + existing_hrns.append(result['hrn']) + + # Get all plc sites + sites = shell.GetSites(plc_auth, {'peer_id': None}) + sites_dict = {} + for site in sites: + sites_dict[site['login_base']] = site + + # Get all plc users + persons = shell.GetPersons(plc_auth, {'peer_id': None, 'enabled': True}, ['person_id', 'email', 'key_ids', 'site_ids']) + persons_dict = {} + for person in persons: + persons_dict[person['person_id']] = person + key_ids.extend(person['key_ids']) + + # Get all public keys + keys = shell.GetKeys(plc_auth, {'peer_id': None, 'key_id': key_ids}) + keys_dict = {} + for key in keys: + keys_dict[key['key_id']] = key['key'] + + # create a dict of person keys keyed on key_id + old_person_keys = load_keys(keys_filename) + for person in persons: + pubkeys = [] + for key_id in person['key_ids']: + pubkeys.append(keys_dict[key_id]) + person_keys[person['person_id']] = pubkeys + + # Get all plc nodes + nodes = shell.GetNodes(plc_auth, {'peer_id': None}, ['node_id', 'hostname', 'site_id']) + nodes_dict = {} + for node in nodes: + nodes_dict[node['node_id']] = node + + # Get all plc slices + slices = shell.GetSlices(plc_auth, {'peer_id': None}, ['slice_id', 'name']) + slices_dict = {} + for slice in slices: + slices_dict[slice['slice_id']] = slice + # start importing + for site in sites: + site_hrn = interface_hrn + "." + site['login_base'] + print "Importing site: %s" % site_hrn + + # import if hrn is not in list of existing hrns or if the hrn exists + # but its not a site record + if site_hrn not in existing_hrns or \ + (site_hrn, 'authority') not in existing_records: + site_hrn = sfaImporter.import_site(interface_hrn, site) + + # import node records + for node_id in site['node_ids']: + if node_id not in nodes_dict: + continue + node = nodes_dict[node_id] + hrn = hostname_to_hrn(interface_hrn, site['login_base'], node['hostname']) + if hrn not in existing_hrns or \ + (hrn, 'node') not in existing_records: + sfaImporter.import_node(site_hrn, node) + + # import slices + for slice_id in site['slice_ids']: + if slice_id not in slices_dict: + continue + slice = slices_dict[slice_id] + hrn = slicename_to_hrn(interface_hrn, slice['name']) + if hrn not in existing_hrns or \ + (hrn, 'slice') not in existing_records: + sfaImporter.import_slice(site_hrn, slice) + + # import persons + for person_id in site['person_ids']: + if person_id not in persons_dict: + continue + person = persons_dict[person_id] + hrn = email_to_hrn(site_hrn, person['email']) + old_keys = [] + new_keys = [] + if person_id in old_person_keys: + old_keys = old_person_keys[person_id] + if person_id in person_keys: + new_keys = person_keys[person_id] + update_record = False + for key in new_keys: + if key not in old_keys: + update_record = True + + if hrn not in existing_hrns or \ + (hrn, 'user') not in existing_records or update_record: + sfaImporter.import_person(site_hrn, person) + + # remove stale records + for (record_hrn, type) in existing_records.keys(): + record = existing_records[(record_hrn, type)] + # if this is the interface name dont do anything + if record_hrn == interface_hrn or \ + record_hrn == root_auth or \ + record['peer_authority']: + continue + # dont delete vini's internet2 placeholdder record + # normally this would be deleted becuase it does not have a plc record + if ".vini" in interface_hrn and interface_hrn.endswith('vini') and \ + record_hrn.endswith("internet2"): + continue + + found = False + + if type == 'authority': + for site in sites: + site_hrn = interface_hrn + "." + site['login_base'] + if site_hrn == record_hrn and site['site_id'] == record['pointer']: + found = True + break + + elif type == 'user': + login_base = get_leaf(get_authority(record_hrn)) + username = get_leaf(record_hrn) + if login_base in sites_dict: + site = sites_dict[login_base] + for person in persons: + tmp_username = person['email'].split("@")[0] + alt_username = person['email'].split("@")[0].replace(".", "_") + if username in [tmp_username, alt_username] and \ + site['site_id'] in person['site_ids'] and \ + person['person_id'] == record['pointer']: + found = True + break + + elif type == 'slice': + slicename = hrn_to_pl_slicename(record_hrn) + for slice in slices: + if slicename == slice['name'] and \ + slice['slice_id'] == record['pointer']: + found = True + break + + elif type == 'node': + login_base = get_leaf(get_authority(record_hrn)) + nodename = get_leaf(record_hrn) + if login_base in sites_dict: + site = sites_dict[login_base] + for node in nodes: + tmp_nodename = node['hostname'].split(".")[0] + if tmp_nodename == nodename and \ + node['site_id'] == site['site_id'] and \ + node['node_id'] == record['pointer']: + found = True + break + else: + continue + + if not found: + record_object = existing_records[(record_hrn, type)] + sfaImporter.delete_record(record_hrn, type) + + # save pub keys + trace('Import: saving current pub keys', logger) + save_keys(keys_filename, person_keys) + +if __name__ == "__main__": + main() diff --git a/sfa/plc/sfa-nuke-plc.py b/sfa/plc/sfa-nuke-plc.py new file mode 100755 index 00000000..2b1b41f5 --- /dev/null +++ b/sfa/plc/sfa-nuke-plc.py @@ -0,0 +1,32 @@ +#!/usr/bin/python +## +# Delete all the database records for SFA. This tool is used to clean out SFA +# records during testing. +# +# Authority info (maintained by the hierarchy module in a subdirectory tree) +# is not purged by this tool and may be deleted by a command like 'rm'. +## + +import getopt +import sys + +from sfa.trust.hierarchy import * +from sfa.util.record import * +from sfa.util.table import SfaTable + +def process_options(): + + (options, args) = getopt.getopt(sys.argv[1:], '', []) + for opt in options: + name = opt[0] + val = opt[1] + +def main(): + process_options() + + print "Purging SFA records from database" + table = SfaTable() + table.sfa_records_purge() + +if __name__ == "__main__": + main() diff --git a/sfa/plc/sfaImport.py b/sfa/plc/sfaImport.py new file mode 100644 index 00000000..b95bc5a6 --- /dev/null +++ b/sfa/plc/sfaImport.py @@ -0,0 +1,246 @@ +# +# The import tool assumes that the existing PLC hierarchy should all be part +# of "planetlab.us" (see the root_auth and level1_auth variables below). +# +# Public keys are extracted from the users' SSH keys automatically and used to +# create GIDs. This is relatively experimental as a custom tool had to be +# written to perform conversion from SSH to OpenSSL format. It only supports +# RSA keys at this time, not DSA keys. +## + +import getopt +import sys +import tempfile + +from sfa.util.record import * +from sfa.util.table import SfaTable +from sfa.util.namespace import * +from sfa.util.config import Config +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 + + +def un_unicode(str): + if isinstance(str, unicode): + return str.encode("ascii", "ignore") + else: + return str + +def cleanup_string(str): + # pgsql has a fit with strings that have high ascii in them, so filter it + # out when generating the hrns. + tmp = "" + for c in str: + if ord(c) < 128: + tmp = tmp + c + str = tmp + + str = un_unicode(str) + str = str.replace(" ", "_") + str = str.replace(".", "_") + str = str.replace("(", "_") + str = str.replace("'", "_") + str = str.replace(")", "_") + str = str.replace('"', "_") + return str + +class sfaImport: + + def __init__(self, logger=None): + self.logger = logger + self.AuthHierarchy = Hierarchy() + self.config = Config() + self.TrustedRoots = TrustedRootList(Config.get_trustedroots_dir(self.config)) + self.plc_auth = self.config.get_plc_auth() + self.root_auth = self.config.SFA_REGISTRY_ROOT_AUTH + + # connect to planetlab + self.shell = None + if "Url" in self.plc_auth: + from sfa.plc.remoteshell import RemoteShell + self.shell = RemoteShell() + else: + import PLC.Shell + self.shell = PLC.Shell.Shell(globals = globals()) + + + def create_top_level_auth_records(self, hrn): + AuthHierarchy = self.AuthHierarchy + urn = hrn_to_urn(hrn, 'authority') + # make sure parent exists + parent_hrn = get_authority(hrn) + if not parent_hrn: + parent_hrn = hrn + if not parent_hrn == hrn: + self.create_top_level_auth_records(parent_hrn) + + # create the authority if it doesnt already exist + if not AuthHierarchy.auth_exists(urn): + trace("Import: creating top level authorites", self.logger) + AuthHierarchy.create_auth(urn) + + # create the db record if it doesnt already exist + auth_info = AuthHierarchy.get_auth_info(hrn) + table = SfaTable() + auth_record = table.find({'type': 'authority', 'hrn': hrn}) + + if not auth_record: + auth_record = SfaRecord(hrn=hrn, gid=auth_info.get_gid_object(), type="authority", pointer=-1) + auth_record['authority'] = get_authority(auth_record['hrn']) + trace("Import: inserting authority record for " + hrn, self.logger) + table.insert(auth_record) + + + def import_person(self, parent_hrn, person): + AuthHierarchy = self.AuthHierarchy + hrn = email_to_hrn(parent_hrn, person['email']) + + # ASN.1 will have problems with hrn's longer than 64 characters + if len(hrn) > 64: + hrn = hrn[:64] + + trace("Import: importing person " + hrn, self.logger) + key_ids = [] + if 'key_ids' in person and person['key_ids']: + key_ids = person["key_ids"] + # get the user's private key from the SSH keys they have uploaded + # to planetlab + keys = self.shell.GetKeys(self.plc_auth, key_ids) + key = keys[0]['key'] + pkey = convert_public_key(key) + if not pkey: + pkey = Keypair(create=True) + else: + # the user has no keys + trace(" person " + hrn + " does not have a PL public key", self.logger) + # if a key is unavailable, then we still need to put something in the + # user's GID. So make one up. + pkey = Keypair(create=True) + + # create the gid + urn = hrn_to_urn(hrn, 'user') + person_gid = AuthHierarchy.create_gid(urn, create_uuid(), pkey) + table = SfaTable() + person_record = SfaRecord(hrn=hrn, gid=person_gid, type="user", pointer=person['person_id']) + person_record['authority'] = get_authority(person_record['hrn']) + existing_records = table.find({'hrn': hrn, 'type': 'user', 'pointer': person['person_id']}) + if not existing_records: + table.insert(person_record) + else: + trace("Import: %s exists, updating " % hrn, self.logger) + existing_record = existing_records[0] + person_record['record_id'] = existing_record['record_id'] + table.update(person_record) + + def import_slice(self, parent_hrn, slice): + AuthHierarchy = self.AuthHierarchy + slicename = slice['name'].split("_",1)[-1] + slicename = cleanup_string(slicename) + + if not slicename: + error("Import_Slice: failed to parse slice name " + slice['name'], self.logger) + return + + hrn = parent_hrn + "." + slicename + trace("Import: importing slice " + hrn, self.logger) + + pkey = Keypair(create=True) + urn = hrn_to_urn(hrn, 'slice') + slice_gid = AuthHierarchy.create_gid(urn, create_uuid(), pkey) + slice_record = SfaRecord(hrn=hrn, gid=slice_gid, type="slice", pointer=slice['slice_id']) + slice_record['authority'] = get_authority(slice_record['hrn']) + table = SfaTable() + existing_records = table.find({'hrn': hrn, 'type': 'slice', 'pointer': slice['slice_id']}) + if not existing_records: + table.insert(slice_record) + else: + trace("Import: %s exists, updating " % hrn, self.logger) + existing_record = existing_records[0] + slice_record['record_id'] = existing_record['record_id'] + table.update(slice_record) + + def import_node(self, parent_hrn, node): + AuthHierarchy = self.AuthHierarchy + nodename = node['hostname'].split(".")[0] + nodename = cleanup_string(nodename) + + if not nodename: + error("Import_node: failed to parse node name " + node['hostname'], self.logger) + return + + hrn = parent_hrn + "." + nodename + trace("Import: importing node " + hrn, self.logger) + # ASN.1 will have problems with hrn's longer than 64 characters + if len(hrn) > 64: + hrn = hrn[:64] + + table = SfaTable() + node_record = table.find({'type': 'node', 'hrn': hrn}) + pkey = Keypair(create=True) + urn = hrn_to_urn(hrn, 'node') + node_gid = AuthHierarchy.create_gid(urn, create_uuid(), pkey) + node_record = SfaRecord(hrn=hrn, gid=node_gid, type="node", pointer=node['node_id']) + node_record['authority'] = get_authority(node_record['hrn']) + existing_records = table.find({'hrn': hrn, 'type': 'node', 'pointer': node['node_id']}) + if not existing_records: + table.insert(node_record) + else: + trace("Import: %s exists, updating " % hrn, self.logger) + existing_record = existing_records[0] + node_record['record_id'] = existing_record['record_id'] + table.update(node_record) + + + def import_site(self, parent_hrn, site): + AuthHierarchy = self.AuthHierarchy + shell = self.shell + plc_auth = self.plc_auth + sitename = site['login_base'] + sitename = cleanup_string(sitename) + print 'importing site %s' % sitename + hrn = parent_hrn + "." + sitename + urn = hrn_to_urn(hrn, 'authority') + # Hardcode 'internet2' into the hrn for sites hosting + # internet2 nodes. This is a special operation for some vini + # sites only + if ".vini" in parent_hrn and parent_hrn.endswith('vini'): + if sitename.startswith("i2"): + #sitename = sitename.replace("ii", "") + hrn = ".".join([parent_hrn, "internet2", sitename]) + elif sitename.startswith("nlr"): + #sitename = sitename.replace("nlr", "") + hrn = ".".join([parent_hrn, "internet2", sitename]) + + trace("Import: importing site " + hrn, self.logger) + + # create the authority + if not AuthHierarchy.auth_exists(urn): + AuthHierarchy.create_auth(urn) + + auth_info = AuthHierarchy.get_auth_info(urn) + + table = SfaTable() + auth_record = SfaRecord(hrn=hrn, gid=auth_info.get_gid_object(), type="authority", pointer=site['site_id']) + auth_record['authority'] = get_authority(auth_record['hrn']) + existing_records = table.find({'hrn': hrn, 'type': 'authority', 'pointer': site['site_id']}) + if not existing_records: + table.insert(auth_record) + else: + trace("Import: %s exists, updating " % hrn, self.logger) + existing_record = existing_records[0] + auth_record['record_id'] = existing_record['record_id'] + table.update(auth_record) + + return hrn + + + def delete_record(self, hrn, type): + # delete the record + table = SfaTable() + record_list = table.find({'type': type, 'hrn': hrn}) + for record in record_list: + trace("Import: Removing record %s %s" % (type, hrn), self.logger) + table.remove(record) diff --git a/sfa/plc/slices.py b/sfa/plc/slices.py new file mode 100644 index 00000000..2344bc87 --- /dev/null +++ b/sfa/plc/slices.py @@ -0,0 +1,443 @@ +### $Id: slices.py 18613 2010-08-09 17:02:53Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/plc/slices.py $ + +import datetime +import time +import traceback +import sys + +from types import StringTypes +from sfa.util.namespace import * +from sfa.util.rspec import * +from sfa.util.specdict import * +from sfa.util.faults import * +from sfa.util.record import SfaRecord +from sfa.util.policy import Policy +from sfa.util.prefixTree import prefixTree +from sfa.util.debug import log + +MAXINT = 2L**31-1 + +class Slices: + + rspec_to_slice_tag = {'max_rate':'net_max_rate'} + + def __init__(self, api, ttl = .5, origin_hrn=None): + self.api = api + #filepath = path + os.sep + filename + self.policy = Policy(self.api) + self.origin_hrn = origin_hrn + + def get_slivers(self, xrn, node=None): + hrn, type = urn_to_hrn(xrn) + + slice_name = hrn_to_pl_slicename(hrn) + # XX Should we just call PLCAPI.GetSliceTicket(slice_name) instead + # of doing all of this? + #return self.api.GetSliceTicket(self.auth, slice_name) + + # from PLCAPI.GetSlivers.get_slivers() + slice_fields = ['slice_id', 'name', 'instantiation', 'expires', 'person_ids', 'slice_tag_ids'] + slices = self.api.plshell.GetSlices(self.api.plauth, slice_name, slice_fields) + # Build up list of users and slice attributes + person_ids = set() + all_slice_tag_ids = set() + for slice in slices: + person_ids.update(slice['person_ids']) + all_slice_tag_ids.update(slice['slice_tag_ids']) + person_ids = list(person_ids) + all_slice_tag_ids = list(all_slice_tag_ids) + # Get user information + all_persons_list = self.api.plshell.GetPersons(self.api.plauth, {'person_id':person_ids,'enabled':True}, ['person_id', 'enabled', 'key_ids']) + all_persons = {} + for person in all_persons_list: + all_persons[person['person_id']] = person + + # Build up list of keys + key_ids = set() + for person in all_persons.values(): + key_ids.update(person['key_ids']) + key_ids = list(key_ids) + # Get user account keys + all_keys_list = self.api.plshell.GetKeys(self.api.plauth, key_ids, ['key_id', 'key', 'key_type']) + all_keys = {} + for key in all_keys_list: + all_keys[key['key_id']] = key + # Get slice attributes + all_slice_tags_list = self.api.plshell.GetSliceTags(self.api.plauth, all_slice_tag_ids) + all_slice_tags = {} + for slice_tag in all_slice_tags_list: + all_slice_tags[slice_tag['slice_tag_id']] = slice_tag + + slivers = [] + for slice in slices: + keys = [] + for person_id in slice['person_ids']: + if person_id in all_persons: + person = all_persons[person_id] + if not person['enabled']: + continue + for key_id in person['key_ids']: + if key_id in all_keys: + key = all_keys[key_id] + keys += [{'key_type': key['key_type'], + 'key': key['key']}] + attributes = [] + # All (per-node and global) attributes for this slice + slice_tags = [] + for slice_tag_id in slice['slice_tag_ids']: + if slice_tag_id in all_slice_tags: + slice_tags.append(all_slice_tags[slice_tag_id]) + # Per-node sliver attributes take precedence over global + # slice attributes, so set them first. + # Then comes nodegroup slice attributes + # Followed by global slice attributes + sliver_attributes = [] + + if node is not None: + for sliver_attribute in filter(lambda a: a['node_id'] == node['node_id'], slice_tags): + sliver_attributes.append(sliver_attribute['tagname']) + attributes.append({'tagname': sliver_attribute['tagname'], + 'value': sliver_attribute['value']}) + + # set nodegroup slice attributes + for slice_tag in filter(lambda a: a['nodegroup_id'] in node['nodegroup_ids'], slice_tags): + # Do not set any nodegroup slice attributes for + # which there is at least one sliver attribute + # already set. + if slice_tag not in slice_tags: + attributes.append({'tagname': slice_tag['tagname'], + 'value': slice_tag['value']}) + + for slice_tag in filter(lambda a: a['node_id'] is None, slice_tags): + # Do not set any global slice attributes for + # which there is at least one sliver attribute + # already set. + if slice_tag['tagname'] not in sliver_attributes: + attributes.append({'tagname': slice_tag['tagname'], + 'value': slice_tag['value']}) + + # XXX Sanity check; though technically this should be a system invariant + # checked with an assertion + if slice['expires'] > MAXINT: slice['expires']= MAXINT + + slivers.append({ + 'hrn': hrn, + 'name': slice['name'], + 'slice_id': slice['slice_id'], + 'instantiation': slice['instantiation'], + 'expires': slice['expires'], + 'keys': keys, + 'attributes': attributes + }) + + return slivers + + def get_peer(self, xrn): + hrn, type = urn_to_hrn(xrn) + # Becaues of myplc federation, we first need to determine if this + # slice belongs to out local plc or a myplc peer. We will assume it + # is a local site, unless we find out otherwise + peer = None + + # get this slice's authority (site) + slice_authority = get_authority(hrn) + + # get this site's authority (sfa root authority or sub authority) + site_authority = get_authority(slice_authority).lower() + + # check if we are already peered with this site_authority, if so + peers = self.api.plshell.GetPeers(self.api.plauth, {}, ['peer_id', 'peername', 'shortname', 'hrn_root']) + for peer_record in peers: + names = [name.lower() for name in peer_record.values() if isinstance(name, StringTypes)] + if site_authority in names: + peer = peer_record['shortname'] + + return peer + + def get_sfa_peer(self, xrn): + hrn, type = urn_to_hrn(xrn) + + # return the authority for this hrn or None if we are the authority + sfa_peer = None + slice_authority = get_authority(hrn) + site_authority = get_authority(slice_authority) + + if site_authority != self.api.hrn: + sfa_peer = site_authority + + return sfa_peer + + def verify_site(self, registry, credential, slice_hrn, peer, sfa_peer, reg_objects=None): + authority = get_authority(slice_hrn) + authority_urn = hrn_to_urn(authority, 'authority') + + if reg_objects: + site = reg_objects['site'] + else: + site_records = registry.Resolve(authority_urn, [credential]) + site = {} + for site_record in site_records: + if site_record['type'] == 'authority': + site = site_record + if not site: + raise RecordNotFound(authority) + + remote_site_id = site.pop('site_id') + + login_base = get_leaf(authority) + sites = self.api.plshell.GetSites(self.api.plauth, login_base) + + if not sites: + site_id = self.api.plshell.AddSite(self.api.plauth, site) + if peer: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'site', site_id, peer, remote_site_id) + # mark this site as an sfa peer record + if sfa_peer and not reg_objects: + peer_dict = {'type': 'authority', 'hrn': authority, 'peer_authority': sfa_peer, 'pointer': site_id} + registry.register_peer_object(credential, peer_dict) + else: + site_id = sites[0]['site_id'] + remote_site_id = sites[0]['peer_site_id'] + + old_site = sites[0] + #the site is already on the remote agg. Let us update(e.g. max_slices field) it with the latest info. + self.sync_site(old_site, site, peer) + + + return (site_id, remote_site_id) + + def verify_slice(self, registry, credential, slice_hrn, site_id, remote_site_id, peer, sfa_peer, reg_objects=None): + slice = {} + slice_record = None + authority = get_authority(slice_hrn) + + if reg_objects: + slice_record = reg_objects['slice_record'] + else: + slice_records = registry.Resolve(slice_hrn, [credential]) + + for record in slice_records: + if record['type'] in ['slice']: + slice_record = record + if not slice_record: + raise RecordNotFound(hrn) + + + slicename = hrn_to_pl_slicename(slice_hrn) + parts = slicename.split("_") + login_base = parts[0] + slices = self.api.plshell.GetSlices(self.api.plauth, [slicename]) + if not slices: + slice_fields = {} + slice_keys = ['name', 'url', 'description'] + for key in slice_keys: + if key in slice_record and slice_record[key]: + slice_fields[key] = slice_record[key] + + # add the slice + slice_id = self.api.plshell.AddSlice(self.api.plauth, slice_fields) + slice = slice_fields + slice['slice_id'] = slice_id + + # mark this slice as an sfa peer record + if sfa_peer: + peer_dict = {'type': 'slice', 'hrn': slice_hrn, 'peer_authority': sfa_peer, 'pointer': slice_id} + registry.register_peer_object(credential, peer_dict) + + #this belongs to a peer + if peer: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'slice', slice_id, peer, slice_record['pointer']) + slice['node_ids'] = [] + else: + slice = slices[0] + slice_id = slice['slice_id'] + site_id = slice['site_id'] + #the slice is alredy on the remote agg. Let us update(e.g. expires field) it with the latest info. + self.sync_slice(slice, slice_record, peer) + + slice['peer_slice_id'] = slice_record['pointer'] + self.verify_persons(registry, credential, slice_record, site_id, remote_site_id, peer, sfa_peer, reg_objects) + + return slice + + def verify_persons(self, registry, credential, slice_record, site_id, remote_site_id, peer, sfa_peer, reg_objects=None): + # get the list of valid slice users from the registry and make + # sure they are added to the slice + slicename = hrn_to_pl_slicename(slice_record['hrn']) + if reg_objects: + researchers = reg_objects['users'].keys() + else: + researchers = slice_record.get('researcher', []) + for researcher in researchers: + if reg_objects: + person_dict = reg_objects['users'][researcher] + else: + person_records = registry.Resolve(researcher, [credential]) + for record in person_records: + if record['type'] in ['user'] and record['enabled']: + person_record = record + if not person_record: + return 1 + person_dict = person_record + + local_person=False + if peer: + peer_id = self.api.plshell.GetPeers(self.api.plauth, {'shortname': peer}, ['peer_id'])[0]['peer_id'] + persons = self.api.plshell.GetPersons(self.api.plauth, {'email': [person_dict['email']], 'peer_id': peer_id}, ['person_id', 'key_ids']) + if not persons: + persons = self.api.plshell.GetPersons(self.api.plauth, [person_dict['email']], ['person_id', 'key_ids']) + if persons: + local_person=True + + else: + persons = self.api.plshell.GetPersons(self.api.plauth, [person_dict['email']], ['person_id', 'key_ids']) + + if not persons: + person_id=self.api.plshell.AddPerson(self.api.plauth, person_dict) + self.api.plshell.UpdatePerson(self.api.plauth, person_id, {'enabled' : True}) + + # mark this person as an sfa peer record + if sfa_peer: + peer_dict = {'type': 'user', 'hrn': researcher, 'peer_authority': sfa_peer, 'pointer': person_id} + registry.register_peer_object(credential, peer_dict) + + if peer: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'person', person_id, peer, person_dict['pointer']) + key_ids = [] + else: + person_id = persons[0]['person_id'] + key_ids = persons[0]['key_ids'] + + + # if this is a peer person, we must unbind them from the peer or PLCAPI will throw + # an error + if peer: + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'person', person_id, peer) + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'site', site_id, peer) + + self.api.plshell.AddPersonToSlice(self.api.plauth, person_dict['email'], slicename) + self.api.plshell.AddPersonToSite(self.api.plauth, person_dict['email'], site_id) + if peer and not local_person: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'person', person_id, peer, person_dict['pointer']) + if peer: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'site', site_id, peer, remote_site_id) + + self.verify_keys(registry, credential, person_dict, key_ids, person_id, peer, local_person) + + def verify_keys(self, registry, credential, person_dict, key_ids, person_id, peer, local_person): + keylist = self.api.plshell.GetKeys(self.api.plauth, key_ids, ['key']) + keys = [key['key'] for key in keylist] + + #add keys that arent already there + key_ids = person_dict['key_ids'] + for personkey in person_dict['keys']: + if personkey not in keys: + key = {'key_type': 'ssh', 'key': personkey} + if peer: + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'person', person_id, peer) + key_id = self.api.plshell.AddPersonKey(self.api.plauth, person_dict['email'], key) + if peer and not local_person: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'person', person_id, peer, person_dict['pointer']) + if peer: + try: self.api.plshell.BindObjectToPeer(self.api.plauth, 'key', key_id, peer, key_ids.pop(0)) + + except: pass + + def create_slice_aggregate(self, xrn, rspec): + hrn, type = urn_to_hrn(xrn) + # Determine if this is a peer slice + peer = self.get_peer(hrn) + sfa_peer = self.get_sfa_peer(hrn) + + spec = RSpec(rspec) + # Get the slice record from sfa + slicename = hrn_to_pl_slicename(hrn) + slice = {} + slice_record = None + registry = self.api.registries[self.api.hrn] + credential = self.api.getCredential() + + site_id, remote_site_id = self.verify_site(registry, credential, hrn, peer, sfa_peer) + slice = self.verify_slice(registry, credential, hrn, site_id, remote_site_id, peer, sfa_peer) + + # find out where this slice is currently running + nodelist = self.api.plshell.GetNodes(self.api.plauth, slice['node_ids'], ['hostname']) + hostnames = [node['hostname'] for node in nodelist] + + # get netspec details + nodespecs = spec.getDictsByTagName('NodeSpec') + + # dict in which to store slice attributes to set for the nodes + nodes = {} + for nodespec in nodespecs: + if isinstance(nodespec['name'], list): + for nodename in nodespec['name']: + nodes[nodename] = {} + for k in nodespec.keys(): + rspec_attribute_value = nodespec[k] + if (self.rspec_to_slice_tag.has_key(k)): + slice_tag_name = self.rspec_to_slice_tag[k] + nodes[nodename][slice_tag_name] = rspec_attribute_value + elif isinstance(nodespec['name'], StringTypes): + nodename = nodespec['name'] + nodes[nodename] = {} + for k in nodespec.keys(): + rspec_attribute_value = nodespec[k] + if (self.rspec_to_slice_tag.has_key(k)): + slice_tag_name = self.rspec_to_slice_tag[k] + nodes[nodename][slice_tag_name] = rspec_attribute_value + + for k in nodespec.keys(): + rspec_attribute_value = nodespec[k] + if (self.rspec_to_slice_tag.has_key(k)): + slice_tag_name = self.rspec_to_slice_tag[k] + nodes[nodename][slice_tag_name] = rspec_attribute_value + + node_names = nodes.keys() + # remove nodes not in rspec + deleted_nodes = list(set(hostnames).difference(node_names)) + # add nodes from rspec + added_nodes = list(set(node_names).difference(hostnames)) + + if peer: + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'slice', slice['slice_id'], peer) + + self.api.plshell.AddSliceToNodes(self.api.plauth, slicename, added_nodes) + + # Add recognized slice tags + for node_name in node_names: + node = nodes[node_name] + for slice_tag in node.keys(): + value = node[slice_tag] + if (isinstance(value, list)): + value = value[0] + + self.api.plshell.AddSliceTag(self.api.plauth, slicename, slice_tag, value, node_name) + + self.api.plshell.DeleteSliceFromNodes(self.api.plauth, slicename, deleted_nodes) + if peer: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'slice', slice['slice_id'], peer, slice['peer_slice_id']) + + return 1 + + def sync_site(self, old_record, new_record, peer): + if old_record['max_slices'] != new_record['max_slices'] or old_record['max_slivers'] != new_record['max_slivers']: + if peer: + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'site', old_record['site_id'], peer) + if old_record['max_slices'] != new_record['max_slices']: + self.api.plshell.UpdateSite(self.api.plauth, old_record['site_id'], {'max_slices' : new_record['max_slices']}) + if old_record['max_slivers'] != new_record['max_slivers']: + self.api.plshell.UpdateSite(self.api.plauth, old_record['site_id'], {'max_slivers' : new_record['max_slivers']}) + if peer: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'site', old_record['site_id'], peer, old_record['peer_site_id']) + return 1 + + def sync_slice(self, old_record, new_record, peer): + if old_record['expires'] != new_record['expires']: + if peer: + self.api.plshell.UnBindObjectFromPeer(self.api.plauth, 'slice', old_record['slice_id'], peer) + self.api.plshell.UpdateSlice(self.api.plauth, old_record['slice_id'], {'expires' : new_record['expires']}) + if peer: + self.api.plshell.BindObjectToPeer(self.api.plauth, 'slice', old_record['slice_id'], peer, old_record['peer_slice_id']) + return 1 diff --git a/sfa/rspecs/__init__.py b/sfa/rspecs/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfa/rspecs/aggregates/__init__.py b/sfa/rspecs/aggregates/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfa/rspecs/aggregates/max.xml b/sfa/rspecs/aggregates/max.xml new file mode 100644 index 00000000..f549ab7d --- /dev/null +++ b/sfa/rspecs/aggregates/max.xml @@ -0,0 +1,90 @@ + + + geni.maxgigapop.net + Example MAX RSpec + + 1279848020 + 1280712039 + + + +
    206.196.176.55
    + + generic + 2.0GHz + 1 + 256MB + 16GB + + + Ethernet + eth1 + 100Mbps + 10.10.10.2/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab2:interface=eth1.any_1 + + + Ethernet + eth1 + 100Mbps + 10.10.30.1/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab5:interface=eth1.any_2 + +
    + +
    206.196.176.138
    + + generic + 2.0GHz + 1 + 256MB + 16GB + + + Ethernet + eth1 + 100Mbps + 10.10.20.2/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab2:interface=eth1.any_3 + + + Ethernet + eth1 + 100Mbps + 10.10.30.2/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab3:interface=eth1.any_2 + +
    + +
    206.196.176.133
    + + generic + 2.0GHz + 1 + 256MB + 16GB + + + Ethernet + eth1 + 100Mbps + 10.10.10.1/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab3:interface=eth1.any_1 + + + Ethernet + eth1 + 100Mbps + 10.10.20.1/24 + any + urn:aggregate=geni.maxgigapop.net:rspec=my-test-max-rspec-slice1:domain=dragon.maxgigapop.net:node=planetlab5:interface=eth1.any_3 + +
    +
    +
    diff --git a/sfa/rspecs/aggregates/openflow.xml b/sfa/rspecs/aggregates/openflow.xml new file mode 100755 index 00000000..791baaba --- /dev/null +++ b/sfa/rspecs/aggregates/openflow.xml @@ -0,0 +1,101 @@ + + + tns:version + + + tns:nodeId + 0 + + 0 + tns:remoteNodeId + 0 + + readonly + 0F00 + 0F00 + 0 + 0 + 0F00 + 0F00 + 0 + 0 + 0 + + 0.0 + 0.0 + 0.0 + + + tns:switchFeatures + tns:controllerUrl + + + + tns:nodeId + 0 + + 0 + tns:remoteNodeId + 0 + + readonly + 0F00 + 0F00 + 0 + 0 + 0F00 + 0F00 + 0 + 0 + 0 + + 0.0 + 0.0 + 0.0 + + + 0.0 + 0.0 + + + tns:remoteURL + tns:remoteType + + tns:nodeId + 0 + + 0 + tns:remoteNodeId + 0 + + readonly + 0F00 + 0F00 + 0 + 0 + 0F00 + 0F00 + 0 + 0 + 0 + + 0.0 + 0.0 + 0.0 + + + + + readonly + 0F00 + 0F00 + 0 + 0 + 0F00 + 0F00 + 0 + 0 + 0 + + + diff --git a/sfa/rspecs/aggregates/rspec_manager_max.py b/sfa/rspecs/aggregates/rspec_manager_max.py new file mode 100644 index 00000000..c6504b99 --- /dev/null +++ b/sfa/rspecs/aggregates/rspec_manager_max.py @@ -0,0 +1,331 @@ +#!/usr/bin/python + +from sfa.util.rspec import RSpec +import sys +import pdb +from sfa.util.namespace import * +from sfa.util.rspec import * +from sfa.util.specdict import * +from sfa.util.faults import * +from sfa.util.storage import * +from sfa.util.policy import Policy +from sfa.util.debug import log +from sfa.server.aggregate import Aggregates +from sfa.server.registry import Registries +from sfa.util.faults import * + +import xml.dom.minidom + +SFA_MAX_CONF_FILE = '/etc/sfa/max_allocations' +SFA_MAX_DEFAULT_RSPEC = '/etc/sfa/max_physical.xml' +SFA_MAX_CANNED_RSPEC = '/etc/sfa/max_physical_canned.xml' + +topology = {} + +class SfaOutOfResource(SfaFault): + def __init__(self, interface): + faultString = "Interface " + interface + " not available" + SfaFault.__init__(self, 100, faultString, '') + +class SfaNoPairRSpec(SfaFault): + def __init__(self, interface, interface2): + faultString = "Interface " + interface + " should be paired with " + interface2 + SfaFault.__init__(self, 100, faultString, '') + +# Returns a mapping from interfaces to the nodes they lie on and their peer interfaces +# i -> node,i_peer + +def get_interface_map(): + r = RSpec() + r.parseFile(SFA_MAX_DEFAULT_RSPEC) + rspec = r.toDict() + capacity = rspec['rspec']['capacity'] + netspec = capacity[0]['netspec'][0] + linkdefs = {} + for n in netspec['nodespec']: + ifspecs = n['ifspec'] + nodename = n['node'] + for i in ifspecs: + ifname = i['name'] + linkid = i['linkid'] + + if (linkdefs.has_key(linkid)): + linkdefs[linkid].extend([(nodename,ifname)]) + else: + linkdefs[linkid]=[(nodename,ifname)] + + # topology maps interface x interface -> link,node1,node2 + topology={} + + for k in linkdefs.keys(): + (n1,i1) = linkdefs[k][0] + (n2,i2) = linkdefs[k][1] + + topology[i1] = (n1, i2) + topology[i2] = (n2, i1) + + + return topology + + +def allocations_to_rspec(allocations): + rspec = xml.dom.minidom.parse(SFA_MAX_DEFAULT_RSPEC) + req = rspec.firstChild.appendChild(rspec.createElement("request")) + for (iname,ip) in allocations: + ifspec = req.appendChild(rspec.createElement("ifspec")) + ifspec.setAttribute("name","tns:"+iname) + ifspec.setAttribute("ip",ip) + + return rspec.toxml() + + +def if_endpoints(ifs): + nodes=[] + for l in ifs: + nodes.extend(topology[l][0]) + return nodes + +def lock_state_file(): + # Noop for demo + return True + +def unlock_state_file(): + return True + # Noop for demo + +def read_alloc_dict(): + alloc_dict={} + rows = open(SFA_MAX_CONF_FILE).read().split('\n') + for r in rows: + columns = r.split(' ') + if (len(columns)==2): + hrn = columns[0] + allocs = columns[1].split(',') + ipallocs = map(lambda alloc:alloc.split('/'), allocs) + alloc_dict[hrn]=ipallocs + return alloc_dict + +def commit_alloc_dict(d): + f = open(SFA_MAX_CONF_FILE, 'w') + for hrn in d.keys(): + columns = d[hrn] + ipcolumns = map(lambda x:"/".join(x), columns) + row = hrn+' '+','.join(ipcolumns)+'\n' + f.write(row) + f.close() + +def collapse_alloc_dict(d): + ret = [] + for k in d.keys(): + ret.extend(d[k]) + return ret + + +def alloc_links(api, hrn, links_to_add, links_to_drop): + slicename=hrn_to_pl_slicename(hrn) + for (iface,ip) in links_to_add: + node = topology[iface][0][0] + try: + api.plshell.AddSliceTag(api.plauth, slicename, "ip_addresses", ip, node) + api.plshell.AddSliceTag(api.plauth, slicename, "vsys", "getvlan", node) + except Exception: + # Probably a duplicate tag. XXX July 21 + pass + return True + +def alloc_nodes(api,hrn, requested_ifs): + requested_nodes = if_endpoints(requested_ifs) + create_slice_max_aggregate(api, hrn, requested_nodes) + +# Taken from slices.py + +def create_slice_max_aggregate(api, hrn, nodes): + # Get the slice record from SFA + global topology + topology = get_interface_map() + slice = {} + registries = Registries(api) + registry = registries[api.hrn] + credential = api.getCredential() + records = registry.resolve(credential, hrn) + for record in records: + if record.get_type() in ['slice']: + slice = record.as_dict() + if not slice: + raise RecordNotFound(hrn) + + # Make sure slice exists at plc, if it doesnt add it + slicename = hrn_to_pl_slicename(hrn) + slices = api.plshell.GetSlices(api.plauth, [slicename], ['node_ids']) + if not slices: + parts = slicename.split("_") + login_base = parts[0] + # if site doesnt exist add it + sites = api.plshell.GetSites(api.plauth, [login_base]) + if not sites: + authority = get_authority(hrn) + site_records = registry.resolve(credential, authority) + site_record = {} + if not site_records: + raise RecordNotFound(authority) + site_record = site_records[0] + site = site_record.as_dict() + + # add the site + site.pop('site_id') + site_id = api.plshell.AddSite(api.plauth, site) + else: + site = sites[0] + + slice_fields = {} + slice_keys = ['name', 'url', 'description'] + for key in slice_keys: + if key in slice and slice[key]: + slice_fields[key] = slice[key] + api.plshell.AddSlice(api.plauth, slice_fields) + slice = slice_fields + slice['node_ids'] = 0 + else: + slice = slices[0] + + # get the list of valid slice users from the registry and make + # they are added to the slice + researchers = record.get('researcher', []) + for researcher in researchers: + person_record = {} + person_records = registry.resolve(credential, researcher) + for record in person_records: + if record.get_type() in ['user']: + person_record = record + if not person_record: + pass + person_dict = person_record.as_dict() + persons = api.plshell.GetPersons(api.plauth, [person_dict['email']], + ['person_id', 'key_ids']) + + # Create the person record + if not persons: + person_id=api.plshell.AddPerson(api.plauth, person_dict) + + # The line below enables the user account on the remote aggregate + # soon after it is created. + # without this the user key is not transfered to the slice + # (as GetSlivers returns key of only enabled users), + # which prevents the user from login to the slice. + # We may do additional checks before enabling the user. + + api.plshell.UpdatePerson(api.plauth, person_id, {'enabled' : True}) + key_ids = [] + else: + key_ids = persons[0]['key_ids'] + + api.plshell.AddPersonToSlice(api.plauth, person_dict['email'], + slicename) + + # Get this users local keys + keylist = api.plshell.GetKeys(api.plauth, key_ids, ['key']) + keys = [key['key'] for key in keylist] + + # add keys that arent already there + for personkey in person_dict['keys']: + if personkey not in keys: + key = {'key_type': 'ssh', 'key': personkey} + api.plshell.AddPersonKey(api.plauth, person_dict['email'], key) + + # find out where this slice is currently running + nodelist = api.plshell.GetNodes(api.plauth, slice['node_ids'], + ['hostname']) + hostnames = [node['hostname'] for node in nodelist] + + # remove nodes not in rspec + deleted_nodes = list(set(hostnames).difference(nodes)) + # add nodes from rspec + added_nodes = list(set(nodes).difference(hostnames)) + + api.plshell.AddSliceToNodes(api.plauth, slicename, added_nodes) + api.plshell.DeleteSliceFromNodes(api.plauth, slicename, deleted_nodes) + + return 1 + + +def get_rspec(api, hrn): + # Eg. config line: + # plc.princeton.sapan vlan23,vlan45 + + allocations = read_alloc_dict() + if (hrn and allocations.has_key(hrn)): + ret_rspec = allocations_to_rspec(allocations[hrn]) + else: + ret_rspec = open(SFA_MAX_CANNED_RSPEC).read() + + return (ret_rspec) + + +def create_slice(api, hrn, rspec_xml): + global topology + topology = get_interface_map() + + # Check if everything in rspec is either allocated by hrn + # or not allocated at all. + r = RSpec() + r.parseString(rspec_xml) + rspec = r.toDict() + + lock_state_file() + + allocations = read_alloc_dict() + requested_allocations = rspec_to_allocations (rspec) + current_allocations = collapse_alloc_dict(allocations) + try: + current_hrn_allocations=allocations[hrn] + except KeyError: + current_hrn_allocations=[] + + # Check request against current allocations + requested_interfaces = map(lambda(elt):elt[0], requested_allocations) + current_interfaces = map(lambda(elt):elt[0], current_allocations) + current_hrn_interfaces = map(lambda(elt):elt[0], current_hrn_allocations) + + for a in requested_interfaces: + if (a not in current_hrn_interfaces and a in current_interfaces): + raise SfaOutOfResource(a) + if (topology[a][1] not in requested_interfaces): + raise SfaNoPairRSpec(a,topology[a][1]) + # Request OK + + # Allocations to delete + allocations_to_delete = [] + for a in current_hrn_allocations: + if (a not in requested_allocations): + allocations_to_delete.extend([a]) + + # Ok, let's do our thing + alloc_nodes(api, hrn, requested_interfaces) + alloc_links(api, hrn, requested_allocations, allocations_to_delete) + allocations[hrn] = requested_allocations + commit_alloc_dict(allocations) + + unlock_state_file() + + return True + +def rspec_to_allocations(rspec): + ifs = [] + try: + ifspecs = rspec['rspec']['request'][0]['ifspec'] + for l in ifspecs: + ifs.extend([(l['name'].replace('tns:',''),l['ip'])]) + except KeyError: + # Bad RSpec + pass + return ifs + +def main(): + t = get_interface_map() + r = RSpec() + rspec_xml = open(sys.argv[1]).read() + #get_rspec(None,'foo') + create_slice(None, "plc.princeton.sap0", rspec_xml) + +if __name__ == "__main__": + main() diff --git a/sfa/rspecs/aggregates/rspec_manager_openflow.py b/sfa/rspecs/aggregates/rspec_manager_openflow.py new file mode 100755 index 00000000..a745b6ea --- /dev/null +++ b/sfa/rspecs/aggregates/rspec_manager_openflow.py @@ -0,0 +1,166 @@ +from sfa.util.faults import * +from sfa.util.namespace import * +from sfa.util.rspec import RSpec +from sfa.server.registry import Registries +from sfa.util.config import Config +from sfa.plc.nodes import * +import sys + +#The following is not essential +#from soaplib.wsgi_soap import SimpleWSGISoapApp +#from soaplib.serializers.primitive import * +#from soaplib.serializers.clazz import * + +import socket +import struct + +# Message IDs for all the SFA light calls +# This will be used by the aggrMgr controller +SFA_GET_RESOURCES = 101 +SFA_CREATE_SLICE = 102 +SFA_START_SLICE = 103 +SFA_STOP_SLICE = 104 +SFA_DELETE_SLICE = 105 +SFA_GET_SLICES = 106 +SFA_RESET_SLICES = 107 + +DEBUG = 1 + +def print_buffer(buf): + for i in range(0,len(buf)): + print('%x' % buf[i]) + +def extract(sock): + # Shud we first obtain the message length? + # msg_len = socket.ntohs(sock.recv(2)) + msg = "" + + while (1): + try: + chunk = sock.recv(1) + except socket.error, message: + if 'timed out' in message: + break + else: + sys.exit("Socket error: " + message) + + if len(chunk) == 0: + break + msg += chunk + + print 'Done extracting %d bytes of response from aggrMgr' % len(msg) + return msg + +def connect(server, port): + '''Connect to the Aggregate Manager module''' + sock = socket.socket ( socket.AF_INET, socket.SOCK_STREAM ) + sock.connect ( ( server, port) ) + sock.settimeout(1) + if DEBUG: print 'Connected!' + return sock + +def connect_aggrMgr(): + (aggr_mgr_ip, aggr_mgr_port) = Config().get_openflow_aggrMgr_info() + if DEBUG: print """Connecting to port %d of %s""" % (aggr_mgr_port, aggr_mgr_ip) + return connect(aggr_mgr_ip, aggr_mgr_port) + +def generate_slide_id(cred, hrn): + if cred == None: + cred = "" + if hrn == None: + hrn = "" + #return cred + '_' + hrn + return str(hrn) + +def msg_aggrMgr(cred, hrn, msg_id): + slice_id = generate_slide_id(cred, hrn) + + msg = struct.pack('> B%ds' % len(slice_id), msg_id, slice_id) + buf = struct.pack('> H', len(msg)+2) + msg + + try: + aggrMgr_sock = connect_aggrMgr() + aggrMgr_sock.send(buf) + aggrMgr_sock.close() + return 1 + except socket.error, message: + print "Socket error" + except IOerror, message: + print "IO error" + return 0 + +def start_slice(cred, hrn): + if DEBUG: print "Received start_slice call" + return msg_aggrMgr(SFA_START_SLICE) + +def stop_slice(cred, hrn): + if DEBUG: print "Received stop_slice call" + return msg_aggrMgr(SFA_STOP_SLICE) + +def delete_slice(cred, hrn): + if DEBUG: print "Received delete_slice call" + return msg_aggrMgr(SFA_DELETE_SLICE) + +def reset_slices(cred, hrn): + if DEBUG: print "Received reset_slices call" + return msg_aggrMgr(SFA_RESET_SLICES) + +def create_slice(cred, hrn, rspec): + if DEBUG: print "Received create_slice call" + slice_id = generate_slide_id(cred, hrn) + + msg = struct.pack('> B%ds%ds' % (len(slice_id)+1, len(rspec)), SFA_CREATE_SLICE, slice_id, rspec) + buf = struct.pack('> H', len(msg)+2) + msg + + try: + aggrMgr_sock = connect_aggrMgr() + aggrMgr_sock.send(buf) + if DEBUG: print "Sent %d bytes and closing connection" % len(buf) + aggrMgr_sock.close() + + if DEBUG: print "----------------" + return 1 + except socket.error, message: + print "Socket error" + except IOerror, message: + print "IO error" + return 0 + +def get_rspec(cred, hrn=None): + if DEBUG: print "Received get_rspec call" + slice_id = generate_slide_id(cred, hrn) + + msg = struct.pack('> B%ds' % len(slice_id), SFA_GET_RESOURCES, slice_id) + buf = struct.pack('> H', len(msg)+2) + msg + + try: + aggrMgr_sock = connect_aggrMgr() + aggrMgr_sock.send(buf) + resource_list = extract(aggrMgr_sock); + aggrMgr_sock.close() + + if DEBUG: print "----------------" + return resource_list + except socket.error, message: + print "Socket error" + except IOerror, message: + print "IO error" + return None + +""" +Returns the request context required by sfatables. At some point, this mechanism should be changed +to refer to "contexts", which is the information that sfatables is requesting. But for now, we just +return the basic information needed in a dict. +""" +def fetch_context(slice_hrn, user_hrn, contexts): + base_context = {'sfa':{'user':{'hrn':user_hrn}}} + return base_context + +def main(): + r = RSpec() + r.parseFile(sys.argv[1]) + rspec = r.toDict() + create_slice(None,'plc',rspec) + +if __name__ == "__main__": + main() diff --git a/sfa/rspecs/aggregates/rspec_manager_pl.py b/sfa/rspecs/aggregates/rspec_manager_pl.py new file mode 100644 index 00000000..ffc0a2b4 --- /dev/null +++ b/sfa/rspecs/aggregates/rspec_manager_pl.py @@ -0,0 +1,8 @@ +""" +Returns the request context required by sfatables. At some point, this mechanism should be changed +to refer to "contexts", which is the information that sfatables is requesting. But for now, we just +return the basic information needed in a dict. +""" +def fetch_context(slice_hrn, user_hrn, contexts): + base_context = {'sfa':{'user':{'hrn':user_hrn}}} + return base_context diff --git a/sfa/server/__init__.py b/sfa/server/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfa/server/aggregate.py b/sfa/server/aggregate.py new file mode 100644 index 00000000..07a8d204 --- /dev/null +++ b/sfa/server/aggregate.py @@ -0,0 +1,47 @@ +### $Id: aggregate.py 18632 2010-08-16 21:44:19Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/server/aggregate.py $ + + +from sfa.util.server import SfaServer +from sfa.util.faults import * +from sfa.util.namespace import hrn_to_urn +from sfa.server.interface import Interfaces +import sfa.util.xmlrpcprotocol as xmlrpcprotocol +import sfa.util.soapprotocol as soapprotocol + + +class Aggregate(SfaServer): + + ## + # Create a new aggregate object. + # + # @param ip the ip address to listen on + # @param port the port to listen on + # @param key_file private key filename of registry + # @param cert_file certificate filename containing public key (could be a GID file) + def __init__(self, ip, port, key_file, cert_file): + SfaServer.__init__(self, ip, port, key_file, cert_file) + self.server.interface = 'aggregate' + +## +# Aggregates is a dictionary of aggregate connections keyed on the aggregate hrn + +class Aggregates(Interfaces): + + default_dict = {'aggregates': {'aggregate': [Interfaces.default_fields]}} + + def __init__(self, api, conf_file = "/etc/sfa/aggregates.xml"): + Interfaces.__init__(self, api, conf_file) + # set up a connection to the local registry + address = self.api.config.SFA_AGGREGATE_HOST + port = self.api.config.SFA_AGGREGATE_PORT + url = 'http://%(address)s:%(port)s' % locals() + local_aggregate = {'hrn': self.api.hrn, + 'urn': hrn_to_urn(self.api.hrn, 'authority'), + 'addr': address, + 'port': port, + 'url': url} + self.interfaces[self.api.hrn] = local_aggregate + + # get connections + self.update(self.get_connections()) diff --git a/sfa/server/component.py b/sfa/server/component.py new file mode 100644 index 00000000..c83ac4af --- /dev/null +++ b/sfa/server/component.py @@ -0,0 +1,35 @@ +# +# Component is a SfaServer that implements the Component interface +# +### $Id: +### $URL: +# + +import tempfile +import os +import time +import sys + +from sfa.util.componentserver import ComponentServer + +# GeniLight client support is optional +try: + from egeni.geniLight_client import * +except ImportError: + GeniClientLight = None + +## +# Component is a SfaServer that serves component operations. + +class Component(ComponentServer): + ## + # Create a new registry object. + # + # @param ip the ip address to listen on + # @param port the port to listen on + # @param key_file private key filename of registry + # @param cert_file certificate filename containing public key (could be a GID file) + + def __init__(self, ip, port, key_file, cert_file): + ComponentServer.__init__(self, ip, port, key_file, cert_file) + self.server.interface = 'component' diff --git a/sfa/server/interface.py b/sfa/server/interface.py new file mode 100644 index 00000000..dbc54891 --- /dev/null +++ b/sfa/server/interface.py @@ -0,0 +1,207 @@ +# +### $Id: interface.py 17583 2010-04-06 15:01:08Z tmack $ +### $URL: https://svn.planet-lab.org/svn/sfa/trunk/sfa/server/interface.py $ +# + +from sfa.util.faults import * +from sfa.util.storage import * +from sfa.util.namespace import * +from sfa.trust.gid import GID +from sfa.util.record import SfaRecord +import traceback +import sfa.util.xmlrpcprotocol as xmlrpcprotocol +import sfa.util.soapprotocol as soapprotocol + + +# GeniLight client support is optional +try: + from egeni.geniLight_client import * +except ImportError: + GeniClientLight = None + + +## +# In is a dictionary of registry connections keyed on the registry +# hrn + +class Interfaces(dict): + """ + Interfaces is a base class for managing information on the + peers we are federated with. It is responsible for the following: + + 1) Makes sure a record exist in the local registry for the each + fedeated peer + 2) Attepts to fetch and install trusted gids + 3) Provides connections (xmlrpc or soap) to federated peers + """ + + # fields that must be specified in the config file + default_fields = { + 'hrn': '', + 'addr': '', + 'port': '', + } + + # defined by the class + default_dict = {} + + types = ['authority'] + + def __init__(self, api, conf_file, type='authority'): + if type not in self.types: + raise SfaInfaildArgument('Invalid type %s: must be in %s' % (type, self.types)) + dict.__init__(self, {}) + self.api = api + self.type = type + # load config file + self.interface_info = XmlStorage(conf_file, self.default_dict) + self.interface_info.load() + interfaces = self.interface_info.values()[0].values()[0] + if not isinstance(interfaces, list): + interfaces = [self.interfaces] + # set the url and urn + for interface in interfaces: + hrn, address, port = interface['hrn'], interface['addr'], interface['port'] + url = 'http://%(address)s:%(port)s' % locals() + interface['url'] = url + interface['urn'] = hrn_to_urn(hrn, 'authority') + + self.interfaces = {} + required_fields = self.default_fields.keys() + for interface in interfaces: + valid = True + # skp any interface definition that has a null hrn, + # address or port + for field in required_fields: + if field not in interface or not interface[field]: + valid = False + break + if valid: + self.interfaces[interface['hrn']] = interface + + + def sync_interfaces(self): + """ + Install missing trusted gids and db records for our federated + interfaces + """ + # Attempt to get any missing peer gids + # There should be a gid file in /etc/sfa/trusted_roots for every + # peer registry found in in the registries.xml config file. If there + # are any missing gids, request a new one from the peer registry. + gids_current = self.api.auth.trusted_cert_list + hrns_current = [gid.get_hrn() for gid in gids_current] + hrns_expected = self.interfaces.keys() + new_hrns = set(hrns_expected).difference(hrns_current) + gids = self.get_peer_gids(new_hrns) + gids_current + # make sure there is a record for every gid + self.update_db_records(self.type, gids) + + def get_peer_gids(self, new_hrns): + """ + Install trusted gids from the specified interfaces. + """ + peer_gids = [] + if not new_hrns: + return peer_gids + trusted_certs_dir = self.api.config.get_trustedroots_dir() + for new_hrn in new_hrns: + if not new_hrn: + continue + # the gid for this interface should already be installed + if new_hrn == self.api.config.SFA_INTERFACE_HRN: + continue + try: + # get gid from the registry + interface_info = self.interfaces[new_hrn] + interface = self[new_hrn] + trusted_gids = interface.get_trusted_certs() + if trusted_gids: + # the gid we want shoudl be the first one in the list, + # but lets make sure + for trusted_gid in trusted_gids: + # default message + message = "interface: %s\t" % (self.api.interface) + message += "unable to install trusted gid for %s" % \ + (new_hrn) + gid = GID(string=trusted_gids[0]) + peer_gids.append(gid) + if gid.get_hrn() == new_hrn: + gid_filename = os.path.join(trusted_certs_dir, '%s.gid' % new_hrn) + gid.save_to_file(gid_filename, save_parents=True) + message = "interface: %s\tinstalled trusted gid for %s" % \ + (self.api.interface, new_hrn) + # log the message + self.api.logger.info(message) + except: + message = "interface: %s\tunable to install trusted gid for %s" % \ + (self.api.interface, new_hrn) + self.api.logger.info(message) + traceback.print_exc() + + # reload the trusted certs list + self.api.auth.load_trusted_certs() + return peer_gids + + def update_db_records(self, type, gids): + """ + Make sure there is a record in the local db for allowed registries + defined in the config file (registries.xml). Removes old records from + the db. + """ + # import SfaTable here so this module can be loaded by CompoenetAPI + from sfa.util.table import SfaTable + if not gids: + return + + # hrns that should have a record + hrns_expected = [gid.get_hrn() for gid in gids] + + # get hrns that actually exist in the db + table = SfaTable() + records = table.find({'type': type, 'pointer': -1}) + hrns_found = [record['hrn'] for record in records] + + # remove old records + for record in records: + if record['hrn'] not in hrns_expected and \ + record['hrn'] != self.api.config.SFA_INTERFACE_HRN: + table.remove(record) + + # add new records + for gid in gids: + hrn = gid.get_hrn() + if hrn not in hrns_found: + record = { + 'hrn': hrn, + 'type': type, + 'pointer': -1, + 'authority': get_authority(hrn), + 'gid': gid.save_to_string(save_parents=True), + } + record = SfaRecord(dict=record) + table.insert(record) + + def get_connections(self): + """ + read connection details for the trusted peer registries from file return + a dictionary of connections keyed on interface hrn. + """ + connections = {} + required_fields = self.default_fields.keys() + for interface in self.interfaces.values(): + # make sure the required fields are present and not null + + url = interface['url'] + # check which client we should use + # sfa.util.xmlrpcprotocol is default + client_type = 'xmlrpcprotocol' + if interface.has_key('client') and \ + interface['client'] in ['geniclientlight'] and \ + GeniClientLight: + client_type = 'geniclientlight' + connections[hrn] = GeniClientLight(url, self.api.key_file, self.api.cert_file) + else: + connections[interface['hrn']] = xmlrpcprotocol.get_server(url, self.api.key_file, self.api.cert_file) + + return connections diff --git a/sfa/server/modpython/SfaAggregateModPython.py b/sfa/server/modpython/SfaAggregateModPython.py new file mode 100755 index 00000000..e1ab86dc --- /dev/null +++ b/sfa/server/modpython/SfaAggregateModPython.py @@ -0,0 +1,70 @@ +# +# Apache mod_python interface +# +# Aaron Klingaman +# Mark Huang +# +# Copyright (C) 2004-2006 The Trustees of Princeton University +# + +import sys +import traceback +import xmlrpclib +from mod_python import apache + +from sfa.plc.api import SfaAPI +from sfa.util.debug import log + +api = SfaAPI(interface='aggregate') + +class unbuffered: + """ + Write to /var/log/httpd/error_log. See + + http://www.modpython.org/FAQ/faqw.py?req=edit&file=faq02.003.htp + """ + + def write(self, data): + sys.stderr.write(data) + sys.stderr.flush() + +#log = unbuffered() + +def handler(req): + try: + if req.method != "POST": + req.content_type = "text/html" + req.send_http_header() + req.write(""" + +SFA Aggregate API XML-RPC/SOAP Interface + +

    SFA Aggregate API XML-RPC/SOAP Interface

    +

    Please use XML-RPC or SOAP to access the SFA API.

    + +""") + return apache.OK + + # Read request + request = req.read(int(req.headers_in['content-length'])) + + # mod_python < 3.2: The IP address portion of remote_addr is + # incorrect (always 0.0.0.0) when IPv6 is enabled. + # http://issues.apache.org/jira/browse/MODPYTHON-64?page=all + (remote_ip, remote_port) = req.connection.remote_addr + remote_addr = (req.connection.remote_ip, remote_port) + + # Handle request + response = api.handle(remote_addr, request) + + # Write response + req.content_type = "text/xml; charset=" + api.encoding + req.send_http_header() + req.write(response) + + return apache.OK + + except Exception, err: + # Log error in /var/log/httpd/(ssl_)?error_log + print >> log, err, traceback.format_exc() + return apache.HTTP_INTERNAL_SERVER_ERROR diff --git a/sfa/server/modpython/SfaRegistryModPython.py b/sfa/server/modpython/SfaRegistryModPython.py new file mode 100755 index 00000000..a9044ebb --- /dev/null +++ b/sfa/server/modpython/SfaRegistryModPython.py @@ -0,0 +1,69 @@ +# +# Apache mod_python interface +# +# Aaron Klingaman +# Mark Huang +# +# Copyright (C) 2004-2006 The Trustees of Princeton University +# + +import sys +import traceback +import xmlrpclib +from mod_python import apache +from sfa.util.debug import log +from sfa.plc.api import SfaAPI + +api = SfaAPI(interface='registry') + +class unbuffered: + """ + Write to /var/log/httpd/error_log. See + + http://www.modpython.org/FAQ/faqw.py?req=edit&file=faq02.003.htp + """ + + def write(self, data): + sys.stderr.write(data) + sys.stderr.flush() + +#log = unbuffered() + +def handler(req): + try: + if req.method != "POST": + req.content_type = "text/html" + req.send_http_header() + req.write(""" + +SFA Registry API XML-RPC/SOAP Interface + +

    SFA Registry API XML-RPC/SOAP Interface

    +

    Please use XML-RPC or SOAP to access the SFA API.

    + +""") + return apache.OK + + # Read request + request = req.read(int(req.headers_in['content-length'])) + + # mod_python < 3.2: The IP address portion of remote_addr is + # incorrect (always 0.0.0.0) when IPv6 is enabled. + # http://issues.apache.org/jira/browse/MODPYTHON-64?page=all + (remote_ip, remote_port) = req.connection.remote_addr + remote_addr = (req.connection.remote_ip, remote_port) + + # Handle request + response = api.handle(remote_addr, request) + + # Write response + req.content_type = "text/xml; charset=" + api.encoding + req.send_http_header() + req.write(response) + + return apache.OK + + except Exception, err: + # Log error in /var/log/httpd/(ssl_)?error_log + print >> log, err, traceback.format_exc() + return apache.HTTP_INTERNAL_SERVER_ERROR diff --git a/sfa/server/modpython/SfaSliceMgrModPython.py b/sfa/server/modpython/SfaSliceMgrModPython.py new file mode 100755 index 00000000..7ad8e0d4 --- /dev/null +++ b/sfa/server/modpython/SfaSliceMgrModPython.py @@ -0,0 +1,70 @@ +# +# Apache mod_python interface +# +# Aaron Klingaman +# Mark Huang +# +# Copyright (C) 2004-2006 The Trustees of Princeton University +# + +import sys +import traceback +import xmlrpclib +from mod_python import apache + +from sfa.plc.api import SfaAPI +from sfa.util.debug import log + +api = SfaAPI(interface='slicemgr') + +class unbuffered: + """ + Write to /var/log/httpd/error_log. See + + http://www.modpython.org/FAQ/faqw.py?req=edit&file=faq02.003.htp + """ + + def write(self, data): + sys.stderr.write(data) + sys.stderr.flush() + +#log = unbuffered() + +def handler(req): + try: + if req.method != "POST": + req.content_type = "text/html" + req.send_http_header() + req.write(""" + +SFA SliceMgr API XML-RPC/SOAP Interface + +

    SFA SliceMgr API XML-RPC/SOAP Interface

    +

    Please use XML-RPC or SOAP to access the SFA API.

    + +""") + return apache.OK + + # Read request + request = req.read(int(req.headers_in['content-length'])) + + # mod_python < 3.2: The IP address portion of remote_addr is + # incorrect (always 0.0.0.0) when IPv6 is enabled. + # http://issues.apache.org/jira/browse/MODPYTHON-64?page=all + (remote_ip, remote_port) = req.connection.remote_addr + remote_addr = (req.connection.remote_ip, remote_port) + + # Handle request + response = api.handle(remote_addr, request) + + # Write response + req.content_type = "text/xml; charset=" + api.encoding + req.send_http_header() + req.write(response) + + return apache.OK + + except Exception, err: + # Log error in /var/log/httpd/(ssl_)?error_log + print >> log, err, traceback.format_exc() + return apache.HTTP_INTERNAL_SERVER_ERROR diff --git a/sfa/server/modpython/sfa.aggregate.httpd.conf b/sfa/server/modpython/sfa.aggregate.httpd.conf new file mode 100644 index 00000000..2e6f4f44 --- /dev/null +++ b/sfa/server/modpython/sfa.aggregate.httpd.conf @@ -0,0 +1,24 @@ +Listen 12346 + + + ErrorLog logs/sfa_ssl_error_log + TransferLog logs/sfa_ssl_access_log + CustomLog logs/ssl_request_log \ + "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b + LogLevel warn + + SSLEngine on + SSLProtocol all -SSLv2 + + SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW + SSLCertificateFile /etc/sfa/authorities/server.cert + SSLCertificateKeyFile /etc/sfa/authorities/server.key + SetEnvIf User-Agent ".*MSIE.*" \ + nokeepalive ssl-unclean-shutdown \ + downgrade-1.0 force-response-1.0 + + SetHandler mod_python + PythonPath "sys.path + ['/usr/lib/python2.5/site-packages/sfa/', '/usr/lib/python2.5/site-packages/sfa/server/']" + PythonHandler SfaAggregateModPython + + diff --git a/sfa/server/modpython/sfa.registry.httpd.conf b/sfa/server/modpython/sfa.registry.httpd.conf new file mode 100644 index 00000000..714fe553 --- /dev/null +++ b/sfa/server/modpython/sfa.registry.httpd.conf @@ -0,0 +1,24 @@ +Listen 12345 + + + ErrorLog logs/sfa_ssl_error_log + TransferLog logs/sfa_ssl_access_log + CustomLog logs/ssl_request_log \ + "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b + LogLevel warn + + SSLEngine on + SSLProtocol all -SSLv2 + + SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW + SSLCertificateFile /etc/sfa/authorities/server.cert + SSLCertificateKeyFile /etc/sfa/authorities/server.key + SetEnvIf User-Agent ".*MSIE.*" \ + nokeepalive ssl-unclean-shutdown \ + downgrade-1.0 force-response-1.0 + + SetHandler mod_python + PythonPath "sys.path + ['/usr/lib/python2.5/site-packages/sfa/', '/usr/lib/python2.5/site-packages/sfa/server/']" + PythonHandler SfaRegistryModPython + + diff --git a/sfa/server/modpython/sfa.slicemgr.httpd.conf b/sfa/server/modpython/sfa.slicemgr.httpd.conf new file mode 100644 index 00000000..6e3a8e87 --- /dev/null +++ b/sfa/server/modpython/sfa.slicemgr.httpd.conf @@ -0,0 +1,24 @@ +Listen 12347 + + + ErrorLog logs/sfa_ssl_error_log + TransferLog logs/sfa_ssl_access_log + CustomLog logs/ssl_request_log \ + "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b + LogLevel warn + + SSLEngine on + SSLProtocol all -SSLv2 + + SSLCipherSuite ALL:!ADH:!EXPORT:!SSLv2:RC4+RSA:+HIGH:+MEDIUM:+LOW + SSLCertificateFile /etc/sfa/authorities/server.cert + SSLCertificateKeyFile /etc/sfa/authorities/server.key + SetEnvIf User-Agent ".*MSIE.*" \ + nokeepalive ssl-unclean-shutdown \ + downgrade-1.0 force-response-1.0 + + SetHandler mod_python + PythonPath "sys.path + ['/usr/lib/python2.5/site-packages/sfa/', '/usr/lib/python2.5/site-packages/sfa/server/']" + PythonHandler SfaSliceMgrModPython + + diff --git a/sfa/server/modpythonapi/ApiExceptionCodes.py b/sfa/server/modpythonapi/ApiExceptionCodes.py new file mode 100644 index 00000000..cd811d23 --- /dev/null +++ b/sfa/server/modpythonapi/ApiExceptionCodes.py @@ -0,0 +1,2 @@ +FAULT_UNHANDLEDSERVEREXCEPTION = 901 +FAULT_BADREQUESTHASH = 902 diff --git a/sfa/server/modpythonapi/ApiExceptions.py b/sfa/server/modpythonapi/ApiExceptions.py new file mode 100644 index 00000000..834afd2c --- /dev/null +++ b/sfa/server/modpythonapi/ApiExceptions.py @@ -0,0 +1,15 @@ +import traceback +import xmlrpclib + +FAULTCODE = 900 + +class UnhandledServerException(xmlrpclib.Fault): + def __init__(self, type, value, tb): + exc_str = ''.join(traceback.format_exception(type, value, tb)) + faultString = exc_str # "Unhandled exception: " + str(type) + "\n" + exc_str + xmlrpclib.Fault.__init__(self, FAULTCODE + 1, faultString) + +class BadRequestHash(xmlrpclib.Fault): + def __init__(self, hash = None): + faultString = "bad request hash: " + str(hash) + xmlrpclib.Fault.__init__(self, FAULTCODE + 2, faultString) diff --git a/sfa/server/modpythonapi/AuthenticatedApi.py b/sfa/server/modpythonapi/AuthenticatedApi.py new file mode 100755 index 00000000..e86781f3 --- /dev/null +++ b/sfa/server/modpythonapi/AuthenticatedApi.py @@ -0,0 +1,66 @@ +import xmlrpclib + +from BaseApi import BaseApi + +from sfa.trust.credential import Credential +from sfa.trust.gid import GID +from sfa.trust.trustedroot import TrustedRootList + +from ApiExceptionCodes import * + +class BadRequestHash(xmlrpclib.Fault): + def __init__(self, hash = None): + faultString = "bad request hash: " + str(hash) + xmlrpclib.Fault.__init__(self, FAULT_BADREQUESTHASH, faultString) + +class AuthenticatedApi(BaseApi): + def __init__(self, encoding = "utf-8", trustedRootsDir=None): + BaseApi.__init__(self, encoding) + if trustedRootsDir: + self.trusted_cert_list = TrustedRootList(trustedRootsDir).get_list() + self.trusted_cert_file_list = TrustedRootList(trustedRootsDir).get_file_list() + else: + self.trusted_cert_list = None + + def register_functions(self): + BaseApi.register_functions(self) + self.register_function(self.gidNoop) + + def verifyGidRequestHash(self, gid, hash, arglist): + key = gid.get_pubkey() + if not key.verify_string(str(arglist), hash): + raise BadRequestHash(hash) + + def verifyCredRequestHash(self, cred, hash, arglist): + gid = cred.get_gid_caller() + self.verifyGidRequestHash(gid, hash, arglist) + + def validateGid(self, gid): + if self.trusted_cert_list: + gid.verify_chain(self.trusted_cert_list) + + def validateCred(self, cred): + if self.trusted_cert_list: + cred.verify(self.trusted_cert_file_list) + + def authenticateGid(self, gidStr, argList, requestHash): + gid = GID(string = gidStr) + self.validateGid(gid) + self.verifyGidRequestHash(gid, requestHash, argList) + return gid + + def authenticateCred(self, credStr, argList, requestHash): + cred = Credential(string = credStr) + self.validateCred(cred) + self.verifyCredRequestHash(cred, requestHash, argList) + return cred + + def gidNoop(self, gidStr, value, requestHash): + self.authenticateGid(gidStr, [gidStr, value], requestHash) + return value + + def credNoop(self, credStr, value, requestHash): + self.authenticateCred(credStr, [credStr, value], requestHash) + return value + + diff --git a/sfa/server/modpythonapi/AuthenticatedClient.py b/sfa/server/modpythonapi/AuthenticatedClient.py new file mode 100755 index 00000000..6b705fc4 --- /dev/null +++ b/sfa/server/modpythonapi/AuthenticatedClient.py @@ -0,0 +1,24 @@ +from sfa.trust.certificate import Keypair +from sfa.trust.gid import GID + +from BaseClient import BaseClient + +class AuthenticatedClient(BaseClient): + def __init__(self, url, private_key_file, gid_file=None, cred_file=None): + BaseClient.__init__(self, url) + self.private_key_file = private_key_file + self.gid_file = gid_file + self.cred_file = cred_file + self.private_key = Keypair(filename = self.private_key_file) + if gid_file: + self.gid = GID(filename = self.gid_file) + if cred_file: + self.cred = Credential(filename = self.cred_file) + + def computeRequestHash(self, argList): + return self.private_key.sign_string(str(argList)) + + def gidNoop(self, value): + gidStr = self.gid.save_to_string(True) + reqHash = self.computeRequestHash([gidStr, value]) + return self.server.gidNoop(gidStr, value, reqHash) diff --git a/sfa/server/modpythonapi/BaseApi.py b/sfa/server/modpythonapi/BaseApi.py new file mode 100755 index 00000000..95538ad3 --- /dev/null +++ b/sfa/server/modpythonapi/BaseApi.py @@ -0,0 +1,203 @@ +# +# PLCAPI XML-RPC and SOAP interfaces +# +# Aaron Klingaman +# Mark Huang +# +# Copyright (C) 2004-2006 The Trustees of Princeton University +# $Id: API.py 14587 2009-07-19 13:18:50Z thierry $ +# $URL: https://svn.planet-lab.org/svn/PLCAPI/trunk/PLC/API.py $ +# + +import sys +import traceback +import string + +import xmlrpclib +import logging +import logging.handlers + +from ApiExceptionCodes import * + +# Wrapper around xmlrpc fault to include a traceback of the server to the +# client. This is done to aid in debugging from a client perspective. + +class FaultWithTraceback(xmlrpclib.Fault): + def __init__(self, code, faultString, exc_info): + type, value, tb = exc_info + exc_str = ''.join(traceback.format_exception(type, value, tb)) + faultString = faultString + "\nFAULT_TRACEBACK:" + exc_str + xmlrpclib.Fault.__init__(self, code, faultString) + +# Exception to report to the caller when some non-XMLRPC fault occurs on the +# server. For example a TypeError. + +class UnhandledServerException(FaultWithTraceback): + def __init__(self, exc_info): + type, value, tb = exc_info + faultString = "Unhandled exception: " + str(type) + FaultWithTraceback.__init__(self, FAULT_UNHANDLEDSERVEREXCEPTION, faultString, exc_info) + +# See "2.2 Characters" in the XML specification: +# +# #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] +# avoiding +# [#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDDF] + +invalid_xml_ascii = map(chr, range(0x0, 0x8) + [0xB, 0xC] + range(0xE, 0x1F)) +xml_escape_table = string.maketrans("".join(invalid_xml_ascii), "?" * len(invalid_xml_ascii)) + +def xmlrpclib_escape(s, replace = string.replace): + """ + xmlrpclib does not handle invalid 7-bit control characters. This + function augments xmlrpclib.escape, which by default only replaces + '&', '<', and '>' with entities. + """ + + # This is the standard xmlrpclib.escape function + s = replace(s, "&", "&") + s = replace(s, "<", "<") + s = replace(s, ">", ">",) + + # Replace invalid 7-bit control characters with '?' + return s.translate(xml_escape_table) + +def xmlrpclib_dump(self, value, write): + """ + xmlrpclib cannot marshal instances of subclasses of built-in + types. This function overrides xmlrpclib.Marshaller.__dump so that + any value that is an instance of one of its acceptable types is + marshalled as that type. + + xmlrpclib also cannot handle invalid 7-bit control characters. See + above. + """ + + # Use our escape function + args = [self, value, write] + if isinstance(value, (str, unicode)): + args.append(xmlrpclib_escape) + + try: + # Try for an exact match first + f = self.dispatch[type(value)] + except KeyError: + # Try for an isinstance() match + for Type, f in self.dispatch.iteritems(): + if isinstance(value, Type): + f(*args) + return + raise TypeError, "cannot marshal %s objects" % type(value) + else: + f(*args) + +# You can't hide from me! +xmlrpclib.Marshaller._Marshaller__dump = xmlrpclib_dump + +# SOAP support is optional +try: + import SOAPpy + from SOAPpy.Parser import parseSOAPRPC + from SOAPpy.Types import faultType + from SOAPpy.NS import NS + from SOAPpy.SOAPBuilder import buildSOAP +except ImportError: + SOAPpy = None + +def import_deep(name): + mod = __import__(name) + components = name.split('.') + for comp in components[1:]: + mod = getattr(mod, comp) + return mod + +class BaseApi: + def __init__(self, encoding = "utf-8"): + self.encoding = encoding + self.init_logger() + self.funcs = {} + self.register_functions() + + def init_logger(self): + self.logger = logging.getLogger("ApiLogger") + self.logger.setLevel(logging.INFO) + self.logger.addHandler(logging.handlers.RotatingFileHandler(self.get_log_name(), maxBytes=100000, backupCount=5)) + + def get_log_name(self): + return "/tmp/apilogfile.txt" + + def register_functions(self): + self.register_function(self.noop) + + def register_function(self, function, name = None): + if name is None: + name = function.__name__ + self.funcs[name] = function + + def call(self, source, method, *args): + """ + Call the named method from the specified source with the + specified arguments. + """ + + if not method in self.funcs: + raise "Unknown method: " + method + + return self.funcs[method](*args) + + def handle(self, source, data): + """ + Handle an XML-RPC or SOAP request from the specified source. + """ + + # Parse request into method name and arguments + try: + interface = xmlrpclib + (args, method) = xmlrpclib.loads(data) + methodresponse = True + except Exception, e: + if SOAPpy is not None: + interface = SOAPpy + (r, header, body, attrs) = parseSOAPRPC(data, header = 1, body = 1, attrs = 1) + method = r._name + args = r._aslist() + # XXX Support named arguments + else: + raise e + + self.logger.debug("OP:" + str(method) + " from " + str(source)) + + try: + result = self.call(source, method, *args) + except xmlrpclib.Fault, fault: + self.logger.warning("FAULT: " + str(fault.faultCode) + " " + str(fault.faultString)) + self.logger.info(traceback.format_exc()) + # Handle expected faults + if interface == xmlrpclib: + result = FaultWithTraceback(fault.faultCode, fault.faultString, sys.exc_info()) + methodresponse = None + elif interface == SOAPpy: + result = faultParameter(NS.ENV_T + ":Server", "Method Failed", method) + result._setDetail("Fault %d: %s" % (fault.faultCode, fault.faultString)) + self.logger.debug + except: + self.logger.warning("EXCEPTION: " + str(sys.exc_info()[0])) + self.logger.info(traceback.format_exc()) + result = UnhandledServerException(sys.exc_info()) + methodresponse = None + + # Return result + if interface == xmlrpclib: + if not isinstance(result, xmlrpclib.Fault): + result = (result,) + data = xmlrpclib.dumps(result, methodresponse = True, encoding = self.encoding, allow_none = 1) + elif interface == SOAPpy: + data = buildSOAP(kw = {'%sResponse' % method: {'Result': result}}, encoding = self.encoding) + + return data + + def noop(self, value): + return value + + + diff --git a/sfa/server/modpythonapi/BaseClient.py b/sfa/server/modpythonapi/BaseClient.py new file mode 100755 index 00000000..448f9346 --- /dev/null +++ b/sfa/server/modpythonapi/BaseClient.py @@ -0,0 +1,46 @@ +import xmlrpclib + +from ApiExceptionCodes import * + +VerboseExceptions = False + +def EnableVerboseExceptions(x=True): + global VerboseExceptions + VerboseExceptions = x + +class ExceptionUnmarshaller(xmlrpclib.Unmarshaller): + def close(self): + try: + return xmlrpclib.Unmarshaller.close(self) + except xmlrpclib.Fault, e: + # if the server tagged some traceback info onto the end of the + # exception text, then print it out on the client. + + if "\nFAULT_TRACEBACK:" in e.faultString: + parts = e.faultString.split("\nFAULT_TRACEBACK:") + e.faultString = parts[0] + if VerboseExceptions: + print "\n|Server Traceback:", "\n|".join(parts[1].split("\n")) + + raise e + +class ExceptionReportingTransport(xmlrpclib.Transport): + def make_connection(self, host): + import httplib + if host.startswith("https:"): + return httplib.HTTPS(host) + else: + return httplib.HTTP(host) + + def getparser(self): + unmarshaller = ExceptionUnmarshaller() + parser = xmlrpclib.ExpatParser(unmarshaller) + return parser, unmarshaller + +class BaseClient(): + def __init__(self, url): + self.url = url + self.server = xmlrpclib.ServerProxy(self.url, ExceptionReportingTransport()) + + def noop(self, value): + return self.server.noop(value) diff --git a/sfa/server/modpythonapi/ModPython.py b/sfa/server/modpythonapi/ModPython.py new file mode 100755 index 00000000..64ceb990 --- /dev/null +++ b/sfa/server/modpythonapi/ModPython.py @@ -0,0 +1,68 @@ +# +# Apache mod_python interface +# +# Aaron Klingaman +# Mark Huang +# +# Copyright (C) 2004-2006 The Trustees of Princeton University +# + +import sys +import traceback +import xmlrpclib +from mod_python import apache + +from API import RemoteApi +api = RemoteApi() + +class unbuffered: + """ + Write to /var/log/httpd/error_log. See + + http://www.modpython.org/FAQ/faqw.py?req=edit&file=faq02.003.htp + """ + + def write(self, data): + sys.stderr.write(data) + sys.stderr.flush() + +#log = unbuffered() + +def handler(req): + try: + if req.method != "POST": + req.content_type = "text/html" + req.send_http_header() + req.write(""" + +PLCAPI XML-RPC/SOAP Interface + +

    PLCAPI XML-RPC/SOAP Interface

    +

    Please use XML-RPC or SOAP to access the PLCAPI.

    + +""") + return apache.OK + + # Read request + request = req.read(int(req.headers_in['content-length'])) + + # mod_python < 3.2: The IP address portion of remote_addr is + # incorrect (always 0.0.0.0) when IPv6 is enabled. + # http://issues.apache.org/jira/browse/MODPYTHON-64?page=all + (remote_ip, remote_port) = req.connection.remote_addr + remote_addr = (req.connection.remote_ip, remote_port) + + # Handle request + response = api.handle(remote_addr, request) + + # Write response + req.content_type = "text/xml; charset=" + api.encoding + req.send_http_header() + req.write(response) + + return apache.OK + + except Exception, err: + # Log error in /var/log/httpd/(ssl_)?error_log + print >> log, err, traceback.format_exc() + return apache.HTTP_INTERNAL_SERVER_ERROR diff --git a/sfa/server/modpythonapi/TestApi.py b/sfa/server/modpythonapi/TestApi.py new file mode 100755 index 00000000..11daed51 --- /dev/null +++ b/sfa/server/modpythonapi/TestApi.py @@ -0,0 +1,19 @@ +from AuthenticatedApi import AuthenticatedApi, BadRequestHash + +class RemoteApi(AuthenticatedApi): + def __init__(self, encoding="utf-8", trustedRootsDir="/usr/local/testapi/var/trusted_roots"): + return AuthenticatedApi.__init__(self, encoding) + + def get_log_name(self): + return "/usr/local/testapi/var/logfile.txt" + + def register_functions(self): + AuthenticatedApi.register_functions(self) + self.register_function(self.typeError) + self.register_function(self.badRequestHash) + + def typeError(self): + raise TypeError() + + def badRequestHash(self): + raise BadRequestHash("somehashvalue") diff --git a/sfa/server/modpythonapi/installTest.sh b/sfa/server/modpythonapi/installTest.sh new file mode 100755 index 00000000..1a6514eb --- /dev/null +++ b/sfa/server/modpythonapi/installTest.sh @@ -0,0 +1,37 @@ +SFA_SRC_DIR=/home/smbaker/projects/sfa/trunk + +mkdir -p /usr/local/testapi/bin +mkdir -p /usr/local/testapi/bin/sfa/trust +mkdir -p /usr/local/testapi/bin/sfa/util +mkdir -p /usr/local/testapi/var/trusted_roots +mkdir -p /repository/testapi + +# source code for the API +cp BaseApi.py /usr/local/testapi/bin/ +cp AuthenticatedApi.py /usr/local/testapi/bin/ +cp TestApi.py /usr/local/testapi/bin/API.py +cp ModPython.py /usr/local/testapi/bin/ +cp ApiExceptionCodes.py /usr/local/testapi/bin/ + +# trusted root certificates that match gackstestuser.* +cp trusted_roots/*.gid /usr/local/testapi/var/trusted_roots/ + +# apache config file to enable the api +cp testapi.conf /etc/httpd/conf.d/ + +# copy over sfa stuff that we need +echo > /usr/local/testapi/bin/sfa/__init__.py +echo > /usr/local/testapi/bin/sfa/trust/__init__.py +echo > /usr/local/testapi/bin/sfa/util/__init__.py +cp $SFA_SRC_DIR/sfa/trust/gid.py /usr/local/testapi/bin/sfa/trust/ +cp $SFA_SRC_DIR/sfa/trust/certificate.py /usr/local/testapi/bin/sfa/trust/ +cp $SFA_SRC_DIR/sfa/trust/trustedroot.py /usr/local/testapi/bin/sfa/trust/ +cp $SFA_SRC_DIR/sfa/trust/credential.py /usr/local/testapi/bin/sfa/trust/ +cp $SFA_SRC_DIR/sfa/trust/rights.py /usr/local/testapi/bin/sfa/trust/ +cp $SFA_SRC_DIR/sfa/util/faults.py /usr/local/testapi/bin/sfa/util/ + +# make everything owned by apache +chown -R apache /usr/local/testapi +chown apache /etc/httpd/conf.d/testapi.conf + +/etc/init.d/httpd restart diff --git a/sfa/server/modpythonapi/test.py b/sfa/server/modpythonapi/test.py new file mode 100755 index 00000000..d3fafed9 --- /dev/null +++ b/sfa/server/modpythonapi/test.py @@ -0,0 +1,44 @@ +import sys +import traceback + +from BaseClient import BaseClient, EnableVerboseExceptions +from AuthenticatedClient import AuthenticatedClient + +EnableVerboseExceptions(True) + +HOST = "localhost" +URL = "http://" + HOST + "/TESTAPI/" +SURL = "https://" + HOST + "/TESTAPI/" + +print "*** testing some valid ops; these should print \"Hello, World\" ***" + +bc = BaseClient(URL) +print "HTTP noop:", bc.noop("Hello, World") + +ac = AuthenticatedClient(URL, "gackstestuser.pkey", "gackstestuser.gid") +print "HTTP gidNoop:", ac.gidNoop("Hello, World") + +bc = BaseClient(SURL) +print "HTTPS noop:", bc.noop("Hello, World") + +ac = AuthenticatedClient(URL, "gackstestuser.pkey", "gackstestuser.gid") +print "HTTPS gidNoop:", ac.gidNoop("Hello, World") + +print +print "*** testing some exception handling: ***" + +bc = BaseClient(URL) +print "HTTP typeError:", +try: + result = bc.server.typeError() + print result +except Exception, e: + print ''.join(traceback.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])) + +print "HTTP badrequesthash:", +try: + result = bc.server.badRequestHash() + print result +except: + print ''.join(traceback.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])) + diff --git a/sfa/server/modpythonapi/test.sh b/sfa/server/modpythonapi/test.sh new file mode 100755 index 00000000..cafa0fb8 --- /dev/null +++ b/sfa/server/modpythonapi/test.sh @@ -0,0 +1,3 @@ +export PYTHONPATH=/home/smbaker/projects/sfa/trunk + +python ./test.py diff --git a/sfa/server/modpythonapi/testapi.conf b/sfa/server/modpythonapi/testapi.conf new file mode 100644 index 00000000..5495fd24 --- /dev/null +++ b/sfa/server/modpythonapi/testapi.conf @@ -0,0 +1,5 @@ + + SetHandler mod_python + PythonPath "sys.path + ['/usr/local/testapi/bin/']" + PythonHandler ModPython + \ No newline at end of file diff --git a/sfa/server/registry.py b/sfa/server/registry.py new file mode 100644 index 00000000..020d8f5f --- /dev/null +++ b/sfa/server/registry.py @@ -0,0 +1,53 @@ +# +# Registry is a SfaServer that implements the Registry interface +# +### $Id: registry.py 18632 2010-08-16 21:44:19Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/server/registry.py $ +# + +from sfa.util.server import SfaServer +from sfa.util.faults import * +from sfa.util.namespace import hrn_to_urn +from sfa.server.interface import Interfaces +import sfa.util.xmlrpcprotocol as xmlrpcprotocol +import sfa.util.soapprotocol as soapprotocol + + +## +# Registry is a SfaServer that serves registry and slice operations at PLC. +class Registry(SfaServer): + ## + # Create a new registry object. + # + # @param ip the ip address to listen on + # @param port the port to listen on + # @param key_file private key filename of registry + # @param cert_file certificate filename containing public key (could be a GID file) + + def __init__(self, ip, port, key_file, cert_file): + SfaServer.__init__(self, ip, port, key_file, cert_file) + self.server.interface = 'registry' + + +## +# Registries is a dictionary of registry connections keyed on the registry +# hrn + +class Registries(Interfaces): + + default_dict = {'registries': {'registry': [Interfaces.default_fields]}} + + def __init__(self, api, conf_file = "/etc/sfa/registries.xml"): + Interfaces.__init__(self, api, conf_file) + address = self.api.config.SFA_REGISTRY_HOST + port = self.api.config.SFA_REGISTRY_PORT + url = 'http://%(address)s:%(port)s' % locals() + local_registry = {'hrn': self.api.hrn, + 'urn': hrn_to_urn(self.api.hrn, 'authority'), + 'addr': address, + 'port': port, + 'url': url} + self.interfaces[self.api.hrn] = local_registry + + # get connections + self.update(self.get_connections()) diff --git a/sfa/server/sfa-ca.py b/sfa/server/sfa-ca.py new file mode 100755 index 00000000..c76b9857 --- /dev/null +++ b/sfa/server/sfa-ca.py @@ -0,0 +1,242 @@ +#!/usr/bin/python + +# +# SFA Certificate Signing and management +# + +import os +import sys +from optparse import OptionParser +from sfa.trust.certificate import Keypair, Certificate +from sfa.trust.gid import GID, create_uuid +from sfa.trust.hierarchy import Hierarchy +from sfa.util.config import Config +from collections import defaultdict + +def main(): + args = sys.argv + script_name = args[0] + parser = OptionParser(usage="%(script_name)s [options]" % locals()) + parser.add_option("-d", "--display", dest="display", default=None, + help="print contents of specified gid") + parser.add_option("-s", "--sign", dest="sign", default=None, + help="gid to sign" ) + parser.add_option("-k", "--key", dest="key", default=None, + help="keyfile to use for signing") + parser.add_option("-a", "--authority", dest="authority", default=None, + help="sign the gid using the specified authority ") + parser.add_option("-i", "--import", dest="importgid", default=None, + help="gid file to import into the registry") + parser.add_option("-e", "--export", dest="export", + help="name of gid to export from registry") + parser.add_option("-o", "--outfile", dest="outfile", + help="where to write the exprted gid") + parser.add_option("-v", "--verbose", dest="verbose", default=False, + action="store_true", help="be verbose") + + (options, args) = parser.parse_args() + + + if options.display: + display(options) + elif options.sign: + sign(options) + elif options.importgid: + import_gid(options) + elif options.export: + export_gid(options) + else: + parser.print_help() + sys.exit(1) + + +def display(options): + """ + Display the sepcified GID + """ + gidfile = os.path.abspath(options.display) + if not gidfile or not os.path.isfile(gidfile): + print "No such gid: %s" % gidfile + sys.exit(1) + gid = GID(filename=gidfile) + gid.dump(dump_parents=True) + +def sign_gid(gid, parent_key, parent_gid): + gid.set_issuer(parent_key, parent_gid.get_hrn()) + gid.set_parent(parent_gid) + gid.sign() + return gid + +def sign(options): + """ + Sign the specified gid + """ + hierarchy = Hierarchy() + config = Config() + default_authority = config.SFA_INTERFACE_HRN + auth_info = hierarchy.get_auth_info(default_authority) + + # load the gid + gidfile = os.path.abspath(options.sign) + if not os.path.isfile(gidfile): + print "no such gid: %s" % gidfile + sys.exit(1) + gid = GID(filename=gidfile) + + # remove previous parent + gid = GID(string=gid.save_to_string(save_parents=False)) + + # load the parent private info + authority = options.authority + # if no pkey was specified, then use the this authority's key + if not authority: + authority = default_authority + + if not hierarchy.auth_exists(authority): + print "no such authority: %s" % authority + + # load the parent gid and key + auth_info = hierarchy.get_auth_info(authority) + pkeyfile = auth_info.privkey_filename + parent_key = Keypair(filename=pkeyfile) + parent_gid = auth_info.gid_object + + # get the outfile + outfile = options.outfile + if not outfile: + outfile = os.path.abspath('./signed-%s.gid' % gid.get_hrn()) + + # check if gid already has a parent + + # sign the gid + if options.verbose: + print "Signing %s gid with parent %s" % \ + (gid.get_hrn(), parent_gid.get_hrn()) + gid = sign_gid(gid, parent_key, parent_gid) + # save the signed gid + if options.verbose: + print "Writing signed gid %s" % outfile + gid.save_to_file(outfile, save_parents=True) + + +def export_gid(options): + from sfa.util.table import SfaTable + # lookup the record for the specified hrn + hrn = options.export + + # check sfa table first + table = SfaTable() + records = table.find({'hrn': hrn, type: 'authority'}) + if not records: + # check the authorities hierarchy + hierarchy = Hierarchy() + try: + auth_info = hierarchy.get_auth_info() + gid = auth_info.gid_object + except: + print "Record: %s not found" % hrn + sys.exit(1) + else: + record = records[0] + gid = GID(string=record['gid']) + + # get the outfile + outfile = options.outfile + if not outfile: + outfile = os.path.abspath('./%s.gid' % gid.get_hrn()) + + # save it + if options.verbose: + print "Writing %s gid to %s" % (gid.get_hrn(), outfile) + gid.save_to_file(outfile, save_parents=True) + +def import_gid(options): + """ + Import the specified gid into the registry (db and authorities + hierarchy) overwriting any previous gid. + """ + from sfa.util.table import SfaTable + from sfa.util.record import SfaRecord + # load the gid + gidfile = os.path.abspath(options.importgid) + if not gidfile or not os.path.isfile(gidfile): + print "No such gid: %s" % gidfile + sys.exit(1) + gid = GID(filename=gidfile) + + # check if it exists within the hierarchy + hierarchy = Hierarchy() + if not hierarchy.auth_exists(gid.get_hrn()): + print "%s not found in hierarchy" % gid.get_hrn() + sys.exit(1) + + # check if record exists in db + table = SfaTable() + records = table.find({'hrn': gid.get_hrn(), 'type': 'authority'}) + if not records: + print "%s not found in record database" % get.get_hrn() + sys.exit(1) + + # update the database record + record = records[0] + record['gid'] = gid.save_to_string(save_parents=True) + table.update(record) + if options.verbose: + print "Imported %s gid into db" % record['hrn'] + + # update the hierarchy + auth_info = hierarchy.get_auth_info(gid.get_hrn()) + filename = auth_info.gid_filename + gid.save_to_file(filename, save_parents=True) + if options.verbose: + print "Writing %s gid to %s" % (gid.get_hrn(), filename) + + # re-sign all existing gids signed by this authority + # create a dictionary of records keyed on the record's authority + record_dict = defaultdict(list) + # only get regords that belong to this authority + # or any of its sub authorities + child_records = table.find({'hrn': '%s*' % gid.get_hrn()}) + if not child_records: + return + + for record in child_records: + record_dict[record['authority']].append(record) + + # start with the authority we just imported + authorities = [gid.get_hrn()] + while authorities: + next_authorities = [] + for authority in authorities: + # create a new signed gid for each record at this authority + # and update the registry + auth_info = hierarchy.get_auth_info(authority) + records = record_dict[authority] + for record in records: + record_gid = GID(string=record['gid']) + parent_pkey = Keypair(filename=auth_info.privkey_filename) + parent_gid = GID(filename=auth_info.gid_filename) + if options.verbose: + print "re-signing %s gid with parent %s" % \ + (record['hrn'], parent_gid.get_hrn()) + signed_gid = sign_gid(record_gid, parent_pkey, parent_gid) + record['gid'] = signed_gid.save_to_string(save_parents=True) + table.update(record) + + # if this is an authority then update the hierarchy + if record['type'] == 'authority': + record_info = hierarchy.get_auth_info(record['hrn']) + if options.verbose: + print "Writing %s gid to %s" % (record['hrn'], record_info.gid_filename) + signed_gid.save_to_file(filename=record_info.gid_filename, save_parents=True) + + # update list of next authorities + tmp_authorities = set([record['hrn'] for record in records \ + if record['type'] == 'authority']) + next_authorities.extend(tmp_authorities) + + # move on to next set of authorities + authorities = next_authorities + +if __name__ == '__main__': + main() diff --git a/sfa/server/sfa-clean-peer-records.py b/sfa/server/sfa-clean-peer-records.py new file mode 100644 index 00000000..5edb3f36 --- /dev/null +++ b/sfa/server/sfa-clean-peer-records.py @@ -0,0 +1,79 @@ +#!/usr/bin/python + +import sys +import os +import traceback +from sfa.util.namespace import * +from sfa.util.table import SfaTable +from sfa.util.prefixTree import prefixTree +from sfa.plc.api import SfaAPI +from sfa.util.config import Config +from sfa.trust.certificate import Keypair +from sfa.trust.hierarchy import Hierarchy +from sfa.util.report import trace, error +from sfa.server.registry import Registries +import sfa.util.xmlrpcprotocol as xmlrpcprotocol +import socket + +def main(): + config = Config() + if not config.SFA_REGISTRY_ENABLED: + sys.exit(0) + + # Get the path to the sfa server key/cert files from + # the sfa hierarchy object + sfa_hierarchy = Hierarchy() + sfa_key_path = sfa_hierarchy.basedir + key_file = os.path.join(sfa_key_path, "server.key") + cert_file = os.path.join(sfa_key_path, "server.cert") + key = Keypair(filename=key_file) + + # get a connection to our local sfa registry + # and a valid credential + authority = config.SFA_INTERFACE_HRN + url = 'http://%s:%s/' %(config.SFA_REGISTRY_HOST, config.SFA_REGISTRY_PORT) + registry = xmlrpcprotocol.get_server(url, key_file, cert_file) + sfa_api = SfaAPI(key_file = key_file, cert_file = cert_file, interface='registry') + credential = sfa_api.getCredential() + + # get peer registries + registries = Registries(sfa_api) + tree = prefixTree() + tree.load(registries.keys()) + + # get local peer records + table = SfaTable() + peer_records = table.find({'~peer_authority': None}) + found_records = [] + hrn_dict = {} + for record in peer_records: + registry_hrn = tree.best_match(record['hrn']) + if registry_hrn not in hrn_dict: + hrn_dict[registry_hrn] = [] + hrn_dict[registry_hrn].append(record['hrn']) + + # attempt to resolve the record at the authoritative interface + for registry_hrn in hrn_dict: + if registry_hrn in registries: + records = [] + target_hrns = hrn_dict[registry_hrn] + try: + records = registries[registry_hrn].Resolve(target_hrns, credential) + found_records.extend([record['hrn'] for record in records]) + except ServerException: + # an exception will be thrown if the record doenst exist + # if so remove the record from the local registry + continue + except: + # this deosnt necessarily mean the records dont exist + # lets give them the benefit of the doubt here (for now) + found_records.extend(target_hrns) + traceback.print_exc() + + # remove what wasnt found + for peer_record in peer_records: + if peer_record['hrn'] not in found_records: + registries[sfa_api.hrn].Remove(peer_record['hrn'], credential, peer_record['type']) + +if __name__ == '__main__': + main() diff --git a/sfa/server/sfa-server.py b/sfa/server/sfa-server.py new file mode 100755 index 00000000..a9e9b457 --- /dev/null +++ b/sfa/server/sfa-server.py @@ -0,0 +1,221 @@ +#!/usr/bin/python +# +### $Id: sfa-server.py 18662 2010-08-24 16:53:40Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/server/sfa-server.py $ +# +# SFA PLC Wrapper +# +# This wrapper implements the SFA Registry and Slice Interfaces on PLC. +# Depending on command line options, it starts some combination of a +# Registry, an Aggregate Manager, and a Slice Manager. +# +# There are several items that need to be done before starting the wrapper +# server. +# +# NOTE: Many configuration settings, including the PLC maintenance account +# credentials, URI of the PLCAPI, and PLC DB URI and admin credentials are initialized +# from your MyPLC configuration (/etc/planetlab/plc_config*). Please make sure this information +# is up to date and accurate. +# +# 1) Import the existing planetlab database, creating the +# appropriate SFA records. This is done by running the "sfa-import-plc.py" tool. +# +# 2) Create a "trusted_roots" directory and place the certificate of the root +# authority in that directory. Given the defaults in sfa-import-plc.py, this +# certificate would be named "planetlab.gid". For example, +# +# mkdir trusted_roots; cp authorities/planetlab.gid trusted_roots/ +# +# TODO: Can all three servers use the same "registry" certificate? +## + +# TCP ports for the three servers +registry_port=12345 +aggregate_port=12346 +slicemgr_port=12347 +component_port=12346 +import os, os.path +import sys +from optparse import OptionParser +from sfa.trust.trustedroot import TrustedRootList +from sfa.trust.certificate import Keypair, Certificate +from sfa.trust.hierarchy import Hierarchy +from sfa.util.config import Config +from sfa.util.report import trace +from sfa.plc.api import SfaAPI +from sfa.server.registry import Registries +from sfa.server.aggregate import Aggregates + +# after http://www.erlenstar.demon.co.uk/unix/faq_2.html +def daemon(): + """Daemonize the current process.""" + if os.fork() != 0: os._exit(0) + os.setsid() + if os.fork() != 0: os._exit(0) + os.umask(0) + devnull = os.open(os.devnull, os.O_RDWR) + os.dup2(devnull, 0) + # xxx fixme - this is just to make sure that nothing gets stupidly lost - should use devnull + crashlog = os.open('/var/log/sfa.daemon', os.O_RDWR | os.O_APPEND | os.O_CREAT, 0644) + os.dup2(crashlog, 1) + os.dup2(crashlog, 2) + +def init_server_key(server_key_file, server_cert_file, config, hierarchy): + + subject = config.SFA_INTERFACE_HRN + # check if the server's private key exists. If it doesnt, + # get the right one from the authorities directory. If it cant be + # found in the authorities directory, generate a random one + if not os.path.exists(server_key_file): + hrn = config.SFA_INTERFACE_HRN.lower() + hrn_parts = hrn.split(".") + rel_key_path = hrn + pkey_filename = hrn+".pkey" + + # sub authority's have "." in their hrn. This must + # be converted to os.path separator + if len(hrn_parts) > 0: + rel_key_path = hrn.replace(".", os.sep) + pkey_filename= hrn_parts[-1]+".pkey" + + key_file = os.sep.join([hierarchy.basedir, rel_key_path, pkey_filename]) + if not os.path.exists(key_file): + # if it doesnt exist then this is probably a fresh interface + # with no records. Generate a random keypair for now + trace("server's public key not found in %s" % key_file) + trace("generating a random server key pair") + key = Keypair(create=True) + key.save_to_file(server_key_file) + cert = Certificate(subject=subject) + cert.set_issuer(key=key, subject=subject) + cert.set_pubkey(key) + cert.sign() + cert.save_to_file(server_cert_file, save_parents=True) + + else: + # the pkey was found in the authorites directory. lets + # copy it to where the server key should be and generate + # the cert + key = Keypair(filename=key_file) + key.save_to_file(server_key_file) + cert = Certificate(subject=subject) + cert.set_issuer(key=key, subject=subject) + cert.set_pubkey(key) + cert.sign() + cert.save_to_file(server_cert_file, save_parents=True) + + + # If private key exists and cert doesnt, recreate cert + if (os.path.exists(server_key_file)) and (not os.path.exists(server_cert_file)): + key = Keypair(filename=server_key_file) + cert = Certificate(subject=subject) + cert.set_issuer(key=key, subject=subject) + cert.set_pubkey(key) + cert.sign() + cert.save_to_file(server_cert_file) + +def init_server(options, config): + """ + Execute the init method defined in the manager file + """ + manager_base = 'sfa.managers' + if options.registry: + mgr_type = config.SFA_REGISTRY_TYPE + manager_module = manager_base + ".registry_manager_%s" % mgr_type + try: manager = __import__(manager_module, fromlist=[manager_base]) + except: manager = None + if manager and hasattr(manager, 'init_server'): + manager.init_server() + if options.am: + mgr_type = config.SFA_AGGREGATE_TYPE + manager_module = manager_base + ".aggregate_manager_%s" % mgr_type + try: manager = __import__(manager_module, fromlist=[manager_base]) + except: manager = None + if manager and hasattr(manager, 'init_server'): + manager.init_server() + if options.sm: + mgr_type = config.SFA_SM_TYPE + manager_module = manager_base + ".slice_manager_%s" % mgr_type + try: manager = __import__(manager_module, fromlist=[manager_base]) + except: manager = None + if manager and hasattr(manager, 'init_server'): + manager.init_server() + if options.cm: + mgr_type = config.SFA_CM_TYPE + manager_module = manager_base + ".component_manager_%s" % mgr_type + try: manager = __import__(manager_module, fromlist=[manager_base]) + except: manager = None + if manager and hasattr(manager, 'init_server'): + manager.init_server() + +def sync_interfaces(server_key_file, server_cert_file): + """ + Attempt to install missing trusted gids and db records for + our federated interfaces + """ + api = SfaAPI(key_file = server_key_file, cert_file = server_cert_file) + registries = Registries(api) + aggregates = Aggregates(api) + registries.sync_interfaces() + aggregates.sync_interfaces() + +def main(): + # xxx get rid of globals - name consistently CamelCase or under_score + global AuthHierarchy + global TrustedRoots + global registry_port + global aggregate_port + global slicemgr_port + + # Generate command line parser + parser = OptionParser(usage="sfa-server [options]") + parser.add_option("-r", "--registry", dest="registry", action="store_true", + help="run registry server", default=False) + parser.add_option("-s", "--slicemgr", dest="sm", action="store_true", + help="run slice manager", default=False) + parser.add_option("-a", "--aggregate", dest="am", action="store_true", + help="run aggregate manager", default=False) + parser.add_option("-c", "--component", dest="cm", action="store_true", + help="run component server", default=False) + parser.add_option("-v", "--verbose", dest="verbose", action="store_true", + help="verbose mode", default=False) + parser.add_option("-d", "--daemon", dest="daemon", action="store_true", + help="Run as daemon.", default=False) + (options, args) = parser.parse_args() + + + config = Config() + hierarchy = Hierarchy() + server_key_file = os.path.join(hierarchy.basedir, "server.key") + server_cert_file = os.path.join(hierarchy.basedir, "server.cert") + + init_server_key(server_key_file, server_cert_file, config, hierarchy) + init_server(options, config) + sync_interfaces(server_key_file, server_cert_file) + + if (options.daemon): daemon() + # start registry server + if (options.registry): + from sfa.server.registry import Registry + r = Registry("", registry_port, server_key_file, server_cert_file) + r.start() + + # start aggregate manager + if (options.am): + from sfa.server.aggregate import Aggregate + a = Aggregate("", aggregate_port, server_key_file, server_cert_file) + a.start() + + # start slice manager + if (options.sm): + from sfa.server.slicemgr import SliceMgr + s = SliceMgr("", slicemgr_port, server_key_file, server_cert_file) + s.start() + + if (options.cm): + from sfa.server.component import Component + c = Component("", component_port, server_key_file, server_cert_file) + c.start() + +if __name__ == "__main__": + main() diff --git a/sfa/server/sfa_component_setup.py b/sfa/server/sfa_component_setup.py new file mode 100755 index 00000000..628ae7a8 --- /dev/null +++ b/sfa/server/sfa_component_setup.py @@ -0,0 +1,311 @@ +#!/usr/bin/python +import sys +import os +import tempfile +from optparse import OptionParser +from sfa.util.config import Config +import sfa.util.xmlrpcprotocol as xmlrpcprotocol +from sfa.util.namespace import * +from sfa.util.faults import * +from sfa.trust.certificate import Keypair, Certificate +from sfa.trust.credential import Credential +from sfa.trust.gid import GID +from sfa.trust.hierarchy import Hierarchy + +KEYDIR = "/var/lib/sfa/" +CONFDIR = "/etc/sfa/" + +def handle_gid_mismatch_exception(f): + def wrapper(*args, **kwds): + try: return f(*args, **kwds) + except ConnectionKeyGIDMismatch: + # clean regen server keypair and try again + print "cleaning keys and trying again" + clean_key_cred() + return f(args, kwds) + + return wrapper + +def get_server(url=None, port=None, keyfile=None, certfile=None,verbose=False): + """ + returns an xmlrpc connection to the service a the specified + address + """ + if url: + url_parts = url.split(":") + if len(url_parts) >1: + pass + else: + url = "http://%(url)s:%(port)s" % locals() + else: + # connect to registry by default + config = Config() + addr, port = config.SFA_REGISTRY_HOST, config.SFA_REGISTRY_PORT + url = "http://%(addr)s:%(port)s" % locals() + + if verbose: + print "Contacting registry at: %(url)s" % locals() + + server = xmlrpcprotocol.get_server(url, keyfile, certfile) + return server + + +def create_default_dirs(): + config = Config() + hierarchy = Hierarchy() + config_dir = config.config_path + trusted_certs_dir = config.get_trustedroots_dir() + authorities_dir = hierarchy.basedir + all_dirs = [config_dir, trusted_certs_dir, authorities_dir] + for dir in all_dirs: + if not os.path.exists(dir): + os.makedirs(dir) + +def has_node_key(): + key_file = KEYDIR + os.sep + 'server.key' + return os.path.exists(key_file) + +def clean_key_cred(): + """ + remove the existing keypair and cred and generate new ones + """ + files = ["server.key", "server.cert", "node.cred"] + for f in files: + filepath = KEYDIR + os.sep + f + if os.path.isfile(filepath): + os.unlink(f) + + # install the new key pair + # get_credential will take care of generating the new keypair + # and credential + get_credential() + + +def get_node_key(registry=None, verbose=False): + # this call requires no authentication, + # so we can generate a random keypair here + subject="component" + (kfd, keyfile) = tempfile.mkstemp() + (cfd, certfile) = tempfile.mkstemp() + key = Keypair(create=True) + key.save_to_file(keyfile) + cert = Certificate(subject=subject) + cert.set_issuer(key=key, subject=subject) + cert.set_pubkey(key) + cert.sign() + cert.save_to_file(certfile) + + registry = get_server(url = registry, keyfile=keyfile, certfile=certfile) + registry.get_key() + +def create_server_keypair(keyfile=None, certfile=None, hrn="component", verbose=False): + """ + create the server key/cert pair in the right place + """ + key = Keypair(filename=keyfile) + key.save_to_file(keyfile) + cert = Certificate(subject=hrn) + cert.set_issuer(key=key, subject=hrn) + cert.set_pubkey(key) + cert.sign() + cert.save_to_file(certfile, save_parents=True) + +@handle_gid_mismatch_exception +def get_credential(registry=None, force=False, verbose=False): + config = Config() + hierarchy = Hierarchy() + key_dir= hierarchy.basedir + data_dir = config.data_path + config_dir = config.config_path + credfile = data_dir + os.sep + 'node.cred' + # check for existing credential + if not force and os.path.exists(credfile): + if verbose: + print "Loading Credential from %(credfile)s " % locals() + cred = Credential(filename=credfile).save_to_string(save_parents=True) + else: + if verbose: + print "Getting credential from registry" + # make sure node private key exists + node_pkey_file = config_dir + os.sep + "node.key" + node_gid_file = config_dir + os.sep + "node.gid" + if not os.path.exists(node_pkey_file) or \ + not os.path.exists(node_gid_file): + get_node_key(registry=registry, verbose=verbose) + + gid = GID(filename=node_gid_file) + hrn = gid.get_hrn() + # create server key and certificate + keyfile =data_dir + os.sep + "server.key" + certfile = data_dir + os.sep + "server.cert" + key = Keypair(filename=node_pkey_file) + key.save_to_file(keyfile) + create_server_keypair(keyfile, certfile, hrn, verbose) + + # get credential from registry + registry = get_server(url=registry, keyfile=keyfile, certfile=certfile) + cert = Certificate(filename=certfile) + cert_str = cert.save_to_string(save_parents=True) + cred = registry.GetSelfCredential(cert_str, hrn, 'node') + Credential(string=cred).save_to_file(credfile, save_parents=True) + + return cred + +@handle_gid_mismatch_exception +def get_trusted_certs(registry=None, verbose=False): + """ + refresh our list of trusted certs. + """ + # define useful variables + config = Config() + data_dir = config.SFA_DATA_DIR + config_dir = config.SFA_CONFIG_DIR + trusted_certs_dir = config.get_trustedroots_dir() + keyfile = data_dir + os.sep + "server.key" + certfile = data_dir + os.sep + "server.cert" + node_gid_file = config_dir + os.sep + "node.gid" + node_gid = GID(filename=node_gid_file) + hrn = node_gid.get_hrn() + # get credential + cred = get_credential(registry=registry, verbose=verbose) + # make sure server key cert pair exists + create_server_keypair(keyfile=keyfile, certfile=certfile, hrn=hrn, verbose=verbose) + registry = get_server(url=registry, keyfile=keyfile, certfile=certfile) + # get the trusted certs and save them in the right place + if verbose: + print "Getting trusted certs from registry" + trusted_certs = registry.get_trusted_certs(cred) + trusted_gid_names = [] + for gid_str in trusted_certs: + gid = GID(string=gid_str) + gid.decode() + relative_filename = gid.get_hrn() + ".gid" + trusted_gid_names.append(relative_filename) + gid_filename = trusted_certs_dir + os.sep + relative_filename + if verbose: + print "Writing GID for %s as %s" % (gid.get_hrn(), gid_filename) + gid.save_to_file(gid_filename, save_parents=True) + + # remove old certs + all_gids_names = os.listdir(trusted_certs_dir) + for gid_name in all_gids_names: + if gid_name not in trusted_gid_names: + if verbose: + print "Removing old gid ", gid_name + os.unlink(trusted_certs_dir + os.sep + gid_name) + +@handle_gid_mismatch_exception +def get_gids(registry=None, verbose=False): + """ + Get the gid for all instantiated slices on this node and store it + in /etc/sfa/slice.gid in the slice's filesystem + """ + # define useful variables + config = Config() + data_dir = config.data_path + config_dir = config.SFA_CONFIG_DIR + trusted_certs_dir = config.get_trustedroots_dir() + keyfile = data_dir + os.sep + "server.key" + certfile = data_dir + os.sep + "server.cert" + node_gid_file = config_dir + os.sep + "node.gid" + node_gid = GID(filename=node_gid_file) + hrn = node_gid.get_hrn() + interface_hrn = config.SFA_INTERFACE_HRN + # get credential + cred = get_credential(registry=registry, verbose=verbose) + # make sure server key cert pair exists + create_server_keypair(keyfile=keyfile, certfile=certfile, hrn=hrn, verbose=verbose) + registry = get_server(url=registry, keyfile=keyfile, certfile=certfile) + + if verbose: + print "Getting current slices on this node" + # get a list of slices on this node + from sfa.plc.api import ComponentAPI + api = ComponentAPI() + xids_tuple = api.nodemanager.GetXIDs() + slices = eval(xids_tuple[1]) + slicenames = slices.keys() + + # generate a list of slices that dont have gids installed + slices_without_gids = [] + for slicename in slicenames: + if not os.path.isfile("/vservers/%s/etc/slice.gid" % slicename) \ + or not os.path.isfile("/vservers/%s/etc/node.gid" % slicename): + slices_without_gids.append(slicename) + + # convert slicenames to hrns + hrns = [slicename_to_hrn(interface_hrn, slicename) \ + for slicename in slices_without_gids] + + # exit if there are no gids to install + if not hrns: + return + + if verbose: + print "Getting gids for slices on this node from registry" + # get the gids + # and save them in the right palce + records = registry.GetGids(hrns, cred) + for record in records: + # if this isnt a slice record skip it + if not record['type'] == 'slice': + continue + slicename = hrn_to_pl_slicename(record['hrn']) + # if this slice isnt really instatiated skip it + if not os.path.exists("/vservers/%(slicename)s" % locals()): + continue + + # save the slice gid in /etc/sfa/ in the vservers filesystem + vserver_path = "/vservers/%(slicename)s" % locals() + gid = record['gid'] + slice_gid_filename = os.sep.join([vserver_path, "etc", "slice.gid"]) + if verbose: + print "Saving GID for %(slicename)s as %(slice_gid_filename)s" % locals() + GID(string=gid).save_to_file(slice_gid_filename, save_parents=True) + # save the node gid in /etc/sfa + node_gid_filename = os.sep.join([vserver_path, "etc", "node.gid"]) + if verbose: + print "Saving node GID for %(slicename)s as %(node_gid_filename)s" % locals() + node_gid.save_to_file(node_gid_filename, save_parents=True) + + +def dispatch(options, args): + + create_default_dirs() + if options.key: + if options.verbose: + print "Getting the component's pkey" + get_node_key(registry=options.registry, verbose=options.verbose) + if options.certs: + if options.verbose: + print "Getting the component's trusted certs" + get_trusted_certs(verbose=options.verbose) + if options.gids: + if options.verbose: + print "Geting the component's GIDs" + get_gids(verbose=options.verbose) + +def main(): + args = sys.argv + prog_name = args[0] + parser = OptionParser(usage="%(prog_name)s [options]" % locals()) + parser.add_option("-v", "--verbose", dest="verbose", action="store_true", + default=False, help="Be verbose") + parser.add_option("-r", "--registry", dest="registry", default=None, + help="Url of registry to contact") + parser.add_option("-k", "--key", dest="key", action="store_true", + default=False, + help="Get the node's pkey from the registry") + parser.add_option("-c", "--certs", dest="certs", action="store_true", + default=False, + help="Get the trusted certs from the registry") + parser.add_option("-g", "--gids", dest="gids", action="store_true", + default=False, + help="Get gids for all the slices on the component") + + (options, args) = parser.parse_args() + + dispatch(options, args) + +if __name__ == '__main__': + main() diff --git a/sfa/server/slicemgr.py b/sfa/server/slicemgr.py new file mode 100644 index 00000000..2f706275 --- /dev/null +++ b/sfa/server/slicemgr.py @@ -0,0 +1,23 @@ +### $Id: slicemgr.py 16477 2010-01-05 16:31:37Z thierry $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/server/slicemgr.py $ + +import os +import sys +import datetime +import time +from sfa.util.server import * + +class SliceMgr(SfaServer): + + + ## + # Create a new slice manager object. + # + # @param ip the ip address to listen on + # @param port the port to listen on + # @param key_file private key filename of registry + # @param cert_file certificate filename containing public key (could be a GID file) + + def __init__(self, ip, port, key_file, cert_file, config = "/etc/sfa/sfa_config"): + SfaServer.__init__(self, ip, port, key_file, cert_file) + self.server.interface = 'slicemgr' diff --git a/sfa/trust/__init__.py b/sfa/trust/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfa/trust/auth.py b/sfa/trust/auth.py new file mode 100644 index 00000000..17f3ec81 --- /dev/null +++ b/sfa/trust/auth.py @@ -0,0 +1,321 @@ +# +# SfaAPI authentication +# +### $Id: auth.py 18648 2010-08-20 22:29:27Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/trust/auth.py $ +# + + +from sfa.trust.certificate import Keypair, Certificate +from sfa.trust.credential import Credential +from sfa.trust.trustedroot import TrustedRootList +from sfa.util.faults import * +from sfa.trust.hierarchy import Hierarchy +from sfa.util.config import * +from sfa.util.namespace import * +from sfa.util.sfaticket import * +from sfa.util.sfalogging import logger +import sys + +class Auth: + """ + Credential based authentication + """ + + def __init__(self, peer_cert = None, config = None ): + self.peer_cert = peer_cert + self.hierarchy = Hierarchy() + if not config: + self.config = Config() + self.load_trusted_certs() + + def load_trusted_certs(self): + self.trusted_cert_list = TrustedRootList(self.config.get_trustedroots_dir()).get_list() + self.trusted_cert_file_list = TrustedRootList(self.config.get_trustedroots_dir()).get_file_list() + + + + def checkCredentials(self, creds, operation, hrn = None): + valid = [] + if not isinstance(creds, list): + creds = [creds] + for cred in creds: + try: + self.check(cred, operation, hrn) + valid.append(cred) + except: + error = sys.exc_info()[:2] + continue + + if not len(valid): + raise InsufficientRights('Access denied: %s -- %s' % (error[0],error[1])) + + return valid + + + def check(self, cred, operation, hrn = None): + """ + Check the credential against the peer cert (callerGID included + in the credential matches the caller that is connected to the + HTTPS connection, check if the credential was signed by a + trusted cert and check if the credential is allowd to perform + the specified operation. + """ + self.client_cred = Credential(string = cred) + self.client_gid = self.client_cred.get_gid_caller() + self.object_gid = self.client_cred.get_gid_object() + + # make sure the client_gid is not blank + if not self.client_gid: + raise MissingCallerGID(self.client_cred.get_subject()) + + # validate the client cert if it exists + if self.peer_cert: + self.verifyPeerCert(self.peer_cert, self.client_gid) + + # make sure the client is allowed to perform the operation + if operation: + if not self.client_cred.can_perform(operation): + raise InsufficientRights(operation) + + if self.trusted_cert_list: + self.client_cred.verify(self.trusted_cert_file_list) + else: + raise MissingTrustedRoots(self.config.get_trustedroots_dir()) + + # Make sure the credential's target matches the specified hrn. + # This check does not apply to trusted peers + trusted_peers = [gid.get_hrn() for gid in self.trusted_cert_list] + if hrn and self.client_gid.get_hrn() not in trusted_peers: + target_hrn = self.object_gid.get_hrn() + if not hrn == target_hrn: + raise PermissionError("Target hrn: %s doesn't match specified hrn: %s " % \ + (target_hrn, hrn) ) + return True + + def check_ticket(self, ticket): + """ + Check if the tickt was signed by a trusted cert + """ + if self.trusted_cert_list: + client_ticket = SfaTicket(string=ticket) + client_ticket.verify_chain(self.trusted_cert_list) + else: + raise MissingTrustedRoots(self.config.get_trustedroots_dir()) + + return True + + def verifyPeerCert(self, cert, gid): + # make sure the client_gid matches client's certificate + if not cert.is_pubkey(gid.get_pubkey()): + raise ConnectionKeyGIDMismatch(gid.get_subject()+":"+cert.get_subject()) + + def verifyGidRequestHash(self, gid, hash, arglist): + key = gid.get_pubkey() + if not key.verify_string(str(arglist), hash): + raise BadRequestHash(hash) + + def verifyCredRequestHash(self, cred, hash, arglist): + gid = cred.get_gid_caller() + self.verifyGidRequestHash(gid, hash, arglist) + + def validateGid(self, gid): + if self.trusted_cert_list: + gid.verify_chain(self.trusted_cert_list) + + def validateCred(self, cred): + if self.trusted_cert_list: + cred.verify(self.trusted_cert_file_list) + + def authenticateGid(self, gidStr, argList, requestHash=None): + gid = GID(string = gidStr) + self.validateGid(gid) + # request_hash is optional + if requestHash: + self.verifyGidRequestHash(gid, requestHash, argList) + return gid + + def authenticateCred(self, credStr, argList, requestHash=None): + cred = Credential(string = credStr) + self.validateCred(cred) + # request hash is optional + if requestHash: + self.verifyCredRequestHash(cred, requestHash, argList) + return cred + + def authenticateCert(self, certStr, requestHash): + cert = Certificate(string=certStr) + self.validateCert(self, cert) + + def gidNoop(self, gidStr, value, requestHash): + self.authenticateGid(gidStr, [gidStr, value], requestHash) + return value + + def credNoop(self, credStr, value, requestHash): + self.authenticateCred(credStr, [credStr, value], requestHash) + return value + + def verify_cred_is_me(self, credential): + is_me = False + cred = Credential(string=credential) + caller_gid = cred.get_gid_caller() + caller_hrn = caller_gid.get_hrn() + if caller_hrn != self.config.SFA_INTERFACE_HRN: + raise SfaPermissionDenied(self.config.SFA_INTEFACE_HRN) + + return + + def get_auth_info(self, auth_hrn): + """ + Given an authority name, return the information for that authority. + This is basically a stub that calls the hierarchy module. + + @param auth_hrn human readable name of authority + """ + + return self.hierarchy.get_auth_info(auth_hrn) + + + def veriry_auth_belongs_to_me(self, name): + """ + Verify that an authority belongs to our hierarchy. + This is basically left up to the implementation of the hierarchy + module. If the specified name does not belong, ane exception is + thrown indicating the caller should contact someone else. + + @param auth_name human readable name of authority + """ + + # get auth info will throw an exception if the authority doesnt exist + self.get_auth_info(name) + + + def verify_object_belongs_to_me(self, name): + """ + Verify that an object belongs to our hierarchy. By extension, + this implies that the authority that owns the object belongs + to our hierarchy. If it does not an exception is thrown. + + @param name human readable name of object + """ + auth_name = self.get_authority(name) + if not auth_name: + auth_name = name + if name == self.config.SFA_INTERFACE_HRN: + return + self.verify_auth_belongs_to_me(auth_name) + + def verify_auth_belongs_to_me(self, name): + # get auth info will throw an exception if the authority doesnt exist + self.get_auth_info(name) + + + def verify_object_permission(self, name): + """ + Verify that the object gid that was specified in the credential + allows permission to the object 'name'. This is done by a simple + prefix test. For example, an object_gid for plc.arizona would + match the objects plc.arizona.slice1 and plc.arizona. + + @param name human readable name to test + """ + object_hrn = self.object_gid.get_hrn() + if object_hrn == name: + return + if name.startswith(object_hrn + "."): + return + #if name.startswith(get_authority(name)): + #return + + raise PermissionError(name) + + def determine_user_rights(self, caller_hrn, record): + """ + Given a user credential and a record, determine what set of rights the + user should have to that record. + + This is intended to replace determine_rights() and + verify_cancreate_credential() + """ + + rl = RightList() + type = record['type'] + + + if type=="slice": + researchers = record.get("researcher", []) + pis = record.get("PI", []) + if (caller_hrn in researchers + pis): + rl.add("refresh") + rl.add("embed") + rl.add("bind") + rl.add("control") + rl.add("info") + + elif type == "authority": + pis = record.get("PI", []) + operators = record.get("operator", []) + if (caller_hrn == self.config.SFA_INTERFACE_HRN): + rl.add("authority") + rl.add("sa") + rl.add("ma") + if (caller_hrn in pis): + rl.add("authority") + rl.add("sa") + if (caller_hrn in operators): + rl.add("authority") + rl.add("ma") + + elif type == "user": + rl.add("refresh") + rl.add("resolve") + rl.add("info") + + elif type == "node": + rl.add("operator") + + return rl + + def verify_cancreate_credential(self, src_cred, record): + """ + Verify that a user can retrive a particular type of credential. + For slices, the user must be on the researcher list. For SA and + MA the user must be on the pi and operator lists respectively + """ + + type = record.get_type() + cred_object_hrn = src_cred.get_gid_object().get_hrn() + if cred_object_hrn in [self.config.SFA_REGISTRY_ROOT_AUTH]: + return + if type=="slice": + researchers = record.get("researcher", []) + if not (cred_object_hrn in researchers): + raise PermissionError(cred_object_hrn + " is not in researcher list for " + record.get_name()) + elif type == "sa": + pis = record.get("pi", []) + if not (cred_object_hrn in pis): + raise PermissionError(cred_object_hrn + " is not in pi list for " + record.get_name()) + elif type == "ma": + operators = record.get("operator", []) + if not (cred_object_hrn in operators): + raise PermissionError(cred_object_hrn + " is not in operator list for " + record.get_name()) + + def get_authority(self, hrn): + return get_authority(hrn) + + def filter_creds_by_caller(self, creds, caller_hrn): + """ + Returns a list of creds who's gid caller matches the + specified caller hrn + """ + if not isinstance(creds, list): + creds = [creds] + creds = [] + for cred in creds: + try: + tmp_cred = Credential(string=cred) + if tmp_cred.get_gid_caller().get_hrn() == caller_hrn: + creds.append(cred) + except: pass + return creds + diff --git a/sfa/trust/certificate.py b/sfa/trust/certificate.py new file mode 100644 index 00000000..2d33cff0 --- /dev/null +++ b/sfa/trust/certificate.py @@ -0,0 +1,604 @@ +#---------------------------------------------------------------------- +# Copyright (c) 2008 Board of Trustees, Princeton University +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and/or hardware specification (the "Work") to +# deal in the Work without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Work, and to permit persons to whom the Work +# is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Work. +# +# THE WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE WORK OR THE USE OR OTHER DEALINGS +# IN THE WORK. +#---------------------------------------------------------------------- + +## +# SFA uses two crypto libraries: pyOpenSSL and M2Crypto to implement +# the necessary crypto functionality. Ideally just one of these libraries +# would be used, but unfortunately each of these libraries is independently +# lacking. The pyOpenSSL library is missing many necessary functions, and +# the M2Crypto library has crashed inside of some of the functions. The +# design decision is to use pyOpenSSL whenever possible as it seems more +# stable, and only use M2Crypto for those functions that are not possible +# in pyOpenSSL. +# +# This module exports two classes: Keypair and Certificate. +## +# +### $Id: certificate.py 18513 2010-07-14 17:00:23Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/trust/certificate.py $ +# + +import os +import tempfile +import base64 +import traceback +from OpenSSL import crypto +import M2Crypto +from M2Crypto import X509 +from tempfile import mkstemp +from sfa.util.sfalogging import logger +from sfa.util.namespace import urn_to_hrn +from sfa.util.faults import * + +def convert_public_key(key): + keyconvert_path = "/usr/bin/keyconvert.py" + if not os.path.isfile(keyconvert_path): + raise IOError, "Could not find keyconvert in %s" % keyconvert_path + + # we can only convert rsa keys + if "ssh-dss" in key: + return None + + (ssh_f, ssh_fn) = tempfile.mkstemp() + ssl_fn = tempfile.mktemp() + os.write(ssh_f, key) + os.close(ssh_f) + + cmd = keyconvert_path + " " + ssh_fn + " " + ssl_fn + os.system(cmd) + + # this check leaves the temporary file containing the public key so + # that it can be expected to see why it failed. + # TODO: for production, cleanup the temporary files + if not os.path.exists(ssl_fn): + return None + + k = Keypair() + try: + k.load_pubkey_from_file(ssl_fn) + except: + traceback.print_exc() + k = None + + # remove the temporary files + os.remove(ssh_fn) + os.remove(ssl_fn) + + return k + +## +# Public-private key pairs are implemented by the Keypair class. +# A Keypair object may represent both a public and private key pair, or it +# may represent only a public key (this usage is consistent with OpenSSL). + +class Keypair: + key = None # public/private keypair + m2key = None # public key (m2crypto format) + + ## + # Creates a Keypair object + # @param create If create==True, creates a new public/private key and + # stores it in the object + # @param string If string!=None, load the keypair from the string (PEM) + # @param filename If filename!=None, load the keypair from the file + + def __init__(self, create=False, string=None, filename=None): + if create: + self.create() + if string: + self.load_from_string(string) + if filename: + self.load_from_file(filename) + + ## + # Create a RSA public/private key pair and store it inside the keypair object + + def create(self): + self.key = crypto.PKey() + self.key.generate_key(crypto.TYPE_RSA, 1024) + + ## + # Save the private key to a file + # @param filename name of file to store the keypair in + + def save_to_file(self, filename): + open(filename, 'w').write(self.as_pem()) + + ## + # Load the private key from a file. Implicity the private key includes the public key. + + def load_from_file(self, filename): + buffer = open(filename, 'r').read() + self.load_from_string(buffer) + + ## + # Load the private key from a string. Implicitly the private key includes the public key. + + def load_from_string(self, string): + self.key = crypto.load_privatekey(crypto.FILETYPE_PEM, string) + self.m2key = M2Crypto.EVP.load_key_string(string) + + ## + # Load the public key from a string. No private key is loaded. + + def load_pubkey_from_file(self, filename): + # load the m2 public key + m2rsakey = M2Crypto.RSA.load_pub_key(filename) + self.m2key = M2Crypto.EVP.PKey() + self.m2key.assign_rsa(m2rsakey) + + # create an m2 x509 cert + m2name = M2Crypto.X509.X509_Name() + m2name.add_entry_by_txt(field="CN", type=0x1001, entry="junk", len=-1, loc=-1, set=0) + m2x509 = M2Crypto.X509.X509() + m2x509.set_pubkey(self.m2key) + m2x509.set_serial_number(0) + m2x509.set_issuer_name(m2name) + m2x509.set_subject_name(m2name) + ASN1 = M2Crypto.ASN1.ASN1_UTCTIME() + ASN1.set_time(500) + m2x509.set_not_before(ASN1) + m2x509.set_not_after(ASN1) + junk_key = Keypair(create=True) + m2x509.sign(pkey=junk_key.get_m2_pkey(), md="sha1") + + # convert the m2 x509 cert to a pyopenssl x509 + m2pem = m2x509.as_pem() + pyx509 = crypto.load_certificate(crypto.FILETYPE_PEM, m2pem) + + # get the pyopenssl pkey from the pyopenssl x509 + self.key = pyx509.get_pubkey() + + ## + # Load the public key from a string. No private key is loaded. + + def load_pubkey_from_string(self, string): + (f, fn) = tempfile.mkstemp() + os.write(f, string) + os.close(f) + self.load_pubkey_from_file(fn) + os.remove(fn) + + ## + # Return the private key in PEM format. + + def as_pem(self): + return crypto.dump_privatekey(crypto.FILETYPE_PEM, self.key) + + ## + # Return an M2Crypto key object + + def get_m2_pkey(self): + if not self.m2key: + self.m2key = M2Crypto.EVP.load_key_string(self.as_pem()) + return self.m2key + + ## + # Returns a string containing the public key represented by this object. + + def get_pubkey_string(self): + m2pkey = self.get_m2_pkey() + return base64.b64encode(m2pkey.as_der()) + + ## + # Return an OpenSSL pkey object + + def get_openssl_pkey(self): + return self.key + + + ## + # Given another Keypair object, return TRUE if the two keys are the same. + + def is_same(self, pkey): + return self.as_pem() == pkey.as_pem() + + def sign_string(self, data): + k = self.get_m2_pkey() + k.sign_init() + k.sign_update(data) + return base64.b64encode(k.sign_final()) + + def verify_string(self, data, sig): + k = self.get_m2_pkey() + k.verify_init() + k.verify_update(data) + return M2Crypto.m2.verify_final(k.ctx, base64.b64decode(sig), k.pkey) + + def compute_hash(self, value): + return self.sign_string(str(value)) + +## +# The certificate class implements a general purpose X509 certificate, making +# use of the appropriate pyOpenSSL or M2Crypto abstractions. It also adds +# several addition features, such as the ability to maintain a chain of +# parent certificates, and storage of application-specific data. +# +# Certificates include the ability to maintain a chain of parents. Each +# certificate includes a pointer to it's parent certificate. When loaded +# from a file or a string, the parent chain will be automatically loaded. +# When saving a certificate to a file or a string, the caller can choose +# whether to save the parent certificates as well. + +class Certificate: + digest = "md5" + + cert = None + issuerKey = None + issuerSubject = None + parent = None + + separator="-----parent-----" + + ## + # Create a certificate object. + # + # @param create If create==True, then also create a blank X509 certificate. + # @param subject If subject!=None, then create a blank certificate and set + # it's subject name. + # @param string If string!=None, load the certficate from the string. + # @param filename If filename!=None, load the certficiate from the file. + + def __init__(self, create=False, subject=None, string=None, filename=None, intermediate=None): + self.data = {} + if create or subject: + self.create() + if subject: + self.set_subject(subject) + if string: + self.load_from_string(string) + if filename: + self.load_from_file(filename) + + if intermediate: + self.set_intermediate_ca(intermediate) + + ## + # Create a blank X509 certificate and store it in this object. + + def create(self): + self.cert = crypto.X509() + self.cert.set_serial_number(3) + self.cert.gmtime_adj_notBefore(0) + self.cert.gmtime_adj_notAfter(60*60*24*365*5) # five years + + ## + # Given a pyOpenSSL X509 object, store that object inside of this + # certificate object. + + def load_from_pyopenssl_x509(self, x509): + self.cert = x509 + + ## + # Load the certificate from a string + + def load_from_string(self, string): + # if it is a chain of multiple certs, then split off the first one and + # load it (support for the ---parent--- tag as well as normal chained certs) + + string = string.strip() + + + if not string.startswith('-----'): + string = '-----BEGIN CERTIFICATE-----\n%s\n-----END CERTIFICATE-----' % string + + parts = [] + + if string.count('-----BEGIN CERTIFICATE-----') > 1 and \ + string.count(Certificate.separator) == 0: + parts = string.split('-----END CERTIFICATE-----',1) + parts[0] += '-----END CERTIFICATE-----' + else: + parts = string.split(Certificate.separator, 1) + + self.cert = crypto.load_certificate(crypto.FILETYPE_PEM, parts[0]) + + # if there are more certs, then create a parent and let the parent load + # itself from the remainder of the string + if len(parts) > 1 and parts[1] != '': + self.parent = self.__class__() + self.parent.load_from_string(parts[1]) + + ## + # Load the certificate from a file + + def load_from_file(self, filename): + file = open(filename) + string = file.read() + self.load_from_string(string) + + ## + # Save the certificate to a string. + # + # @param save_parents If save_parents==True, then also save the parent certificates. + + def save_to_string(self, save_parents=True): + string = crypto.dump_certificate(crypto.FILETYPE_PEM, self.cert) + if save_parents and self.parent: + string = string + self.parent.save_to_string(save_parents) + return string + + ## + # Save the certificate to a file. + # @param save_parents If save_parents==True, then also save the parent certificates. + + def save_to_file(self, filename, save_parents=True, filep=None): + string = self.save_to_string(save_parents=save_parents) + if filep: + f = filep + else: + f = open(filename, 'w') + f.write(string) + f.close() + + ## + # Save the certificate to a random file in /tmp/ + # @param save_parents If save_parents==True, then also save the parent certificates. + def save_to_random_tmp_file(self, save_parents=True): + fp, filename = mkstemp(suffix='cert', text=True) + fp = os.fdopen(fp, "w") + self.save_to_file(filename, save_parents=True, filep=fp) + return filename + + ## + # Sets the issuer private key and name + # @param key Keypair object containing the private key of the issuer + # @param subject String containing the name of the issuer + # @param cert (optional) Certificate object containing the name of the issuer + + def set_issuer(self, key, subject=None, cert=None): + self.issuerKey = key + if subject: + # it's a mistake to use subject and cert params at the same time + assert(not cert) + if isinstance(subject, dict) or isinstance(subject, str): + req = crypto.X509Req() + reqSubject = req.get_subject() + if (isinstance(subject, dict)): + for key in reqSubject.keys(): + setattr(reqSubject, key, subject[key]) + else: + setattr(reqSubject, "CN", subject) + subject = reqSubject + # subject is not valid once req is out of scope, so save req + self.issuerReq = req + if cert: + # if a cert was supplied, then get the subject from the cert + subject = cert.cert.get_subject() + assert(subject) + self.issuerSubject = subject + + ## + # Get the issuer name + + def get_issuer(self, which="CN"): + x = self.cert.get_issuer() + return getattr(x, which) + + ## + # Set the subject name of the certificate + + def set_subject(self, name): + req = crypto.X509Req() + subj = req.get_subject() + if (isinstance(name, dict)): + for key in name.keys(): + setattr(subj, key, name[key]) + else: + setattr(subj, "CN", name) + self.cert.set_subject(subj) + ## + # Get the subject name of the certificate + + def get_subject(self, which="CN"): + x = self.cert.get_subject() + return getattr(x, which) + + ## + # Get the public key of the certificate. + # + # @param key Keypair object containing the public key + + def set_pubkey(self, key): + assert(isinstance(key, Keypair)) + self.cert.set_pubkey(key.get_openssl_pkey()) + + ## + # Get the public key of the certificate. + # It is returned in the form of a Keypair object. + + def get_pubkey(self): + m2x509 = X509.load_cert_string(self.save_to_string()) + pkey = Keypair() + pkey.key = self.cert.get_pubkey() + pkey.m2key = m2x509.get_pubkey() + return pkey + + def set_intermediate_ca(self, val): + self.intermediate = val + if val: + self.add_extension('basicConstraints', 1, 'CA:TRUE') + + + + ## + # Add an X509 extension to the certificate. Add_extension can only be called + # once for a particular extension name, due to limitations in the underlying + # library. + # + # @param name string containing name of extension + # @param value string containing value of the extension + + def add_extension(self, name, critical, value): + ext = crypto.X509Extension (name, critical, value) + self.cert.add_extensions([ext]) + + ## + # Get an X509 extension from the certificate + + def get_extension(self, name): + # pyOpenSSL does not have a way to get extensions + m2x509 = X509.load_cert_string(self.save_to_string()) + value = m2x509.get_ext(name).get_value() + return value + + ## + # Set_data is a wrapper around add_extension. It stores the parameter str in + # the X509 subject_alt_name extension. Set_data can only be called once, due + # to limitations in the underlying library. + + def set_data(self, str, field='subjectAltName'): + # pyOpenSSL only allows us to add extensions, so if we try to set the + # same extension more than once, it will not work + if self.data.has_key(field): + raise "Cannot set ", field, " more than once" + self.data[field] = str + self.add_extension(field, 0, str) + + ## + # Return the data string that was previously set with set_data + + def get_data(self, field='subjectAltName'): + if self.data.has_key(field): + return self.data[field] + + try: + uri = self.get_extension(field) + self.data[field] = uri + except LookupError: + return None + + return self.data[field] + + ## + # Sign the certificate using the issuer private key and issuer subject previous set with set_issuer(). + + def sign(self): + assert self.cert != None + assert self.issuerSubject != None + assert self.issuerKey != None + self.cert.set_issuer(self.issuerSubject) + self.cert.sign(self.issuerKey.get_openssl_pkey(), self.digest) + + ## + # Verify the authenticity of a certificate. + # @param pkey is a Keypair object representing a public key. If Pkey + # did not sign the certificate, then an exception will be thrown. + + def verify(self, pkey): + # pyOpenSSL does not have a way to verify signatures + m2x509 = X509.load_cert_string(self.save_to_string()) + m2pkey = pkey.get_m2_pkey() + # verify it + return m2x509.verify(m2pkey) + + # XXX alternatively, if openssl has been patched, do the much simpler: + # try: + # self.cert.verify(pkey.get_openssl_key()) + # return 1 + # except: + # return 0 + + ## + # Return True if pkey is identical to the public key that is contained in the certificate. + # @param pkey Keypair object + + def is_pubkey(self, pkey): + return self.get_pubkey().is_same(pkey) + + ## + # Given a certificate cert, verify that this certificate was signed by the + # public key contained in cert. Throw an exception otherwise. + # + # @param cert certificate object + + def is_signed_by_cert(self, cert): + k = cert.get_pubkey() + result = self.verify(k) + return result + + ## + # Set the parent certficiate. + # + # @param p certificate object. + + def set_parent(self, p): + self.parent = p + + ## + # Return the certificate object of the parent of this certificate. + + def get_parent(self): + return self.parent + + ## + # Verification examines a chain of certificates to ensure that each parent + # signs the child, and that some certificate in the chain is signed by a + # trusted certificate. + # + # Verification is a basic recursion:
    +    #     if this_certificate was signed by trusted_certs:
    +    #         return
    +    #     else
    +    #         return verify_chain(parent, trusted_certs)
    +    # 
    + # + # At each recursion, the parent is tested to ensure that it did sign the + # child. If a parent did not sign a child, then an exception is thrown. If + # the bottom of the recursion is reached and the certificate does not match + # a trusted root, then an exception is thrown. + # + # @param Trusted_certs is a list of certificates that are trusted. + # + + def verify_chain(self, trusted_certs = None): + # Verify a chain of certificates. Each certificate must be signed by + # the public key contained in it's parent. The chain is recursed + # until a certificate is found that is signed by a trusted root. + # TODO: verify expiration time + #print "====Verify Chain=====" + # if this cert is signed by a trusted_cert, then we are set + for trusted_cert in trusted_certs: + #print "***************" + # TODO: verify expiration of trusted_cert ? + #print "CLIENT CERT", self.dump() + #print "TRUSTED CERT", trusted_cert.dump() + #print "Client is signed by Trusted?", self.is_signed_by_cert(trusted_cert) + if self.is_signed_by_cert(trusted_cert): + logger.debug("Cert %s signed by trusted cert %s", self.get_subject(), trusted_cert.get_subject()) + return trusted_cert + + # if there is no parent, then no way to verify the chain + if not self.parent: + #print self.get_subject(), "has no parent" + raise CertMissingParent(self.get_subject()) + + # if it wasn't signed by the parent... + if not self.is_signed_by_cert(self.parent): + #print self.get_subject(), "is not signed by parent" + return CertNotSignedByParent(self.get_subject()) + + # if the parent isn't verified... + self.parent.verify_chain(trusted_certs) + + return diff --git a/sfa/trust/credential.py b/sfa/trust/credential.py new file mode 100644 index 00000000..e082f756 --- /dev/null +++ b/sfa/trust/credential.py @@ -0,0 +1,851 @@ +#---------------------------------------------------------------------- +# Copyright (c) 2008 Board of Trustees, Princeton University +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and/or hardware specification (the "Work") to +# deal in the Work without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Work, and to permit persons to whom the Work +# is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Work. +# +# THE WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE WORK OR THE USE OR OTHER DEALINGS +# IN THE WORK. +#---------------------------------------------------------------------- +## +# Implements SFA Credentials +# +# Credentials are signed XML files that assign a subject gid privileges to an object gid +## + +### $Id: credential.py 18654 2010-08-23 18:54:57Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/trust/credential.py $ + +import os +import datetime +from xml.dom.minidom import Document, parseString +from tempfile import mkstemp +from sfa.trust.certificate import Keypair +from sfa.trust.credential_legacy import CredentialLegacy +from sfa.trust.rights import * +from sfa.trust.gid import * +from sfa.util.faults import * + +from sfa.util.sfalogging import logger +from dateutil.parser import parse + + + +# Two years, in seconds +DEFAULT_CREDENTIAL_LIFETIME = 60 * 60 * 24 * 365 * 2 + + +# TODO: +# . make privs match between PG and PL +# . Need to add support for other types of credentials, e.g. tickets + + +signature_template = \ +''' + + + + + + + + + + + + + + + + + + + + + + +''' + +## +# Convert a string into a bool + +def str2bool(str): + if str.lower() in ['yes','true','1']: + return True + return False + + +## +# Utility function to get the text of an XML element + +def getTextNode(element, subele): + sub = element.getElementsByTagName(subele)[0] + if len(sub.childNodes) > 0: + return sub.childNodes[0].nodeValue + else: + return None + +## +# Utility function to set the text of an XML element +# It creates the element, adds the text to it, +# and then appends it to the parent. + +def append_sub(doc, parent, element, text): + ele = doc.createElement(element) + ele.appendChild(doc.createTextNode(text)) + parent.appendChild(ele) + +## +# Signature contains information about an xmlsec1 signature +# for a signed-credential +# + +class Signature(object): + + def __init__(self, string=None): + self.refid = None + self.issuer_gid = None + self.xml = None + if string: + self.xml = string + self.decode() + + + def get_refid(self): + if not self.refid: + self.decode() + return self.refid + + def get_xml(self): + if not self.xml: + self.encode() + return self.xml + + def set_refid(self, id): + self.refid = id + + def get_issuer_gid(self): + if not self.gid: + self.decode() + return self.gid + + def set_issuer_gid(self, gid): + self.gid = gid + + def decode(self): + doc = parseString(self.xml) + sig = doc.getElementsByTagName("Signature")[0] + self.set_refid(sig.getAttribute("xml:id").strip("Sig_")) + keyinfo = sig.getElementsByTagName("X509Data")[0] + szgid = getTextNode(keyinfo, "X509Certificate") + szgid = "-----BEGIN CERTIFICATE-----\n%s\n-----END CERTIFICATE-----" % szgid + self.set_issuer_gid(GID(string=szgid)) + + def encode(self): + self.xml = signature_template % (self.get_refid(), self.get_refid()) + + +## +# A credential provides a caller gid with privileges to an object gid. +# A signed credential is signed by the object's authority. +# +# Credentials are encoded in one of two ways. The legacy style places +# it in the subjectAltName of an X509 certificate. The new credentials +# are placed in signed XML. +# +# WARNING: +# In general, a signed credential obtained externally should +# not be changed else the signature is no longer valid. So, once +# you have loaded an existing signed credential, do not call encode() or sign() on it. + +def filter_creds_by_caller(creds, caller_hrn): + """ + Returns a list of creds who's gid caller matches the + specified caller hrn + """ + if not isinstance(creds, list): creds = [creds] + caller_creds = [] + for cred in creds: + try: + tmp_cred = Credential(string=cred) + if tmp_cred.get_gid_caller().get_hrn() == caller_hrn: + caller_creds.append(cred) + except: pass + return caller_creds + +class Credential(object): + + ## + # Create a Credential object + # + # @param create If true, create a blank x509 certificate + # @param subject If subject!=None, create an x509 cert with the subject name + # @param string If string!=None, load the credential from the string + # @param filename If filename!=None, load the credential from the file + # FIXME: create and subject are ignored! + def __init__(self, create=False, subject=None, string=None, filename=None): + self.gidCaller = None + self.gidObject = None + self.expiration = None + self.privileges = None + self.issuer_privkey = None + self.issuer_gid = None + self.issuer_pubkey = None + self.parent = None + self.signature = None + self.xml = None + self.refid = None + self.legacy = None + + # Check if this is a legacy credential, translate it if so + if string or filename: + if string: + str = string + elif filename: + str = file(filename).read() + + if str.strip().startswith("-----"): + self.legacy = CredentialLegacy(False,string=str) + self.translate_legacy(str) + else: + self.xml = str + self.decode() + + # Find an xmlsec1 path + self.xmlsec_path = '' + paths = ['/usr/bin','/usr/local/bin','/bin','/opt/bin','/opt/local/bin'] + for path in paths: + if os.path.isfile(path + '/' + 'xmlsec1'): + self.xmlsec_path = path + '/' + 'xmlsec1' + break + + def get_subject(self): + if not self.gidObject: + self.decode() + return self.gidObject.get_subject() + + def get_signature(self): + if not self.signature: + self.decode() + return self.signature + + def set_signature(self, sig): + self.signature = sig + + + ## + # Translate a legacy credential into a new one + # + # @param String of the legacy credential + + def translate_legacy(self, str): + legacy = CredentialLegacy(False,string=str) + self.gidCaller = legacy.get_gid_caller() + self.gidObject = legacy.get_gid_object() + lifetime = legacy.get_lifetime() + if not lifetime: + # Default to two years + self.set_lifetime(DEFAULT_CREDENTIAL_LIFETIME) + else: + self.set_lifetime(int(lifetime)) + self.lifeTime = legacy.get_lifetime() + self.set_privileges(legacy.get_privileges()) + self.get_privileges().delegate_all_privileges(legacy.get_delegate()) + + ## + # Need the issuer's private key and name + # @param key Keypair object containing the private key of the issuer + # @param gid GID of the issuing authority + + def set_issuer_keys(self, privkey, gid): + self.issuer_privkey = privkey + self.issuer_gid = gid + + + ## + # Set this credential's parent + def set_parent(self, cred): + self.parent = cred + self.updateRefID() + + ## + # set the GID of the caller + # + # @param gid GID object of the caller + + def set_gid_caller(self, gid): + self.gidCaller = gid + # gid origin caller is the caller's gid by default + self.gidOriginCaller = gid + + ## + # get the GID of the object + + def get_gid_caller(self): + if not self.gidCaller: + self.decode() + return self.gidCaller + + ## + # set the GID of the object + # + # @param gid GID object of the object + + def set_gid_object(self, gid): + self.gidObject = gid + + ## + # get the GID of the object + + def get_gid_object(self): + if not self.gidObject: + self.decode() + return self.gidObject + + ## + # set the lifetime of this credential + # + # @param lifetime lifetime of credential + # . if lifeTime is a datetime object, it is used for the expiration time + # . if lifeTime is an integer value, it is considered the number of seconds + # remaining before expiration + + def set_lifetime(self, lifeTime): + if isinstance(lifeTime, int): + self.expiration = datetime.timedelta(seconds=lifeTime) + datetime.datetime.utcnow() + else: + self.expiration = lifeTime + + ## + # get the lifetime of the credential (in datetime format) + + def get_lifetime(self): + if not self.expiration: + self.decode() + return self.expiration + + + ## + # set the privileges + # + # @param privs either a comma-separated list of privileges of a RightList object + + def set_privileges(self, privs): + if isinstance(privs, str): + self.privileges = RightList(string = privs) + else: + self.privileges = privs + + + ## + # return the privileges as a RightList object + + def get_privileges(self): + if not self.privileges: + self.decode() + return self.privileges + + ## + # determine whether the credential allows a particular operation to be + # performed + # + # @param op_name string specifying name of operation ("lookup", "update", etc) + + def can_perform(self, op_name): + rights = self.get_privileges() + + if not rights: + return False + + return rights.can_perform(op_name) + + + ## + # Encode the attributes of the credential into an XML string + # This should be done immediately before signing the credential. + # WARNING: + # In general, a signed credential obtained externally should + # not be changed else the signature is no longer valid. So, once + # you have loaded an existing signed credential, do not call encode() or sign() on it. + + def encode(self): + # Create the XML document + doc = Document() + signed_cred = doc.createElement("signed-credential") + doc.appendChild(signed_cred) + + # Fill in the bit + cred = doc.createElement("credential") + cred.setAttribute("xml:id", self.get_refid()) + signed_cred.appendChild(cred) + append_sub(doc, cred, "type", "privilege") + append_sub(doc, cred, "serial", "8") + append_sub(doc, cred, "owner_gid", self.gidCaller.save_to_string()) + append_sub(doc, cred, "owner_urn", self.gidCaller.get_urn()) + append_sub(doc, cred, "target_gid", self.gidObject.save_to_string()) + append_sub(doc, cred, "target_urn", self.gidObject.get_urn()) + append_sub(doc, cred, "uuid", "") + if not self.expiration: + self.set_lifetime(DEFAULT_CREDENTIAL_LIFETIME) + self.expiration = self.expiration.replace(microsecond=0) + append_sub(doc, cred, "expires", self.expiration.isoformat()) + privileges = doc.createElement("privileges") + cred.appendChild(privileges) + + if self.privileges: + rights = self.get_privileges() + for right in rights.rights: + priv = doc.createElement("privilege") + append_sub(doc, priv, "name", right.kind) + append_sub(doc, priv, "can_delegate", str(right.delegate).lower()) + privileges.appendChild(priv) + + # Add the parent credential if it exists + if self.parent: + sdoc = parseString(self.parent.get_xml()) + p_cred = doc.importNode(sdoc.getElementsByTagName("credential")[0], True) + p = doc.createElement("parent") + p.appendChild(p_cred) + cred.appendChild(p) + + + # Create the tag + signatures = doc.createElement("signatures") + signed_cred.appendChild(signatures) + + # Add any parent signatures + if self.parent: + for cur_cred in self.get_credential_list()[1:]: + sdoc = parseString(cur_cred.get_signature().get_xml()) + ele = doc.importNode(sdoc.getElementsByTagName("Signature")[0], True) + signatures.appendChild(ele) + + # Get the finished product + self.xml = doc.toxml() + + + def save_to_random_tmp_file(self): + fp, filename = mkstemp(suffix='cred', text=True) + fp = os.fdopen(fp, "w") + self.save_to_file(filename, save_parents=True, filep=fp) + return filename + + def save_to_file(self, filename, save_parents=True, filep=None): + if not self.xml: + self.encode() + if filep: + f = filep + else: + f = open(filename, "w") + f.write(self.xml) + f.close() + + def save_to_string(self, save_parents=True): + if not self.xml: + self.encode() + return self.xml + + def get_refid(self): + if not self.refid: + self.refid = 'ref0' + return self.refid + + def set_refid(self, rid): + self.refid = rid + + ## + # Figure out what refids exist, and update this credential's id + # so that it doesn't clobber the others. Returns the refids of + # the parents. + + def updateRefID(self): + if not self.parent: + self.set_refid('ref0') + return [] + + refs = [] + + next_cred = self.parent + while next_cred: + refs.append(next_cred.get_refid()) + if next_cred.parent: + next_cred = next_cred.parent + else: + next_cred = None + + + # Find a unique refid for this credential + rid = self.get_refid() + while rid in refs: + val = int(rid[3:]) + rid = "ref%d" % (val + 1) + + # Set the new refid + self.set_refid(rid) + + # Return the set of parent credential ref ids + return refs + + def get_xml(self): + if not self.xml: + self.encode() + return self.xml + + ## + # Sign the XML file created by encode() + # + # WARNING: + # In general, a signed credential obtained externally should + # not be changed else the signature is no longer valid. So, once + # you have loaded an existing signed credential, do not call encode() or sign() on it. + + def sign(self): + if not self.issuer_privkey or not self.issuer_gid: + return + doc = parseString(self.get_xml()) + sigs = doc.getElementsByTagName("signatures")[0] + + # Create the signature template to be signed + signature = Signature() + signature.set_refid(self.get_refid()) + sdoc = parseString(signature.get_xml()) + sig_ele = doc.importNode(sdoc.getElementsByTagName("Signature")[0], True) + sigs.appendChild(sig_ele) + + self.xml = doc.toxml() + + + # Split the issuer GID into multiple certificates if it's a chain + chain = GID(filename=self.issuer_gid) + gid_files = [] + while chain: + gid_files.append(chain.save_to_random_tmp_file(False)) + if chain.get_parent(): + chain = chain.get_parent() + else: + chain = None + + + # Call out to xmlsec1 to sign it + ref = 'Sig_%s' % self.get_refid() + filename = self.save_to_random_tmp_file() + signed = os.popen('%s --sign --node-id "%s" --privkey-pem %s,%s %s' \ + % (self.xmlsec_path, ref, self.issuer_privkey, ",".join(gid_files), filename)).read() + os.remove(filename) + + for gid_file in gid_files: + os.remove(gid_file) + + self.xml = signed + + # This is no longer a legacy credential + if self.legacy: + self.legacy = None + + # Update signatures + self.decode() + + + ## + # Retrieve the attributes of the credential from the XML. + # This is automatically called by the various get_* methods of + # this class and should not need to be called explicitly. + + def decode(self): + if not self.xml: + return + doc = parseString(self.xml) + sigs = [] + signed_cred = doc.getElementsByTagName("signed-credential") + + # Is this a signed-cred or just a cred? + if len(signed_cred) > 0: + cred = signed_cred[0].getElementsByTagName("credential")[0] + signatures = signed_cred[0].getElementsByTagName("signatures") + if len(signatures) > 0: + sigs = signatures[0].getElementsByTagName("Signature") + else: + cred = doc.getElementsByTagName("credential")[0] + + + self.set_refid(cred.getAttribute("xml:id")) + self.set_lifetime(parse(getTextNode(cred, "expires"))) + self.gidCaller = GID(string=getTextNode(cred, "owner_gid")) + self.gidObject = GID(string=getTextNode(cred, "target_gid")) + + + # Process privileges + privs = cred.getElementsByTagName("privileges")[0] + rlist = RightList() + for priv in privs.getElementsByTagName("privilege"): + kind = getTextNode(priv, "name") + deleg = str2bool(getTextNode(priv, "can_delegate")) + if kind == '*': + # Convert * into the default privileges for the credential's type + _ , type = urn_to_hrn(self.gidObject.get_urn()) + rl = rlist.determine_rights(type, self.gidObject.get_urn()) + for r in rl.rights: + rlist.add(r) + else: + rlist.add(Right(kind.strip(), deleg)) + self.set_privileges(rlist) + + + # Is there a parent? + parent = cred.getElementsByTagName("parent") + if len(parent) > 0: + parent_doc = parent[0].getElementsByTagName("credential")[0] + parent_xml = parent_doc.toxml() + self.parent = Credential(string=parent_xml) + self.updateRefID() + + # Assign the signatures to the credentials + for sig in sigs: + Sig = Signature(string=sig.toxml()) + + for cur_cred in self.get_credential_list(): + if cur_cred.get_refid() == Sig.get_refid(): + cur_cred.set_signature(Sig) + + + ## + # Verify + # trusted_certs: A list of trusted GID filenames (not GID objects!) + # Chaining is not supported within the GIDs by xmlsec1. + # + # Verify that: + # . All of the signatures are valid and that the issuers trace back + # to trusted roots (performed by xmlsec1) + # . The XML matches the credential schema + # . That the issuer of the credential is the authority in the target's urn + # . In the case of a delegated credential, this must be true of the root + # . That all of the gids presented in the credential are valid + # . The credential is not expired + # + # -- For Delegates (credentials with parents) + # . The privileges must be a subset of the parent credentials + # . The privileges must have "can_delegate" set for each delegated privilege + # . The target gid must be the same between child and parents + # . The expiry time on the child must be no later than the parent + # . The signer of the child must be the owner of the parent + # + # -- Verify does *NOT* + # . ensure that an xmlrpc client's gid matches a credential gid, that + # must be done elsewhere + # + # @param trusted_certs: The certificates of trusted CA certificates + def verify(self, trusted_certs): + if not self.xml: + self.decode() + +# trusted_cert_objects = [GID(filename=f) for f in trusted_certs] + trusted_cert_objects = [] + ok_trusted_certs = [] + for f in trusted_certs: + try: + # Failures here include unreadable files + # or non PEM files + trusted_cert_objects.append(GID(filename=f)) + ok_trusted_certs.append(f) + except Exception, exc: + logger.error("Failed to load trusted cert from %s: %r", f, exc) + trusted_certs = ok_trusted_certs + + # Use legacy verification if this is a legacy credential + if self.legacy: + self.legacy.verify_chain(trusted_cert_objects) + if self.legacy.client_gid: + self.legacy.client_gid.verify_chain(trusted_cert_objects) + if self.legacy.object_gid: + self.legacy.object_gid.verify_chain(trusted_cert_objects) + return True + + # make sure it is not expired + if self.get_lifetime() < datetime.datetime.utcnow(): + raise CredentialNotVerifiable("Credential expired at %s" % self.expiration.isoformat()) + + # Verify the signatures + filename = self.save_to_random_tmp_file() + cert_args = " ".join(['--trusted-pem %s' % x for x in trusted_certs]) + + # Verify the gids of this cred and of its parents + for cur_cred in self.get_credential_list(): + cur_cred.get_gid_object().verify_chain(trusted_cert_objects) + cur_cred.get_gid_caller().verify_chain(trusted_cert_objects) + + refs = [] + refs.append("Sig_%s" % self.get_refid()) + + parentRefs = self.updateRefID() + for ref in parentRefs: + refs.append("Sig_%s" % ref) + + for ref in refs: + verified = os.popen('%s --verify --node-id "%s" %s %s 2>&1' \ + % (self.xmlsec_path, ref, cert_args, filename)).read() + if not verified.strip().startswith("OK"): + raise CredentialNotVerifiable("xmlsec1 error verifying cert: " + verified) + os.remove(filename) + + # Verify the parents (delegation) + if self.parent: + self.verify_parent(self.parent) + + # Make sure the issuer is the target's authority + self.verify_issuer() + return True + + ## + # Creates a list of the credential and its parents, with the root + # (original delegated credential) as the last item in the list + def get_credential_list(self): + cur_cred = self + list = [] + while cur_cred: + list.append(cur_cred) + if cur_cred.parent: + cur_cred = cur_cred.parent + else: + cur_cred = None + return list + + ## + # Make sure the credential's target gid was signed by (or is the same) the entity that signed + # the original credential or an authority over that namespace. + def verify_issuer(self): + root_cred = self.get_credential_list()[-1] + root_target_gid = root_cred.get_gid_object() + root_cred_signer = root_cred.get_signature().get_issuer_gid() + + if root_target_gid.is_signed_by_cert(root_cred_signer): + # cred signer matches target signer, return success + return + + root_target_gid_str = root_target_gid.save_to_string() + root_cred_signer_str = root_cred_signer.save_to_string() + if root_target_gid_str == root_cred_signer_str: + # cred signer is target, return success + return + + # See if it the signer is an authority over the domain of the target + # Maybe should be (hrn, type) = urn_to_hrn(root_cred_signer.get_urn()) + root_cred_signer_type = root_cred_signer.get_type() + if (root_cred_signer_type == 'authority'): + #logger.debug('Cred signer is an authority') + # signer is an authority, see if target is in authority's domain + hrn = root_cred_signer.get_hrn() + if root_target_gid.get_hrn().startswith(hrn): + return + + # We've required that the credential be signed by an authority + # for that domain. Reasonable and probably correct. + # A looser model would also allow the signer to be an authority + # in my control framework - eg My CA or CH. Even if it is not + # the CH that issued these, eg, user credentials. + + # Give up, credential does not pass issuer verification + + raise CredentialNotVerifiable("Could not verify credential owned by %s for object %s. Cred signer %s not the trusted authority for Cred target %s" % (self.gidCaller.get_urn(), self.gidObject.get_urn(), root_cred_signer.get_hrn(), root_target_gid.get_hrn())) + + + ## + # -- For Delegates (credentials with parents) verify that: + # . The privileges must be a subset of the parent credentials + # . The privileges must have "can_delegate" set for each delegated privilege + # . The target gid must be the same between child and parents + # . The expiry time on the child must be no later than the parent + # . The signer of the child must be the owner of the parent + def verify_parent(self, parent_cred): + # make sure the rights given to the child are a subset of the + # parents rights (and check delegate bits) + if not parent_cred.get_privileges().is_superset(self.get_privileges()): + raise ChildRightsNotSubsetOfParent( + self.parent.get_privileges().save_to_string() + " " + + self.get_privileges().save_to_string()) + + # make sure my target gid is the same as the parent's + if not parent_cred.get_gid_object().save_to_string() == \ + self.get_gid_object().save_to_string(): + raise CredentialNotVerifiable("Target gid not equal between parent and child") + + # make sure my expiry time is <= my parent's + if not parent_cred.get_lifetime() >= self.get_lifetime(): + raise CredentialNotVerifiable("Delegated credential expires after parent") + + # make sure my signer is the parent's caller + if not parent_cred.get_gid_caller().save_to_string(False) == \ + self.get_signature().get_issuer_gid().save_to_string(False): + raise CredentialNotVerifiable("Delegated credential not signed by parent caller") + + # Recurse + if parent_cred.parent: + parent_cred.verify_parent(parent_cred.parent) + + + def delegate(self, delegee_gidfile, caller_keyfile, caller_gidfile): + """ + Return a delegated copy of this credential, delegated to the + specified gid's user. + """ + # get the gid of the object we are delegating + object_gid = self.get_gid_object() + object_hrn = object_gid.get_hrn() + + # the hrn of the user who will be delegated to + delegee_gid = GID(filename=delegee_gidfile) + delegee_hrn = delegee_gid.get_hrn() + + #user_key = Keypair(filename=keyfile) + #user_hrn = self.get_gid_caller().get_hrn() + subject_string = "%s delegated to %s" % (object_hrn, delegee_hrn) + dcred = Credential(subject=subject_string) + dcred.set_gid_caller(delegee_gid) + dcred.set_gid_object(object_gid) + dcred.set_parent(self) + dcred.set_lifetime(self.get_lifetime()) + dcred.set_privileges(self.get_privileges()) + dcred.get_privileges().delegate_all_privileges(True) + #dcred.set_issuer_keys(keyfile, delegee_gidfile) + dcred.set_issuer_keys(caller_keyfile, caller_gidfile) + dcred.encode() + dcred.sign() + + return dcred + ## + # Dump the contents of a credential to stdout in human-readable format + # + # @param dump_parents If true, also dump the parent certificates + + def dump(self, dump_parents=False): + print "CREDENTIAL", self.get_subject() + + print " privs:", self.get_privileges().save_to_string() + + print " gidCaller:" + gidCaller = self.get_gid_caller() + if gidCaller: + gidCaller.dump(8, dump_parents) + + print " gidObject:" + gidObject = self.get_gid_object() + if gidObject: + gidObject.dump(8, dump_parents) + + + if self.parent and dump_parents: + print "PARENT", + self.parent.dump_parents() + diff --git a/sfa/trust/credential_legacy.py b/sfa/trust/credential_legacy.py new file mode 100644 index 00000000..c33ed6f3 --- /dev/null +++ b/sfa/trust/credential_legacy.py @@ -0,0 +1,247 @@ +## +# Implements SFA Credentials +# +# Credentials are layered on top of certificates, and are essentially a +# certificate that stores a tuple of parameters. +## + +### $Id: credential.py 17477 2010-03-25 16:49:34Z jkarlin $ +### $URL: svn+ssh://svn.planet-lab.org/svn/sfa/branches/geni-api/sfa/trust/credential.py $ + +import xmlrpclib + +from sfa.trust.certificate import Certificate +from sfa.trust.rights import * +from sfa.trust.gid import * +from sfa.util.faults import * +from sfa.util.sfalogging import * + +## +# Credential is a tuple: +# (GIDCaller, GIDObject, LifeTime, Privileges, Delegate) +# +# These fields are encoded using xmlrpc into the subjectAltName field of the +# x509 certificate. Note: Call encode() once the fields have been filled in +# to perform this encoding. + +class CredentialLegacy(Certificate): + gidCaller = None + gidObject = None + lifeTime = None + privileges = None + delegate = False + + ## + # Create a Credential object + # + # @param create If true, create a blank x509 certificate + # @param subject If subject!=None, create an x509 cert with the subject name + # @param string If string!=None, load the credential from the string + # @param filename If filename!=None, load the credential from the file + + def __init__(self, create=False, subject=None, string=None, filename=None): + Certificate.__init__(self, create, subject, string, filename) + + ## + # set the GID of the caller + # + # @param gid GID object of the caller + + def set_gid_caller(self, gid): + self.gidCaller = gid + # gid origin caller is the caller's gid by default + self.gidOriginCaller = gid + + ## + # get the GID of the object + + def get_gid_caller(self): + if not self.gidCaller: + self.decode() + return self.gidCaller + + ## + # set the GID of the object + # + # @param gid GID object of the object + + def set_gid_object(self, gid): + self.gidObject = gid + + ## + # get the GID of the object + + def get_gid_object(self): + if not self.gidObject: + self.decode() + return self.gidObject + + ## + # set the lifetime of this credential + # + # @param lifetime lifetime of credential + + def set_lifetime(self, lifeTime): + self.lifeTime = lifeTime + + ## + # get the lifetime of the credential + + def get_lifetime(self): + if not self.lifeTime: + self.decode() + return self.lifeTime + + ## + # set the delegate bit + # + # @param delegate boolean (True or False) + + def set_delegate(self, delegate): + self.delegate = delegate + + ## + # get the delegate bit + + def get_delegate(self): + if not self.delegate: + self.decode() + return self.delegate + + ## + # set the privileges + # + # @param privs either a comma-separated list of privileges of a RightList object + + def set_privileges(self, privs): + if isinstance(privs, str): + self.privileges = RightList(string = privs) + else: + self.privileges = privs + + ## + # return the privileges as a RightList object + + def get_privileges(self): + if not self.privileges: + self.decode() + return self.privileges + + ## + # determine whether the credential allows a particular operation to be + # performed + # + # @param op_name string specifying name of operation ("lookup", "update", etc) + + def can_perform(self, op_name): + rights = self.get_privileges() + if not rights: + return False + return rights.can_perform(op_name) + + ## + # Encode the attributes of the credential into a string and store that + # string in the alt-subject-name field of the X509 object. This should be + # done immediately before signing the credential. + + def encode(self): + dict = {"gidCaller": None, + "gidObject": None, + "lifeTime": self.lifeTime, + "privileges": None, + "delegate": self.delegate} + if self.gidCaller: + dict["gidCaller"] = self.gidCaller.save_to_string(save_parents=True) + if self.gidObject: + dict["gidObject"] = self.gidObject.save_to_string(save_parents=True) + if self.privileges: + dict["privileges"] = self.privileges.save_to_string() + str = xmlrpclib.dumps((dict,), allow_none=True) + self.set_data('URI:http://' + str) + + ## + # Retrieve the attributes of the credential from the alt-subject-name field + # of the X509 certificate. This is automatically done by the various + # get_* methods of this class and should not need to be called explicitly. + + def decode(self): + data = self.get_data().lstrip('URI:http://') + + if data: + dict = xmlrpclib.loads(data)[0][0] + else: + dict = {} + + self.lifeTime = dict.get("lifeTime", None) + self.delegate = dict.get("delegate", None) + + privStr = dict.get("privileges", None) + if privStr: + self.privileges = RightList(string = privStr) + else: + self.privileges = None + + gidCallerStr = dict.get("gidCaller", None) + if gidCallerStr: + self.gidCaller = GID(string=gidCallerStr) + else: + self.gidCaller = None + + gidObjectStr = dict.get("gidObject", None) + if gidObjectStr: + self.gidObject = GID(string=gidObjectStr) + else: + self.gidObject = None + + ## + # Verify that a chain of credentials is valid (see cert.py:verify). In + # addition to the checks for ordinary certificates, verification also + # ensures that the delegate bit was set by each parent in the chain. If + # a delegate bit was not set, then an exception is thrown. + # + # Each credential must be a subset of the rights of the parent. + + def verify_chain(self, trusted_certs = None): + # do the normal certificate verification stuff + Certificate.verify_chain(self, trusted_certs) + + if self.parent: + # make sure the parent delegated rights to the child + if not self.parent.get_delegate(): + raise MissingDelegateBit(self.parent.get_subject()) + + # make sure the rights given to the child are a subset of the + # parents rights + if not self.parent.get_privileges().is_superset(self.get_privileges()): + raise ChildRightsNotSubsetOfParent(self.get_subject() + + " " + self.parent.get_privileges().save_to_string() + + " " + self.get_privileges().save_to_string()) + + return + + ## + # Dump the contents of a credential to stdout in human-readable format + # + # @param dump_parents If true, also dump the parent certificates + + def dump(self, dump_parents=False): + print "CREDENTIAL", self.get_subject() + + print " privs:", self.get_privileges().save_to_string() + + print " gidCaller:" + gidCaller = self.get_gid_caller() + if gidCaller: + gidCaller.dump(8, dump_parents) + + print " gidObject:" + gidObject = self.get_gid_object() + if gidObject: + gidObject.dump(8, dump_parents) + + print " delegate:", self.get_delegate() + + if self.parent and dump_parents: + print "PARENT", + self.parent.dump(dump_parents) + diff --git a/sfa/trust/gid.py b/sfa/trust/gid.py new file mode 100644 index 00000000..05b58f98 --- /dev/null +++ b/sfa/trust/gid.py @@ -0,0 +1,219 @@ +#---------------------------------------------------------------------- +# Copyright (c) 2008 Board of Trustees, Princeton University +# +# Permission is hereby granted, free of charge, to any person obtaining +# a copy of this software and/or hardware specification (the "Work") to +# deal in the Work without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Work, and to permit persons to whom the Work +# is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be +# included in all copies or substantial portions of the Work. +# +# THE WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE WORK OR THE USE OR OTHER DEALINGS +# IN THE WORK. +#---------------------------------------------------------------------- +## +# Implements SFA GID. GIDs are based on certificates, and the GID class is a +# descendant of the certificate class. +## + +### $Id: gid.py 18510 2010-07-13 18:32:48Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/trust/gid.py $ +import xmlrpclib +import uuid +from sfa.trust.certificate import Certificate +from sfa.util.namespace import * +from sfa.util.sfalogging import logger + +## +# Create a new uuid. Returns the UUID as a string. + +def create_uuid(): + return str(uuid.uuid4().int) + +## +# GID is a tuple: +# (uuid, urn, public_key) +# +# UUID is a unique identifier and is created by the python uuid module +# (or the utility function create_uuid() in gid.py). +# +# HRN is a human readable name. It is a dotted form similar to a backward domain +# name. For example, planetlab.us.arizona.bakers. +# +# URN is a human readable identifier of form: +# "urn:publicid:IDN+toplevelauthority[:sub-auth.]*[\res. type]\ +object name" +# For example, urn:publicid:IDN+planetlab:us:arizona+user+bakers +# +# PUBLIC_KEY is the public key of the principal identified by the UUID/HRN. +# It is a Keypair object as defined in the cert.py module. +# +# It is expected that there is a one-to-one pairing between UUIDs and HRN, +# but it is uncertain how this would be inforced or if it needs to be enforced. +# +# These fields are encoded using xmlrpc into the subjectAltName field of the +# x509 certificate. Note: Call encode() once the fields have been filled in +# to perform this encoding. + + +class GID(Certificate): + uuid = None + hrn = None + urn = None + + ## + # Create a new GID object + # + # @param create If true, create the X509 certificate + # @param subject If subject!=None, create the X509 cert and set the subject name + # @param string If string!=None, load the GID from a string + # @param filename If filename!=None, load the GID from a file + + def __init__(self, create=False, subject=None, string=None, filename=None, uuid=None, hrn=None, urn=None): + + Certificate.__init__(self, create, subject, string, filename) + if subject: + logger.debug("Creating GID for subject: %s" % subject) + if uuid: + self.uuid = int(uuid) + if hrn: + self.hrn = hrn + self.urn = hrn_to_urn(hrn, 'unknown') + if urn: + self.urn = urn + self.hrn, type = urn_to_hrn(urn) + + def set_uuid(self, uuid): + if isinstance(uuid, str): + self.uuid = int(uuid) + else: + self.uuid = uuid + + def get_uuid(self): + if not self.uuid: + self.decode() + return self.uuid + + def set_hrn(self, hrn): + self.hrn = hrn + + def get_hrn(self): + if not self.hrn: + self.decode() + return self.hrn + + def set_urn(self, urn): + self.urn = urn + self.hrn, type = urn_to_hrn(urn) + + def get_urn(self): + if not self.urn: + self.decode() + return self.urn + + def get_type(self): + if not self.urn: + self.decode() + _, t = urn_to_hrn(self.urn) + return t + + ## + # Encode the GID fields and package them into the subject-alt-name field + # of the X509 certificate. This must be called prior to signing the + # certificate. It may only be called once per certificate. + + def encode(self): + if self.urn: + urn = self.urn + else: + urn = hrn_to_urn(self.hrn, None) + + str = "URI:" + urn + + if self.uuid: + str += ", " + "URI:" + uuid.UUID(int=self.uuid).urn + + self.set_data(str, 'subjectAltName') + + + + + ## + # Decode the subject-alt-name field of the X509 certificate into the + # fields of the GID. This is automatically called by the various get_*() + # functions in this class. + + def decode(self): + data = self.get_data('subjectAltName') + dict = {} + if data: + if data.lower().startswith('uri:http://'): + dict = xmlrpclib.loads(data[11:])[0][0] + else: + spl = data.split(', ') + for val in spl: + if val.lower().startswith('uri:urn:uuid:'): + dict['uuid'] = uuid.UUID(val[4:]).int + elif val.lower().startswith('uri:urn:publicid:idn+'): + dict['urn'] = val[4:] + + self.uuid = dict.get("uuid", None) + self.urn = dict.get("urn", None) + self.hrn = dict.get("hrn", None) + if self.urn: + self.hrn = urn_to_hrn(self.urn)[0] + + ## + # Dump the credential to stdout. + # + # @param indent specifies a number of spaces to indent the output + # @param dump_parents If true, also dump the parents of the GID + + def dump(self, indent=0, dump_parents=False): + print " "*indent, " hrn:", self.get_hrn() + print " "*indent, " urn:", self.get_urn() + print " "*indent, "uuid:", self.get_uuid() + + if self.parent and dump_parents: + print " "*indent, "parent:" + self.parent.dump(indent+4, dump_parents) + + ## + # Verify the chain of authenticity of the GID. First perform the checks + # of the certificate class (verifying that each parent signs the child, + # etc). In addition, GIDs also confirm that the parent's HRN is a prefix + # of the child's HRN. + # + # Verifying these prefixes prevents a rogue authority from signing a GID + # for a principal that is not a member of that authority. For example, + # planetlab.us.arizona cannot sign a GID for planetlab.us.princeton.foo. + + def verify_chain(self, trusted_certs = None): + # do the normal certificate verification stuff + trusted_root = Certificate.verify_chain(self, trusted_certs) + + if self.parent: + # make sure the parent's hrn is a prefix of the child's hrn + if not self.get_hrn().startswith(self.parent.get_hrn()): + #print self.get_hrn(), " ", self.parent.get_hrn() + raise GidParentHrn("This cert %s HRN doesnt start with parent HRN %s" % (self.get_hrn(), self.parent.get_hrn())) + else: + # make sure that the trusted root's hrn is a prefix of the child's + trusted_gid = GID(string=trusted_root.save_to_string()) + trusted_type = trusted_gid.get_type() + trusted_hrn = trusted_gid.get_hrn() + #if trusted_type == 'authority': + # trusted_hrn = trusted_hrn[:trusted_hrn.rindex('.')] + cur_hrn = self.get_hrn() + if not self.get_hrn().startswith(trusted_hrn): + raise GidParentHrn("Trusted roots HRN %s isnt start of this cert %s" % (trusted_hrn, cur_hrn)) + + return diff --git a/sfa/trust/hierarchy.py b/sfa/trust/hierarchy.py new file mode 100644 index 00000000..2515a0aa --- /dev/null +++ b/sfa/trust/hierarchy.py @@ -0,0 +1,364 @@ +## +# This module implements a hierarchy of authorities and performs a similar +# function as the "tree" module of the original SFA prototype. An HRN +# is assumed to be a string of authorities separated by dots. For example, +# "planetlab.us.arizona.bakers". Each component of the HRN is a different +# authority, with the last component being a leaf in the tree. +# +# Each authority is stored in a subdirectory on the registry. Inside this +# subdirectory are several files: +# *.GID - GID file +# *.PKEY - private key file +# *.DBINFO - database info +## + +### $Id: hierarchy.py 18243 2010-06-10 18:16:05Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/trust/hierarchy.py $ + +import os + +from sfa.util.report import * +from sfa.trust.certificate import Keypair +from sfa.trust.credential import * +from sfa.trust.gid import GID, create_uuid +from sfa.util.namespace import * +from sfa.util.config import Config +from sfa.util.sfaticket import SfaTicket + +## +# The AuthInfo class contains the information for an authority. This information +# includes the GID, private key, and database connection information. + +class AuthInfo: + hrn = None + gid_object = None + gid_filename = None + privkey_filename = None + dbinfo_filename = None + + ## + # Initialize and authority object. + # + # @param xrn the human readable name of the authority (urn will be converted to hrn) + # @param gid_filename the filename containing the GID + # @param privkey_filename the filename containing the private key + # @param dbinfo_filename the filename containing the database info + + def __init__(self, xrn, gid_filename, privkey_filename, dbinfo_filename): + hrn, type = urn_to_hrn(xrn) + self.hrn = hrn + self.set_gid_filename(gid_filename) + self.privkey_filename = privkey_filename + self.dbinfo_filename = dbinfo_filename + + ## + # Set the filename of the GID + # + # @param fn filename of file containing GID + + def set_gid_filename(self, fn): + self.gid_filename = fn + self.gid_object = None + + def get_privkey_filename(self): + return self.privkey_filename + + def get_gid_filename(self): + return self.gid_filename + + ## + # Get the GID in the form of a GID object + + def get_gid_object(self): + if not self.gid_object: + self.gid_object = GID(filename = self.gid_filename) + return self.gid_object + + ## + # Get the private key in the form of a Keypair object + + def get_pkey_object(self): + return Keypair(filename = self.privkey_filename) + + ## + # Get the dbinfo in the form of a dictionary + + def get_dbinfo(self): + f = file(self.dbinfo_filename) + dict = eval(f.read()) + f.close() + return dict + + ## + # Replace the GID with a new one. The file specified by gid_filename is + # overwritten with the new GID object + # + # @param gid object containing new GID + + def update_gid_object(self, gid): + gid.save_to_file(self.gid_filename) + self.gid_object = gid + +## +# The Hierarchy class is responsible for managing the tree of authorities. +# Each authority is a node in the tree and exists as an AuthInfo object. +# +# The tree is stored on disk in a hierarchical manner than reflects the +# structure of the tree. Each authority is a subdirectory, and each subdirectory +# contains the GID, pkey, and dbinfo files for that authority (as well as +# subdirectories for each sub-authority) + +class Hierarchy: + ## + # Create the hierarchy object. + # + # @param basedir the base directory to store the hierarchy in + + def __init__(self, basedir = None): + if not basedir: + self.config = Config() + basedir = os.path.join(self.config.SFA_DATA_DIR, "authorities") + self.basedir = basedir + ## + # Given a hrn, return the filenames of the GID, private key, and dbinfo + # files. + # + # @param xrn the human readable name of the authority (urn will be convertd to hrn) + + def get_auth_filenames(self, xrn): + hrn, type = urn_to_hrn(xrn) + leaf = get_leaf(hrn) + parent_hrn = get_authority(hrn) + directory = os.path.join(self.basedir, hrn.replace(".", "/")) + + gid_filename = os.path.join(directory, leaf+".gid") + privkey_filename = os.path.join(directory, leaf+".pkey") + dbinfo_filename = os.path.join(directory, leaf+".dbinfo") + + return (directory, gid_filename, privkey_filename, dbinfo_filename) + + ## + # Check to see if an authority exists. An authority exists if it's disk + # files exist. + # + # @param the human readable name of the authority to check + + def auth_exists(self, xrn): + hrn, type = urn_to_hrn(xrn) + (directory, gid_filename, privkey_filename, dbinfo_filename) = \ + self.get_auth_filenames(hrn) + + return os.path.exists(gid_filename) and \ + os.path.exists(privkey_filename) and \ + os.path.exists(dbinfo_filename) + + ## + # Create an authority. A private key for the authority and the associated + # GID are created and signed by the parent authority. + # + # @param xrn the human readable name of the authority to create (urn will be converted to hrn) + # @param create_parents if true, also create the parents if they do not exist + + def create_auth(self, xrn, create_parents=False): + hrn, type = urn_to_hrn(xrn) + trace("Hierarchy: creating authority: " + hrn) + + # create the parent authority if necessary + parent_hrn = get_authority(hrn) + parent_urn = hrn_to_urn(parent_hrn, 'authority') + if (parent_hrn) and (not self.auth_exists(parent_urn)) and (create_parents): + self.create_auth(parent_urn, create_parents) + + (directory, gid_filename, privkey_filename, dbinfo_filename) = \ + self.get_auth_filenames(hrn) + + # create the directory to hold the files + try: + os.makedirs(directory) + # if the path already exists then pass + except OSError, (errno, strerr): + if errno == 17: + pass + + if os.path.exists(privkey_filename): + print "using existing key", privkey_filename, "for authority", hrn + pkey = Keypair(filename = privkey_filename) + else: + pkey = Keypair(create = True) + pkey.save_to_file(privkey_filename) + + gid = self.create_gid(xrn, create_uuid(), pkey) + gid.save_to_file(gid_filename, save_parents=True) + + # XXX TODO: think up a better way for the dbinfo to work + + dbinfo = Config().get_plc_dbinfo() + dbinfo_file = file(dbinfo_filename, "w") + dbinfo_file.write(str(dbinfo)) + dbinfo_file.close() + + ## + # Return the AuthInfo object for the specified authority. If the authority + # does not exist, then an exception is thrown. As a side effect, disk files + # and a subdirectory may be created to store the authority. + # + # @param xrn the human readable name of the authority to create (urn will be converted to hrn). + + def get_auth_info(self, xrn): + + #trace("Hierarchy: getting authority: " + hrn) + hrn, type = urn_to_hrn(xrn) + if not self.auth_exists(hrn): + raise MissingAuthority(hrn) + + (directory, gid_filename, privkey_filename, dbinfo_filename) = \ + self.get_auth_filenames(hrn) + + auth_info = AuthInfo(hrn, gid_filename, privkey_filename, dbinfo_filename) + + # check the GID and see if it needs to be refreshed + gid = auth_info.get_gid_object() + gid_refreshed = self.refresh_gid(gid) + if gid != gid_refreshed: + auth_info.update_gid_object(gid_refreshed) + + return auth_info + + ## + # Create a new GID. The GID will be signed by the authority that is it's + # immediate parent in the hierarchy (and recursively, the parents' GID + # will be signed by its parent) + # + # @param hrn the human readable name to store in the GID + # @param uuid the unique identifier to store in the GID + # @param pkey the public key to store in the GID + + def create_gid(self, xrn, uuid, pkey): + hrn, type = urn_to_hrn(xrn) + # Using hrn_to_urn() here to make sure the urn is in the right format + # If xrn was a hrn instead of a urn, then the gid's urn will be + # of type None + urn = hrn_to_urn(hrn, type) + gid = GID(subject=hrn, uuid=uuid, hrn=hrn, urn=urn) + + parent_hrn = get_authority(hrn) + if not parent_hrn or hrn == self.config.SFA_INTERFACE_HRN: + # if there is no parent hrn, then it must be self-signed. this + # is where we terminate the recursion + gid.set_issuer(pkey, hrn) + else: + # we need the parent's private key in order to sign this GID + parent_auth_info = self.get_auth_info(parent_hrn) + gid.set_issuer(parent_auth_info.get_pkey_object(), parent_auth_info.hrn) + gid.set_parent(parent_auth_info.get_gid_object()) + gid.set_intermediate_ca(True) + + gid.set_pubkey(pkey) + gid.encode() + gid.sign() + + return gid + + ## + # Refresh a GID. The primary use of this function is to refresh the + # the expiration time of the GID. It may also be used to change the HRN, + # UUID, or Public key of the GID. + # + # @param gid the GID to refresh + # @param hrn if !=None, change the hrn + # @param uuid if !=None, change the uuid + # @param pubkey if !=None, change the public key + + def refresh_gid(self, gid, xrn=None, uuid=None, pubkey=None): + # TODO: compute expiration time of GID, refresh it if necessary + gid_is_expired = False + + # update the gid if we need to + if gid_is_expired or xrn or uuid or pubkey: + + if not xrn: + xrn = gid.get_urn() + if not uuid: + uuid = gid.get_uuid() + if not pubkey: + pubkey = gid.get_pubkey() + + gid = self.create_gid(xrn, uuid, pubkey) + + return gid + + ## + # Retrieve an authority credential for an authority. The authority + # credential will contain the authority privilege and will be signed by + # the authority's parent. + # + # @param hrn the human readable name of the authority (urn is converted to hrn) + # @param authority type of credential to return (authority | sa | ma) + + def get_auth_cred(self, xrn, kind="authority"): + hrn, type = urn_to_hrn(xrn) + auth_info = self.get_auth_info(hrn) + gid = auth_info.get_gid_object() + + cred = Credential(subject=hrn) + cred.set_gid_caller(gid) + cred.set_gid_object(gid) + cred.set_privileges(kind) + cred.get_privileges().delegate_all_privileges(True) + #cred.set_pubkey(auth_info.get_gid_object().get_pubkey()) + + parent_hrn = get_authority(hrn) + if not parent_hrn or hrn == self.config.SFA_INTERFACE_HRN: + # if there is no parent hrn, then it must be self-signed. this + # is where we terminate the recursion + cred.set_issuer_keys(auth_info.get_privkey_filename(), auth_info.get_gid_filename()) + else: + # we need the parent's private key in order to sign this GID + parent_auth_info = self.get_auth_info(parent_hrn) + cred.set_issuer_keys(parent_auth_info.get_privkey_filename(), parent_auth_info.get_gid_filename()) + + + cred.set_parent(self.get_auth_cred(parent_hrn, kind)) + + cred.encode() + cred.sign() + + return cred + ## + # Retrieve an authority ticket. An authority ticket is not actually a + # redeemable ticket, but only serves the purpose of being included as the + # parent of another ticket, in order to provide a chain of authentication + # for a ticket. + # + # This looks almost the same as get_auth_cred, but works for tickets + # XXX does similarity imply there should be more code re-use? + # + # @param xrn the human readable name of the authority (urn is converted to hrn) + + def get_auth_ticket(self, xrn): + hrn, type = urn_to_hrn(xrn) + auth_info = self.get_auth_info(hrn) + gid = auth_info.get_gid_object() + + ticket = SfaTicket(subject=hrn) + ticket.set_gid_caller(gid) + ticket.set_gid_object(gid) + ticket.set_delegate(True) + ticket.set_pubkey(auth_info.get_gid_object().get_pubkey()) + + parent_hrn = get_authority(hrn) + if not parent_hrn: + # if there is no parent hrn, then it must be self-signed. this + # is where we terminate the recursion + ticket.set_issuer(auth_info.get_pkey_object(), hrn) + else: + # we need the parent's private key in order to sign this GID + parent_auth_info = self.get_auth_info(parent_hrn) + ticket.set_issuer(parent_auth_info.get_pkey_object(), parent_auth_info.hrn) + ticket.set_parent(self.get_auth_cred(parent_hrn)) + + ticket.encode() + ticket.sign() + + return ticket + diff --git a/sfa/trust/rights.py b/sfa/trust/rights.py new file mode 100644 index 00000000..59324e8d --- /dev/null +++ b/sfa/trust/rights.py @@ -0,0 +1,288 @@ +## +# This Module implements rights and lists of rights for the SFA. Rights +# are implemented by two classes: +# +# Right - represents a single right +# +# RightList - represents a list of rights +# +# A right may allow several different operations. For example, the "info" right +# allows "listslices", "listcomponentresources", etc. +## + + + +## +# privilege_table is a list of priviliges and what operations are allowed +# per privilege. +# Note that "*" is a privilege granted by ProtoGENI slice authorities, and we +# give it access to the GENI AM calls + +privilege_table = {"authority": ["register", "remove", "update", "resolve", "list", "getcredential", "*"], + "refresh": ["remove", "update"], + "resolve": ["resolve", "list", "getcredential"], + "sa": ["getticket", "redeemslice", "redeemticket", "createslice", "createsliver", "deleteslice", "deletesliver", "updateslice", + "getsliceresources", "getticket", "loanresources", "stopslice", "startslice", "renewsliver", + "deleteslice", "deletesliver", "resetslice", "listslices", "listnodes", "getpolicy", "sliverstatus"], + "embed": ["getticket", "redeemslice", "redeemticket", "createslice", "createsliver", "renewsliver", "deleteslice", "deletesliver", "updateslice", "sliverstatus", "getsliceresources", "shutdown"], + "bind": ["getticket", "loanresources", "redeemticket"], + "control": ["updateslice", "createslice", "createsliver", "renewsliver", "sliverstatus", "stopslice", "startslice", "deleteslice", "deletesliver", "resetslice", "getsliceresources", "getgids"], + "info": ["listslices", "listnodes", "getpolicy"], + "ma": ["setbootstate", "getbootstate", "reboot", "getgids", "gettrustedcerts"], + "operator": ["gettrustedcerts", "getgids"], + "*": ["createsliver", "deletesliver", "sliverstatus", "renewsliver", "shutdown"]} + + + +## +# Determine tje rights that an object should have. The rights are entirely +# dependent on the type of the object. For example, users automatically +# get "refresh", "resolve", and "info". +# +# @param type the type of the object (user | sa | ma | slice | node) +# @param name human readable name of the object (not used at this time) +# +# @return RightList object containing rights + +def determine_rights(type, name): + rl = RightList() + + # rights seem to be somewhat redundant with the type of the credential. + # For example, a "sa" credential implies the authority right, because + # a sa credential cannot be issued to a user who is not an owner of + # the authority + if type == "user": + rl.add("refresh") + rl.add("resolve") + rl.add("info") + elif type == "sa": + rl.add("authority") + rl.add("sa") + elif type == "ma": + rl.add("authority") + rl.add("ma") + elif type == "authority": + rl.add("authority") + rl.add("sa") + rl.add("ma") + elif type == "slice": + rl.add("refresh") + rl.add("embed") + rl.add("bind") + rl.add("control") + rl.add("info") + elif type == "component": + rl.add("operator") + return rl + + +## +# The Right class represents a single privilege. + + + +class Right: + ## + # Create a new right. + # + # @param kind is a string naming the right. For example "control" + + def __init__(self, kind, delegate=False): + self.kind = kind + self.delegate = delegate + + ## + # Test to see if this right object is allowed to perform an operation. + # Returns True if the operation is allowed, False otherwise. + # + # @param op_name is a string naming the operation. For example "listslices". + + def can_perform(self, op_name): + allowed_ops = privilege_table.get(self.kind.lower(), None) + if not allowed_ops: + return False + + # if "*" is specified, then all ops are permitted + if "*" in allowed_ops: + return True + + return (op_name.lower() in allowed_ops) + + ## + # Test to see if this right is a superset of a child right. A right is a + # superset if every operating that is allowed by the child is also allowed + # by this object. + # + # @param child is a Right object describing the child right + + def is_superset(self, child): + my_allowed_ops = privilege_table.get(self.kind.lower(), None) + child_allowed_ops = privilege_table.get(child.kind.lower(), None) + + if not self.delegate: + return False + + if "*" in my_allowed_ops: + return True + + for right in child_allowed_ops: + if not right in my_allowed_ops: + return False + + return True + +## +# A RightList object represents a list of privileges. + +class RightList: + ## + # Create a new rightlist object, containing no rights. + # + # @param string if string!=None, load the rightlist from the string + + def __init__(self, string=None): + self.rights = [] + if string: + self.load_from_string(string) + + def is_empty(self): + return self.rights == [] + + ## + # Add a right to this list + # + # @param right is either a Right object or a string describing the right + + def add(self, right, delegate=False): + if isinstance(right, str): + right = Right(right, delegate) + self.rights.append(right) + + ## + # Load the rightlist object from a string + + def load_from_string(self, string): + self.rights = [] + + # none == no rights, so leave the list empty + if not string: + return + + parts = string.split(",") + for part in parts: + if ':' in part: + spl = part.split(':') + kind = spl[0].strip() + delegate = bool(int(spl[1])) + else: + kind = part.strip() + delegate = 0 + self.rights.append(Right(kind, bool(delegate))) + + ## + # Save the rightlist object to a string. It is saved in the format of a + # comma-separated list. + + def save_to_string(self): + right_names = [] + for right in self.rights: + right_names.append('%s:%d' % (right.kind.strip(), right.delegate)) + + return ",".join(right_names) + + ## + # Check to see if some right in this list allows an operation. This is + # done by evaluating the can_perform function of each operation in the + # list. + # + # @param op_name is an operation to check, for example "listslices" + + def can_perform(self, op_name): + for right in self.rights: + if right.can_perform(op_name): + return True + return False + + ## + # Check to see if all of the rights in this rightlist are a superset + # of all the rights in a child rightlist. A rightlist is a superset + # if there is no operation in the child rightlist that cannot be + # performed in the parent rightlist. + # + # @param child is a rightlist object describing the child + + def is_superset(self, child): + for child_right in child.rights: + allowed = False + for my_right in self.rights: + if my_right.is_superset(child_right): + allowed = True + if not allowed: + return False + return True + + + ## + # set the delegate bit to 'delegate' on + # all privileges + # + # @param delegate boolean (True or False) + + def delegate_all_privileges(self, delegate): + for right in self.rights: + right.delegate = delegate + + ## + # true if all privileges have delegate bit set true + # false otherwise + + def get_all_delegate(self): + for right in self.rights: + if not right.delegate: + return False + return True + + + + ## + # Determine the rights that an object should have. The rights are entirely + # dependent on the type of the object. For example, users automatically + # get "refresh", "resolve", and "info". + # + # @param type the type of the object (user | sa | ma | slice | node) + # @param name human readable name of the object (not used at this time) + # + # @return RightList object containing rights + + def determine_rights(self, type, name): + rl = RightList() + + # rights seem to be somewhat redundant with the type of the credential. + # For example, a "sa" credential implies the authority right, because + # a sa credential cannot be issued to a user who is not an owner of + # the authority + + if type == "user": + rl.add("refresh") + rl.add("resolve") + rl.add("info") + elif type == "sa": + rl.add("authority") + rl.add("sa") + elif type == "ma": + rl.add("authority") + rl.add("ma") + elif type == "authority": + rl.add("authority") + rl.add("sa") + rl.add("ma") + elif type == "slice": + rl.add("refresh") + rl.add("embed") + rl.add("bind") + rl.add("control") + rl.add("info") + elif type == "component": + rl.add("operator") + + return rl diff --git a/sfa/trust/trusted_certs/plc_ca.crt b/sfa/trust/trusted_certs/plc_ca.crt new file mode 100644 index 00000000..840cb29a --- /dev/null +++ b/sfa/trust/trusted_certs/plc_ca.crt @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC7DCCAlWgAwIBAgIBADANBgkqhkiG9w0BAQQFADCBoTELMAkGA1UEBhMCVVMx +EzARBgNVBAgTCk5ldyBKZXJzZXkxEjAQBgNVBAcTCVByaW5jZXRvbjESMBAGA1UE +ChMJUGxhbmV0TGFiMRIwEAYDVQQLEwlQbGFuZXRMYWIxGjAYBgNVBAMTEVBsYW5l +dExhYiBSb290IENBMSUwIwYJKoZIhvcNAQkBFhZzdXBwb3J0QHBsYW5ldC1sYWIu +b3JnMB4XDTA0MDIyMzE4MTMyMloXDTE0MDIyMDE4MTMyMlowgaExCzAJBgNVBAYT +AlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRIwEAYDVQQHEwlQcmluY2V0b24xEjAQ +BgNVBAoTCVBsYW5ldExhYjESMBAGA1UECxMJUGxhbmV0TGFiMRowGAYDVQQDExFQ +bGFuZXRMYWIgUm9vdCBDQTElMCMGCSqGSIb3DQEJARYWc3VwcG9ydEBwbGFuZXQt +bGFiLm9yZzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwtpNRNvNmIEX0zDu +JcMc3zLHZz9LuXjH+UqiktPIfiMhh1sUqZE2wDfppcGRLAdC7mrmZys5GjZTO0nf +bU/rV73hplTD8UPZojpbcvKLm5t0kocDG4aoUL+vDF7T8UlXl/T5UF0GWqFey9UY +luCI5UeKMYdyoxhaMGiL8IBK8DUCAwEAAaMyMDAwDwYDVR0TAQH/BAUwAwEB/zAd +BgNVHQ4EFgQU+DhxfTWp4xeIF2lUWngDOhC1lY8wDQYJKoZIhvcNAQEEBQADgYEA +qYakXhLdtk64ppM1KmjeD0M0bGU+ZFu421MH0whxv5RROgNEwCxXicbD/9FZ2uzo +ik7AdBAiZiyvoEkTxYkzpXHkdM6x0j6iDMjomtihUgkjtM+xaiQ6lqy9h583zhjg +2Te0bEteMD8w8zT3Vdg8AsOPsDRZgHS3TMmTSzDg6nI= +-----END CERTIFICATE----- diff --git a/sfa/trust/trusted_certs/ple_ca.crt b/sfa/trust/trusted_certs/ple_ca.crt new file mode 100644 index 00000000..cb00a40f --- /dev/null +++ b/sfa/trust/trusted_certs/ple_ca.crt @@ -0,0 +1,20 @@ +-----BEGIN CERTIFICATE----- +MIIDODCCAqGgAwIBAgICIAYwDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMCRlIx +GTAXBgNVBAcTEFNvcGhpYSBBbnRpcG9saXMxDjAMBgNVBAoTBUlOUklBMRkwFwYD +VQQLExBQbGFuZXRMYWIgRXVyb3BlMSEwHwYDVQQDExhQbGFuZXRMYWIgRXVyb3Bl +IFJvb3QgQ0EwHhcNMDkwNjE4MTI1NDAwWhcNMTkwNjE2MTI1NDAwWjB2MQswCQYD +VQQGEwJGUjEZMBcGA1UEBxMQU29waGlhIEFudGlwb2xpczEOMAwGA1UEChMFSU5S +SUExGTAXBgNVBAsTEFBsYW5ldExhYiBFdXJvcGUxITAfBgNVBAMTGFBsYW5ldExh +YiBFdXJvcGUgUm9vdCBDQTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAxu3l +PiHQVVnkfANCyB+78ZXS0y1Nj2LaoqI/LdSZyKF8JPt+b5fXgOcOWrnNrCrS/9NV +hyX3s4Ps5HuiVxRZi3MPtxeXz5qbU7UH+k/kR9T/Po7DGa0KAP/TmzO3jhV6EalV +1DIkjs6wNZ5Ypv5m6M6puK1LZ+p92yPhePJPftECAwEAAaOB1DCB0TAdBgNVHQ4E +FgQUjbA0nGWCLFZ7L/SiSdvQuMQWhOQwgaEGA1UdIwSBmTCBloAUjbA0nGWCLFZ7 +L/SiSdvQuMQWhOSheqR4MHYxCzAJBgNVBAYTAkZSMRkwFwYDVQQHExBTb3BoaWEg +QW50aXBvbGlzMQ4wDAYDVQQKEwVJTlJJQTEZMBcGA1UECxMQUGxhbmV0TGFiIEV1 +cm9wZTEhMB8GA1UEAxMYUGxhbmV0TGFiIEV1cm9wZSBSb290IENBggIgBjAMBgNV +HRMEBTADAQH/MA0GCSqGSIb3DQEBBQUAA4GBAEZFa4EGGrqGSCZivYCiKiS3vhwP +WQ/84vTXVQr5ydiSc210bIVlPRFqdZAMd64uxdERb90734AVpGAQyBYq1ccA+yCF +v2hW8Cx87XObp0uoL0RniA1qOr3LO69rDJAS7n7EPHhAKjOXUkzb/vvXdIAPmbra +AQGvqcqKX7Fk9+wi +-----END CERTIFICATE----- diff --git a/sfa/trust/trustedroot.py b/sfa/trust/trustedroot.py new file mode 100644 index 00000000..63f781a8 --- /dev/null +++ b/sfa/trust/trustedroot.py @@ -0,0 +1,46 @@ +### $Id: trustedroot.py 18182 2010-06-02 20:42:30Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/trust/trustedroot.py $ + +import os + +from sfa.trust.gid import * + +class TrustedRootList: + def __init__(self, dir): + self.basedir = dir + + # create the directory to hold the files + try: + os.makedirs(self.basedir) + # if the path already exists then pass + except OSError, (errno, strerr): + if errno == 17: + pass + + def add_gid(self, gid): + fn = os.path.join(self.basedir, gid.get_hrn() + ".gid") + + gid.save_to_file(fn) + + def get_list(self): + gid_list = [] + + file_list = os.listdir(self.basedir) + for gid_file in file_list: + fn = os.path.join(self.basedir, gid_file) + if os.path.isfile(fn): + gid = GID(filename = fn) + gid_list.append(gid) + + return gid_list + + def get_file_list(self): + gid_file_list = [] + + file_list = os.listdir(self.basedir) + for gid_file in file_list: + fn = os.path.join(self.basedir, gid_file) + if os.path.isfile(fn): + gid_file_list.append(fn) + + return gid_file_list diff --git a/sfa/util/PostgreSQL.py b/sfa/util/PostgreSQL.py new file mode 100644 index 00000000..984e5149 --- /dev/null +++ b/sfa/util/PostgreSQL.py @@ -0,0 +1,269 @@ +# +# PostgreSQL database interface. Sort of like DBI(3) (Database +# independent interface for Perl). +# +# + +import psycopg2 +import psycopg2.extensions +psycopg2.extensions.register_type(psycopg2.extensions.UNICODE) +# UNICODEARRAY not exported yet +psycopg2.extensions.register_type(psycopg2._psycopg.UNICODEARRAY) + +import pgdb +from types import StringTypes, NoneType +import traceback +import commands +import re +from pprint import pformat + +from sfa.util.faults import * +from sfa.util.debug import * + +if not psycopg2: + is8bit = re.compile("[\x80-\xff]").search + + def unicast(typecast): + """ + pgdb returns raw UTF-8 strings. This function casts strings that + apppear to contain non-ASCII characters to unicode objects. + """ + + def wrapper(*args, **kwds): + value = typecast(*args, **kwds) + + # pgdb always encodes unicode objects as UTF-8 regardless of + # the DB encoding (and gives you no option for overriding + # the encoding), so always decode 8-bit objects as UTF-8. + if isinstance(value, str) and is8bit(value): + value = unicode(value, "utf-8") + + return value + + return wrapper + + pgdb.pgdbTypeCache.typecast = unicast(pgdb.pgdbTypeCache.typecast) + +def handle_exception(f): + def wrapper(*args, **kwds): + try: return f(*args, **kwds) + except Exception, fault: + raise SfaDBError(str(fault)) + return wrapper + +class PostgreSQL: + def __init__(self, config): + self.config = config + self.debug = False +# self.debug = True + self.connection = None + + @handle_exception + def cursor(self): + if self.connection is None: + # (Re)initialize database connection + if psycopg2: + try: + # Try UNIX socket first + self.connection = psycopg2.connect(user = self.config.SFA_PLC_DB_USER, + password = self.config.SFA_PLC_DB_PASSWORD, + database = self.config.SFA_PLC_DB_NAME) + except psycopg2.OperationalError: + # Fall back on TCP + self.connection = psycopg2.connect(user = self.config.SFA_PLC_DB_USER, + password = self.config.SFA_PLC_DB_PASSWORD, + database = self.config.SFA_PLC_DB_NAME, + host = self.config.SFA_PLC_DB_HOST, + port = self.config.SFA_PLC_DB_PORT) + self.connection.set_client_encoding("UNICODE") + else: + self.connection = pgdb.connect(user = self.config.SFA_PLC_DB_USER, + password = self.config.SFA_PLC_DB_PASSWORD, + host = "%s:%d" % (self.config.SFA_PLC_DB_HOST, self.config.SFA_PLC_DB_PORT), + database = self.config.SFA_PLC_DB_NAME) + + (self.rowcount, self.description, self.lastrowid) = \ + (None, None, None) + + return self.connection.cursor() + + def close(self): + if self.connection is not None: + self.connection.close() + self.connection = None + + def quote(self, value): + """ + Returns quoted version of the specified value. + """ + + # The pgdb._quote function is good enough for general SQL + # quoting, except for array types. + if isinstance(value, (list, tuple, set)): + return "ARRAY[%s]" % ", ".join(map, self.quote, value) + else: + return pgdb._quote(value) + + quote = classmethod(quote) + + def param(self, name, value): + # None is converted to the unquoted string NULL + if isinstance(value, NoneType): + conversion = "s" + # True and False are also converted to unquoted strings + elif isinstance(value, bool): + conversion = "s" + elif isinstance(value, float): + conversion = "f" + elif not isinstance(value, StringTypes): + conversion = "d" + else: + conversion = "s" + + return '%(' + name + ')' + conversion + + param = classmethod(param) + + def begin_work(self): + # Implicit in pgdb.connect() + pass + + def commit(self): + self.connection.commit() + + def rollback(self): + self.connection.rollback() + + def do(self, query, params = None): + cursor = self.execute(query, params) + cursor.close() + return self.rowcount + + def next_id(self, table_name, primary_key): + sequence = "%(table_name)s_%(primary_key)s_seq" % locals() + sql = "SELECT nextval('%(sequence)s')" % locals() + rows = self.selectall(sql, hashref = False) + if rows: + return rows[0][0] + return None + + def last_insert_id(self, table_name, primary_key): + if isinstance(self.lastrowid, int): + sql = "SELECT %s FROM %s WHERE oid = %d" % \ + (primary_key, table_name, self.lastrowid) + rows = self.selectall(sql, hashref = False) + if rows: + return rows[0][0] + + return None + + # modified for psycopg2-2.0.7 + # executemany is undefined for SELECT's + # see http://www.python.org/dev/peps/pep-0249/ + # accepts either None, a single dict, a tuple of single dict - in which case it execute's + # or a tuple of several dicts, in which case it executemany's + def execute(self, query, params = None): + + cursor = self.cursor() + try: + + # psycopg2 requires %()s format for all parameters, + # regardless of type. + # this needs to be done carefully though as with pattern-based filters + # we might have percents embedded in the query + # so e.g. GetPersons({'email':'*fake*'}) was resulting in .. LIKE '%sake%' + if psycopg2: + query = re.sub(r'(%\([^)]*\)|%)[df]', r'\1s', query) + # rewrite wildcards set by Filter.py as '***' into '%' + query = query.replace ('***','%') + + if not params: + if self.debug: + print >> log,'execute0',query + cursor.execute(query) + elif isinstance(params,dict): + if self.debug: + print >> log,'execute-dict: params',params,'query',query%params + cursor.execute(query,params) + elif isinstance(params,tuple) and len(params)==1: + if self.debug: + print >> log,'execute-tuple',query%params[0] + cursor.execute(query,params[0]) + else: + param_seq=(params,) + if self.debug: + for params in param_seq: + print >> log,'executemany',query%params + cursor.executemany(query, param_seq) + (self.rowcount, self.description, self.lastrowid) = \ + (cursor.rowcount, cursor.description, cursor.lastrowid) + except Exception, e: + try: + self.rollback() + except: + pass + uuid = commands.getoutput("uuidgen") + print >> log, "Database error %s:" % uuid + print >> log, e + print >> log, "Query:" + print >> log, query + print >> log, "Params:" + print >> log, pformat(params) + raise SfaDBError("Please contact support: %s" % str(e)) + + return cursor + + def selectall(self, query, params = None, hashref = True, key_field = None): + """ + Return each row as a dictionary keyed on field name (like DBI + selectrow_hashref()). If key_field is specified, return rows + as a dictionary keyed on the specified field (like DBI + selectall_hashref()). + + If params is specified, the specified parameters will be bound + to the query. + """ + + cursor = self.execute(query, params) + rows = cursor.fetchall() + cursor.close() + self.commit() + if hashref or key_field is not None: + # Return each row as a dictionary keyed on field name + # (like DBI selectrow_hashref()). + labels = [column[0] for column in self.description] + rows = [dict(zip(labels, row)) for row in rows] + + if key_field is not None and key_field in labels: + # Return rows as a dictionary keyed on the specified field + # (like DBI selectall_hashref()). + return dict([(row[key_field], row) for row in rows]) + else: + return rows + + def fields(self, table, notnull = None, hasdef = None): + """ + Return the names of the fields of the specified table. + """ + + if hasattr(self, 'fields_cache'): + if self.fields_cache.has_key((table, notnull, hasdef)): + return self.fields_cache[(table, notnull, hasdef)] + else: + self.fields_cache = {} + + sql = "SELECT attname FROM pg_attribute, pg_class" \ + " WHERE pg_class.oid = attrelid" \ + " AND attnum > 0 AND relname = %(table)s" + + if notnull is not None: + sql += " AND attnotnull is %(notnull)s" + + if hasdef is not None: + sql += " AND atthasdef is %(hasdef)s" + + rows = self.selectall(sql, locals(), hashref = False) + + self.fields_cache[(table, notnull, hasdef)] = [row[0] for row in rows] + + return self.fields_cache[(table, notnull, hasdef)] diff --git a/sfa/util/__init__.py b/sfa/util/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfa/util/api.py b/sfa/util/api.py new file mode 100644 index 00000000..fa3bf175 --- /dev/null +++ b/sfa/util/api.py @@ -0,0 +1,273 @@ +# +# SFA XML-RPC and SOAP interfaces +# +### $Id: api.py 18586 2010-08-05 23:33:41Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/api.py $ +# + +import sys +import os +import traceback +import string +import xmlrpclib + +from sfa.trust.auth import Auth +from sfa.util.config import * +from sfa.util.faults import * +from sfa.util.debug import * +from sfa.trust.credential import * +from sfa.trust.certificate import * +from sfa.util.namespace import * +from sfa.util.sfalogging import * + +# See "2.2 Characters" in the XML specification: +# +# #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] +# avoiding +# [#x7F-#x84], [#x86-#x9F], [#xFDD0-#xFDDF] + +invalid_xml_ascii = map(chr, range(0x0, 0x8) + [0xB, 0xC] + range(0xE, 0x1F)) +xml_escape_table = string.maketrans("".join(invalid_xml_ascii), "?" * len(invalid_xml_ascii)) + +def xmlrpclib_escape(s, replace = string.replace): + """ + xmlrpclib does not handle invalid 7-bit control characters. This + function augments xmlrpclib.escape, which by default only replaces + '&', '<', and '>' with entities. + """ + + # This is the standard xmlrpclib.escape function + s = replace(s, "&", "&") + s = replace(s, "<", "<") + s = replace(s, ">", ">",) + + # Replace invalid 7-bit control characters with '?' + return s.translate(xml_escape_table) + +def xmlrpclib_dump(self, value, write): + """ + xmlrpclib cannot marshal instances of subclasses of built-in + types. This function overrides xmlrpclib.Marshaller.__dump so that + any value that is an instance of one of its acceptable types is + marshalled as that type. + + xmlrpclib also cannot handle invalid 7-bit control characters. See + above. + """ + + # Use our escape function + args = [self, value, write] + if isinstance(value, (str, unicode)): + args.append(xmlrpclib_escape) + + try: + # Try for an exact match first + f = self.dispatch[type(value)] + except KeyError: + raise + # Try for an isinstance() match + for Type, f in self.dispatch.iteritems(): + if isinstance(value, Type): + f(*args) + return + raise TypeError, "cannot marshal %s objects" % type(value) + else: + f(*args) + +# You can't hide from me! +xmlrpclib.Marshaller._Marshaller__dump = xmlrpclib_dump + +# SOAP support is optional +try: + import SOAPpy + from SOAPpy.Parser import parseSOAPRPC + from SOAPpy.Types import faultType + from SOAPpy.NS import NS + from SOAPpy.SOAPBuilder import buildSOAP +except ImportError: + SOAPpy = None + + +def import_deep(name): + mod = __import__(name) + components = name.split('.') + for comp in components[1:]: + mod = getattr(mod, comp) + return mod + +class ManagerWrapper: + """ + This class acts as a wrapper around an SFA interface manager module, but + can be used with any python module. The purpose of this class is raise a + SfaNotImplemented exception if the a someone attepmts to use an attribute + (could be a callable) thats not available in the library by checking the + library using hasattr. This helps to communicate better errors messages + to the users and developers in the event that a specifiec operation + is not implemented by a libarary and will generally be more helpful than + the standard AttributeError + """ + def __init__(self, manager, interface): + self.manager = manager + self.interface = interface + + def __getattr__(self, method): + + if not hasattr(self.manager, method): + raise SfaNotImplemented(method, self.interface) + return getattr(self.manager, method) + +class BaseAPI: + + cache = None + protocol = None + + def __init__(self, config = "/etc/sfa/sfa_config.py", encoding = "utf-8", + methods='sfa.methods', peer_cert = None, interface = None, + key_file = None, cert_file = None, cache = cache): + + self.encoding = encoding + + # flat list of method names + self.methods_module = methods_module = __import__(methods, fromlist=[methods]) + self.methods = methods_module.all + + # Better just be documenting the API + if config is None: + return + + # Load configuration + self.config = Config(config) + self.auth = Auth(peer_cert) + self.hrn = self.config.SFA_INTERFACE_HRN + self.interface = interface + self.key_file = key_file + self.key = Keypair(filename=self.key_file) + self.cert_file = cert_file + self.cert = Certificate(filename=self.cert_file) + self.cache = cache + self.credential = None + self.source = None + self.time_format = "%Y-%m-%d %H:%M:%S" + self.logger=get_sfa_logger() + + # load registries + from sfa.server.registry import Registries + self.registries = Registries(self) + + # load aggregates + from sfa.server.aggregate import Aggregates + self.aggregates = Aggregates(self) + + + def get_interface_manager(self, manager_base = 'sfa.managers'): + """ + Returns the appropriate manager module for this interface. + Modules are usually found in sfa/managers/ + """ + + if self.interface in ['registry']: + mgr_type = self.config.SFA_REGISTRY_TYPE + manager_module = manager_base + ".registry_manager_%s" % mgr_type + elif self.interface in ['aggregate']: + mgr_type = self.config.SFA_AGGREGATE_TYPE + manager_module = manager_base + ".aggregate_manager_%s" % mgr_type + elif self.interface in ['slicemgr', 'sm']: + mgr_type = self.config.SFA_SM_TYPE + manager_module = manager_base + ".slice_manager_%s" % mgr_type + elif self.interface in ['component', 'cm']: + mgr_type = self.config.SFA_CM_TYPE + manager_module = manager_base + ".component_manager_%s" % mgr_type + else: + raise SfaAPIError("No manager for interface: %s" % self.interface) + manager = __import__(manager_module, fromlist=[manager_base]) + # this isnt necessary but will hlep to produce better error messages + # if someone tries to access an operation this manager doesn't implement + manager = ManagerWrapper(manager, self.interface) + + return manager + + def callable(self, method): + """ + Return a new instance of the specified method. + """ + # Look up method + if method not in self.methods: + raise SfaInvalidAPIMethod, method + + # Get new instance of method + try: + classname = method.split(".")[-1] + module = __import__(self.methods_module.__name__ + "." + method, globals(), locals(), [classname]) + callablemethod = getattr(module, classname)(self) + return getattr(module, classname)(self) + except ImportError, AttributeError: + raise SfaInvalidAPIMethod, method + + def call(self, source, method, *args): + """ + Call the named method from the specified source with the + specified arguments. + """ + function = self.callable(method) + function.source = source + self.source = source + return function(*args) + + + def handle(self, source, data, method_map): + """ + Handle an XML-RPC or SOAP request from the specified source. + """ + # Parse request into method name and arguments + try: + interface = xmlrpclib + self.protocol = 'xmlrpclib' + (args, method) = xmlrpclib.loads(data) + if method_map.has_key(method): + method = method_map[method] + methodresponse = True + + except Exception, e: + if SOAPpy is not None: + self.protocol = 'soap' + interface = SOAPpy + (r, header, body, attrs) = parseSOAPRPC(data, header = 1, body = 1, attrs = 1) + method = r._name + args = r._aslist() + # XXX Support named arguments + else: + raise e + + try: + result = self.call(source, method, *args) + except SfaFault, fault: + result = fault + except Exception, fault: + traceback.print_exc(file = log) + result = SfaAPIError(fault) + + + # Return result + response = self.prepare_response(result, method) + return response + + def prepare_response(self, result, method=""): + """ + convert result to a valid xmlrpc or soap response + """ + + if self.protocol == 'xmlrpclib': + if not isinstance(result, SfaFault): + result = (result,) + response = xmlrpclib.dumps(result, methodresponse = True, encoding = self.encoding, allow_none = 1) + elif self.protocol == 'soap': + if isinstance(result, Exception): + result = faultParameter(NS.ENV_T + ":Server", "Method Failed", method) + result._setDetail("Fault %d: %s" % (result.faultCode, result.faultString)) + else: + response = buildSOAP(kw = {'%sResponse' % method: {'Result': result}}, encoding = self.encoding) + else: + if isinstance(result, Exception): + raise result + + return response diff --git a/sfa/util/cache.py b/sfa/util/cache.py new file mode 100644 index 00000000..45961feb --- /dev/null +++ b/sfa/util/cache.py @@ -0,0 +1,62 @@ +# +# This module implements general purpose caching system +# +from __future__ import with_statement +import time +import threading +from datetime import datetime + +# maximum lifetime of cached data (in seconds) +MAX_CACHE_TTL = 60 * 60 + +class CacheData: + + data = None + created = None + expires = None + lock = None + + def __init__(self, data, ttl = MAX_CACHE_TTL): + self.lock = threading.RLock() + self.data = data + self.renew(ttl) + + def is_expired(self): + return time.time() > self.expires + + def get_created_date(self): + return str(datetime.fromtimestamp(self.created)) + + def get_expires_date(self): + return str(datetime.fromtimestamp(self.expires)) + + def renew(self, ttl = MAX_CACHE_TTL): + self.created = time.time() + self.expires = self.created + ttl + + def set_data(self, data, renew=True, ttl = MAX_CACHE_TTL): + with self.lock: + self.data = data + if renew: + self.renew(ttl) + + def get_data(self): + return self.data + +class Cache: + + cache = {} + lock = threading.RLock() + + def add(self, key, value, ttl = MAX_CACHE_TTL): + with self.lock: + if self.cache.has_key(key): + self.cache[key].set_data(value, ttl=ttl) + else: + self.cache[key] = CacheData(value, ttl) + + def get(self, key): + data = self.cache.get(key) + if not data or data.is_expired(): + return None + return data.get_data() diff --git a/sfa/util/client.py b/sfa/util/client.py new file mode 100644 index 00000000..4dcc92d0 --- /dev/null +++ b/sfa/util/client.py @@ -0,0 +1,382 @@ +## +# This module implements the client-side of the SFA API. Stubs are provided +# that convert the supplied parameters to the necessary format and send them +# via XMLRPC to an SFA Server. +# +# TODO: Investigate ways to combine this with existing PLC API? +## + +### $Id: client.py 16477 2010-01-05 16:31:37Z thierry $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/client.py $ + +from sfa.trust.certificate import * +from sfa.trust.gid import * +from sfa.trust.credential import * +from sfa.util.record import * +from sfa.util.sfaticket import SfaTicket + +## +# The GeniClient class provides stubs for executing SFA operations. A given +# client object connects to one server. To connect to multiple servers, create +# multiple GeniClient objects. +# +# The SFA protocol uses an HTTPS connection, and the client's side of the +# connection uses his private key. Generally, this private key must match the +# public key that is containing in the GID that the client is providing for +# those functions that take a GID. + +class GeniClient: + ## + # Create a new GeniClient object. + # + # @param url is the url of the server + # @param key_file = private key file of client + # @param cert_file = x.509 cert containing the client's public key. This + # could be a GID certificate, or any x.509 cert. + # @param protocol The ORPC protocol to use. Can be "soap" or "xmlrpc" + + def __init__(self, url, key_file, cert_file, protocol="xmlrpc"): + self.url = url + self.key_file = key_file + self.cert_file = cert_file + self.key = Keypair(filename = self.key_file) + + + if (protocol=="xmlrpc"): + import xmlrpcprotocol + self.server = xmlrpcprotocol.get_server(self.url, self.key_file, self.cert_file) + elif (protocol=="soap"): + import soapprotocol + self.server = soapprotocol.get_server(self.url, self.key_file, self.cert_file) + else: + raise Exception("Attempted use of undefined protocol %s"%protocol) + + + # ------------------------------------------------------------------------- + # Registry Interface + # ------------------------------------------------------------------------- + + ## + # Create a new GID. For MAs and SAs that are physically located on the + # registry, this allows a owner/operator/PI to create a new GID and have it + # signed by his respective authority. + # + # @param cred credential of caller + # @param name hrn for new GID + # @param uuid unique identifier for new GID + # @param pkey_string public-key string (TODO: why is this a string and not a keypair object?) + # + # @return a GID object + + def create_gid(self, cred, name, uuid, pkey_string): + gid_str = self.server.create_gid(cred.save_to_string(save_parents=True), name, uuid, pkey_string) + return GID(string=gid_str) + + ## + # Retrieve the GID for an object. This function looks up a record in the + # registry and returns the GID of the record if it exists. + # TODO: Is this function needed? It's a shortcut for Resolve() + # + # @param name hrn to look up + # + # @return a GID object + + #def get_gid(self, name): + # gid_str_list = self.server.get_gid(name) + # gid_list = [] + # for str in gid_str_list: + # gid_list.append(GID(string=str)) + # return gid_list + + + def get_gid(self, cert, hrn, type, request_hash): + cert_string = cert.save_to_string(save_parents=True) + gid_str = self.server.get_gid(cert_string, hrn, type, request_hash) + return GID(string=gid_str) + ## + # Get_self_credential a degenerate version of get_credential used by a + # client to get his initial credential when he doesn't have one. This is + # the same as get_credential(..., cred=None,...). + # + # The registry ensures that the client is the principal that is named by + # (type, name) by comparing the public key in the record's GID to the + # private key used to encrypt the client-side of the HTTPS connection. Thus + # it is impossible for one principal to retrieve another principal's + # credential without having the appropriate private key. + # + # @param type type of object (user | slice | sa | ma | node + # @param name human readable name of object + # + # @return a credential object + + def get_self_credential(self, type, name): + cred_str = self.server.get_self_credential(type, name) + return Credential(string = cred_str) + + ## + # Retrieve a credential for an object. + # + # If cred==None, then the behavior reverts to get_self_credential() + # + # @param cred credential object specifying rights of the caller + # @param type type of object (user | slice | sa | ma | node) + # @param name human readable name of object + # + # @return a credental object + + def get_credential(self, cred, type, name): + if cred: + cred = cred.save_to_string(save_parents=True) + cred_str = self.server.get_credential(cred, type, name) + return Credential(string = cred_str) + + ## + # List the records in an authority. The objectGID in the supplied credential + # should name the authority that will be listed. + # + # @param cred credential object specifying rights of the caller + # + # @return list of record objects + + def list(self, cred, auth_hrn, caller_cred=None): + result_dict_list = self.server.list(cred.save_to_string(save_parents=True), auth_hrn, caller_cred) + result_rec_list = [] + for dict in result_dict_list: + result_rec_list.append(SfaRecord(dict=dict)) + return result_rec_list + + ## + # Register an object with the registry. In addition to being stored in the + # SFA database, the appropriate records will also be created in the + # PLC databases. + # + # + # + # @param cred credential object specifying rights of the caller + # @param record to register + # + # @return GID object for the newly-registered record + + def register(self, cred, record, caller_cred=None): + gid_str = self.server.register(cred.save_to_string(save_parents=True), record.as_dict(), caller_cred) + return GID(string = gid_str) + + + ## + # Register a peer object with the registry. + # + # + # @param cred credential object specifying rights of the caller + # @param record to register + # + # @return GID object for the newly-registered record + + def register_peer_object(self, cred, record, caller_cred=None): + return self.server.register_peer_object(cred.save_to_string(save_parents=True), record, caller_cred) + + ## + # Remove an object from the registry. If the object represents a PLC object, + # then the PLC records will also be removed. + # + # @param cred credential object specifying rights of the caller + # @param type + # @param hrn + + def remove(self, cred, type, hrn, caller_cred=None): + return self.server.remove(cred.save_to_string(save_parents=True), type, hrn, caller_cred) + + ## + # Remove a peer object from the registry. If the object represents a PLC object, + # then the PLC records will also be removed. + # + # @param cred credential object specifying rights of the caller + # @param type + # @param hrn + + def remove_peer_object(self, cred, record, caller_cred=None): + result = self.server.remove_peer_object(cred.save_to_string(save_parents=True), record, caller_cred) + return result + + ## + # Resolve an object in the registry. A given HRN may have multiple records + # associated with it, and therefore multiple records may be returned. The + # caller should check the type fields of the records to find the one that + # he is interested in. + # + # @param cred credential object specifying rights of the caller + # @param name human readable name of object + + def resolve(self, cred, name, caller_cred=None): + result_dict_list = self.server.resolve(cred.save_to_string(save_parents=True), name, caller_cred) + result_rec_list = [] + for dict in result_dict_list: + if dict['type'] in ['authority']: + result_rec_list.append(AuthorityRecord(dict=dict)) + elif dict['type'] in ['node']: + result_rec_list.append(NodeRecord(dict=dict)) + elif dict['type'] in ['slice']: + result_rec_list.append(SliceRecord(dict=dict)) + elif dict['type'] in ['user']: + result_rec_list.append(UserRecord(dict=dict)) + else: + result_rec_list.append(SfaRecord(dict=dict)) + return result_rec_list + + ## + # Update an object in the registry. Currently, this only updates the + # PLC information associated with the record. The SFA fields (name, type, + # GID) are fixed. + # + # + # + # @param cred credential object specifying rights of the caller + # @param record a record object to be updated + + def update(self, cred, record, caller_cred=None): + result = self.server.update(cred.save_to_string(save_parents=True), record.as_dict(), caller_cred) + return result + + + #------------------------------------------------------------------------- + # Aggregate Interface + #------------------------------------------------------------------------- + + ## list resources + # + # @param cred a credential + # @param hrn slice hrn + + def get_resources(self, cred, hrn=None, caller_cred=None): + result = self.server.get_resources(cred.save_to_string(save_parents=True), hrn, caller_cred) + return result + + def get_aggregates(self, cred, hrn=None): + result = self.server.get_aggregates(cred.save_to_string(save_parents=True), hrn) + return result + + def get_registries(self, cred, hrn=None): + result = self.server.get_registries(cred.save_to_string(save_parents=True), hrn) + return result + + ## get policy + # + # @param cred a credential + + def get_policy(self, cred): + result = self.server.get_policy(cred.save_to_string(save_parents=True)) + return result + + ## create slice + # + # @param cred a credential + # @param rspec resource specification defining how to instantiate the slice + + def create_slice(self, cred, hrn, rspec, caller_cred=None): + result = self.server.create_slice(cred.save_to_string(save_parents=True), hrn, rspec, caller_cred) + return result + + + ## delete slice + # + # @param cred a credential + # @param hrn slice to delete + def delete_slice(self, cred, hrn, caller_cred=None): + result = self.server.delete_slice(cred.save_to_string(save_parents=True), hrn, caller_cred) + return result + + # ------------------------------------------------------------------------ + # Slice Interface + # ------------------------------------------------------------------------ + + ## + # Start a slice. + # + # @param cred a credential identifying the caller (callerGID) and the slice + # (objectGID) + + def start_slice(self, cred, hrn): + result = self.server.start_slice(cred.save_to_string(save_parents=True), hrn) + return result + + ## + # Stop a slice. + # + # @param cred a credential identifying the caller (callerGID) and the slice + # (objectGID) + + def stop_slice(self, cred, hrn): + result = self.server.stop_slice(cred.save_to_string(save_parents=True), hrn) + return result + + ## + # Reset a slice. + # + # @param cred a credential identifying the caller (callerGID) and the slice + # (objectGID) + + def reset_slice(self, cred, hrn): + result = self.server.reset_slice(cred.save_to_string(save_parents=True), hrn) + return result + + ## + # Delete a slice. + # + # @param cred a credential identifying the caller (callerGID) and the slice + # (objectGID) + + def delete_slice(self, cred, hrn, caller_cred=None): + result = self.server.delete_slice(cred.save_to_string(save_parents=True), hrn, caller_cred) + return result + + ## + # List the slices on a component. + # + # @param cred credential object that authorizes the caller + # + # @return a list of slice names + + def get_slices(self, cred): + result = self.server.get_slices(cred.save_to_string(save_parents=True)) + return result + + ## + # Retrieve a ticket. This operation is currently implemented on the + # registry (see SFA, engineering decisions), and is not implemented on + # components. + # + # The ticket is filled in with information from the PLC database. This + # information includes resources, and attributes such as user keys and + # initscripts. + # + # @param cred credential object + # @param name name of the slice to retrieve a ticket for + # @param rspec resource specification dictionary + # + # @return a ticket object + + def get_ticket(self, cred, name, rspec): + ticket_str = self.server.get_ticket(cred.save_to_string(save_parents=True), name, rspec) + ticket = SfaTicket(string=ticket_str) + return ticket + + ## + # Redeem a ticket. This operation is currently implemented on the + # component. + # + # The ticket is submitted to the node manager, and the slice is instantiated + # or updated as appropriate. + # + # TODO: This operation should return a sliver credential and indicate + # whether or not the component will accept only sliver credentials, or + # will accept both sliver and slice credentials. + # + # @param ticket a ticket object containing the ticket + + def redeem_ticket(self, ticket): + result = self.server.redeem_ticket(ticket.save_to_string(save_parents=True)) + return result + + + def remove_remote_object(self, cred, hrn, record): + result = self.server.remove_remote_object(cred.save_to_string(save_parents=True), hrn, record) + return result diff --git a/sfa/util/componentserver.py b/sfa/util/componentserver.py new file mode 100644 index 00000000..f0944a6e --- /dev/null +++ b/sfa/util/componentserver.py @@ -0,0 +1,138 @@ +## +# This module implements a general-purpose server layer for sfa. +# The same basic server should be usable on the registry, component, or +# other interfaces. +# +# TODO: investigate ways to combine this with existing PLC server? +## + +### $Id: componentserver.py 17275 2010-03-05 21:37:10Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/componentserver.py $ + +import sys +import traceback +import threading +import socket, os +import SocketServer +import BaseHTTPServer +import SimpleHTTPServer +import SimpleXMLRPCServer +from OpenSSL import SSL +from sfa.trust.certificate import Keypair, Certificate +from sfa.trust.credential import * +from sfa.util.faults import * +from sfa.plc.api import ComponentAPI +from sfa.util.server import verify_callback, ThreadedServer +from sfa.util.debug import log + + +## +# taken from the web (XXX find reference). Implents HTTPS xmlrpc request handler + +class SecureXMLRpcRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): + """Secure XML-RPC request handler class. + + It it very similar to SimpleXMLRPCRequestHandler but it uses HTTPS for transporting XML data. + """ + def setup(self): + self.connection = self.request + self.rfile = socket._fileobject(self.request, "rb", self.rbufsize) + self.wfile = socket._fileobject(self.request, "wb", self.wbufsize) + + def do_POST(self): + """Handles the HTTPS POST request. + + It was copied out from SimpleXMLRPCServer.py and modified to shutdown the socket cleanly. + """ + try: + peer_cert = Certificate() + peer_cert.load_from_pyopenssl_x509(self.connection.get_peer_certificate()) + self.api = ComponentAPI(peer_cert = peer_cert, + interface = self.server.interface, + key_file = self.server.key_file, + cert_file = self.server.cert_file) + # get arguments + request = self.rfile.read(int(self.headers["content-length"])) + # In previous versions of SimpleXMLRPCServer, _dispatch + # could be overridden in this class, instead of in + # SimpleXMLRPCDispatcher. To maintain backwards compatibility, + # check to see if a subclass implements _dispatch and dispatch + # using that method if present. + #response = self.server._marshaled_dispatch(request, getattr(self, '_dispatch', None)) + # XX TODO: Need to get the real remote address + remote_addr = (remote_ip, remote_port) = self.connection.getpeername() + self.api.remote_addr = remote_addr + #remote_addr = (self.rfile.connection.remote_ip, remote_port) + #self.api.remote_addr = remote_addr + response = self.api.handle(remote_addr, request) + + + except Exception, fault: + raise + # This should only happen if the module is buggy + # internal error, report as HTTP server error + self.send_response(500) + self.end_headers() + traceback.print_exc() + else: + # got a valid XML RPC response + self.send_response(200) + self.send_header("Content-type", "text/xml") + self.send_header("Content-length", str(len(response))) + self.end_headers() + self.wfile.write(response) + + # shut down the connection + self.wfile.flush() + self.connection.shutdown() # Modified here! + +## +# Implements an HTTPS XML-RPC server. Generally it is expected that SFA +# functions will take a credential string, which is passed to +# decode_authentication. Decode_authentication() will verify the validity of +# the credential, and verify that the user is using the key that matches the +# GID supplied in the credential. + +class ComponentServer(threading.Thread): + + ## + # Create a new SfaServer object. + # + # @param ip the ip address to listen on + # @param port the port to listen on + # @param key_file private key filename of registry + # @param cert_file certificate filename containing public key + # (could be a GID file) + + def __init__(self, ip, port, key_file, cert_file, api=None): + threading.Thread.__init__(self) + self.key = Keypair(filename = key_file) + self.cert = Certificate(filename = cert_file) + self.server = ThreadedServer((ip, port), SecureXMLRpcRequestHandler, key_file, cert_file) + self.trusted_cert_list = None + self.register_functions() + + + ## + # Register functions that will be served by the XMLRPC server. This + # function should be overrided by each descendant class. + + def register_functions(self): + self.server.register_function(self.noop) + + ## + # Sample no-op server function. The no-op function decodes the credential + # that was passed to it. + + def noop(self, cred, anything): + self.decode_authentication(cred) + + return anything + + ## + # Execute the server, serving requests forever. + + def run(self): + self.server.serve_forever() + + diff --git a/sfa/util/config.py b/sfa/util/config.py new file mode 100644 index 00000000..fe92c867 --- /dev/null +++ b/sfa/util/config.py @@ -0,0 +1,128 @@ +## +# SFA Configuration Info +# +# This module holds configuration parameters for SFA. There are two +# main pieces of information that are used: the database connection and +# the PLCAPI connection +## + +## +# SFA uses a MYSQL database to store records. This database may be +# co-located with the PLC database, or it may be a separate database. The +# following parameters define the connection to the database. +# +# Note that SFA does not access any of the PLC databases directly via +# a mysql connection; All PLC databases are accessed via PLCAPI. + +### $Id: config.py 16803 2010-01-26 17:49:14Z acb $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/config.py $ + +import os.path +import traceback + +from sfa.util.debug import log + +class Config: + """ + Parse the bash/Python/PHP version of the configuration file. Very + fast but no type conversions. + """ + + def __init__(self, config_file = "/etc/sfa/sfa_config.py"): + self.config_file = None + self.config_path = None + self.data_path = None + self.load(config_file) + + def load(self, config_file): + try: + execfile(config_file, self.__dict__) + self.config_file = config_file + # path to configuration data + self.config_path = os.path.dirname(config_file) + + # path to server data + if not hasattr(self, 'SFA_DATA_DIR'): + # default to /var/lib/sfa not specified in config + self.SFA_DATA_DIR="/var/lib/sfa" + self.data_path = self.SFA_DATA_DIR + else: + self.data_path = self.SFA_DATA_DIR + + # path to config data + if not hasattr(self, 'SFA_CONFIG_DIR'): + # default to /var/lib/sfa not specified in config + self.SFA_CONFIG_DIR="/etc/sfa" + + if not hasattr(self, 'SFA_REGISTRY_LEVEL1_AUTH'): + self.SFA_REGISTRY_LEVEL1_AUTH=None + + # define interface types + # this will determine which manager to use + if not hasattr(self, 'SFA_REGISTRY_TYPE'): + self.SFA_REGISTRY_TYPE='pl' + + if not hasattr(self, 'SFA_AGGREGATE_TYPE'): + self.SFA_AGGREGATE_TYPE='pl' + + if not hasattr(self, 'SFA_SM_TYPE'): + self.SFA_SM_TYPE='pl' + + if not hasattr(self, 'SFA_CM_TYPE'): + self.SFA_COMPONENT_TYPE='pl' + + # create the data directory if it doesnt exist + if not os.path.isdir(self.SFA_DATA_DIR): + try: + os.mkdir(self.SFA_DATA_DIR) + except: pass + + except IOError, e: + raise IOError, "Could not find the configuration file: %s" % config_file + + def get_trustedroots_dir(self): + return self.config_path + os.sep + 'trusted_roots' + + def get_openflow_aggrMgr_info(self): + aggr_mgr_ip = 'localhost' + if (hasattr(self,'OPENFLOW_AGGREGATE_MANAGER_IP')): + aggr_mgr_ip = self.OPENFLOW_AGGREGATE_MANAGER_IP + + aggr_mgr_port = 2603 + if (hasattr(self,'OPENFLOW_AGGREGATE_MANAGER_PORT')): + aggr_mgr_port = self.OPENFLOW_AGGREGATE_MANAGER_PORT + + return (aggr_mgr_ip,aggr_mgr_port) + + def get_aggregate_type(self): + if (hasattr(self,'SFA_AGGREGATE_TYPE')): + return self.SFA_AGGREGATE_TYPE + else: + return "pl" + + def get_plc_dbinfo(self): + return { + 'dbname' : self.SFA_PLC_DB_NAME, + 'address' : self.SFA_PLC_DB_HOST, + 'port' : self.SFA_PLC_DB_PORT, + 'user' : self.SFA_PLC_DB_USER, + 'password' : self.SFA_PLC_DB_PASSWORD + } + + ## + # SFA uses a PLCAPI connection to perform operations on the registry, + # such as creating and deleting slices. This connection requires an account + # on the PLC server with full administrator access. + # + # The Url parameter controls whether the connection uses PLCAPI directly (i.e. + # SFA is located on the same machine as PLC), or uses a XMLRPC connection + # to the PLC machine. If you wish to use the API directly, then remove the Url + # field from the dictionary. + + def get_plc_auth(self): + return { + 'AuthMethod': 'capability', + 'Username': self.SFA_PLC_USER, + 'AuthString': self.SFA_PLC_PASSWORD, + "Url": self.SFA_PLC_URL + } diff --git a/sfa/util/debug.py b/sfa/util/debug.py new file mode 100644 index 00000000..71eb0642 --- /dev/null +++ b/sfa/util/debug.py @@ -0,0 +1,57 @@ +### $Id: debug.py 14192 2009-07-02 08:40:01Z thierry $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/debug.py $ + +import time +import sys +import syslog + +class unbuffered: + """ + Write to /var/log/httpd/error_log. See + + http://www.modpython.org/FAQ/faqw.py?req=edit&file=faq02.003.htp + """ + + def write(self, data): + sys.stderr.write(data) + sys.stderr.flush() + +log = unbuffered() + +def profile(callable): + """ + Prints the runtime of the specified callable. Use as a decorator, e.g., + + @profile + def foo(...): + ... + + Or, equivalently, + + def foo(...): + ... + foo = profile(foo) + + Or inline: + + result = profile(foo)(...) + """ + + def wrapper(*args, **kwds): + start = time.time() + result = callable(*args, **kwds) + end = time.time() + args = map(str, args) + args += ["%s = %s" % (name, str(value)) for (name, value) in kwds.items()] + print >> log, "%s (%s): %f s" % (callable.__name__, ", ".join(args), end - start) + return result + + return wrapper + +if __name__ == "__main__": + def sleep(seconds = 1): + time.sleep(seconds) + + sleep = profile(sleep) + + sleep(1) diff --git a/sfa/util/faults.py b/sfa/util/faults.py new file mode 100644 index 00000000..7391bdd0 --- /dev/null +++ b/sfa/util/faults.py @@ -0,0 +1,290 @@ +# +# SFA API faults +# +# + +### $Id: faults.py 18586 2010-08-05 23:33:41Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/faults.py $ + +import xmlrpclib + +class SfaFault(xmlrpclib.Fault): + def __init__(self, faultCode, faultString, extra = None): + if extra: + faultString += ": " + str(extra) + xmlrpclib.Fault.__init__(self, faultCode, faultString) + +class SfaInvalidAPIMethod(SfaFault): + def __init__(self, method, interface = None, extra = None): + faultString = "Invalid method " + method + if interface: + faultString += " for interface " + interface + SfaFault.__init__(self, 100, faultString, extra) + +class SfaInvalidArgumentCount(SfaFault): + def __init__(self, got, min, max = min, extra = None): + if min != max: + expected = "%d-%d" % (min, max) + else: + expected = "%d" % min + faultString = "Expected %s arguments, got %d" % \ + (expected, got) + SfaFault.__init__(self, 101, faultString, extra) + +class SfaInvalidArgument(SfaFault): + def __init__(self, extra = None, name = None): + if name is not None: + faultString = "Invalid %s value" % name + else: + faultString = "Invalid argument" + SfaFault.__init__(self, 102, faultString, extra) + +class SfaAuthenticationFailure(SfaFault): + def __init__(self, extra = None): + faultString = "Failed to authenticate call" + SfaFault.__init__(self, 103, faultString, extra) + +class SfaDBError(SfaFault): + def __init__(self, extra = None): + faultString = "Database error" + SfaFault.__init__(self, 106, faultString, extra) + +class SfaPermissionDenied(SfaFault): + def __init__(self, extra = None): + faultString = "Permission denied" + SfaFault.__init__(self, 108, faultString, extra) + +class SfaNotImplemented(SfaFault): + def __init__(self, interface=None, extra = None): + faultString = "Not implemented" + if interface: + faultString += " at interface " + interface + SfaFault.__init__(self, 109, faultString, extra) + +class SfaAPIError(SfaFault): + def __init__(self, extra = None): + faultString = "Internal API error" + SfaFault.__init__(self, 111, faultString, extra) + +class MalformedHrnException(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Malformed HRN: %(value)s" % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +class TreeException(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Tree Exception: %(value)s, " % locals() + SfaFault.__init__(self, 111, faultString, extra) + def __str__(self): + return repr(self.value) + +class NonExistingRecord(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Non exsiting record %(value)s, " % locals() + SfaFault.__init__(self, 111, faultString, extra) + def __str__(self): + return repr(self.value) + +class ExistingRecord(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Existing record: %(value)s, " % locals() + SfaFault.__init__(self, 111, faultString, extra) + def __str__(self): + return repr(self.value) + + +class NonexistingCredType(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Non existing record: %(value)s, " % locals() + SfaFault.__init__(self, 111, faultString, extra) + def __str__(self): + return repr(self.value) + +class NonexistingFile(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Non existing file: %(value)s, " % locals() + SfaFault.__init__(self, 111, faultString, extra) + def __str__(self): + return repr(self.value) + +class InvalidRPCParams(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Invalid RPC Params: %(value)s, " % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +# SMBAKER exceptions follow + +class ConnectionKeyGIDMismatch(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Connection Key GID mismatch: %(value)s" % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +class MissingCallerGID(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Missing Caller GID: %(value)s" % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +class RecordNotFound(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Record not found: %(value)s" % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +class UnknownSfaType(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Unknown SFA Type: %(value)s" % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +class MissingAuthority(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Missing authority: %(value)s" % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +class PlanetLabRecordDoesNotExist(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "PlanetLab record does not exist : %(value)s" % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +class PermissionError(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Permission error: %(value)s" % locals() + SfaFault.__init__(self, 108, faultString, extra) + def __str__(self): + return repr(self.value) + +class InsufficientRights(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Insufficient rights: %(value)s" % locals() + SfaFault.__init__(self, 108, faultString, extra) + def __str__(self): + return repr(self.value) + +class MissingDelegateBit(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Missing delegate bit: %(value)s" % locals() + SfaFault.__init__(self, 108, faultString, extra) + def __str__(self): + return repr(self.value) + +class ChildRightsNotSubsetOfParent(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Child rights not subset of parent: %(value)s" % locals() + SfaFault.__init__(self, 103, faultString, extra) + def __str__(self): + return repr(self.value) + +class CertMissingParent(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Cert missing parent: %(value)s" % locals() + SfaFault.__init__(self, 103, faultString, extra) + def __str__(self): + return repr(self.value) + +class CertNotSignedByParent(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Cert not signed by parent: %(value)s" % locals() + SfaFault.__init__(self, 103, faultString, extra) + def __str__(self): + return repr(self.value) + +class GidParentHrn(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Cert URN is not an extension of its parent: %(value)s" % locals() + SfaFault.__init__(self, 103, faultString, extra) + def __str__(self): + return repr(self.value) + +class GidInvalidParentHrn(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "GID invalid parent hrn: %(value)s" % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +class SliverDoesNotExist(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Sliver does not exist : %(value)s" % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +class BadRequestHash(xmlrpclib.Fault): + def __init__(self, hash = None, extra = None): + faultString = "bad request hash: " + str(hash) + xmlrpclib.Fault.__init__(self, 902, faultString) + +class MissingTrustedRoots(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Trusted root directory does not exist: %(value)s" % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +class MissingSfaInfo(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Missing information: %(value)s" % locals() + SfaFault.__init__(self, 102, faultString, extra) + def __str__(self): + return repr(self.value) + +class InvalidRSpec(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Invalid RSpec: %(value)s" % locals() + SfaFault.__init__(self, 108, faultString, extra) + def __str__(self): + return repr(self.value) + +class AccountNotEnabled(SfaFault): + def __init__(self, extra = None): + faultString = "Account Disabled" + SfaFault.__init__(self, 108, faultString, extra) + def __str__(self): + return repr(self.value) + +class CredentialNotVerifiable(SfaFault): + def __init__(self, value, extra = None): + self.value = value + faultString = "Unable to verify credential: %(value)s, " %locals() + SfaFault.__init__(self, 115, faultString, extra) + def __str__(self): + return repr(self.value) diff --git a/sfa/util/filter.py b/sfa/util/filter.py new file mode 100644 index 00000000..0e362506 --- /dev/null +++ b/sfa/util/filter.py @@ -0,0 +1,218 @@ +# $Id: filter.py 16477 2010-01-05 16:31:37Z thierry $ +# $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/filter.py $ +from types import StringTypes +try: + set +except NameError: + from sets import Set + set = Set + +import time +import pgdb + +from sfa.util.faults import * +from sfa.util.parameter import Parameter, Mixed, python_type + + +class Filter(Parameter, dict): + """ + A type of parameter that represents a filter on one or more + columns of a database table. + Special features provide support for negation, upper and lower bounds, + as well as sorting and clipping. + + + fields should be a dictionary of field names and types + Only filters on non-sequence type fields are supported. + example : fields = {'node_id': Parameter(int, "Node identifier"), + 'hostname': Parameter(int, "Fully qualified hostname", max = 255), + ...} + + + filter should be a dictionary of field names and values + representing the criteria for filtering. + example : filter = { 'hostname' : '*.edu' , site_id : [34,54] } + Whether the filter represents an intersection (AND) or a union (OR) + of these criteria is determined by the join_with argument + provided to the sql method below + + Special features: + + * a field starting with the ~ character means negation. + example : filter = { '~peer_id' : None } + + * a field starting with < [ ] or > means lower than or greater than + < > uses strict comparison + [ ] is for using <= or >= instead + example : filter = { ']event_id' : 2305 } + example : filter = { '>time' : 1178531418 } + in this example the integer value denotes a unix timestamp + + * if a value is a sequence type, then it should represent + a list of possible values for that field + example : filter = { 'node_id' : [12,34,56] } + + * a (string) value containing either a * or a % character is + treated as a (sql) pattern; * are replaced with % that is the + SQL wildcard character. + example : filter = { 'hostname' : '*.jp' } + + * fields starting with - are special and relate to row selection, i.e. sorting and clipping + * '-SORT' : a field name, or an ordered list of field names that are used for sorting + these fields may start with + (default) or - for denoting increasing or decreasing order + example : filter = { '-SORT' : [ '+node_id', '-hostname' ] } + * '-OFFSET' : the number of first rows to be ommitted + * '-LIMIT' : the amount of rows to be returned + example : filter = { '-OFFSET' : 100, '-LIMIT':25} + + A realistic example would read + GetNodes ( { 'node_type' : 'regular' , 'hostname' : '*.edu' , '-SORT' : 'hostname' , '-OFFSET' : 30 , '-LIMIT' : 25 } ) + and that would return regular (usual) nodes matching '*.edu' in alphabetical order from 31th to 55th + """ + + def __init__(self, fields = {}, filter = {}, doc = "Attribute filter"): + # Store the filter in our dict instance + valid_fields = {} + for field in filter: + if field in fields: + valid_fields[field] = filter[field] + dict.__init__(self, valid_fields) + + # Declare ourselves as a type of parameter that can take + # either a value or a list of values for each of the specified + # fields. + self.fields = dict ( [ ( field, Mixed (expected, [expected])) + for (field,expected) in fields.iteritems() + if python_type(expected) not in (list, tuple, set) ] ) + + # Null filter means no filter + Parameter.__init__(self, self.fields, doc = doc, nullok = True) + + def quote(self, value): + """ + Returns quoted version of the specified value. + """ + + # The pgdb._quote function is good enough for general SQL + # quoting, except for array types. + if isinstance(value, (list, tuple, set)): + return "ARRAY[%s]" % ", ".join(map(self.quote, value)) + else: + return pgdb._quote(value) + + def sql(self, join_with = "AND"): + """ + Returns a SQL conditional that represents this filter. + """ + + # So that we always return something + if join_with == "AND": + conditionals = ["True"] + elif join_with == "OR": + conditionals = ["False"] + else: + assert join_with in ("AND", "OR") + + # init + sorts = [] + clips = [] + + for field, value in self.iteritems(): + # handle negation, numeric comparisons + # simple, 1-depth only mechanism + + modifiers={'~' : False, + '<' : False, '>' : False, + '[' : False, ']' : False, + '-' : False, + } + + for char in modifiers.keys(): + if field[0] == char: + modifiers[char]=True; + field = field[1:] + break + + # filter on fields + if not modifiers['-']: + if field not in self.fields: + raise SfaInvalidArgument, "Invalid filter field '%s'" % field + + if isinstance(value, (list, tuple, set)): + # handling filters like '~slice_id':[] + # this should return true, as it's the opposite of 'slice_id':[] which is false + # prior to this fix, 'slice_id':[] would have returned ``slice_id IN (NULL) '' which is unknown + # so it worked by coincidence, but the negation '~slice_ids':[] would return false too + if not value: + field="" + operator="" + value = "FALSE" + else: + operator = "IN" + value = map(str, map(self.quote, value)) + value = "(%s)" % ", ".join(value) + else: + if value is None: + operator = "IS" + value = "NULL" + elif isinstance(value, StringTypes) and \ + (value.find("*") > -1 or value.find("%") > -1): + operator = "LIKE" + # insert *** in pattern instead of either * or % + # we dont use % as requests are likely to %-expansion later on + # actual replacement to % done in PostgreSQL.py + value = value.replace ('*','***') + value = value.replace ('%','***') + value = str(self.quote(value)) + else: + operator = "=" + if modifiers['<']: + operator='<' + if modifiers['>']: + operator='>' + if modifiers['[']: + operator='<=' + if modifiers[']']: + operator='>=' + else: + value = str(self.quote(value)) + + clause = "%s %s %s" % (field, operator, value) + + if modifiers['~']: + clause = " ( NOT %s ) " % (clause) + + conditionals.append(clause) + # sorting and clipping + else: + if field not in ('SORT','OFFSET','LIMIT'): + raise SfaInvalidArgument, "Invalid filter, unknown sort and clip field %r"%field + # sorting + if field == 'SORT': + if not isinstance(value,(list,tuple,set)): + value=[value] + for field in value: + order = 'ASC' + if field[0] == '+': + field = field[1:] + elif field[0] == '-': + field = field[1:] + order = 'DESC' + if field not in self.fields: + raise SfaInvalidArgument, "Invalid field %r in SORT filter"%field + sorts.append("%s %s"%(field,order)) + # clipping + elif field == 'OFFSET': + clips.append("OFFSET %d"%value) + # clipping continued + elif field == 'LIMIT' : + clips.append("LIMIT %d"%value) + + where_part = (" %s " % join_with).join(conditionals) + clip_part = "" + if sorts: + clip_part += " ORDER BY " + ",".join(sorts) + if clips: + clip_part += " " + " ".join(clips) +# print 'where_part=',where_part,'clip_part',clip_part + return (where_part,clip_part) diff --git a/sfa/util/method.py b/sfa/util/method.py new file mode 100644 index 00000000..40bc5a57 --- /dev/null +++ b/sfa/util/method.py @@ -0,0 +1,306 @@ +# +# Base class for all SfaAPI functions +# +# + +### $Id: method.py 18544 2010-07-30 20:42:56Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/method.py $ + +import os, time +from types import * +from types import StringTypes +import traceback +import textwrap +import xmlrpclib + + +from sfa.util.faults import * +from sfa.util.parameter import Parameter, Mixed, python_type, xmlrpc_type +from sfa.trust.auth import Auth +from sfa.util.debug import profile, log + +# we inherit object because we use new-style classes for legacy methods +class Method (object): + """ + Base class for all SfaAPI functions. At a minimum, all SfaAPI + functions must define: + + interfaces = [allowed interfaces] + accepts = [Parameter(arg1_type, arg1_doc), Parameter(arg2_type, arg2_doc), ...] + returns = Parameter(return_type, return_doc) + call(arg1, arg2, ...): method body + + Argument types may be Python types (e.g., int, bool, etc.), typed + values (e.g., 1, True, etc.), a Parameter, or lists or + dictionaries of possibly mixed types, values, and/or Parameters + (e.g., [int, bool, ...] or {'arg1': int, 'arg2': bool}). + + Once function decorators in Python 2.4 are fully supported, + consider wrapping calls with accepts() and returns() functions + instead of performing type checking manually. + """ + + interfaces = [] + accepts = [] + returns = bool + status = "current" + + def call(self, *args): + """ + Method body for all SfaAPI functions. Must override. + + """ + + return True + + def __init__(self, api): + self.name = self.__class__.__name__ + self.api = api + + # Auth may set this to a Person instance (if an anonymous + # method, will remain None). + self.caller = None + + # API may set this to a (addr, port) tuple if known + self.source = None + + def __call__(self, *args, **kwds): + """ + Main entry point for all SfaAPI functions. Type checks + arguments, authenticates, and executes call(). + """ + + try: + start = time.time() + methodname = self.name + if not self.api.interface or self.api.interface not in self.interfaces: + raise SfaInvalidAPIMethod(methodname, self.api.interface) + + # legacy code cannot be type-checked, due to the way Method.args() works + if not hasattr(self,"skip_typecheck"): + (min_args, max_args, defaults) = self.args() + + # Check that the right number of arguments were passed in + if len(args) < len(min_args) or len(args) > len(max_args): + raise SfaInvalidArgumentCount(len(args), len(min_args), len(max_args)) + + for name, value, expected in zip(max_args, args, self.accepts): + self.type_check(name, value, expected, args) + + result = self.call(*args, **kwds) + runtime = time.time() - start + + if self.api.config.SFA_API_DEBUG or hasattr(self, 'message'): + # XX print to some log file + # print >> log, "some output" + pass + + return result + + except SfaFault, fault: + + caller = "" + + # Prepend caller and method name to expected faults + fault.faultString = caller + ": " + self.name + ": " + fault.faultString + runtime = time.time() - start + + if self.api.config.SFA_API_DEBUG: + traceback.print_exc() + raise fault + + + def help(self, indent = " "): + """ + Text documentation for the method. + """ + + (min_args, max_args, defaults) = self.args() + + text = "%s(%s) -> %s\n\n" % (self.name, ", ".join(max_args), xmlrpc_type(self.returns)) + + text += "Description:\n\n" + lines = [indent + line.strip() for line in self.__doc__.strip().split("\n")] + text += "\n".join(lines) + "\n\n" + + def param_text(name, param, indent, step): + """ + Format a method parameter. + """ + + text = indent + + # Print parameter name + if name: + param_offset = 32 + text += name.ljust(param_offset - len(indent)) + else: + param_offset = len(indent) + + # Print parameter type + param_type = python_type(param) + text += xmlrpc_type(param_type) + "\n" + + # Print parameter documentation right below type + if isinstance(param, Parameter): + wrapper = textwrap.TextWrapper(width = 70, + initial_indent = " " * param_offset, + subsequent_indent = " " * param_offset) + text += "\n".join(wrapper.wrap(param.doc)) + "\n" + param = param.type + + text += "\n" + + # Indent struct fields and mixed types + if isinstance(param, dict): + for name, subparam in param.iteritems(): + text += param_text(name, subparam, indent + step, step) + elif isinstance(param, Mixed): + for subparam in param: + text += param_text(name, subparam, indent + step, step) + elif isinstance(param, (list, tuple, set)): + for subparam in param: + text += param_text("", subparam, indent + step, step) + + return text + + text += "Parameters:\n\n" + for name, param in zip(max_args, self.accepts): + text += param_text(name, param, indent, indent) + + text += "Returns:\n\n" + text += param_text("", self.returns, indent, indent) + + return text + + def args(self): + """ + Returns a tuple: + + ((arg1_name, arg2_name, ...), + (arg1_name, arg2_name, ..., optional1_name, optional2_name, ...), + (None, None, ..., optional1_default, optional2_default, ...)) + + That represents the minimum and maximum sets of arguments that + this function accepts and the defaults for the optional arguments. + """ + + # Inspect call. Remove self from the argument list. + max_args = self.call.func_code.co_varnames[1:self.call.func_code.co_argcount] + defaults = self.call.func_defaults + if defaults is None: + defaults = () + + min_args = max_args[0:len(max_args) - len(defaults)] + defaults = tuple([None for arg in min_args]) + defaults + + return (min_args, max_args, defaults) + + def type_check(self, name, value, expected, args): + """ + Checks the type of the named value against the expected type, + which may be a Python type, a typed value, a Parameter, a + Mixed type, or a list or dictionary of possibly mixed types, + values, Parameters, or Mixed types. + + Extraneous members of lists must be of the same type as the + last specified type. For example, if the expected argument + type is [int, bool], then [1, False] and [14, True, False, + True] are valid, but [1], [False, 1] and [14, True, 1] are + not. + + Extraneous members of dictionaries are ignored. + """ + + # If any of a number of types is acceptable + if isinstance(expected, Mixed): + for item in expected: + try: + self.type_check(name, value, item, args) + return + except SfaInvalidArgument, fault: + pass + raise fault + + # If an authentication structure is expected, save it and + # authenticate after basic type checking is done. + #if isinstance(expected, Auth): + # auth = expected + #else: + # auth = None + + # Get actual expected type from within the Parameter structure + if isinstance(expected, Parameter): + min = expected.min + max = expected.max + nullok = expected.nullok + expected = expected.type + else: + min = None + max = None + nullok = False + + expected_type = python_type(expected) + + # If value can be NULL + if value is None and nullok: + return + + # Strings are a special case. Accept either unicode or str + # types if a string is expected. + if expected_type in StringTypes and isinstance(value, StringTypes): + pass + + # Integers and long integers are also special types. Accept + # either int or long types if an int or long is expected. + elif expected_type in (IntType, LongType) and isinstance(value, (IntType, LongType)): + pass + + elif not isinstance(value, expected_type): + raise SfaInvalidArgument("expected %s, got %s" % \ + (xmlrpc_type(expected_type), + xmlrpc_type(type(value))), + name) + + # If a minimum or maximum (length, value) has been specified + if expected_type in StringTypes: + if min is not None and \ + len(value.encode(self.api.encoding)) < min: + raise SfaInvalidArgument, "%s must be at least %d bytes long" % (name, min) + if max is not None and \ + len(value.encode(self.api.encoding)) > max: + raise SfaInvalidArgument, "%s must be at most %d bytes long" % (name, max) + elif expected_type in (list, tuple, set): + if min is not None and len(value) < min: + raise SfaInvalidArgument, "%s must contain at least %d items" % (name, min) + if max is not None and len(value) > max: + raise SfaInvalidArgument, "%s must contain at most %d items" % (name, max) + else: + if min is not None and value < min: + raise SfaInvalidArgument, "%s must be > %s" % (name, str(min)) + if max is not None and value > max: + raise SfaInvalidArgument, "%s must be < %s" % (name, str(max)) + + # If a list with particular types of items is expected + if isinstance(expected, (list, tuple, set)): + for i in range(len(value)): + if i >= len(expected): + j = len(expected) - 1 + else: + j = i + self.type_check(name + "[]", value[i], expected[j], args) + + # If a struct with particular (or required) types of items is + # expected. + elif isinstance(expected, dict): + for key in value.keys(): + if key in expected: + self.type_check(name + "['%s']" % key, value[key], expected[key], args) + for key, subparam in expected.iteritems(): + if isinstance(subparam, Parameter) and \ + subparam.optional is not None and \ + not subparam.optional and key not in value.keys(): + raise SfaInvalidArgument("'%s' not specified" % key, name) + + #if auth is not None: + # auth.check(self, *args) diff --git a/sfa/util/misc.py b/sfa/util/misc.py new file mode 100644 index 00000000..e81123b6 --- /dev/null +++ b/sfa/util/misc.py @@ -0,0 +1,49 @@ +### $Id: misc.py 16477 2010-01-05 16:31:37Z thierry $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/misc.py $ + +from sfa.util.faults import * + +def get_leaf(hrn): + parts = hrn.split(".") + return ".".join(parts[-1:]) + +def get_authority(hrn): + parts = hrn.split(".") + return ".".join(parts[:-1]) + +def hrn_to_pl_slicename(hrn): + parts = hrn.split(".") + return parts[-2] + "_" + parts[-1] + +# assuming hrn is the hrn of an authority, return the plc authority name +def hrn_to_pl_authname(hrn): + parts = hrn.split(".") + return parts[-1] + +# assuming hrn is the hrn of an authority, return the plc login_base +def hrn_to_pl_login_base(hrn): + return hrn_to_pl_authname(hrn) + +def hostname_to_hrn(auth_hrn, login_base, hostname): + """ + Convert hrn to plantelab name. + """ + sfa_hostname = ".".join([auth_hrn, login_base, hostname.split(".")[0]]) + return sfa_hostname + +def slicename_to_hrn(auth_hrn, slicename): + """ + Convert hrn to planetlab name. + """ + parts = slicename.split("_") + slice_hrn = ".".join([auth_hrn, parts[0]]) + "." + "_".join(parts[1:]) + + return slice_hrn + +def email_to_hrn(auth_hrn, email): + parts = email.split("@") + username = parts[0] + username = username.replace(".", "_") + person_hrn = ".".join([auth_hrn, username]) + + return person_hrn diff --git a/sfa/util/namespace.py b/sfa/util/namespace.py new file mode 100644 index 00000000..a868bb67 --- /dev/null +++ b/sfa/util/namespace.py @@ -0,0 +1,108 @@ +### $Id: namespace.py 18515 2010-07-15 20:41:59Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/namespace.py $ + +from sfa.util.faults import * +URN_PREFIX = "urn:publicid:IDN" + +def get_leaf(hrn): + parts = hrn.split(".") + return ".".join(parts[-1:]) + +def get_authority(xrn): + hrn, type = urn_to_hrn(xrn) + if type and type == 'authority': + return hrn + + parts = hrn.split(".") + return ".".join(parts[:-1]) + +def hrn_to_pl_slicename(hrn): + parts = hrn.split(".") + return parts[-2] + "_" + parts[-1] + +# assuming hrn is the hrn of an authority, return the plc authority name +def hrn_to_pl_authname(hrn): + parts = hrn.split(".") + return parts[-1] + +# assuming hrn is the hrn of an authority, return the plc login_base +def hrn_to_pl_login_base(hrn): + return hrn_to_pl_authname(hrn) + +def hostname_to_hrn(auth_hrn, login_base, hostname): + """ + Convert hrn to plantelab name. + """ + sfa_hostname = ".".join([auth_hrn, login_base, hostname.split(".")[0]]) + return sfa_hostname + +def slicename_to_hrn(auth_hrn, slicename): + """ + Convert hrn to planetlab name. + """ + parts = slicename.split("_") + slice_hrn = ".".join([auth_hrn, parts[0]]) + "." + "_".join(parts[1:]) + + return slice_hrn + +def email_to_hrn(auth_hrn, email): + parts = email.split("@") + username = parts[0] + username = username.replace(".", "_").replace("+", "_") + person_hrn = ".".join([auth_hrn, username]) + + return person_hrn + +def urn_to_hrn(urn): + """ + convert a urn to hrn + return a tuple (hrn, type) + """ + + # if this is already a hrn dont do anything + if not urn or not urn.startswith(URN_PREFIX): + return urn, None + + name = urn[len(URN_PREFIX):] + hrn_parts = name.split("+") + + type = hrn_parts.pop(2) + + # convert hrn_parts (list) into hrn (str) by doing the following + # remove blank elements + # replace ':' with '.' + # join list elements using '.' + hrn = '.'.join([part.replace(':', '.') for part in hrn_parts if part]) + + # Remove the authority name (e.g. '.sa') + if type == 'authority': + hrn = hrn.replace ('.sa', '') + + return str(hrn), str(type) + + +def hrn_to_urn(hrn, type=None): + """ + convert an hrn and type to a urn string + """ + # if this is already a urn dont do anything + if not hrn or hrn.startswith(URN_PREFIX): + return hrn + + authority = get_authority(hrn) + name = get_leaf(hrn) + + if type == 'authority': + authority = hrn + name = 'sa' + + if authority.startswith("plc"): + if type == None: + urn = "+".join(['',authority.replace('.',':'),name]) + else: + urn = "+".join(['',authority.replace('.',':'),type,name]) + + else: + urn = "+".join(['',authority,type,name]) + + return URN_PREFIX + urn diff --git a/sfa/util/nodemanager.py b/sfa/util/nodemanager.py new file mode 100644 index 00000000..1671b9d6 --- /dev/null +++ b/sfa/util/nodemanager.py @@ -0,0 +1,46 @@ +import tempfile +import commands +import os + +class NodeManager: + + method = None + + def __init__(self, config): + self.config = config + + def __getattr__(self, method): + self.method = method + return self.__call__ + + def __call__(self, *args): + method = self.method + sfa_slice_prefix = self.config.SFA_CM_SLICE_PREFIX + sfa_slice = sfa_slice_prefix + "_sfacm" + python = "/usr/bin/python" + vserver_path = "/vservers/%s" % (sfa_slice) + script_path = "/tmp/" + path = "%(vserver_path)s/%(script_path)s" % locals() + (fd, filename) = tempfile.mkstemp(dir=path) + scriptname = script_path + os.sep + filename.split(os.sep)[-1:][0] + # define the script to execute + script = """ +#!%(python)s +import xmlrpclib +s = xmlrpclib.ServerProxy('http://127.0.0.1:812') +print s.%(method)s%(args)s""" % locals() + + try: + # write the script to a temporary file + f = open(filename, 'w') + f.write(script % locals()) + f.close() + # make the file executeable + chmod_cmd = "/bin/chmod 775 %(filename)s" % locals() + (status, output) = commands.getstatusoutput(chmod_cmd) + + # execute the commad as a slice with root NM privs + cmd = 'su - %(sfa_slice)s -c "%(python)s %(scriptname)s"' % locals() + (status, output) = commands.getstatusoutput(cmd) + return (status, output) + finally: os.unlink(filename) diff --git a/sfa/util/parameter.py b/sfa/util/parameter.py new file mode 100644 index 00000000..367d106e --- /dev/null +++ b/sfa/util/parameter.py @@ -0,0 +1,108 @@ +# +# Shared type definitions +# +# Mark Huang +# Copyright (C) 2006 The Trustees of Princeton University +# +# $Id: parameter.py 16477 2010-01-05 16:31:37Z thierry $ +# + +### $Id: parameter.py 16477 2010-01-05 16:31:37Z thierry $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/parameter.py $ + +from types import * +from sfa.util.faults import * + +class Parameter: + """ + Typed value wrapper. Use in accepts and returns to document method + parameters. Set the optional and default attributes for + sub-parameters (i.e., dict fields). + """ + + def __init__(self, type, doc = "", + min = None, max = None, + optional = None, + ro = False, + nullok = False): + # Basic type of the parameter. Must be a builtin type + # that can be marshalled by XML-RPC. + self.type = type + + # Documentation string for the parameter + self.doc = doc + + # Basic value checking. For numeric types, the minimum and + # maximum possible values, inclusive. For string types, the + # minimum and maximum possible UTF-8 encoded byte lengths. + self.min = min + self.max = max + + # Whether the sub-parameter is optional or not. If None, + # unknown whether it is optional. + self.optional = optional + + # Whether the DB field is read-only. + self.ro = ro + + # Whether the DB field can be NULL. + self.nullok = nullok + + def type(self): + return self.type + + def __repr__(self): + return repr(self.type) + +class Mixed(tuple): + """ + A list (technically, a tuple) of types. Use in accepts and returns + to document method parameters that may return mixed types. + """ + + def __new__(cls, *types): + return tuple.__new__(cls, types) + + +def python_type(arg): + """ + Returns the Python type of the specified argument, which may be a + Python type, a typed value, or a Parameter. + """ + + if isinstance(arg, Parameter): + arg = arg.type + + if isinstance(arg, type): + return arg + else: + return type(arg) + +def xmlrpc_type(arg): + """ + Returns the XML-RPC type of the specified argument, which may be a + Python type, a typed value, or a Parameter. + """ + + arg_type = python_type(arg) + + if arg_type == NoneType: + return "nil" + elif arg_type == IntType or arg_type == LongType: + return "int" + elif arg_type == bool: + return "boolean" + elif arg_type == FloatType: + return "double" + elif arg_type in StringTypes: + return "string" + elif arg_type == ListType or arg_type == TupleType: + return "array" + elif arg_type == DictType: + return "struct" + elif arg_type == Mixed: + # Not really an XML-RPC type but return "mixed" for + # documentation purposes. + return "mixed" + else: + raise SfaAPIError, "XML-RPC cannot marshal %s objects" % arg_type diff --git a/sfa/util/policy.py b/sfa/util/policy.py new file mode 100644 index 00000000..3e8332c9 --- /dev/null +++ b/sfa/util/policy.py @@ -0,0 +1,23 @@ +### $Id: policy.py 15724 2009-11-11 19:52:12Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/policy.py $ + +import os + +from sfa.util.storage import * +from sfa.util.debug import log + +class Policy(SimpleStorage): + + def __init__(self, api): + self.api = api + path = self.api.config.SFA_CONFIG_DIR + filename = ".".join([self.api.interface, self.api.hrn, "policy"]) + filepath = path + os.sep + filename + self.policy_file = filepath + default_policy = {'slice_whitelist': [], + 'slice_blacklist': [], + 'node_whitelist': [], + 'node_blacklist': []} + SimpleStorage.__init__(self, self.policy_file, default_policy) + self.load() + diff --git a/sfa/util/prefixTree.py b/sfa/util/prefixTree.py new file mode 100755 index 00000000..93b0c5cd --- /dev/null +++ b/sfa/util/prefixTree.py @@ -0,0 +1,97 @@ +class prefixNode: + + def __init__(self, prefix): + self.prefix = prefix + self.children = [] + + +class prefixTree: + + def __init__(self): + self.root = prefixNode("") + + def insert(self, prefix, node = None): + """ + insert a prefix into the tree + """ + if not node: + node = self.root + + parts = prefix.split(".") + length = len(parts) + + if length > 1: + for i in range(1, length + 1): + name = ".".join(parts[:i]) + if not self.exists(name) and not name == prefix: + self.insert(name) + + if prefix.startswith(node.prefix): + if prefix == node.prefix: + pass + elif not node.children: + node.children.append(prefixNode(prefix)) + else: + inserted = False + for child in node.children: + if prefix.startswith(child.prefix): + self.insert(prefix, child) + inserted = True + if not inserted: + node.children.append(prefixNode(prefix)) + + def load(self, prefix_list): + """ + load a list of prefixes into the tree + """ + for prefix in prefix_list: + self.insert(prefix) + + def exists(self, prefix, node = None): + """ + returns true if the specified prefix exists anywhere in the tree, + false if it doesnt. + """ + if not node: + node = self.root + + if not prefix.startswith(node.prefix): + return False + elif node.prefix == prefix: + return True + elif not node.children: + return False + else: + for child in node.children: + if prefix.startswith(child.prefix): + return self.exists(prefix, child) + + def best_match(self, prefix, node = None): + """ + searches the tree and returns the prefix that best matches the + specified prefix + """ + if not node: + node = self.root + + if prefix.startswith(node.prefix): + if not node.children: + return node.prefix + for child in node.children: + if prefix.startswith(child.prefix): + return self.best_match(prefix, child) + return node.prefix + + def dump(self, node = None): + """ + print the tree + """ + if not node: + node = self.root + print node.prefix + + for child in node.children: + print child.prefix, + + for child in node.children: + self.dump(child) diff --git a/sfa/util/record.py b/sfa/util/record.py new file mode 100644 index 00000000..a0d836c5 --- /dev/null +++ b/sfa/util/record.py @@ -0,0 +1,399 @@ +## +# Implements support for SFA records +# +# TODO: Use existing PLC database methods? or keep this separate? +## + +### $Id: record.py 17916 2010-05-04 21:01:12Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/record.py $ + +from types import StringTypes + +from sfa.trust.gid import * + +import sfa.util.report +from sfa.util.rspec import * +from sfa.util.parameter import * +from sfa.util.namespace import * +from sfa.util.row import Row + +class SfaRecord(Row): + """ + The SfaRecord class implements an SFA Record. A SfaRecord is a tuple + (Hrn, GID, Type, Info). + + Hrn specifies the Human Readable Name of the object + GID is the GID of the object + Type is user | authority | slice | component + + Info is comprised of the following sub-fields + pointer = a pointer to the record in the PL database + + The pointer is interpreted depending on the type of the record. For example, + if the type=="user", then pointer is assumed to be a person_id that indexes + into the persons table. + + A given HRN may have more than one record, provided that the records are + of different types. + """ + + table_name = 'sfa' + + primary_key = 'record_id' + + ### the wsdl generator assumes this is named 'fields' + internal_fields = { + 'record_id': Parameter(int, 'An id that uniquely identifies this record', ro=True), + 'pointer': Parameter(int, 'An id that uniquely identifies this record in an external database ') + } + + fields = { + 'authority': Parameter(str, "The authority for this record"), + 'peer_authority': Parameter(str, "The peer authority for this record"), + 'hrn': Parameter(str, "Human readable name of object"), + 'gid': Parameter(str, "GID of the object"), + 'type': Parameter(str, "Record type"), + 'last_updated': Parameter(int, 'Date and time of last update', ro=True), + 'date_created': Parameter(int, 'Date and time this record was created', ro=True), + } + all_fields = dict(fields.items() + internal_fields.items()) + ## + # Create an SFA Record + # + # @param name if !=None, assign the name of the record + # @param gid if !=None, assign the gid of the record + # @param type one of user | authority | slice | component + # @param pointer is a pointer to a PLC record + # @param dict if !=None, then fill in this record from the dictionary + + def __init__(self, hrn=None, gid=None, type=None, pointer=None, peer_authority=None, dict=None, string=None): + self.dirty = True + self.hrn = None + self.gid = None + self.type = None + self.pointer = None + self.set_peer_auth(peer_authority) + if hrn: + self.set_name(hrn) + if gid: + self.set_gid(gid) + if type: + self.set_type(type) + if pointer: + self.set_pointer(pointer) + if dict: + self.load_from_dict(dict) + if string: + self.load_from_string(string) + + + def validate_last_updated(self, last_updated): + return time.strftime("%Y-%m-%d %H:%M:%S", time.gmtime()) + + def update(self, new_dict): + if isinstance(new_dict, list): + new_dict = new_dict[0] + + # Convert any boolean strings to real bools + for key in new_dict: + if isinstance(new_dict[key], StringTypes): + if new_dict[key].lower() in ["true"]: + new_dict[key] = True + elif new_dict[key].lower() in ["false"]: + new_dict[key] = False + dict.update(self, new_dict) + + ## + # Set the name of the record + # + # @param hrn is a string containing the HRN + + def set_name(self, hrn): + """ + Set the name of the record + """ + self.hrn = hrn + self['hrn'] = hrn + self.dirty = True + + ## + # Set the GID of the record + # + # @param gid is a GID object or the string representation of a GID object + + def set_gid(self, gid): + """ + Set the GID of the record + """ + + if isinstance(gid, StringTypes): + self.gid = gid + self['gid'] = gid + else: + self.gid = gid.save_to_string(save_parents=True) + self['gid'] = gid.save_to_string(save_parents=True) + self.dirty = True + + ## + # Set the type of the record + # + # @param type is a string: user | authority | slice | component + + def set_type(self, type): + """ + Set the type of the record + """ + self.type = type + self['type'] = type + self.dirty = True + + ## + # Set the pointer of the record + # + # @param pointer is an integer containing the ID of a PLC record + + def set_pointer(self, pointer): + """ + Set the pointer of the record + """ + self.pointer = pointer + self['pointer'] = pointer + self.dirty = True + + + def set_peer_auth(self, peer_authority): + self.peer_authority = peer_authority + self['peer_authority'] = peer_authority + self.dirty = True + + ## + # Return the name (HRN) of the record + + def get_name(self): + """ + Return the name (HRN) of the record + """ + return self.hrn + + ## + # Return the type of the record + + def get_type(self): + """ + Return the type of the record + """ + return self.type + + ## + # Return the pointer of the record. The pointer is an integer that may be + # used to look up the record in the PLC database. The evaluation of pointer + # depends on the type of the record + + def get_pointer(self): + """ + Return the pointer of the record. The pointer is an integer that may be + used to look up the record in the PLC database. The evaluation of pointer + depends on the type of the record + """ + return self.pointer + + ## + # Return the GID of the record, in the form of a GID object + # TODO: not the best name for the function, because we have things called + # gidObjects in the Cred + + def get_gid_object(self): + """ + Return the GID of the record, in the form of a GID object + """ + return GID(string=self.gid) + + ## + # Returns a list of field names in this record. + + def get_field_names(self): + """ + Returns a list of field names in this record. + """ + return self.fields.keys() + + ## + # Given a field name ("hrn", "gid", ...) return the value of that field. + # + # @param fieldname is the name of field to be returned + + def get_field_value_string(self, fieldname): + """ + Given a field name ("hrn", "gid", ...) return the value of that field. + """ + if fieldname == "authority": + val = get_authority(self['hrn']) + else: + try: + val = getattr(self, fieldname) + except: + val = self[fieldname] + if isinstance(val, str): + return "'" + str(val) + "'" + else: + return str(val) + + ## + # Given a list of field names, return a list of values for those public. + # + # @param fieldnames is a list of field names + + def get_field_value_strings(self, fieldnames): + """ + Given a list of field names, return a list of values for those public. + """ + return [ self.get_field_value_string (fieldname) for fieldname in fieldnames ] + + ## + # Return the record in the form of a dictionary + + def as_dict(self): + """ + Return the record in the form of a dictionary + """ + return dict(self) + + ## + # Load the record from a dictionary + # + # @param dict dictionary to load record public from + + def load_from_dict(self, dict): + """ + Load the record from a dictionary + """ + self.set_name(dict['hrn']) + gidstr = dict.get("gid", None) + if gidstr: + self.set_gid(dict['gid']) + + if "pointer" in dict: + self.set_pointer(dict['pointer']) + + self.set_type(dict['type']) + self.update(dict) + + ## + # Save the record to a string. The string contains an XML representation of + # the record. + + def save_to_string(self): + """ + Save the record to a string. The string contains an XML representation of + the record. + """ + recorddict = self.as_dict() + filteredDict = dict([(key, val) for (key, val) in recorddict.iteritems() if key in self.fields.keys()]) + record = RecordSpec() + record.parseDict(filteredDict) + str = record.toxml() + #str = xmlrpclib.dumps((dict,), allow_none=True) + return str + + ## + # Load the record from a string. The string is assumed to contain an XML + # representation of the record. + + def load_from_string(self, str): + """ + Load the record from a string. The string is assumed to contain an XML + representation of the record. + """ + #dict = xmlrpclib.loads(str)[0][0] + + record = RecordSpec() + record.parseString(str) + record_dict = record.toDict() + sfa_dict = record_dict['record'] + self.load_from_dict(sfa_dict) + + ## + # Dump the record to stdout + # + # @param dump_parents if true, then the parents of the GID will be dumped + + def dump(self, dump_parents=False): + """ + Walk tree and dump records. + """ + #print "RECORD", self.name + #print " hrn:", self.name + #print " type:", self.type + #print " gid:" + #if (not self.gid): + # print " None" + #else: + # self.get_gid_object().dump(8, dump_parents) + #print " pointer:", self.pointer + + order = SfaRecord.fields.keys() + for key in self.keys(): + if key not in order: + order.append(key) + for key in order: + if key in self and key in self.fields: + if key in 'gid' and self[key]: + gid = GID(string=self[key]) + print " %s:" % key + gid.dump(8, dump_parents) + else: + print " %s: %s" % (key, self[key]) + + def getdict(self): + return dict(self) + + +class UserRecord(SfaRecord): + + fields = { + 'email': Parameter(str, 'email'), + 'first_name': Parameter(str, 'First name'), + 'last_name': Parameter(str, 'Last name'), + 'phone': Parameter(str, 'Phone Number'), + 'keys': Parameter(str, 'Public key'), + 'slices': Parameter([str], 'List of slices this user belongs to'), + } + fields.update(SfaRecord.fields) + +class SliceRecord(SfaRecord): + fields = { + 'name': Parameter(str, 'Slice name'), + 'url': Parameter(str, 'Slice url'), + 'expires': Parameter(int, 'Date and time this slice exipres'), + 'researcher': Parameter([str], 'List of users for this slice'), + 'PI': Parameter([str], 'List of PIs responsible for this slice'), + 'description': Parameter([str], 'Description of this slice'), + } + fields.update(SfaRecord.fields) + + +class NodeRecord(SfaRecord): + fields = { + 'hostname': Parameter(str, 'This nodes dns name'), + 'node_type': Parameter(str, 'Type of node this is'), + 'node_type': Parameter(str, 'Type of node this is'), + 'latitude': Parameter(str, 'latitude'), + 'longitude': Parameter(str, 'longitude'), + } + fields.update(SfaRecord.fields) + + +class AuthorityRecord(SfaRecord): + fields = { + 'name': Parameter(str, 'Name'), + 'login_base': Parameter(str, 'login base'), + 'enabled': Parameter(bool, 'Is this site enabled'), + 'url': Parameter(str, 'URL'), + 'nodes': Parameter([str], 'List of nodes at this site'), + 'operator': Parameter([str], 'List of operators'), + 'researcher': Parameter([str], 'List of researchers'), + 'PI': Parameter([str], 'List of Principal Investigators'), + } + fields.update(SfaRecord.fields) + + diff --git a/sfa/util/report.py b/sfa/util/report.py new file mode 100644 index 00000000..9a882f07 --- /dev/null +++ b/sfa/util/report.py @@ -0,0 +1,11 @@ +def trace(x, logger=None): + if logger: + logger.info(x) + else: + print x + +def error(x, logger=None): + if logger: + logger.error(x) + else: + print x diff --git a/sfa/util/row.py b/sfa/util/row.py new file mode 100644 index 00000000..7334fccd --- /dev/null +++ b/sfa/util/row.py @@ -0,0 +1,57 @@ + +class Row(dict): + + # Set this to the name of the table that stores the row. + # e.g. table_name = "nodes" + table_name = None + + # Set this to the name of the primary key of the table. It is + # assumed that the this key is a sequence if it is not set when + # sync() is called. + # e.g. primary_key="record_id" + primary_key = None + + # Set this to the names of tables that reference this table's + # primary key. + join_tables = [] + + def validate(self): + """ + Validates values. Will validate a value with a custom function + if a function named 'validate_[key]' exists. + """ + # Warn about mandatory fields + # XX TODO: Support checking for mandatory fields later + #mandatory_fields = self.db.fields(self.table_name, notnull = True, hasdef = False) + #for field in mandatory_fields: + # if not self.has_key(field) or self[field] is None: + # raise SfaInvalidArgument, field + " must be specified and cannot be unset in class %s"%self.__class__.__name__ + + # Validate values before committing + for key, value in self.iteritems(): + if value is not None and hasattr(self, 'validate_' + key): + validate = getattr(self, 'validate_' + key) + self[key] = validate(value) + + + def validate_timestamp(self, timestamp, check_future = False): + """ + Validates the specified GMT timestamp string (must be in + %Y-%m-%d %H:%M:%S format) or number (seconds since UNIX epoch, + i.e., 1970-01-01 00:00:00 GMT). If check_future is True, + raises an exception if timestamp is not in the future. Returns + a GMT timestamp string. + """ + + time_format = "%Y-%m-%d %H:%M:%S" + if isinstance(timestamp, StringTypes): + # calendar.timegm() is the inverse of time.gmtime() + timestamp = calendar.timegm(time.strptime(timestamp, time_format)) + + # Human readable timestamp string + human = time.strftime(time_format, time.gmtime(timestamp)) + + if check_future and timestamp < time.time(): + raise SfaInvalidArgument, "'%s' not in the future" % human + + return human diff --git a/sfa/util/rspec.py b/sfa/util/rspec.py new file mode 100644 index 00000000..bd2cf8bd --- /dev/null +++ b/sfa/util/rspec.py @@ -0,0 +1,420 @@ +### $Id: rspec.py 18557 2010-08-03 19:18:39Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/rspec.py $ + +import sys +import pprint +import os +import httplib +from xml.dom import minidom +from types import StringTypes, ListType +from lxml import etree +from StringIO import StringIO + + +class RSpec: + + def __init__(self, xml = None, xsd = None, NSURL = None): + ''' + Class to manipulate RSpecs. Reads and parses rspec xml into python dicts + and reads python dicts and writes rspec xml + + self.xsd = # Schema. Can be local or remote file. + self.NSURL = # If schema is remote, Name Space URL to query (full path minus filename) + self.rootNode = # root of the DOM + self.dict = # dict of the RSpec. + self.schemaDict = {} # dict of the Schema + ''' + + self.xsd = xsd + self.rootNode = None + self.dict = {} + self.schemaDict = {} + self.NSURL = NSURL + if xml: + if type(xml) == file: + self.parseFile(xml) + if type(xml) in StringTypes: + self.parseString(xml) + self.dict = self.toDict() + if xsd: + self._parseXSD(self.NSURL + self.xsd) + + + def _getText(self, nodelist): + rc = "" + for node in nodelist: + if node.nodeType == node.TEXT_NODE: + rc = rc + node.data + return rc + + # The rspec is comprised of 2 parts, and 1 reference: + # attributes/elements describe individual resources + # complexTypes are used to describe a set of attributes/elements + # complexTypes can include a reference to other complexTypes. + + + def _getName(self, node): + '''Gets name of node. If tag has no name, then return tag's localName''' + name = None + if not node.nodeName.startswith("#"): + if node.localName: + name = node.localName + elif node.attributes.has_key("name"): + name = node.attributes.get("name").value + return name + + + # Attribute. {name : nameofattribute, {items: values}) + def _attributeDict(self, attributeDom): + '''Traverse single attribute node. Create a dict {attributename : {name: value,}]}''' + node = {} # parsed dict + for attr in attributeDom.attributes.keys(): + node[attr] = attributeDom.attributes.get(attr).value + return node + + + def appendToDictOrCreate(self, dict, key, value): + if (dict.has_key(key)): + dict[key].append(value) + else: + dict[key]=[value] + return dict + + def toGenDict(self, nodeDom=None, parentdict=None, siblingdict={}, parent=None): + """ + convert an XML to a nested dict: + * Non-terminal nodes (elements with string children and attributes) are simple dictionaries + * Terminal nodes (the rest) are nested dictionaries + """ + + if (not nodeDom): + nodeDom=self.rootNode + + curNodeName = nodeDom.localName + + if (nodeDom.hasChildNodes()): + childdict={} + for attribute in nodeDom.attributes.keys(): + childdict = self.appendToDictOrCreate(childdict, attribute, nodeDom.getAttribute(attribute)) + for child in nodeDom.childNodes[:-1]: + if (child.nodeValue): + siblingdict = self.appendToDictOrCreate(siblingdict, curNodeName, child.nodeValue) + else: + childdict = self.toGenDict(child, None, childdict, curNodeName) + + child = nodeDom.childNodes[-1] + if (child.nodeValue): + siblingdict = self.appendToDictOrCreate(siblingdict, curNodeName, child.nodeValue) + if (childdict): + siblingdict = self.appendToDictOrCreate(siblingdict, curNodeName, childdict) + else: + siblingdict = self.toGenDict(child, siblingdict, childdict, curNodeName) + else: + childdict={} + for attribute in nodeDom.attributes.keys(): + childdict = self.appendToDictOrCreate(childdict, attribute, nodeDom.getAttribute(attribute)) + + self.appendToDictOrCreate(siblingdict, curNodeName, childdict) + + if (parentdict is not None): + parentdict = self.appendToDictOrCreate(parentdict, parent, siblingdict) + return parentdict + else: + return siblingdict + + + + def toDict(self, nodeDom = None): + """ + convert this rspec to a dict and return it. + """ + node = {} + if not nodeDom: + nodeDom = self.rootNode + + elementName = nodeDom.nodeName + if elementName and not elementName.startswith("#"): + # attributes have tags and values. get {tag: value}, else {type: value} + node[elementName] = self._attributeDict(nodeDom) + # resolve the child nodes. + if nodeDom.hasChildNodes(): + for child in nodeDom.childNodes: + childName = self._getName(child) + + # skip null children + if not childName: continue + + # initialize the possible array of children + if not node[elementName].has_key(childName): node[elementName][childName] = [] + + if isinstance(child, minidom.Text): + # add if data is not empty + if child.data.strip(): + node[elementName][childName].append(nextchild.data) + elif child.hasChildNodes() and isinstance(child.childNodes[0], minidom.Text): + for nextchild in child.childNodes: + node[elementName][childName].append(nextchild.data) + else: + childdict = self.toDict(child) + for value in childdict.values(): + node[elementName][childName].append(value) + + return node + + + def toxml(self): + """ + convert this rspec to an xml string and return it. + """ + return self.rootNode.toxml() + + + def toprettyxml(self): + """ + print this rspec in xml in a pretty format. + """ + return self.rootNode.toprettyxml() + + + def __removeWhitespaceNodes(self, parent): + for child in list(parent.childNodes): + if child.nodeType == minidom.Node.TEXT_NODE and child.data.strip() == '': + parent.removeChild(child) + else: + self.__removeWhitespaceNodes(child) + + def parseFile(self, filename): + """ + read a local xml file and store it as a dom object. + """ + dom = minidom.parse(filename) + self.__removeWhitespaceNodes(dom) + self.rootNode = dom.childNodes[0] + + + def parseString(self, xml): + """ + read an xml string and store it as a dom object. + """ + dom = minidom.parseString(xml) + self.__removeWhitespaceNodes(dom) + self.rootNode = dom.childNodes[0] + + + def _httpGetXSD(self, xsdURI): + # split the URI into relevant parts + host = xsdURI.split("/")[2] + if xsdURI.startswith("https"): + conn = httplib.HTTPSConnection(host, + httplib.HTTPSConnection.default_port) + elif xsdURI.startswith("http"): + conn = httplib.HTTPConnection(host, + httplib.HTTPConnection.default_port) + conn.request("GET", xsdURI) + # If we can't download the schema, raise an exception + r1 = conn.getresponse() + if r1.status != 200: + raise Exception + return r1.read().replace('\n', '').replace('\t', '').strip() + + + def _parseXSD(self, xsdURI): + """ + Download XSD from URL, or if file, read local xsd file and set + schemaDict. + + Since the schema definiton is a global namespace shared by and + agreed upon by others, this should probably be a URL. Check + for URL, download xsd, parse, or if local file, use that. + """ + schemaDom = None + if xsdURI.startswith("http"): + try: + schemaDom = minidom.parseString(self._httpGetXSD(xsdURI)) + except Exception, e: + # logging.debug("%s: web file not found" % xsdURI) + # logging.debug("Using local file %s" % self.xsd") + print e + print "Can't find %s on the web. Continuing." % xsdURI + if not schemaDom: + if os.path.exists(xsdURI): + # logging.debug("using local copy.") + print "Using local %s" % xsdURI + schemaDom = minidom.parse(xsdURI) + else: + raise Exception("Can't find xsd locally") + self.schemaDict = self.toDict(schemaDom.childNodes[0]) + + + def dict2dom(self, rdict, include_doc = False): + """ + convert a dict object into a dom object. + """ + + def elementNode(tagname, rd): + element = minidom.Element(tagname) + for key in rd.keys(): + if isinstance(rd[key], StringTypes) or isinstance(rd[key], int): + element.setAttribute(key, str(rd[key])) + elif isinstance(rd[key], dict): + child = elementNode(key, rd[key]) + element.appendChild(child) + elif isinstance(rd[key], list): + for item in rd[key]: + if isinstance(item, dict): + child = elementNode(key, item) + element.appendChild(child) + elif isinstance(item, StringTypes) or isinstance(item, int): + child = minidom.Element(key) + text = minidom.Text() + text.data = item + child.appendChild(text) + element.appendChild(child) + return element + + # Minidom does not allow documents to have more then one + # child, but elements may have many children. Because of + # this, the document's root node will be the first key/value + # pair in the dictionary. + node = elementNode(rdict.keys()[0], rdict.values()[0]) + if include_doc: + rootNode = minidom.Document() + rootNode.appendChild(node) + else: + rootNode = node + return rootNode + + + def parseDict(self, rdict, include_doc = True): + """ + Convert a dictionary into a dom object and store it. + """ + self.rootNode = self.dict2dom(rdict, include_doc).childNodes[0] + + + def getDictsByTagName(self, tagname, dom = None): + """ + Search the dom for all elements with the specified tagname + and return them as a list of dicts + """ + if not dom: + dom = self.rootNode + dicts = [] + doms = dom.getElementsByTagName(tagname) + dictlist = [self.toDict(d) for d in doms] + for item in dictlist: + for value in item.values(): + dicts.append(value) + return dicts + + def getDictByTagNameValue(self, tagname, value, dom = None): + """ + Search the dom for the first element with the specified tagname + and value and return it as a dict. + """ + tempdict = {} + if not dom: + dom = self.rootNode + dicts = self.getDictsByTagName(tagname, dom) + + for rdict in dicts: + if rdict.has_key('name') and rdict['name'] in [value]: + return rdict + + return tempdict + + + def filter(self, tagname, attribute, blacklist = [], whitelist = [], dom = None): + """ + Removes all elements where: + 1. tagname matches the element tag + 2. attribute matches the element attribte + 3. attribute value is in valuelist + """ + + tempdict = {} + if not dom: + dom = self.rootNode + + if dom.localName in [tagname] and dom.attributes.has_key(attribute): + if whitelist and dom.attributes.get(attribute).value not in whitelist: + dom.parentNode.removeChild(dom) + if blacklist and dom.attributes.get(attribute).value in blacklist: + dom.parentNode.removeChild(dom) + + if dom.hasChildNodes(): + for child in dom.childNodes: + self.filter(tagname, attribute, blacklist, whitelist, child) + + + def merge(self, rspecs, tagname, dom=None): + """ + Merge this rspec with the requested rspec based on the specified + starting tag name. The start tag (and all of its children) will be merged + """ + tempdict = {} + if not dom: + dom = self.rootNode + + whitelist = [] + blacklist = [] + + if dom.localName in [tagname] and dom.attributes.has_key(attribute): + if whitelist and dom.attributes.get(attribute).value not in whitelist: + dom.parentNode.removeChild(dom) + if blacklist and dom.attributes.get(attribute).value in blacklist: + dom.parentNode.removeChild(dom) + + if dom.hasChildNodes(): + for child in dom.childNodes: + self.filter(tagname, attribute, blacklist, whitelist, child) + + def validateDicts(self): + types = { + 'EInt' : int, + 'EString' : str, + 'EByteArray' : list, + 'EBoolean' : bool, + 'EFloat' : float, + 'EDate' : date} + + + def pprint(self, r = None, depth = 0): + """ + Pretty print the dict + """ + line = "" + if r == None: r = self.dict + # Set the dept + for tab in range(0,depth): line += " " + # check if it's nested + if type(r) == dict: + for i in r.keys(): + print line + "%s:" % i + self.pprint(r[i], depth + 1) + elif type(r) in (tuple, list): + for j in r: self.pprint(j, depth + 1) + # not nested so just print. + else: + print line + "%s" % r + + + +class RecordSpec(RSpec): + + root_tag = 'record' + def parseDict(self, rdict, include_doc = False): + """ + Convert a dictionary into a dom object and store it. + """ + self.rootNode = self.dict2dom(rdict, include_doc) + + def dict2dom(self, rdict, include_doc = False): + record_dict = rdict + if not len(rdict.keys()) == 1: + record_dict = {self.root_tag : rdict} + return RSpec.dict2dom(self, record_dict, include_doc) + + +# vim:ts=4:expandtab + diff --git a/sfa/util/rspecHelper.py b/sfa/util/rspecHelper.py new file mode 100755 index 00000000..8d002393 --- /dev/null +++ b/sfa/util/rspecHelper.py @@ -0,0 +1,326 @@ +#! /usr/bin/env python + +import sys +from copy import deepcopy +from lxml import etree +from StringIO import StringIO +from optparse import OptionParser + + +def merge_rspecs(rspecs): + """ + Merge merge a list of RSpecs into 1 RSpec, and return the result. + rspecs must be a valid RSpec string or list of RSpec strings. + """ + if not rspecs or not isinstance(rspecs, list): + return rspecs + + rspec = None + for tmp_rspec in rspecs: + try: + tree = etree.parse(StringIO(tmp_rspec)) + except etree.XMLSyntaxError: + # consider failing silently here + message = str(agg_rspec) + ": " + str(sys.exc_info()[1]) + raise InvalidRSpec(message) + + root = tree.getroot() + if root.get("type") in ["SFA"]: + if rspec == None: + rspec = root + else: + for network in root.iterfind("./network"): + rspec.append(deepcopy(network)) + for request in root.iterfind("./request"): + rspec.append(deepcopy(request)) + return etree.tostring(rspec, xml_declaration=True, pretty_print=True) + +class RSpec: + def __init__(self, xml): + parser = etree.XMLParser(remove_blank_text=True) + tree = etree.parse(StringIO(xml), parser) + self.rspec = tree.getroot() + + def get_node_element(self, hostname): + names = self.rspec.iterfind("./network/site/node/hostname") + for name in names: + if name.text == hostname: + return name.getparent() + return None + + def get_node_list(self): + result = self.rspec.xpath("./network/site/node/hostname/text()") + return result + + def get_sliver_list(self): + result = self.rspec.xpath("./network/site/node[sliver]/hostname/text()") + return result + + def add_sliver(self, hostname): + node = self.get_node_element(hostname) + etree.SubElement(node, "sliver") + + def remove_sliver(self, hostname): + node = self.get_node_element(hostname) + node.remove(node.find("sliver")) + + def attributes_list(self, elem): + opts = [] + if elem is not None: + for e in elem: + opts.append((e.tag, e.text)) + return opts + + def get_default_sliver_attributes(self): + defaults = self.rspec.find(".//sliver_defaults") + return self.attributes_list(defaults) + + def get_sliver_attributes(self, hostname): + node = self.get_node_element(hostname) + sliver = node.find("sliver") + return self.attributes_list(sliver) + + def add_attribute(self, elem, name, value): + opt = etree.SubElement(elem, name) + opt.text = value + + def add_default_sliver_attribute(self, name, value): + defaults = self.rspec.find(".//sliver_defaults") + if defaults is None: + defaults = etree.Element("sliver_defaults") + network = self.rspec.find(".//network") + network.insert(0, defaults) + self.add_attribute(defaults, name, value) + + def add_sliver_attribute(self, hostname, name, value): + node = self.get_node_element(hostname) + sliver = node.find("sliver") + self.add_attribute(sliver, name, value) + + def remove_attribute(self, elem, name, value): + if elem is not None: + opts = elem.iterfind(name) + if opts is not None: + for opt in opts: + if opt.text == value: + elem.remove(opt) + + def remove_default_sliver_attribute(self, name, value): + defaults = self.rspec.find(".//sliver_defaults") + self.remove_attribute(defaults, name, value) + + def remove_sliver_attribute(self, hostname, name, value): + node = self.get_node_element(hostname) + sliver = node.find("sliver") + self.remove_attribute(sliver, name, value) + + def get_site_nodes(self, siteid): + query = './/site[@id="%s"]/node/hostname/text()' % siteid + result = self.rspec.xpath(query) + return result + + def get_link_list(self): + linklist = [] + links = self.rspec.iterfind(".//link") + for link in links: + (end1, end2) = link.get("endpoints").split() + name = link.find("description") + linklist.append((name.text, + self.get_site_nodes(end1), + self.get_site_nodes(end2))) + return linklist + + def get_vlink_list(self): + vlinklist = [] + vlinks = self.rspec.iterfind(".//vlink") + for vlink in vlinks: + endpoints = vlink.get("endpoints") + (end1, end2) = endpoints.split() + query = './/node[@id="%s"]/hostname/text()' + node1 = self.rspec.xpath(query % end1)[0] + node2 = self.rspec.xpath(query % end2)[0] + desc = "%s <--> %s" % (node1, node2) + kbps = vlink.find("kbps") + vlinklist.append((endpoints, desc, kbps.text)) + return vlinklist + + def query_links(self, fromnode, tonode): + fromsite = fromnode.getparent() + tosite = tonode.getparent() + fromid = fromsite.get("id") + toid = tosite.get("id") + + query = ".//link[@endpoints = '%s %s']" % (fromid, toid) + results = self.rspec.xpath(query) + if results == None: + query = ".//link[@endpoints = '%s %s']" % (toid, fromid) + results = self.rspec.xpath(query) + return results + + def query_vlinks(self, endpoints): + query = ".//vlink[@endpoints = '%s']" % endpoints + results = self.rspec.xpath(query) + return results + + + def add_vlink(self, fromhost, tohost, kbps): + fromnode = self.get_node_element(fromhost) + tonode = self.get_node_element(tohost) + links = self.query_links(fromnode, tonode) + + for link in links: + vlink = etree.SubElement(link, "vlink") + fromid = fromnode.get("id") + toid = tonode.get("id") + vlink.set("endpoints", "%s %s" % (fromid, toid)) + self.add_attribute(vlink, "kbps", kbps) + + + def remove_vlink(self, endpoints): + vlinks = self.query_vlinks(endpoints) + for vlink in vlinks: + vlink.getparent().remove(vlink) + + def toxml(self): + return etree.tostring(self.rspec, pretty_print=True, + xml_declaration=True) + + def __str__(self): + return self.toxml() + + def save(self, filename): + f = open(filename, "w") + f.write(self.toxml()) + f.close() + + +class Commands: + def __init__(self, usage, description, epilog=None): + self.parser = OptionParser(usage=usage, description=description, + epilog=epilog) + self.parser.add_option("-i", "", dest="infile", metavar="FILE", + help="read RSpec from FILE (default is stdin)") + self.parser.add_option("-o", "", dest="outfile", metavar="FILE", + help="write output to FILE (default is stdout)") + self.nodefile = False + self.attributes = {} + + def add_nodefile_option(self): + self.nodefile = True + self.parser.add_option("-n", "", dest="nodefile", + metavar="FILE", + help="read node list from FILE"), + + def add_show_attributes_option(self): + self.parser.add_option("-s", "--show-attributes", action="store_true", + dest="showatt", default=False, + help="show sliver attributes") + + def add_attribute_options(self): + self.parser.add_option("", "--capabilities", action="append", + metavar="", + help="Vserver bcapabilities") + self.parser.add_option("", "--codemux", action="append", + metavar="", + help="Demux HTTP between slices using " + + "localhost ports") + self.parser.add_option("", "--cpu-pct", action="append", + metavar="", + help="Reserved CPU percent (e.g., 25)") + self.parser.add_option("", "--cpu-share", action="append", + metavar="", + help="Number of CPU shares (e.g., 5)") + self.parser.add_option("", "--delegations", + metavar="", action="append", + help="List of slices with delegation authority") + self.parser.add_option("", "--disk-max", + metavar="", action="append", + help="Disk quota (1k disk blocks)") + self.parser.add_option("", "--initscript", + metavar="", action="append", + help="Slice initialization script (e.g., stork)") + self.parser.add_option("", "--ip-addresses", action="append", + metavar="", + help="Add an IP address to a sliver") + self.parser.add_option("", "--net-i2-max-kbyte", + metavar="", action="append", + help="Maximum daily network Tx limit " + + "to I2 hosts.") + self.parser.add_option("", "--net-i2-max-rate", + metavar="", action="append", + help="Maximum bandwidth over I2 routes") + self.parser.add_option("", "--net-i2-min-rate", + metavar="", action="append", + help="Minimum bandwidth over I2 routes") + self.parser.add_option("", "--net-i2-share", + metavar="", action="append", + help="Number of bandwidth shares over I2 routes") + self.parser.add_option("", "--net-i2-thresh-kbyte", + metavar="", action="append", + help="Limit sent to I2 hosts before warning, " + + "throttling") + self.parser.add_option("", "--net-max-kbyte", + metavar="", action="append", + help="Maximum daily network Tx limit " + + "to non-I2 hosts.") + self.parser.add_option("", "--net-max-rate", + metavar="", action="append", + help="Maximum bandwidth over non-I2 routes") + self.parser.add_option("", "--net-min-rate", + metavar="", action="append", + help="Minimum bandwidth over non-I2 routes") + self.parser.add_option("", "--net-share", + metavar="", action="append", + help="Number of bandwidth shares over non-I2 " + + "routes") + self.parser.add_option("", "--net-thresh-kbyte", + metavar="", action="append", + help="Limit sent to non-I2 hosts before " + + "warning, throttling") + self.parser.add_option("", "--vsys", + metavar="", action="append", + help="Vsys script (e.g., fd_fusemount)") + self.parser.add_option("", "--vsys-vnet", + metavar="", action="append", + help="Allocate a virtual private network") + + def get_attribute_dict(self): + attrlist = ['capabilities','codemux','cpu_pct','cpu_share', + 'delegations','disk_max','initscript','ip_addresses', + 'net_i2_max_kbyte','net_i2_max_rate','net_i2_min_rate', + 'net_i2_share','net_i2_thresh_kbyte', + 'net_max_kbyte','net_max_rate','net_min_rate', + 'net_share','net_thresh_kbyte', + 'vsys','vsys_vnet'] + attrdict = {} + for attr in attrlist: + value = getattr(self.opts, attr, None) + if value is not None: + attrdict[attr] = value + return attrdict + + def prep(self): + (self.opts, self.args) = self.parser.parse_args() + + if self.opts.infile: + sys.stdin = open(self.opts.infile, "r") + xml = sys.stdin.read() + self.rspec = RSpec(xml) + + if self.nodefile: + if self.opts.nodefile: + f = open(self.opts.nodefile, "r") + self.nodes = f.read().split() + f.close() + else: + self.nodes = self.args + + if self.opts.outfile: + sys.stdout = open(self.opts.outfile, "w") + + + + + + + diff --git a/sfa/util/server.py b/sfa/util/server.py new file mode 100644 index 00000000..4f26186f --- /dev/null +++ b/sfa/util/server.py @@ -0,0 +1,280 @@ +## +# This module implements a general-purpose server layer for sfa. +# The same basic server should be usable on the registry, component, or +# other interfaces. +# +# TODO: investigate ways to combine this with existing PLC server? +## + +### $Id: server.py 18501 2010-07-09 20:20:48Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/server.py $ + +import sys +import traceback +import threading +import socket, os +import SocketServer +import BaseHTTPServer +import SimpleHTTPServer +import SimpleXMLRPCServer +from OpenSSL import SSL +from Queue import Queue +from sfa.trust.certificate import Keypair, Certificate +from sfa.trust.credential import * +from sfa.util.faults import * +from sfa.plc.api import SfaAPI +from sfa.util.cache import Cache +from sfa.util.debug import log +from sfa.util.sfalogging import logger +## +# Verification callback for pyOpenSSL. We do our own checking of keys because +# we have our own authentication spec. Thus we disable several of the normal +# prohibitions that OpenSSL places on certificates + +def verify_callback(conn, x509, err, depth, preverify): + # if the cert has been preverified, then it is ok + if preverify: + #print " preverified" + return 1 + + + # the certificate verification done by openssl checks a number of things + # that we aren't interested in, so we look out for those error messages + # and ignore them + + # XXX SMBAKER: I don't know what this error is, but it's being returned + # by newer pl nodes. + if err == 9: + #print " X509_V_ERR_CERT_NOT_YET_VALID" + return 1 + + # allow self-signed certificates + if err == 18: + #print " X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT" + return 1 + + # allow certs that don't have an issuer + if err == 20: + #print " X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY" + return 1 + + # allow chained certs with self-signed roots + if err == 19: + return 1 + + # allow certs that are untrusted + if err == 21: + #print " X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE" + return 1 + + # allow certs that are untrusted + if err == 27: + #print " X509_V_ERR_CERT_UNTRUSTED" + return 1 + + print " error", err, "in verify_callback" + + return 0 + +## +# taken from the web (XXX find reference). Implents HTTPS xmlrpc request handler +class SecureXMLRpcRequestHandler(SimpleXMLRPCServer.SimpleXMLRPCRequestHandler): + """Secure XML-RPC request handler class. + + It it very similar to SimpleXMLRPCRequestHandler but it uses HTTPS for transporting XML data. + """ + def setup(self): + self.connection = self.request + self.rfile = socket._fileobject(self.request, "rb", self.rbufsize) + self.wfile = socket._fileobject(self.request, "wb", self.wbufsize) + + def do_POST(self): + """Handles the HTTPS POST request. + + It was copied out from SimpleXMLRPCServer.py and modified to shutdown + the socket cleanly. + """ + try: + peer_cert = Certificate() + peer_cert.load_from_pyopenssl_x509(self.connection.get_peer_certificate()) + self.api = SfaAPI(peer_cert = peer_cert, + interface = self.server.interface, + key_file = self.server.key_file, + cert_file = self.server.cert_file, + cache = self.cache) + # get arguments + request = self.rfile.read(int(self.headers["content-length"])) + remote_addr = (remote_ip, remote_port) = self.connection.getpeername() + self.api.remote_addr = remote_addr + response = self.api.handle(remote_addr, request, self.server.method_map) + except Exception, fault: + # This should only happen if the module is buggy + # internal error, report as HTTP server error + traceback.print_exc() + response = self.api.prepare_response(fault) + #self.send_response(500) + #self.end_headers() + + # got a valid response + self.send_response(200) + self.send_header("Content-type", "text/xml") + self.send_header("Content-length", str(len(response))) + self.end_headers() + self.wfile.write(response) + + # shut down the connection + self.wfile.flush() + self.connection.shutdown() # Modified here! + +## +# Taken from the web (XXX find reference). Implements an HTTPS xmlrpc server +class SecureXMLRPCServer(BaseHTTPServer.HTTPServer,SimpleXMLRPCServer.SimpleXMLRPCDispatcher): + def __init__(self, server_address, HandlerClass, key_file, cert_file, logRequests=True): + """Secure XML-RPC server. + + It it very similar to SimpleXMLRPCServer but it uses HTTPS for transporting XML data. + """ + self.logRequests = logRequests + self.interface = None + self.key_file = key_file + self.cert_file = cert_file + self.method_map = {} + # add cache to the request handler + HandlerClass.cache = Cache() + #for compatibility with python 2.4 (centos53) + if sys.version_info < (2, 5): + SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self) + else: + SimpleXMLRPCServer.SimpleXMLRPCDispatcher.__init__(self, True, None) + SocketServer.BaseServer.__init__(self, server_address, HandlerClass) + ctx = SSL.Context(SSL.SSLv23_METHOD) + ctx.use_privatekey_file(key_file) + ctx.use_certificate_file(cert_file) + # If you wanted to verify certs against known CAs.. this is how you would do it + #ctx.load_verify_locations('/etc/sfa/trusted_roots/plc.gpo.gid') + ctx.set_verify(SSL.VERIFY_PEER | SSL.VERIFY_FAIL_IF_NO_PEER_CERT, verify_callback) + ctx.set_verify_depth(5) + ctx.set_app_data(self) + self.socket = SSL.Connection(ctx, socket.socket(self.address_family, + self.socket_type)) + self.server_bind() + self.server_activate() + + # _dispatch + # + # Convert an exception on the server to a full stack trace and send it to + # the client. + + def _dispatch(self, method, params): + try: + return SimpleXMLRPCServer.SimpleXMLRPCDispatcher._dispatch(self, method, params) + except: + # can't use format_exc() as it is not available in jython yet + # (evein in trunk). + type, value, tb = sys.exc_info() + raise xmlrpclib.Fault(1,''.join(traceback.format_exception(type, value, tb))) + +## From Active State code: http://code.activestate.com/recipes/574454/ +# This is intended as a drop-in replacement for the ThreadingMixIn class in +# module SocketServer of the standard lib. Instead of spawning a new thread +# for each request, requests are processed by of pool of reusable threads. +class ThreadPoolMixIn(SocketServer.ThreadingMixIn): + """ + use a thread pool instead of a new thread on every request + """ + # XX TODO: Make this configurable + # config = Config() + # numThreads = config.SFA_SERVER_NUM_THREADS + numThreads = 25 + allow_reuse_address = True # seems to fix socket.error on server restart + + def serve_forever(self): + """ + Handle one request at a time until doomsday. + """ + # set up the threadpool + self.requests = Queue() + + for x in range(self.numThreads): + t = threading.Thread(target = self.process_request_thread) + t.setDaemon(1) + t.start() + + # server main loop + while True: + self.handle_request() + + self.server_close() + + + def process_request_thread(self): + """ + obtain request from queue instead of directly from server socket + """ + while True: + SocketServer.ThreadingMixIn.process_request_thread(self, *self.requests.get()) + + + def handle_request(self): + """ + simply collect requests and put them on the queue for the workers. + """ + try: + request, client_address = self.get_request() + except socket.error: + return + if self.verify_request(request, client_address): + self.requests.put((request, client_address)) + +class ThreadedServer(ThreadPoolMixIn, SecureXMLRPCServer): + pass +## +# Implements an HTTPS XML-RPC server. Generally it is expected that SFA +# functions will take a credential string, which is passed to +# decode_authentication. Decode_authentication() will verify the validity of +# the credential, and verify that the user is using the key that matches the +# GID supplied in the credential. + +class SfaServer(threading.Thread): + + ## + # Create a new SfaServer object. + # + # @param ip the ip address to listen on + # @param port the port to listen on + # @param key_file private key filename of registry + # @param cert_file certificate filename containing public key + # (could be a GID file) + + def __init__(self, ip, port, key_file, cert_file): + threading.Thread.__init__(self) + self.key = Keypair(filename = key_file) + self.cert = Certificate(filename = cert_file) + #self.server = SecureXMLRPCServer((ip, port), SecureXMLRpcRequestHandler, key_file, cert_file) + self.server = ThreadedServer((ip, port), SecureXMLRpcRequestHandler, key_file, cert_file) + self.trusted_cert_list = None + self.register_functions() + + + ## + # Register functions that will be served by the XMLRPC server. This + # function should be overridden by each descendant class. + + def register_functions(self): + self.server.register_function(self.noop) + + ## + # Sample no-op server function. The no-op function decodes the credential + # that was passed to it. + + def noop(self, cred, anything): + self.decode_authentication(cred) + return anything + + ## + # Execute the server, serving requests forever. + + def run(self): + self.server.serve_forever() + + diff --git a/sfa/util/sfalogging.py b/sfa/util/sfalogging.py new file mode 100644 index 00000000..0e17ccba --- /dev/null +++ b/sfa/util/sfalogging.py @@ -0,0 +1,22 @@ +import logging +import os + +#SFA access log initialization +TMPDIR = os.getenv("TMPDIR", "/tmp") +SFA_HTTPD_ACCESS_LOGFILE = TMPDIR + "/" + 'sfa_httpd_access.log' +SFA_ACCESS_LOGFILE='/var/log/sfa_access.log' +logger=logging.getLogger() +logger.setLevel(logging.INFO) + +try: + logfile=logging.FileHandler(SFA_ACCESS_LOGFILE) +except IOError: + # This is usually a permissions error becaue the file is + # owned by root, but httpd is trying to access it. + logfile=logging.FileHandler(SFA_HTTPD_ACCESS_LOGFILE) + +formatter = logging.Formatter("%(asctime)s - %(message)s") +logfile.setFormatter(formatter) +logger.addHandler(logfile) +def get_sfa_logger(): + return logger diff --git a/sfa/util/sfatablesRuntime.py b/sfa/util/sfatablesRuntime.py new file mode 100644 index 00000000..14ec6f74 --- /dev/null +++ b/sfa/util/sfatablesRuntime.py @@ -0,0 +1,38 @@ +from sfatables.runtime import SFATablesRules + +def fetch_context(slice_hrn, user_hrn, contexts): + """ + Returns the request context required by sfatables. At some point, this + mechanism should be changed to refer to "contexts", which is the + information that sfatables is requesting. But for now, we just return + the basic information needed in a dict. + """ + slice_hrn = urn_to_hrn(slice_xrn)[0] + user_hrn = urn_to_hrn(user_xrn)[0] + base_context = {'sfa':{'user':{'hrn':user_hrn}, 'slice':{'hrn':slice_hrn}}} + return base_context + +def run_sfatables(chain, hrn, origin_hrn, rspec, context_callback = None ): + """ + Run the rspec through sfatables + @param chain Name of rule chain + @param hrn Object's hrn + @param origin_hrn Original caller's hrn + @param rspec Incoming rspec + @param context_callback Callback used to generate the request context + + @return rspec + """ + if not context_callback: + context_callback = fetch_context + + chain = chain.upper() + rules = SFATablesRules(chain) + if rules.sorted_rule_list: + contexts = rules.contexts + request_context = context_callback(hrn, origin_hrn, contexts) + rules.set_context(request_context) + newrspec = rules.apply(rspec) + else: + newrspec = rspec + return newrspec diff --git a/sfa/util/sfaticket.py b/sfa/util/sfaticket.py new file mode 100644 index 00000000..670ad145 --- /dev/null +++ b/sfa/util/sfaticket.py @@ -0,0 +1,130 @@ +# +# implements SFA tickets +# + +### $Id: sfaticket.py 18530 2010-07-23 21:27:18Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/sfaticket.py $ + +import xmlrpclib + +from sfa.trust.certificate import Certificate +from sfa.trust.rights import * +from sfa.trust.gid import * + +# Ticket is tuple: +# (gidCaller, gidObject, attributes, rspec, delegate) +# +# gidCaller = GID of the caller performing the operation +# gidObject = GID of the slice +# attributes = slice attributes (keys, vref, instantiation, etc) +# rspec = resources + +class SfaTicket(Certificate): + gidCaller = None + gidObject = None + attributes = {} + rspec = {} + delegate = False + + def __init__(self, create=False, subject=None, string=None, filename=None): + Certificate.__init__(self, create, subject, string, filename) + + def set_gid_caller(self, gid): + self.gidCaller = gid + + def get_gid_caller(self): + if not self.gidCaller: + self.decode() + return self.gidCaller + + def set_gid_object(self, gid): + self.gidObject = gid + + def get_gid_object(self): + if not self.gidObject: + self.decode() + return self.gidObject + + def set_attributes(self, gid): + self.attributes = gid + + def get_attributes(self): + if not self.attributes: + self.decode() + return self.attributes + + def set_rspec(self, gid): + self.rspec = gid + + def get_rspec(self): + if not self.rspec: + self.decode() + return self.rspec + + def set_delegate(self, delegate): + self.delegate = delegate + + def get_delegate(self): + if not self.delegate: + self.decode() + return self.delegate + + def encode(self): + dict = {"gidCaller": None, + "gidObject": None, + "attributes": self.attributes, + "rspec": self.rspec, + "delegate": self.delegate} + if self.gidCaller: + dict["gidCaller"] = self.gidCaller.save_to_string(save_parents=True) + if self.gidObject: + dict["gidObject"] = self.gidObject.save_to_string(save_parents=True) + str = "URI:" + xmlrpclib.dumps((dict,), allow_none=True) + self.set_data(str) + + def decode(self): + data = self.get_data() + if data: + dict = xmlrpclib.loads(self.get_data()[4:])[0][0] + else: + dict = {} + + self.attributes = dict.get("attributes", {}) + self.rspec = dict.get("rspec", {}) + self.delegate = dict.get("delegate", False) + + gidCallerStr = dict.get("gidCaller", None) + if gidCallerStr: + self.gidCaller = GID(string=gidCallerStr) + else: + self.gidCaller = None + + gidObjectStr = dict.get("gidObject", None) + if gidObjectStr: + self.gidObject = GID(string=gidObjectStr) + else: + self.gidObject = None + + def dump(self, dump_parents=False): + print "TICKET", self.get_subject() + + print " gidCaller:" + gidCaller = self.get_gid_caller() + if gidCaller: + gidCaller.dump(8, dump_parents) + + print " gidObject:" + gidObject = self.get_gid_object() + if gidObject: + gidObject.dump(8, dump_parents) + + print " attributes:" + for attrname in self.get_attributes().keys(): + print " ", attrname, self.get_attributes()[attrname] + + print " rspec:" + print " ", self.get_rspec() + + if self.parent and dump_parents: + print "PARENT", + self.parent.dump(dump_parents) diff --git a/sfa/util/soapprotocol.py b/sfa/util/soapprotocol.py new file mode 100644 index 00000000..8d9b3d15 --- /dev/null +++ b/sfa/util/soapprotocol.py @@ -0,0 +1,36 @@ +# SOAP-specific code for SFA Client + +import pdb +from ZSI.client import Binding +from httplib import HTTPSConnection + +def xmlrpc_like_callable (soap_callable, *x): + soap_result = soap_callable(*x) + xmlrpc_result = soap_result['Result'] + return xmlrpc_result + +class SFACallable: + def __init__(self, soap_callable): + self.soap_callable = soap_callable + + def __call__(self, *args): + outer_result = self.soap_callable(*args) + return outer_result['Result'] + + +class SFASoapBinding(Binding): + def __getattr__(self, attr): + soap_callable = Binding.__getattr__(self, attr) + return SFACallable(soap_callable) + + +def get_server(url, key_file, cert_file): + auth = { + 'transport' : HTTPSConnection, + 'transdict' : {'cert_file' : cert_file, + 'key_file' : key_file + }, + } + + return SFASoapBinding(url=url, **auth) + diff --git a/sfa/util/specdict.py b/sfa/util/specdict.py new file mode 100644 index 00000000..ed1bb4c3 --- /dev/null +++ b/sfa/util/specdict.py @@ -0,0 +1,134 @@ +## +# SpecDict +# +# SpecDict defines a means for converting a dictionary with plc specific keys +# to a dict with rspec specific keys. +# +# SpecDict.fields dict defines all the rspec specific attribute and their +# expected type. +# +# SpecDict.plc_fields defines a one to one mapping of plc attribute to rspec +# attribute + +### $Id: specdict.py 15485 2009-10-26 18:31:09Z sapanb $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/specdict.py $ + +from types import StringTypes, ListType + +class SpecDict(dict): + """ + Base class of SpecDict objects. + """ + fields = {} + plc_fields = {} + type = None + + def __init__(self, spec_dict): + # convert plc dict and initialize self + sdict = self.plcToSpec(spec_dict) + dict.__init__(self, sdict) + + + def plcToSpec(self, spec_dict): + """ + Defines how to convert a plc dict to rspec dict + """ + spec = {} + for field in self.fields: + value = "" + expected = self.fields[field] + if isinstance(expected, StringTypes): + if self.plc_fields.has_key(field): + plc_field = self.plc_fields[field] + if spec_dict.has_key(plc_field): + value = spec_dict[plc_field] + elif isinstance(expected, ListType): + expected = expected[0] + if self.plc_fields.has_key(field): + plc_field = self.plc_fields[field] + if spec_dict.has_key(plc_field): + value = [expected(value) for value in spec_dict[plc_field]] + spec[field] = value + return {self.type: spec} + +# +# fields = { geni_field: type. Could be class for nested classes, otherwise prob str} +# plc_fields = {geni_field : plc_field} +# + +class IfSpecDict(SpecDict): + type = 'IfSpec' + fields = {'name': '', + 'addr': '', + 'type': '', + 'init_params': '', + 'min_rate': '', + 'max_rate': '', + 'max_kbyte': '', + 'ip_spoof': ''} + plc_fields = {'name': 'is_primary', # XXX needs munging to return name instead of True or False + 'addr': 'ip', + 'type': 'type'} + +class LinkSpecDict(SpecDict): + type = 'LinkSpec' + fields = {'min_alloc': '', + 'max_alloc': '', + 'type': '', + 'start_time': '', + 'bw': '', + 'duration': '', + 'init_params': '', + 'endpoints': [IfSpecDict]} + plc_fields = {'min_alloc': 'min_alloc', + 'max_alloc': 'max_alloc', + 'type': 'type', + 'start_time': 'start_time', + 'bw': 'bw', + 'duration': 'duration', + 'init_params': 'init_params', + 'endpoints': 'endpoints'} + + +class NodeSpecDict(SpecDict): + type = 'NodeSpec' + fields = {'name': '', + 'type': '', + 'init_params': '', + 'cpu_min': '', + 'cpu_share': '', + 'cpu_pct': '', + 'disk_max': '', + 'start_time': '', + 'duration': '', + 'net_if': [IfSpecDict]} + + plc_fields = {'name': 'hostname', + 'net_if': 'interfaces'} + +class NetSpecDict(SpecDict): + type = 'NetSpec' + fields = {'name': '', + 'start_time': '', + 'duration': '', + 'nodes': [NodeSpecDict], + 'links': [LinkSpecDict], + } + plc_fields = {'name': 'name', + 'start_time': 'start_time', + 'duration': 'duration', + 'nodes': 'nodes', + 'links': 'links'} + +class RSpecDict(SpecDict): + type = 'RSpec' + fields = {'start_time': '', + 'duration': '', + 'networks': [NetSpecDict] + } + plc_fields = {'networks': 'networks', + 'start_time': 'start_tim', + 'duration': 'duration' + } + +# vim:ts=4:expandtab diff --git a/sfa/util/storage.py b/sfa/util/storage.py new file mode 100644 index 00000000..6ed30d38 --- /dev/null +++ b/sfa/util/storage.py @@ -0,0 +1,73 @@ +### $Id: storage.py 14252 2009-07-03 14:40:59Z thierry $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/storage.py $ + +import os + +from sfa.util.rspec import RecordSpec + +class SimpleStorage(dict): + """ + Handles storing and loading python dictionaries. The storage file created + is a string representation of the native python dictionary. + """ + db_filename = None + type = 'dict' + + def __init__(self, db_filename, db = {}): + + dict.__init__(self, db) + self.db_filename = db_filename + + def load(self): + if os.path.exists(self.db_filename) and os.path.isfile(self.db_filename): + db_file = open(self.db_filename, 'r') + dict.__init__(self, eval(db_file.read())) + elif os.path.exists(self.db_filename) and not os.path.isfile(self.db_filename): + raise IOError, '%s exists but is not a file. please remove it and try again' \ + % self.db_filename + else: + self.write() + self.load() + + def write(self): + db_file = open(self.db_filename, 'w') + db_file.write(str(self)) + db_file.close() + + def sync(self): + self.write() + +class XmlStorage(SimpleStorage): + """ + Handles storing and loading python dictionaries. The storage file created + is a xml representation of the python dictionary. + """ + db_filename = None + type = 'xml' + + def load(self): + """ + Parse an xml file and store it as a dict + """ + data = RecordSpec() + if os.path.exists(self.db_filename) and os.path.isfile(self.db_filename): + data.parseFile(self.db_filename) + dict.__init__(self, data.toDict()) + elif os.path.exists(self.db_filename) and not os.path.isfile(self.db_filename): + raise IOError, '%s exists but is not a file. please remove it and try again' \ + % self.db_filename + else: + self.write() + self.load() + + def write(self): + data = RecordSpec() + data.parseDict(self) + db_file = open(self.db_filename, 'w') + db_file.write(data.toprettyxml()) + db_file.close() + + def sync(self): + self.write() + + diff --git a/sfa/util/table.py b/sfa/util/table.py new file mode 100644 index 00000000..de9fe2ec --- /dev/null +++ b/sfa/util/table.py @@ -0,0 +1,196 @@ +### $Id: table.py 18182 2010-06-02 20:42:30Z tmack $ +### $URL: http://svn.planet-lab.org/svn/sfa/trunk/sfa/util/table.py $ +# +# implements support for SFA records stored in db tables +# +# TODO: Use existing PLC database methods? or keep this separate? + +import report +import pgdb + +from sfa.util.PostgreSQL import * +from sfa.trust.gid import * +from sfa.util.record import * +from sfa.util.debug import * +from sfa.util.config import * +from sfa.util.filter import * + +class SfaTable(list): + + SFA_TABLE_PREFIX = "sfa" + + def __init__(self, record_filter = None): + + # pgsql doesn't like table names with "." in them, to replace it with "$" + self.tablename = SfaTable.SFA_TABLE_PREFIX + self.config = Config() + self.db = PostgreSQL(self.config) + + if record_filter: + records = self.find(record_filter) + for record in records: + self.append(record) + + def exists(self): + sql = "SELECT * from pg_tables" + tables = self.db.selectall(sql) + tables = filter(lambda row: row['tablename'].startswith(self.SFA_TABLE_PREFIX), tables) + if tables: + return True + return False + def db_fields(self, obj=None): + + db_fields = self.db.fields(self.SFA_TABLE_PREFIX) + return dict( [ (key,value) for (key, value) in obj.items() \ + if key in db_fields and + self.is_writable(key, value, SfaRecord.fields)] ) + + @staticmethod + def is_writable (key,value,dict): + # if not mentioned, assume it's writable (e.g. deleted ...) + if key not in dict: return True + # if mentioned but not linked to a Parameter object, idem + if not isinstance(dict[key], Parameter): return True + # if not marked ro, it's writable + if not dict[key].ro: return True + + return False + + + def create(self): + + querystr = "CREATE TABLE " + self.tablename + " ( \ + record_id serial PRIMARY KEY , \ + hrn text NOT NULL, \ + authority text NOT NULL, \ + peer_authority text, \ + gid text, \ + type text NOT NULL, \ + pointer integer, \ + date_created timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, \ + last_updated timestamp without time zone NOT NULL DEFAULT CURRENT_TIMESTAMP);" + template = "CREATE INDEX %s_%s_idx ON %s (%s);" + indexes = [template % ( self.tablename, field, self.tablename, field) \ + for field in ['hrn', 'type', 'authority', 'peer_authority', 'pointer']] + # IF EXISTS doenst exist in postgres < 8.2 + try: + self.db.do('DROP TABLE IF EXISTS ' + self.tablename) + except: + try: + self.db.do('DROP TABLE' + self.tablename) + except: + pass + + self.db.do(querystr) + for index in indexes: + self.db.do(index) + + self.db.commit() + + def remove(self, record): + params = {'record_id': record['record_id']} + template = "DELETE FROM %s " % self.tablename + sql = template + "WHERE record_id = %(record_id)s" + self.db.do(sql, params) + + # if this is a site, remove all records where 'authority' == the + # site's hrn + if record['type'] == 'authority': + params = {'authority': record['hrn']} + sql = template + "WHERE authority = %(authority)s" + self.db.do(sql, params) + self.db.commit() + + def insert(self, record): + db_fields = self.db_fields(record) + keys = db_fields.keys() + values = [self.db.param(key, value) for (key, value) in db_fields.items()] + query_str = "INSERT INTO " + self.tablename + \ + "(" + ",".join(keys) + ") " + \ + "VALUES(" + ",".join(values) + ")" + self.db.do(query_str, db_fields) + self.db.commit() + result = self.find({'hrn': record['hrn'], 'type': record['type'], 'peer_authority': record['peer_authority']}) + if not result: + record_id = None + elif isinstance(result, list): + record_id = result[0]['record_id'] + else: + record_id = result['record_id'] + + return record_id + + def update(self, record): + db_fields = self.db_fields(record) + keys = db_fields.keys() + values = [self.db.param(key, value) for (key, value) in db_fields.items()] + columns = ["%s = %s" % (key, value) for (key, value) in zip(keys, values)] + query_str = "UPDATE %s SET %s WHERE record_id = %s" % \ + (self.tablename, ", ".join(columns), record['record_id']) + self.db.do(query_str, db_fields) + self.db.commit() + + def quote_string(self, value): + return str(self.db.quote(value)) + + def quote(self, value): + return self.db.quote(value) + + def find(self, record_filter = None, columns=None): + if not columns: + columns = "*" + else: + columns = ",".join(columns) + sql = "SELECT %s FROM %s WHERE True " % (columns, self.tablename) + + if isinstance(record_filter, (list, tuple, set)): + ints = filter(lambda x: isinstance(x, (int, long)), record_filter) + strs = filter(lambda x: isinstance(x, StringTypes), record_filter) + record_filter = Filter(SfaRecord.all_fields, {'record_id': ints, 'hrn': strs}) + sql += "AND (%s) %s " % record_filter.sql("OR") + elif isinstance(record_filter, dict): + record_filter = Filter(SfaRecord.all_fields, record_filter) + sql += " AND (%s) %s" % record_filter.sql("AND") + elif isinstance(record_filter, StringTypes): + record_filter = Filter(SfaRecord.all_fields, {'hrn':[record_filter]}) + sql += " AND (%s) %s" % record_filter.sql("AND") + elif isinstance(record_filter, int): + record_filter = Filter(SfaRecord.all_fields, {'record_id':[record_filter]}) + sql += " AND (%s) %s" % record_filter.sql("AND") + + results = self.db.selectall(sql) + if isinstance(results, dict): + results = [results] + return results + + def findObjects(self, record_filter = None, columns=None): + + results = self.find(record_filter, columns) + result_rec_list = [] + for result in results: + if result['type'] in ['authority']: + result_rec_list.append(AuthorityRecord(dict=result)) + elif result['type'] in ['node']: + result_rec_list.append(NodeRecord(dict=result)) + elif result['type'] in ['slice']: + result_rec_list.append(SliceRecord(dict=result)) + elif result['type'] in ['user']: + result_rec_list.append(UserRecord(dict=result)) + else: + result_rec_list.append(SfaRecord(dict=result)) + return result_rec_list + + + def drop(self): + try: + self.db.do('DROP TABLE IF EXISTS ' + self.tablename) + self.db.commit() + except: + try: + self.db.do('DROP TABLE ' + self.tablename) + self.db.commit() + except: + pass + + def sfa_records_purge(self): + self.drop() diff --git a/sfa/util/threadmanager.py b/sfa/util/threadmanager.py new file mode 100755 index 00000000..3d5dd03e --- /dev/null +++ b/sfa/util/threadmanager.py @@ -0,0 +1,71 @@ +import threading +import time +from Queue import Queue + +def ThreadedMethod(callable, queue): + """ + A function decorator that returns a running thread. The thread + runs the specified callable and stores the result in the specified + results queue + """ + def wrapper(args, kwds): + class ThreadInstance(threading.Thread): + def run(self): + try: + queue.put(callable(*args, **kwds)) + except: + # ignore errors + pass + thread = ThreadInstance() + thread.start() + return thread + return wrapper + + + +class ThreadManager: + """ + ThreadManager executes a callable in a thread and stores the result + in a thread safe queue. + """ + queue = Queue() + threads = [] + + def run (self, method, *args, **kwds): + """ + Execute a callable in a separate thread. + """ + method = ThreadedMethod(method, self.queue) + thread = method(args, kwds) + self.threads.append(thread) + + start = run + + def get_results(self): + """ + Return a list of all the results so far. Blocks until + all threads are finished. + """ + for thread in self.threads: + thread.join() + results = [] + while not self.queue.empty(): + results.append(self.queue.get()) + return results + +if __name__ == '__main__': + + def f(name, n, sleep=1): + nums = [] + for i in range(n, n+5): + print "%s: %s" % (name, i) + nums.append(i) + time.sleep(sleep) + return nums + + threads = ThreadManager() + threads.run(f, "Thread1", 10, 2) + threads.run(f, "Thread2", -10, 1) + + results = threads.get_results() + print "Results:", results diff --git a/sfa/util/xmlrpcprotocol.py b/sfa/util/xmlrpcprotocol.py new file mode 100644 index 00000000..11a4317d --- /dev/null +++ b/sfa/util/xmlrpcprotocol.py @@ -0,0 +1,54 @@ +# XMLRPC-specific code for SFA Client + +import xmlrpclib + +## +# ServerException, ExceptionUnmarshaller +# +# Used to convert server exception strings back to an exception. +# from usenet, Raghuram Devarakonda + +class ServerException(Exception): + pass + +class ExceptionUnmarshaller(xmlrpclib.Unmarshaller): + def close(self): + try: + return xmlrpclib.Unmarshaller.close(self) + except xmlrpclib.Fault, e: + raise ServerException(e.faultString) + +## +# XMLRPCTransport +# +# A transport for XMLRPC that works on top of HTTPS + +class XMLRPCTransport(xmlrpclib.Transport): + key_file = None + cert_file = None + def make_connection(self, host): + # create a HTTPS connection object from a host descriptor + # host may be a string, or a (host, x509-dict) tuple + import httplib + host, extra_headers, x509 = self.get_host_info(host) + try: + HTTPS = httplib.HTTPS() + except AttributeError: + raise NotImplementedError( + "your version of httplib doesn't support HTTPS" + ) + else: + return httplib.HTTPS(host, None, key_file=self.key_file, cert_file=self.cert_file) #**(x509 or {})) + + def getparser(self): + unmarshaller = ExceptionUnmarshaller() + parser = xmlrpclib.ExpatParser(unmarshaller) + return parser, unmarshaller + +def get_server(url, key_file, cert_file, debug=False): + transport = XMLRPCTransport() + transport.key_file = key_file + transport.cert_file = cert_file + + return xmlrpclib.ServerProxy(url, transport, allow_none=True, verbose=debug) + diff --git a/sfatables/README b/sfatables/README new file mode 100644 index 00000000..892442ff --- /dev/null +++ b/sfatables/README @@ -0,0 +1,265 @@ +sfatables is a tool for defining access and admission control policies +in an SFA network, in much the same way as iptables is for ip +networks. This file gives an overview of the tool and then describes +its design and implementation. + +Example command +--------------- + +An sfatables configuration consists of lists of rules that are applied +to incoming and outgoing rspecs. Each rule consists of a 'match', to +evaluate a given request against a certain set of criteria and a +'target', to perform a corresponding action. Rules are manipulated by +using the 'sfatables' command. + +Consider the following example: + +sfatables -A INCOMING -- -m hrn --user-hrn plc.princeton -- -j RESTRICT_TO_NODES --blacklist plc.mit + +The statement in this example has three parts: the command, the match +and the target, separated by the token '--'. + +* The command is '-A', which means 'Add rule.' + +* The match is defined in the segment '-m hrn --user-hrn + plc.princeton.' Here, '-m hrn' specifies the 'match type', and + '--user-hrn' provides an argument specific to the match type. + +* The target is defined by the segment '-j RESTRICT_TO_NODES + --blacklist plc.princeton.' '-j RESTRICT_TO_NODES' defines the + target type (RESTRICT_TO_NODES) and '--blacklist' defines a + parameter specific to this type. + +sfatables comes with a default set of matches and targets, which can +be extended using a simple interface. + +When you execute this command, you should see it in your current +configuration by running 'sfatables -L INCOMING' + +# ./sfatables -L INCOMING + +# Rule Match Arguments Target Arguments +# 1 hrn user-hrn=plc.princeton.* RESTRICT_TO_NODES blacklist=plc.mit + +With this configuration, every time a request is received from +plc.princeton.*, nodes matching the blacklist prefix (plc.mit) are +dropped from the rspec. + +The basis for deploying rules using sfatables is the library of +matches and targets. A set of such rules constitutes a 'policy', which +as we will see is a portable piece of information that can be +exchanged with users, peers, and policy makers to make resource +allocation and peering a more effective process. + +XPath crash course -- read this now, or deal with frustration in the +remainder of the document +----------------------------------------------------- + +XPath is used to select sets of nodes in an XML file. It is like the +'SELECT' command in SQL, but has the advantage of applying to tree +structures, which are more general than relations. That is, while a +relation (a table) has a depth = 2, a tree can have an arbitrary +depth. This property allows us to consicely refer to criteria such as 'the nodes in the +site corresponding to a user named Alice.' This particular command +might look like: '/user[name='Alice']/site/node.' + +An XPath expression is like a directory path, with the following key +differences. + +* In a directory path the relationship between X/Y is a parent-child + relationship. In XPath, this can be one of a large number of + relationships, including 'sibling', 'parent', 'ancestor', + 'descendant' etc. The most frequently used relationships are: + + child - e.g. site/node + + and + + descendant - e.g. user//node + +* Each level can be filtered with a predicate; e.g., + 'site[startswith(@hrn,'plc')]/nodes' means all nodes in sites that + have the prefix 'plc'. + +* Some terms have an '@' in them, meaning that they are attributes; + e.g., to retrieve the value of p in the following data, we would use + the expression "/x/y/@p" + + + + + +Example match +------------- + +A match specification consists of a 'context', a set of arguments, and +a 'processor.' The context defines the information associated with a +request that this match operates on. Think of it as the input +parameters to the match. The arguments define values specific to the +rule. The processor refers to the program that actually evaluates the +match. + + + + + + user-hrn + HRN of the user requesting resouces + HRN + + + + + +Now, when we run the command in the previous example: + +sfatables -A INCOMING -- -m hrn --user-hrn plc.princeton -- -j RESTRICT_TO_NODES --blacklist plc.mit + +... this match specification is parameterized and dropped in the +sfatables configuration directory. The paramterized version of the +match is given below: + + + + + + + user-hrn + HRN of the user requesting resouces + HRN + plc.princeton <------------------ + + + + + +Notice the additional 'value' tag. Let's list the entries in the +configuration directory. + +# ls -l /etc/sfatables/INCOMING + +sapan@joyce ~/Projects/planetlab/sfa/sfatables/targets $ +total 16 +-rw-r--r-- 1 sapan sapan 671 Sep 11 12:13 sfatables-1-match +-rw-r--r-- 1 sapan sapan 646 Sep 11 12:13 sfatables-1-target + +As you can see, a configuration is simply a set of match-target pairs. + +Finally, this is what the match processor looks like: + + + + + + + + True + + + False + + + + + + + +It is written in XSLT. If the syntax of XSLT were not XML-based, then +it might have looked as follows: + +context-hrn = //sfa/user/hrn +request-hrn = //request/user/hrn + +result = + if (starts_with(context-hrn,request-hrn)) then + True + else + False + return result + +This is exactly what the previous fragment of code says, albeit in a +different format. + +Example target +-------------- + +Targets are specified just like matches. If you haven't read the match +example, then now is a good time to do that. Here's an example target: + + + + + + + whitelist + Prefix of nodes to whitelist for this match. + PREFIX + + + blacklist + Prefix of nodes to blacklist for this match. + PREFIX + + + + + +and the corresponding target processor: + + + + + + + + + + + + + + + + + + + + + + + + + +[TODO: explain this target] + + +Contexts +-------- + +Matches and targets are associated with specific contexts. A target may use a +variety of criteria to process a request, and may need to look them up in the +SFA database. The 'context' contains an xpath expression that isolates the +items that a match or target may refer to. For example, if a match needs access +to the nodes corresponding to a slice's site, then the context may be '/sfa/slice[@name=/context/slice/@name]/nodes'. + + +Here's a summary of the model: +----------------------------- + +An AM can inherit from a set of elements (E). + +Each element in E is associated with three things: + + * A er... 'micro-rspec' + + * an abstract database schema - S, which the AM is expected to be + able to generate on the fly. + + * a set of matches and targets. + +Matches and targets may use pieces of information from S by specifying +them in their context (see the 'context' part of matches and targets +above). diff --git a/sfatables/TO_CLEANUP b/sfatables/TO_CLEANUP new file mode 100644 index 00000000..bb7db58c --- /dev/null +++ b/sfatables/TO_CLEANUP @@ -0,0 +1,3 @@ +1# Load sfatables rules only once, not on every request. +2# Set request context based on the context requested by the match/target. +3# Remember the element type at run time diff --git a/sfatables/__init__.py b/sfatables/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/sfatables/command.py b/sfatables/command.py new file mode 100644 index 00000000..1cb58e7d --- /dev/null +++ b/sfatables/command.py @@ -0,0 +1,26 @@ +import os, time + +class Command: + options = [] + help = '' + type='command' + matches = False + targets = False + action = 'store_const' + + def __init__(self): + self.options = [] + self.help = '' + self.type = 'command' + self.matches = False + self.targets = False + self.action = 'store_const' + + return + + def call(self, coptions, moptions, toptions): + # Override this function + return True + + def __call__(self, coptions, moptions, toptions): + return self.call(coptions,moptions,toptions) diff --git a/sfatables/commands/Add.py b/sfatables/commands/Add.py new file mode 100644 index 00000000..e7657fff --- /dev/null +++ b/sfatables/commands/Add.py @@ -0,0 +1,70 @@ +import os, time +import libxml2 +from sfatables.command import Command +from sfatables.globals import * + +class Add(Command): + def __init__(self): + self.options = [('-A','--add')] + self.help = 'Add a rule to a chain' + self.matches = True + self.targets = True + return + + def getnextfilename(self,type,chain): + dir = sfatables_config + "/"+chain; + last_rule_number = 0 + + for (root, dirs, files) in os.walk(dir): + for file in files: + if (file.startswith('sfatables-') and file.endswith(type)): + number_str = file.split('-')[1] + number = int(number_str) + if (number>last_rule_number): + last_rule_number = number + + return "sfatables-%d-%s"%(last_rule_number+1,type) + + def call_gen(self, chain, type, dir, options): + filename = os.path.join(dir, options.name+".xml") + xmldoc = libxml2.parseFile(filename) + + p = xmldoc.xpathNewContext() + + supplied_arguments = options.arguments + if (hasattr(options,'element') and options.element): + element = options.element + else: + element='*' + + for option in supplied_arguments: + option_name = option['name'] + option_value = getattr(options,option_name) + + if (hasattr(options,option_name) and getattr(options,option_name)): + context = p.xpathEval("//rule[@element='%s' or @element='*']/argument[name='%s']"%(element, option_name)) + if (not context): + raise Exception('Unknown option %s for match %s and element %s'%(option,option['name'], element)) + else: + # Add the value of option + valueNode = libxml2.newNode('value') + valueNode.addContent(option_value) + context[0].addChild(valueNode) + + filename = self.getnextfilename(type,chain) + file_path = os.path.join(sfatables_config, chain, filename) + if not os.path.isdir(os.path.dirname(file_path)): + os.makedirs(os.path.dirname(file_path)) + xmldoc.saveFile(file_path) + p.xpathFreeContext() + xmldoc.freeDoc() + + return True + + def call(self, command_options, match_options, target_options): + chain = command_options.args[0] + ret = self.call_gen(chain, 'match',match_dir, match_options) + if (ret): + ret = self.call_gen(chain, 'target',target_dir, target_options) + + return ret diff --git a/sfatables/commands/Delete.py b/sfatables/commands/Delete.py new file mode 100644 index 00000000..50b1d626 --- /dev/null +++ b/sfatables/commands/Delete.py @@ -0,0 +1,32 @@ +import os, time +from sfatables.globals import * +from sfatables.command import Command + +class Delete(Command): + options = [('-D','--delete')] + help = 'Delete a rule from a chain' + key='delete_rule' + matches = False + targets = False + + def __init__(self): + return + + def call(self, command_options, match_options, target_options): + + if (len(command_options.args)<2): + print "Please specify the chain and the rule number to delete, e.g. sfatables -D INCOMING 1." + return + + chain = command_options.args[0] + + + rule_number = command_options.args[1] + chain_dir = sfatables_config + "/" + chain + + match_path = chain_dir + "/" + "sfatables-%s-match"%rule_number + target_path = chain_dir + "/" + "sfatables-%s-target"%rule_number + + os.unlink(match_path) + os.unlink(target_path) + diff --git a/sfatables/commands/Insert.py b/sfatables/commands/Insert.py new file mode 100644 index 00000000..d4010920 --- /dev/null +++ b/sfatables/commands/Insert.py @@ -0,0 +1,65 @@ +import os, time +import libxml2 +from sfatables.command import Command +from sfatables.globals import * + +class Insert(Command): + def __init__(self): + self.options = [('-I','--insert')] + self.help = 'Insert a rule into a chain' + self.matches = True + self.targets = True + return + + def call_gen(self, chain, type, dir, options, file_path): + filename = os.path.join(dir, options.name+".xml") + xmldoc = libxml2.parseFile(filename) + + p = xmldoc.xpathNewContext() + + supplied_arguments = options.arguments + if (hasattr(options,'element') and options.element): + element = options.element + else: + element='*' + + for option in supplied_arguments: + option_name = option['name'] + option_value = getattr(options,option_name) + + if (hasattr(options,option_name) and getattr(options,option_name)): + context = p.xpathEval("//rule[@element='%s' or @element='*']/argument[name='%s']"%(element, option_name)) + if (not context): + raise Exception('Unknown option %s for match %s and element %s'%(option,option['name'], element)) + else: + # Add the value of option + valueNode = libxml2.newNode('value') + valueNode.addContent(option_value) + context[0].addChild(valueNode) + + if not os.path.isdir(os.path.dirname(file_path)): + os.makedirs(os.path.dirname(file_path)) + xmldoc.saveFile(file_path) + p.xpathFreeContext() + xmldoc.freeDoc() + + return True + + def call(self, command_options, match_options, target_options): + if (len(command_options.args)<2): + print "Please specify the chain and the rule number to insert, e.g. sfatables -I INCOMING 1 -- ...." + return + + chain = command_options.args[0] + + rule_number = command_options.args[1] + chain_dir = sfatables_config + "/" + chain + + match_path = chain_dir + "/" + "sfatables-%s-match"%rule_number + target_path = chain_dir + "/" + "sfatables-%s-target"%rule_number + + ret = self.call_gen(chain, 'match',match_dir, match_options, match_path) + if (ret): + ret = self.call_gen(chain, 'target',target_dir, target_options, target_path) + + return ret diff --git a/sfatables/commands/List.py b/sfatables/commands/List.py new file mode 100644 index 00000000..95d20381 --- /dev/null +++ b/sfatables/commands/List.py @@ -0,0 +1,103 @@ +import os, time +import libxml2 +import pdb + +from sfatables.globals import * +from sfatables.pretty import Pretty +from sfatables.command import Command + +class List(Command): + + def __init__(self): + self.options = [('-L','--list')] + self.help = 'List a chain' + self.key='list_rule' + self.matches = False + self.targets = False + + return + + def get_info(self, type, xmlextension_path): + xmldoc = libxml2.parseFile(xmlextension_path) + p = xmldoc.xpathNewContext() + + ext_name_node = p.xpathEval("/%s/@name"%type) + ext_name = ext_name_node[0].content + + name_nodes = p.xpathEval("//rule/argument[value!='']/name") + value_nodes = p.xpathEval("//rule/argument[value!='']/value") + element_nodes = p.xpathEval("//argument[value!='']/parent::rule/@element") + + if (len(element_nodes)>1): + raise Exception("Invalid rule %s contains multiple elements."%xmlextension_path) + + element = [] + argument_str = "" + if element_nodes: + element = element_nodes[0].content + + names = [n.content for n in name_nodes] + values = [v.content for v in value_nodes] + + name_values = zip(names,values) + name_value_pairs = map(lambda (n,v):n+'='+v, name_values) + + argument_str = ",".join(name_value_pairs) + + p.xpathFreeContext() + xmldoc.freeDoc() + + return {'name':ext_name, 'arguments':argument_str, 'element':element} + + def get_rule_list(self, chain_dir_path): + broken_semantics = os.walk(chain_dir_path) + rule_numbers = {} + + for (root, dirs, files) in broken_semantics: + for file in files: + if (file.startswith('sfatables')): + (magic,number,type) = file.split('-') + rule_numbers[int(number)]=1 + + rule_list = rule_numbers.keys() + rule_list.sort() + return rule_list + + def call(self, command_options, match_options, target_options): + if (len(command_options.args) < 1): + print "Please specify the name of the chain you would like to list, e.g. sfatables -L INCOMING." + return + + chain = command_options.args[0] + chain_dir = os.path.join(sfatables_config, chain) + + rule_list = self.get_rule_list(chain_dir) + + pretty = Pretty(['Rule','Match','Arguments','Target','Element','Arguments']) + + for number in rule_list: + match_file = "sfatables-%d-%s"%(number,'match') + target_file = "sfatables-%d-%s"%(number,'target') + + match_path = sfatables_config + '/' + chain + '/' + match_file + target_path = sfatables_config + '/' + chain + '/' + target_file + + match_info = self.get_info ('match',match_path) + target_info = self.get_info ('target',target_path) + + pretty.push_row(["%d"%number, + match_info['name'], + match_info['arguments'], + target_info['name'], + target_info['element'], + target_info['arguments']]) + + pretty.pprint() + + + + + + + + diff --git a/sfatables/commands/SetDefault.py b/sfatables/commands/SetDefault.py new file mode 100644 index 00000000..b840706b --- /dev/null +++ b/sfatables/commands/SetDefault.py @@ -0,0 +1,19 @@ +import os, time +from sfatables.command import Command + +class SetDefault(Command): + options = [('-P','--default')] + help = 'Set the default rule for a chain' + key='set_default_rule' + matches = False + targets = False + + def __init__(self): + return + + def call(self): + # Override this function + return True + + def __call__(self, option, opt_str, value, parser, *args, **kwargs): + return self.call(option) diff --git a/sfatables/commands/__init__.py b/sfatables/commands/__init__.py new file mode 100644 index 00000000..273696c1 --- /dev/null +++ b/sfatables/commands/__init__.py @@ -0,0 +1,7 @@ +all = """ +Add +Delete +Insert +List +SetDefault +""".split() diff --git a/sfatables/commands/moo.py b/sfatables/commands/moo.py new file mode 100644 index 00000000..bd8c88ef --- /dev/null +++ b/sfatables/commands/moo.py @@ -0,0 +1,210 @@ +import os, time + +class Command: + commandline_options = [] + help = "Add a new rule" + + def __init__(self): + if (len(commandline_options!=2)): + raise Exception("Internal error: each command must supply 2 command line options") + + + def __call__(self, option, opt_str, value, parser, *args, **kwargs): + return True + + + + def help(self, indent = " "): + """ + Text documentation for the method. + """ + + (min_args, max_args, defaults) = self.args() + + text = "%s(%s) -> %s\n\n" % (self.name, ", ".join(max_args), xmlrpc_type(self.returns)) + + text += "Description:\n\n" + lines = [indent + line.strip() for line in self.__doc__.strip().split("\n")] + text += "\n".join(lines) + "\n\n" + + def param_text(name, param, indent, step): + """ + Format a method parameter. + """ + + text = indent + + # Print parameter name + if name: + param_offset = 32 + text += name.ljust(param_offset - len(indent)) + else: + param_offset = len(indent) + + # Print parameter type + param_type = python_type(param) + text += xmlrpc_type(param_type) + "\n" + + # Print parameter documentation right below type + if isinstance(param, Parameter): + wrapper = textwrap.TextWrapper(width = 70, + initial_indent = " " * param_offset, + subsequent_indent = " " * param_offset) + text += "\n".join(wrapper.wrap(param.doc)) + "\n" + param = param.type + + text += "\n" + + # Indent struct fields and mixed types + if isinstance(param, dict): + for name, subparam in param.iteritems(): + text += param_text(name, subparam, indent + step, step) + elif isinstance(param, Mixed): + for subparam in param: + text += param_text(name, subparam, indent + step, step) + elif isinstance(param, (list, tuple, set)): + for subparam in param: + text += param_text("", subparam, indent + step, step) + + return text + + text += "Parameters:\n\n" + for name, param in zip(max_args, self.accepts): + text += param_text(name, param, indent, indent) + + text += "Returns:\n\n" + text += param_text("", self.returns, indent, indent) + + return text + + def args(self): + """ + Returns a tuple: + + ((arg1_name, arg2_name, ...), + (arg1_name, arg2_name, ..., optional1_name, optional2_name, ...), + (None, None, ..., optional1_default, optional2_default, ...)) + + That represents the minimum and maximum sets of arguments that + this function accepts and the defaults for the optional arguments. + """ + + # Inspect call. Remove self from the argument list. + max_args = self.call.func_code.co_varnames[1:self.call.func_code.co_argcount] + defaults = self.call.func_defaults + if defaults is None: + defaults = () + + min_args = max_args[0:len(max_args) - len(defaults)] + defaults = tuple([None for arg in min_args]) + defaults + + return (min_args, max_args, defaults) + + def type_check(self, name, value, expected, args): + """ + Checks the type of the named value against the expected type, + which may be a Python type, a typed value, a Parameter, a + Mixed type, or a list or dictionary of possibly mixed types, + values, Parameters, or Mixed types. + + Extraneous members of lists must be of the same type as the + last specified type. For example, if the expected argument + type is [int, bool], then [1, False] and [14, True, False, + True] are valid, but [1], [False, 1] and [14, True, 1] are + not. + + Extraneous members of dictionaries are ignored. + """ + + # If any of a number of types is acceptable + if isinstance(expected, Mixed): + for item in expected: + try: + self.type_check(name, value, item, args) + return + except SfaInvalidArgument, fault: + pass + raise fault + + # If an authentication structure is expected, save it and + # authenticate after basic type checking is done. + #if isinstance(expected, Auth): + # auth = expected + #else: + # auth = None + + # Get actual expected type from within the Parameter structure + if isinstance(expected, Parameter): + min = expected.min + max = expected.max + nullok = expected.nullok + expected = expected.type + else: + min = None + max = None + nullok = False + + expected_type = python_type(expected) + + # If value can be NULL + if value is None and nullok: + return + + # Strings are a special case. Accept either unicode or str + # types if a string is expected. + if expected_type in StringTypes and isinstance(value, StringTypes): + pass + + # Integers and long integers are also special types. Accept + # either int or long types if an int or long is expected. + elif expected_type in (IntType, LongType) and isinstance(value, (IntType, LongType)): + pass + + elif not isinstance(value, expected_type): + raise SfaInvalidArgument("expected %s, got %s" % \ + (xmlrpc_type(expected_type), + xmlrpc_type(type(value))), + name) + + # If a minimum or maximum (length, value) has been specified + if expected_type in StringTypes: + if min is not None and \ + len(value.encode(self.api.encoding)) < min: + raise SfaInvalidArgument, "%s must be at least %d bytes long" % (name, min) + if max is not None and \ + len(value.encode(self.api.encoding)) > max: + raise SfaInvalidArgument, "%s must be at most %d bytes long" % (name, max) + elif expected_type in (list, tuple, set): + if min is not None and len(value) < min: + raise SfaInvalidArgument, "%s must contain at least %d items" % (name, min) + if max is not None and len(value) > max: + raise SfaInvalidArgument, "%s must contain at most %d items" % (name, max) + else: + if min is not None and value < min: + raise SfaInvalidArgument, "%s must be > %s" % (name, str(min)) + if max is not None and value > max: + raise SfaInvalidArgument, "%s must be < %s" % (name, str(max)) + + # If a list with particular types of items is expected + if isinstance(expected, (list, tuple, set)): + for i in range(len(value)): + if i >= len(expected): + j = len(expected) - 1 + else: + j = i + self.type_check(name + "[]", value[i], expected[j], args) + + # If a struct with particular (or required) types of items is + # expected. + elif isinstance(expected, dict): + for key in value.keys(): + if key in expected: + self.type_check(name + "['%s']" % key, value[key], expected[key], args) + for key, subparam in expected.iteritems(): + if isinstance(subparam, Parameter) and \ + subparam.optional is not None and \ + not subparam.optional and key not in value.keys(): + raise SfaInvalidArgument("'%s' not specified" % key, name) + + #if auth is not None: + # auth.check(self, *args) diff --git a/sfatables/globals.py b/sfatables/globals.py new file mode 100644 index 00000000..fe6788d7 --- /dev/null +++ b/sfatables/globals.py @@ -0,0 +1,5 @@ +import os.path + +sfatables_config = '/etc/sfatables' +match_dir = os.path.join(sfatables_config, "matches") +target_dir = os.path.join(sfatables_config, "targets") diff --git a/sfatables/matches/all.xml b/sfatables/matches/all.xml new file mode 100644 index 00000000..f21fc09e --- /dev/null +++ b/sfatables/matches/all.xml @@ -0,0 +1,12 @@ + + + + + + + diff --git a/sfatables/matches/hrn.xml b/sfatables/matches/hrn.xml new file mode 100644 index 00000000..14bc26e2 --- /dev/null +++ b/sfatables/matches/hrn.xml @@ -0,0 +1,19 @@ + + + + + + + + user-hrn + HRN of the user requesting resouces + HRN + + + + diff --git a/sfatables/matches/slice-whitelist.xml b/sfatables/matches/slice-whitelist.xml new file mode 100644 index 00000000..ad3c8401 --- /dev/null +++ b/sfatables/matches/slice-whitelist.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/sfatables/matches/slice.xml b/sfatables/matches/slice.xml new file mode 100644 index 00000000..e3ee7db9 --- /dev/null +++ b/sfatables/matches/slice.xml @@ -0,0 +1,19 @@ + + + + + + + + hrn + HRN of the slice requesting resources + HRN + + + + diff --git a/sfatables/pretty.py b/sfatables/pretty.py new file mode 100644 index 00000000..9498aac1 --- /dev/null +++ b/sfatables/pretty.py @@ -0,0 +1,38 @@ +#!/usr/bin/python + +class Pretty: + rows = [] + column_width = [] + + def __init__(self, header): + self.rows.append(header) + for c in header: + self.column_width.append(len(header)) + + def push_row (self, row): + self.rows.append(row) + num = 0 + for c in row: + if (self.column_width[num] < len(c)): + self.column_width[num] = len(c) + num = num + 1 + return + + def pprint (self): + print '\n' + + for rule in self.rows: + cur_line = "" + num = 0 + + for r in rule: + cur_line = cur_line + "%s "%r + if (self.column_width[num] > len(r)): + padding0 = ''.zfill(self.column_width[num] - len(r)) + padding = padding0.replace('0',' ') + cur_line = cur_line + padding + num = num + 1 + + print cur_line + + diff --git a/sfatables/processors/__sfatables_rule_wrap_up__.xsl b/sfatables/processors/__sfatables_rule_wrap_up__.xsl new file mode 100644 index 00000000..00e43b60 --- /dev/null +++ b/sfatables/processors/__sfatables_rule_wrap_up__.xsl @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/sfatables/processors/__sfatables_wrap_up__.xsl b/sfatables/processors/__sfatables_wrap_up__.xsl new file mode 100644 index 00000000..3b73dc38 --- /dev/null +++ b/sfatables/processors/__sfatables_wrap_up__.xsl @@ -0,0 +1,14 @@ + + + + + + + + + + + + diff --git a/sfatables/processors/accept.xsl b/sfatables/processors/accept.xsl new file mode 100644 index 00000000..9a397ef7 --- /dev/null +++ b/sfatables/processors/accept.xsl @@ -0,0 +1,12 @@ + + + + + + + + + + diff --git a/sfatables/processors/all.xsl b/sfatables/processors/all.xsl new file mode 100644 index 00000000..469220c9 --- /dev/null +++ b/sfatables/processors/all.xsl @@ -0,0 +1,8 @@ + + + + + + + diff --git a/sfatables/processors/hrn.xsl b/sfatables/processors/hrn.xsl new file mode 100644 index 00000000..47a8b621 --- /dev/null +++ b/sfatables/processors/hrn.xsl @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfatables/processors/legacy-restrict-to-nodes.xsl b/sfatables/processors/legacy-restrict-to-nodes.xsl new file mode 100644 index 00000000..6548cebd --- /dev/null +++ b/sfatables/processors/legacy-restrict-to-nodes.xsl @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfatables/processors/link/restrict_slice.xml b/sfatables/processors/link/restrict_slice.xml new file mode 100644 index 00000000..2a3f1b5c --- /dev/null +++ b/sfatables/processors/link/restrict_slice.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfatables/processors/max_link_kbps.xsl b/sfatables/processors/max_link_kbps.xsl new file mode 100644 index 00000000..7170fd81 --- /dev/null +++ b/sfatables/processors/max_link_kbps.xsl @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfatables/processors/max_node_kbps.xsl b/sfatables/processors/max_node_kbps.xsl new file mode 100644 index 00000000..89b4df85 --- /dev/null +++ b/sfatables/processors/max_node_kbps.xsl @@ -0,0 +1,60 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfatables/processors/reject.xsl b/sfatables/processors/reject.xsl new file mode 100644 index 00000000..0c07e5e6 --- /dev/null +++ b/sfatables/processors/reject.xsl @@ -0,0 +1,8 @@ + + + + + Your resource-allocation request has been rejected. + + + diff --git a/sfatables/processors/restrict_to_flowspec.xsl b/sfatables/processors/restrict_to_flowspec.xsl new file mode 100644 index 00000000..a919da75 --- /dev/null +++ b/sfatables/processors/restrict_to_flowspec.xsl @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfatables/processors/restrict_to_nodes.xsl b/sfatables/processors/restrict_to_nodes.xsl new file mode 100644 index 00000000..12ff4cd5 --- /dev/null +++ b/sfatables/processors/restrict_to_nodes.xsl @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfatables/processors/slice-hrn.xsl b/sfatables/processors/slice-hrn.xsl new file mode 100644 index 00000000..1ba59422 --- /dev/null +++ b/sfatables/processors/slice-hrn.xsl @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfatables/processors/slice-whitelist.xsl b/sfatables/processors/slice-whitelist.xsl new file mode 100644 index 00000000..8ca8deb2 --- /dev/null +++ b/sfatables/processors/slice-whitelist.xsl @@ -0,0 +1,54 @@ + + + + + + + + + + plc.princeton.acb + plc.princeton.sapanb + plc.princeton.codeen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfatables/processors/test.xml b/sfatables/processors/test.xml new file mode 100644 index 00000000..49857349 --- /dev/null +++ b/sfatables/processors/test.xml @@ -0,0 +1,3 @@ + +plc.princeton.sapanb + diff --git a/sfatables/runtime.py b/sfatables/runtime.py new file mode 100644 index 00000000..a5363352 --- /dev/null +++ b/sfatables/runtime.py @@ -0,0 +1,110 @@ +#!/usr/bin/python + +import sys +import os +import pdb +import libxml2 + +from optparse import OptionParser +from sfatables import commands +from sfatables.globals import * +from sfatables.commands.List import * +from sfatables.xmlrule import * + +class SFATablesRules: + def __init__(self, chain_name): + self.active_context = {} + self.contexts = None # placeholder for rspec_manger + self.sorted_rule_list = [] + self.final_processor = '__sfatables_wrap_up__.xsl' + chain_dir_path = os.path.join(sfatables_config,chain_name) + rule_list = List().get_rule_list(chain_dir_path) + for rule_number in rule_list: + self.sorted_rule_list = self.sorted_rule_list + [XMLRule(chain_name, rule_number)] + return + + def wrap_up(self, doc): + filepath = os.path.join(sfatables_config, 'processors', self.final_processor) + + if not os.path.exists(filepath): + raise Exception('Could not find final rule filter') + + styledoc = libxml2.parseFile(filepath) + style = libxslt.parseStylesheetDoc(styledoc) + result = style.applyStylesheet(doc, None) + stylesheet_result = style.saveResultToString(result) + style.freeStylesheet() + doc.freeDoc() + result.freeDoc() + + return stylesheet_result + + def set_context(self, request_context): + self.active_context = request_context + return + + def create_xml_node(self, name, context_dict): + node = libxml2.newNode(name) + for k in context_dict.keys(): + if (type(context_dict[k])==dict): + childNode = self.create_xml_node(k, context_dict[k]) + node.addChild(childNode) + else: + childNode = libxml2.newNode(k) + childNode.addContent(context_dict[k]) + node.addChild(childNode) + return node + + def add_request_context_to_rspec(self, doc): + p = doc.xpathNewContext() + context = p.xpathEval("//RSpec") + if (not context): + raise Exception('Request is not an rspec') + else: + # Add the request context + requestNode = self.create_xml_node('request-context',self.active_context) + context[0].addChild(requestNode) + p.xpathFreeContext() + return doc + + + def apply(self, rspec): + if (self.sorted_rule_list): + doc = libxml2.parseDoc(rspec) + doc = self.add_request_context_to_rspec(doc) + + intermediate_rspec = doc + + for rule in self.sorted_rule_list: + (matched,intermediate_rspec) = rule.apply_interpreted(intermediate_rspec) + if (rule.terminal and matched): + break + + final_rspec = self.wrap_up(intermediate_rspec) + else: + final_rspec = rspec + + return final_rspec + + def print_rules(self): + for rule in self.sorted_rule_list: + print rule.processors + +def main(): + incoming = SFATablesRules('INCOMING') + incoming.set_context({'sfa':{'user':{'hrn':'plc.princeton.sapanb'}}}) + + outgoing = SFATablesRules('OUTGOING') + print "%d rules loaded for INCOMING chain"%len(incoming.sorted_rule_list) + incoming.print_rules() + + print "%d rules loaded for OUTGOING chain"%len(outgoing.sorted_rule_list) + outgoing.print_rules() + + rspec = open(sys.argv[1]).read() + newrspec = incoming.apply(rspec) + print newrspec + return + +if __name__=="__main__": + main() diff --git a/sfatables/sfatables b/sfatables/sfatables new file mode 100755 index 00000000..b413ef1a --- /dev/null +++ b/sfatables/sfatables @@ -0,0 +1,138 @@ +#!/usr/bin/python + +# This file parses an sfatables command and generates XML files that parameterize +# matches and targets. Each such XML file defines a rule. Rules are dropped in directories +# that represent 'chains.' SFA loads rules from various chains and invokes them at certain +# 'hook points.' For example, it invokes rules in the 'OUTGOING' chain before returning +# the output of 'get_resources.' + +import sys +import os +import pdb +import glob +import libxml2 + +from optparse import OptionParser +from sfatables import commands +from sfatables.xmlextension import Xmlextension +from sfatables.globals import * + +def load_commands(module, list): + command_dict={} + + for command_name in list: + command_module = __import__(".".join([module,command_name]),fromlist=[module]) + command = getattr(command_module, command_name) + command_dict[command_name]=command() + + return command_dict + +def load_xml_extensions(module, ext_dir): + ext_dict={} + + exts = glob.glob(ext_dir + os.path.sep + "*") + for ext in exts: + module = Xmlextension(ext) + # get the filename and get rid of the ".xml" extension + ext_name = os.path.extsep.join(os.path.splitext(os.path.basename(ext))[:-1]) + ext_dict[ext_name]=module + + return ext_dict + + +def create_parser(command_dict): + parser = OptionParser(usage="sfatables [command] [chain] [match] [target]", + description='See "man sfatables" for more detail.') + + for k in command_dict.keys(): + command = command_dict[k] + for (short_option,long_option) in command.options: + parser.add_option(short_option,long_option,dest=command.type,action=command.action,const=k,help=command.help,metavar="CHAIN") + + return parser + +def create_parser_xml_ext(ext_dict): + parser = OptionParser(usage="sfatables [command] [chain] [match] [target]", + description='See "man sfatables" for more detail.') + + for k in ext_dict.keys(): + command = ext_dict[k] + for arg in command.arguments: + parser.add_option('',"--"+arg['name'],dest=arg['name'],help=arg['help'],metavar=arg['target']) + + return parser + + +def partition(sep, lst): + ret = [] + curpart = [] + for item in lst: + if (item==sep): + ret.append(curpart) + curpart=[] + else: + curpart.append(item) + ret.append(curpart) + + return ret + + +def main(): + # sfatables -- -- + pargs = partition('--', sys.argv[1:]) + + command_dict = load_commands("sfatables.commands",commands.all) + command_parser = create_parser(command_dict) + (options, args) = command_parser.parse_args(pargs[0]) + setattr(options, 'args', args) + + command = command_dict[options.command] + + if (command.matches): + if (len(pargs)<2): + raise Exception("Must specify match for this command") + match_dict = load_xml_extensions("sfatables.matches",match_dir) + match_parser = create_parser_xml_ext(match_dict) + matches_str = ",".join(match_dict.keys()) + match_parser.add_option('-m','--match',dest='name',help='Match name (one of %s)'%matches_str, metavar = 'MATCH') + match_parser.add_option('-n','--negate',dest='negate',help='Negate result',action='store_true') + (match_options, args) = match_parser.parse_args(pargs[1]) + try: + name = match_options.name + except Exception: + print "Must specify match name with -m" + + if (match_dict.has_key(name)): + setattr(match_options, 'arguments', match_dict[name].arguments) + else: + raise Exception('Match %s not found'%name) + + else: + match_options=None + + if (command.targets): + if (len(pargs)<3): + raise Exception("Must specify a target for this command") + target_dict = load_xml_extensions("sfatables.targets",target_dir) + target_parser = create_parser_xml_ext(target_dict) + targets_str = ",".join(target_dict.keys()) + target_parser.add_option('-j','--jump',dest='name',help='Target name (one of %s)'%targets_str, metavar = 'TARGET') + target_parser.add_option('-e','--element',dest='element',help='Element name', metavar = 'ELEMENT') + (target_options, args) = target_parser.parse_args(pargs[2]) + try: + name = target_options.name + except Exception: + print "Must specify target name with -j" + + if (target_dict.has_key(name)): + setattr(target_options, 'arguments', target_dict[name].arguments) + else: + raise Exception('Target %s not found'%name) + + else: + target_options = None + + command(options, match_options, target_options) + +if __name__=='__main__': + main() diff --git a/sfatables/targets/ACCEPT.xml b/sfatables/targets/ACCEPT.xml new file mode 100644 index 00000000..d97c68d6 --- /dev/null +++ b/sfatables/targets/ACCEPT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/sfatables/targets/REJECT.xml b/sfatables/targets/REJECT.xml new file mode 100644 index 00000000..8beeb3c1 --- /dev/null +++ b/sfatables/targets/REJECT.xml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/sfatables/targets/RESTRICT_SLICE_DOMAIN.xml b/sfatables/targets/RESTRICT_SLICE_DOMAIN.xml new file mode 100644 index 00000000..3fc08418 --- /dev/null +++ b/sfatables/targets/RESTRICT_SLICE_DOMAIN.xml @@ -0,0 +1,63 @@ + + + + + + whitelist-dns-suffix + Suffix of nodes to whitelist for this match. + SUFFIX + + + blacklist-dns-suffix + Suffix of nodes to blacklist for this match. + SUFFIX + + + + + + + + whitelist + Prefix of nodes to whitelist for this match. + PREFIX + + + blacklist + Prefix of nodes to blacklist for this match. + PREFIX + + + + + + + whitelist-switch + Switch id to whitelist. + PREFIX + + + + whitelist-tpsrc + Source port to whitelist. + PREFIX + + + whitelist-tpdst + Destination port to whitelist. + PREFIX + + + whitelist-ipdst + Destination IP to whitelist. + PREFIX + + + whitelist-ipsrc + Source IP to whitelist. + PREFIX + + + + + diff --git a/sfatables/targets/RESTRICT_SLICE_PROP.xml b/sfatables/targets/RESTRICT_SLICE_PROP.xml new file mode 100644 index 00000000..4f6c1462 --- /dev/null +++ b/sfatables/targets/RESTRICT_SLICE_PROP.xml @@ -0,0 +1,26 @@ + + + + + + max-node-kbps + Maximum node bandwidth in kilobytes per second. + kbps + + + on-node + Node to impose the limit on. Empty => all nodes. + kbps + + + + + + + max-link-kbps + Maximum link bandwidth in kilobytes per second. + kbps + + + + diff --git a/sfatables/test.rspec b/sfatables/test.rspec new file mode 100644 index 00000000..387594b8 --- /dev/null +++ b/sfatables/test.rspec @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/sfatables/test.sfarspec b/sfatables/test.sfarspec new file mode 100644 index 00000000..641095e4 --- /dev/null +++ b/sfatables/test.sfarspec @@ -0,0 +1,16 @@ + + + + plc.princeton.sapanb + user-hrnplc.princeton.sapanb + blacklist-dns-suffixbing + + + + + + + + + + diff --git a/sfatables/vini.rspec b/sfatables/vini.rspec new file mode 100644 index 00000000..ffe034ce --- /dev/null +++ b/sfatables/vini.rspec @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sfatables/xmlextension.py b/sfatables/xmlextension.py new file mode 100644 index 00000000..5e298db9 --- /dev/null +++ b/sfatables/xmlextension.py @@ -0,0 +1,47 @@ +# Matches and targets are specified using XML files. +# They provide the following information: +# - The context required by the match +# - The processor that actually implements the match or target +# - The parameters that the processor needs to evaluate the context + +import libxml2 +from sfatables.globals import * + +class Xmlextension: + def __init__(self, file_path): + + self.context = "" + self.processor = "" + self.operand = "VALUE" + self.arguments = [] + self.terminal = 0 + + self.xmldoc = libxml2.parseFile(file_path) + + # TODO: Check xmldoc against a schema + p = self.xmldoc.xpathNewContext() + + # + # + # + + context = p.xpathEval('//context/@select') + self.context = context[0].content + + processor = p.xpathEval('//processor/@filename') + self.context = processor[0].content + + name = p.xpathEval('//rule/argument/name') + help = p.xpathEval('//rule/argument/help') + target = p.xpathEval('//rule/argument/operand') + + context = p.xpathEval('//attributes/attribute[@terminal="yes"]') + self.terminal = (context != []) + + self.arguments = map(lambda (name,help,target):{'name':name.content,'help':help.content,'target':target.content}, zip(name,help,target)) + + p.xpathFreeContext() + self.xmldoc.freeDoc() + + return + diff --git a/sfatables/xmlrule.py b/sfatables/xmlrule.py new file mode 100644 index 00000000..52bea31e --- /dev/null +++ b/sfatables/xmlrule.py @@ -0,0 +1,138 @@ +import libxml2 +import libxslt +from sfatables.globals import * + +class XMLRule: + def apply_processor(self, type, doc, output_xpath_filter=None): + processor = self.processors[type] + + # XXX TO CLEAN UP + filepath = os.path.join(sfatables_config, 'processors', processor) + # XXX + + styledoc = libxml2.parseFile(filepath) + style = libxslt.parseStylesheetDoc(styledoc) + result = style.applyStylesheet(doc, None) + if (output_xpath_filter): + p = result.xpathNewContext() + xpath_result = p.xpathEval(output_xpath_filter) + if (xpath_result == []): + raise Exception("Could not apply processor %s."%processor) + + stylesheet_result = xpath_result + p.xpathFreeContext() + else: + stylesheet_result = result #style.saveResultToString(result) + + style.freeStylesheet() + #doc.freeDoc() + #result.freeDoc() + + return stylesheet_result + + def wrap_up(self, doc): + filepath = os.path.join(sfatables_config, 'processors', self.final_processor) + + if not os.path.exists(filepath): + raise Exception('Could not find final rule filter') + + styledoc = libxml2.parseFile(filepath) + style = libxslt.parseStylesheetDoc(styledoc) + result = style.applyStylesheet(doc, None) + stylesheet_result = result#style.saveResultToString(result) + style.freeStylesheet() + #doc.freeDoc() + #result.freeDoc() + + return stylesheet_result + + def match(self, rspec): + match_result = self.apply_processor('match',rspec,"//result/@verdict") + return (match_result[0].content=='True') + + def target(self, rspec): + target_result = self.apply_processor('target',rspec,None) + return target_result + + def add_rule_context_to_rspec(self, doc): + p = doc.xpathNewContext() + context = p.xpathEval("//RSpec") + if (not context): + raise Exception('Request is not an rspec') + else: + # Add the request context + matchNode = libxml2.newNode('match-context') + for match_argument in self.arguments['match']: + matchNode.addChild(match_argument) + + targetNode = libxml2.newNode('target-context') + for target_argument in self.arguments['target']: + targetNode.addChild(target_argument) + + context[0].addChild(matchNode) + context[0].addChild(targetNode) + p.xpathFreeContext() + + return doc + + def apply_interpreted(self, rspec): + rspec = self.add_rule_context_to_rspec(rspec) + # Interpreted + # + # output = + # if (match(match_args, rspec) + # then target(target_args, rspec) + # else rspec + + import pdb + if (self.match(rspec)): + return (True,self.wrap_up(self.target(rspec))) + else: + return (False,self.wrap_up(rspec)) + + + def apply_compiled(rspec): + # Not supported yet + return None + + def load_xml_extension (self, type, chain, rule_number): + filename = sfatables_config+"/"+chain+"/"+"sfatables-%d-%s"%(rule_number,type) + + self.xmldoc = libxml2.parseFile(filename) + p = self.xmldoc.xpathNewContext() + + context = p.xpathEval('//context/@select') + self.context[type] = context[0].content + + processor = p.xpathEval('//processor/@filename') + + context = p.xpathEval('//attributes/attribute[@terminal="yes"]') + if (context != []): + self.terminal = 1 + + self.processors[type] = processor[0].content + self.arguments[type] = p.xpathEval('//rule//argument[value!=""]') + + p.xpathFreeContext() + + + def __init__(self, chain=None, rule_number=None): + self.rule_number = None + self.chain = None + self.xmldoc = None + self.terminal = 0 + self.final_processor = '__sfatables_rule_wrap_up__.xsl' + + self.arguments = {'match':None,'target':None} + self.processors = {'match':None,'target':None} + self.context = {'match':None,'target':None} + + if (chain and rule_number): + self.load_xml_extension('match', chain, rule_number) + self.load_xml_extension('target',chain, rule_number) + self.rule_number = rule_number + self.chain = chain + return + + def free(self): + self.xmldoc.freeDoc() diff --git a/tests/client/README b/tests/client/README new file mode 100644 index 00000000..6d4ae3d9 --- /dev/null +++ b/tests/client/README @@ -0,0 +1 @@ +these files used to be in geniwrapper/cmdline diff --git a/tests/client/demoAggregate.sh b/tests/client/demoAggregate.sh new file mode 100644 index 00000000..ccb4b5f5 --- /dev/null +++ b/tests/client/demoAggregate.sh @@ -0,0 +1,56 @@ +#!/bin/bash + +export PATH=$PATH:/etc/sfa +source sfi_config +CWD=$(pwd) + +DEMO_AUTH='planetlab.us' +DEMO_PL_AUTH='planetlab.us.pl' + +echo XXXXX ------------------------------------------------ +echo XXXXX list contents of authority +echo XXXXX ------------------------------------------------ + +python $(CWD)/sfi.py list $DEMO_PL_AUTH + +echo XXXXX ------------------------------------------------ +echo XXXXX show contents of authority +echo XXXXX ------------------------------------------------ + +python $(CWD)/sfi.py show $DEMO_PL_AUTH + + +echo XXXXX ------------------------------------------------ +echo XXXXX show users authority +echo XXXXX ------------------------------------------------ + +python $(CWD)/sfi.py show $DEMO_PL_AUTH + +echo XXXXX ------------------------------------------------ +echo XXXXX list available node +rspec+ +echo XXXXX ------------------------------------------------ + +python $(CWD)/sfi.py nodes + +echo XXXXX ------------------------------------------------ +echo XXXXX list available node +dns+ +echo XXXXX ------------------------------------------------ + +python $(CWD)/sfi.py nodes dns + +echo XXXXX ------------------------------------------------ +echo XXXXX list slices at the aggregate +echo XXXXX ------------------------------------------------ + +python $(CWD)/sfi.py slices + + +echo XXXXX ------------------------------------------------ +echo XXXXX list resources being used by pl_tmack +echo XXXXX ------------------------------------------------ + +python $(CWD)/sfi.py resources planetlab.us.pl.tmack + + + + diff --git a/tests/client/testAggregate.py b/tests/client/testAggregate.py new file mode 100644 index 00000000..0f9e77e0 --- /dev/null +++ b/tests/client/testAggregate.py @@ -0,0 +1,32 @@ +from pprint import pprint + +from sfa.util.client import * +from sfa.trust.credential import * + +cred = Credential(filename = 'tmack.pl.sa.cred') +slicehrn = 'planetlab.us.pl.tmack' +print cred.get_privileges().save_to_string() + +r = GeniClient('https://128.112.139.120:12345', 'tmack.pkey', 'tmack.cert') +a = GeniClient('https://128.112.139.120:12346', 'tmack.pkey', 'tmack.cert') + +#pprint(r.list(cred, 'planetlab.us.princeton')) +pprint(a.get_policy(cred)) + +print "components at this aggregate" +components = a.list_components() +pprint(components) + +print "resources being used by %(slicehrn)s" % locals() +tmack_components = a.list_resources(cred, slicehrn) +pprint(tmack_components) + +#print "removing %(slicehrn)s from all nodes" % locals() +#a.delete_slice(cred, slicehrn) + +print "adding %(slicehrn)s back to its original nodes" % locals() +a.list_resources(cred, slicehrn) +a.create_slice(cred, slicehrn, components) +a.list_resources(cred, slicehrn) + + diff --git a/tests/client/testSfi.sh b/tests/client/testSfi.sh new file mode 100644 index 00000000..2d2d1802 --- /dev/null +++ b/tests/client/testSfi.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +export PATH=$PATH:/etc/sfa +source sfi_config +CWD=$(pwd) + +rm -f saved_record.* + +python $(CWD)/sfi.py show -o saved_record.$SFI_USER $SFI_USER +python $(CWD)/sfi.py list -o saved_record.$SFI_AUTH $SFI_AUTH + +#rm -f saved_record.* diff --git a/tests/client/testSfiDelegate.sh b/tests/client/testSfiDelegate.sh new file mode 100644 index 00000000..72f6057f --- /dev/null +++ b/tests/client/testSfiDelegate.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +export PATH=$PATH:/etc/sfa +source sfi_config +CWD=$(pwd) + +rm -f saved_record.* + +python $(CWD)/sfi.py show $SFI_USER +python $(CWD)/sfi.py delegate --user plc.arizona.gackscentral + +#rm -f saved_record.* diff --git a/tests/client/testSfiSliceRegister.sh b/tests/client/testSfiSliceRegister.sh new file mode 100644 index 00000000..0e651238 --- /dev/null +++ b/tests/client/testSfiSliceRegister.sh @@ -0,0 +1,84 @@ +#!/bin/bash + +export PATH=$PATH:/etc/sfa +source sfi_config +CWD=$(pwd) + +# private key to use when creating GID for new slice +export TEST_KEY=$CWD/testkey.pkey + +export TEST_SLICE_GID=$CWD/testslice.gid +export TEST_SLICE_RECORD=$CWD/testslice.record +export TEST_SLICE_HRN=$SFI_AUTH.testslice + +rm ~/.sfi/*.cred + +echo XXXXX ------------------------------------------------------------------- +echo XXXXX Removing the test slice. this will cause an error if the slice does +echo XXXXX not exist -- this error can be ignored +echo XXXXX ------------------------------------------------------------------- + +python $(CWD)/sfi.py remove --type slice $TEST_SLICE_HRN + +echo XXXXX ------------------------------------------------------------------- +echo XXXXX Creating a record for the test slice +echo XXXXX ------------------------------------------------------------------- + +python $(CWD)/editRecord.py --hrn $TEST_SLICE_HRN --pubkeyfile $TEST_KEY --type slice --addresearcher $SFI_USER --outfile $TEST_SLICE_RECORD + +echo XXXXX ------------------------------------------------------------------- +echo XXXXX Adding the test slice, $TEST_SLICE_HRN +echo XXXXX ------------------------------------------------------------------- + +python $(CWD)/sfi.py add $TEST_SLICE_RECORD + +echo XXXXX ------------------------------------------------------------------- +echo XXXXX The slice should have one researcher, $SFI_USER +echo XXXXX ------------------------------------------------------------------- + +python $(CWD)/sfi.py show $TEST_SLICE_HRN + +echo XXXXX ------------------------------------------------------------------- +echo XXXXX Adding $TEST_USER_2 to the slice researchers +echo XXXXX ------------------------------------------------------------------- + +python $(CWD)/editRecord.py --infile $TEST_SLICE_RECORD --outfile $TEST_SLICE_RECORD --addresearcher $TEST_USER_2 + +echo XXXXX ------------------------------------------------------------------- +echo XXXXX Updating the slice +echo XXXXX ------------------------------------------------------------------- + +python $(CWD)/sfi.py update $TEST_SLICE_RECORD + +echo XXXXX ------------------------------------------------------------------- +echo XXXXX The slice record should now have two users: $SFI_USER, $TEST_USER_2 +echo XXXXX ------------------------------------------------------------------- + +python $(CWD)/sfi.py show $TEST_SLICE_HRN + +echo XXXXX ------------------------------------------------------------------- +echo XXXXX Removing $SFI_USER from the slice researchers +echo XXXXX ------------------------------------------------------------------- + +python $(CWD)/editRecord.py --infile $TEST_SLICE_RECORD --outfile $TEST_SLICE_RECORD --delresearcher $SFI_USER + +echo XXXXX ------------------------------------------------------------------- +echo XXXXX Updating the slice +echo XXXXX ------------------------------------------------------------------- + +python $(CWD)/sfi.py update $TEST_SLICE_RECORD + +echo XXXXX ------------------------------------------------------------------- +echo XXXXX The slice record should now have one users: $TEST_USER_2 +echo XXXXX ------------------------------------------------------------------- + +python $(CWD)/sfi.py show $TEST_SLICE_HRN + +echo XXXXX ------------------------------------------------------------------- +echo XXXXX Updating the slice +echo XXXXX ... this verifies escalation from slice_cred to auth_cred +echo XXXXX ------------------------------------------------------------------- + +rm ~/.sfi/slice_testslice.cred +python $(CWD)/sfi.py update $TEST_SLICE_RECORD + diff --git a/tests/testAll.py b/tests/testAll.py new file mode 100755 index 00000000..9990ffce --- /dev/null +++ b/tests/testAll.py @@ -0,0 +1,12 @@ +from testRights import * +from testCert import * +from testGid import * +from testCred import * +from testKeypair import * +from testMisc import * +from testHierarchy import * +from testRecord import * +from testTable import * + +if __name__ == "__main__": + unittest.main() diff --git a/tests/testCert.py b/tests/testCert.py new file mode 100755 index 00000000..0a6a90c4 --- /dev/null +++ b/tests/testCert.py @@ -0,0 +1,204 @@ +import unittest +import xmlrpclib +from sfa.trust.certificate import Certificate, Keypair + +class TestCert(unittest.TestCase): + def setUp(self): + pass + + def testCreate(self): + cert = Certificate() + cert.create() + + def testSetAndGetSubject(self): + cert = Certificate() + cert.create() + cert.set_subject("test") + subj = cert.get_subject() + self.assertEqual(subj, "test") + + def testSign(self): + cert = Certificate(subject="test") + + # create an issuer and sign the certificate + issuerKey = Keypair(create=True) + issuerSubject = "testissuer" + cert.set_issuer(issuerKey, issuerSubject) + cert.sign() + + def testAddExtension(self): + cert = Certificate(subject="test") + cert.add_extension("subjectAltName", 0, "URI:http://foovalue") + + self.assertEqual(cert.get_extension("subjectAltName"), + "URI:http://foovalue") + + def testSetData(self): + cert = Certificate(subject="test") + data = "this is a test" + cert.set_data(data) + self.assertEqual(cert.get_data(), data) + + # try something a bit more complicated, like an xmlrpc encoding of + # some parameters + cert = Certificate(subject="test") + data = xmlrpclib.dumps((1, "foo", ["a", "b"], {"c": "d", "e": "f"}, True)) + cert.set_data(data) + self.assertEqual(cert.get_data(), data) + + + def testSaveAndLoadString(self): + cert = Certificate(subject="test") + cert.add_extension("subjectAltName", 0, "URI:http://foovalue") + + # create an issuer and sign the certificate + issuerKey = Keypair(create=True) + issuerSubject = "testissuer" + cert.set_issuer(issuerKey, issuerSubject) + cert.sign() + + certstr = cert.save_to_string() + + #print certstr + + cert2 = Certificate() + cert2.load_from_string(certstr) + + # read back the subject and make sure it is correct + subj = cert2.get_subject() + self.assertEqual(subj, "test") + + # read back the issuer and make sure it is correct + issuerName = cert2.get_issuer() + self.assertEqual(issuerName, "testissuer") + + # read back the extension and make sure it is correct + self.assertEqual(cert2.get_extension("subjectAltName"), + "URI:http://foovalue") + + def testLongExtension(self): + cert = Certificate(subject="test") + + # should produce something around 256 KB + veryLongString = "URI:http://" + shortString = "" + for i in range(1, 80): + shortString = shortString + "abcdefghijklmnopqrstuvwxyz012345" + for i in range(1, 100): + veryLongString = veryLongString + shortString + str(i) + + cert.add_extension("subjectAltName", 0, veryLongString) + + # create an issuer and sign the certificate + issuerKey = Keypair(create=True) + issuerSubject = "testissuer" + cert.set_issuer(issuerKey, issuerSubject) + cert.sign() + + certstr = cert.save_to_string() + + cert2 = Certificate() + cert2.load_from_string(certstr) + val = cert2.get_extension("subjectAltName") + self.assertEqual(val, veryLongString) + + def testVerify(self): + cert = Certificate(subject="test") + + # create an issuer and sign the certificate + issuerKey = Keypair(create=True) + issuerSubject = "testissuer" + cert.set_issuer(issuerKey, issuerSubject) + cert.sign() + + result = cert.verify(issuerKey) + self.assert_(result) + + # create another key + issuerKey2 = Keypair(create=True) + issuerSubject2 = "wrongissuer" + + # and make sure it doesn't verify + result = cert.verify(issuerKey2) + self.assert_(not result) + + # load the cert from a string, and verify again + cert2 = Certificate(string = cert.save_to_string()) + result = cert2.verify(issuerKey) + self.assert_(result) + result = cert2.verify(issuerKey2) + self.assert_(not result) + + def test_is_signed_by(self): + cert1 = Certificate(subject="one") + + key1 = Keypair() + key1.create() + cert1.set_pubkey(key1) + + # create an issuer and sign the certificate + issuerKey = Keypair(create=True) + issuerSubject = "testissuer" + cert1.set_issuer(issuerKey, issuerSubject) + cert1.sign() + + cert2 = Certificate(subject="two") + + key2 = Keypair(create=True) + cert2.set_pubkey(key2) + + cert2.set_issuer(key1, cert=cert1) + + # cert2 is signed by cert1 + self.assert_(cert2.is_signed_by_cert(cert1)) + # cert1 is not signed by cert2 + self.assert_(not cert1.is_signed_by_cert(cert2)) + + def test_parents(self): + cert_root = Certificate(subject="root") + key_root = Keypair(create=True) + cert_root.set_pubkey(key_root) + cert_root.set_issuer(key_root, "root") + cert_root.sign() + + cert1 = Certificate(subject="one") + key1 = Keypair(create=True) + cert1.set_pubkey(key1) + cert1.set_issuer(key_root, "root") + cert1.sign() + + cert2 = Certificate(subject="two") + key2 = Keypair(create=True) + cert2.set_pubkey(key2) + cert2.set_issuer(key1, cert=cert1) + cert2.set_parent(cert1) + cert2.sign() + + cert3 = Certificate(subject="three") + key3 = Keypair(create=True) + cert3.set_pubkey(key3) + cert3.set_issuer(key2, cert=cert2) + cert3.set_parent(cert2) + cert3.sign() + + self.assert_(cert1.verify(key_root)) + self.assert_(cert2.is_signed_by_cert(cert1)) + self.assert_(cert3.is_signed_by_cert(cert2)) + + cert3.verify_chain([cert_root]) + + # now save the chain to a string and load it into a new certificate + str_chain = cert3.save_to_string(save_parents=True) + cert4 = Certificate(string = str_chain) + + # verify the newly loaded chain still verifies + cert4.verify_chain([cert_root]) + + # verify the parentage + self.assertEqual(cert4.get_parent().get_subject(), "two") + self.assertEqual(cert4.get_parent().get_parent().get_subject(), "one") + + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/testCred.py b/tests/testCred.py new file mode 100755 index 00000000..32fac4af --- /dev/null +++ b/tests/testCred.py @@ -0,0 +1,173 @@ +import unittest +from sfa.trust.credential import * +from sfa.trust.rights import * +from sfa.trust.gid import * +from sfa.trust.certificate import * + +class TestCred(unittest.TestCase): + def setUp(self): + pass + + def testCreate(self): + cred = Credential(create=True) + + def testDefaults(self): + cred = Credential(subject="testCredential") + + self.assertEqual(cred.get_gid_caller(), None) + self.assertEqual(cred.get_gid_object(), None) + + def testLoadSave(self): + cred = Credential(subject="testCredential") + + gidCaller = GID(subject="caller", uuid=create_uuid(), hrn="foo.caller") + gidObject = GID(subject="object", uuid=create_uuid(), hrn="foo.object") + lifeTime = 12345 + delegate = True + rights = "embed:1,bind:1" + + cred.set_gid_caller(gidCaller) + self.assertEqual(cred.get_gid_caller().get_subject(), gidCaller.get_subject()) + + cred.set_gid_object(gidObject) + self.assertEqual(cred.get_gid_object().get_subject(), gidObject.get_subject()) + + cred.set_lifetime(lifeTime) + + cred.set_privileges(rights) + self.assertEqual(cred.get_privileges().save_to_string(), rights) + + cred.get_privileges().delegate_all_privileges(delegate) + + cred.encode() + + cred_str = cred.save_to_string() + + # re-load the credential from a string and make sure its fields are + # intact + cred2 = Credential(string = cred_str) + self.assertEqual(cred2.get_gid_caller().get_subject(), gidCaller.get_subject()) + self.assertEqual(cred2.get_gid_object().get_subject(), gidObject.get_subject()) + self.assertEqual(cred2.get_privileges().get_all_delegate(), delegate) + self.assertEqual(cred2.get_privileges().save_to_string(), rights) + + + + def createSignedGID(self, subject, urn, issuer_pkey = None, issuer_gid = None): + gid = GID(subject=subject, uuid=1, urn=urn) + keys = Keypair(create=True) + gid.set_pubkey(keys) + if issuer_pkey: + gid.set_issuer(issuer_pkey, str(issuer_gid.get_issuer())) + else: + gid.set_issuer(keys, subject) + + gid.encode() + gid.sign() + return gid, keys + + + + + def testDelegationAndVerification(self): + gidAuthority, keys = self.createSignedGID("site", "urn:publicid:IDN+plc+authority+site") + gidCaller, ckeys = self.createSignedGID("site.foo", "urn:publicid:IDN+plc:site+user+foo", + keys, gidAuthority) + gidObject, _ = self.createSignedGID("site.slice", "urn:publicid:IDN+plc:site+slice+bar_slice", + keys, gidAuthority) + gidDelegatee, _ = self.createSignedGID("site.delegatee", "urn:publicid:IDN+plc:site+user+delegatee", + keys, gidAuthority) + + cred = Credential() + cred.set_gid_caller(gidCaller) + cred.set_gid_object(gidObject) + cred.set_lifetime(3600) + cred.set_privileges("embed:1, bind:1") + cred.encode() + + gidAuthority.save_to_file("/tmp/auth_gid") + keys.save_to_file("/tmp/auth_key") + cred.set_issuer_keys("/tmp/auth_key", "/tmp/auth_gid") + cred.sign() + + + cred.verify(['/tmp/auth_gid']) + + # Test copying + cred2 = Credential(string=cred.save_to_string()) + cred2.verify(['/tmp/auth_gid']) + + + # Test delegation + delegated = Credential() + delegated.set_gid_caller(gidDelegatee) + delegated.set_gid_object(gidObject) + delegated.set_parent(cred) + delegated.set_lifetime(600) + delegated.set_privileges("embed:1, bind:1") + gidCaller.save_to_file("/tmp/caller_gid") + ckeys.save_to_file("/tmp/caller_pkey") + + delegated.set_issuer_keys("/tmp/caller_pkey", "/tmp/caller_gid") + + delegated.encode() + + delegated.sign() + + # This should verify + delegated.verify(['/tmp/auth_gid']) + + backup = Credential(string=delegated.get_xml()) + + # Test that verify catches an incorrect lifetime + delegated.set_lifetime(6000) + delegated.encode() + delegated.sign() + try: + delegated.verify(['/tmp/auth_gid']) + assert(1==0) + except CredentialNotVerifiable: + pass + + # Test that verify catches an incorrect signer + delegated = Credential(string=backup.get_xml()) + delegated.set_issuer_keys("/tmp/auth_key", "/tmp/auth_gid") + delegated.encode() + delegated.sign() + + try: + delegated.verify(['/tmp/auth_gid']) + assert(1==0) + except CredentialNotVerifiable: + pass + + + # Test that verify catches a changed gid + delegated = Credential(string=backup.get_xml()) + delegated.set_gid_object(delegated.get_gid_caller()) + delegated.encode() + delegated.sign() + + try: + delegated.verify(['/tmp/auth_gid']) + assert(1==0) + except CredentialNotVerifiable: + pass + + + # Test that verify catches a credential with the wrong authority for the object + test = Credential(string=cred.get_xml()) + test.set_issuer_keys("/tmp/caller_pkey", "/tmp/caller_gid") + test.encode() + test.sign() + + try: + test.verify(['/tmp/auth_gid']) + assert(1==0) + except CredentialNotVerifiable: + pass + + # Test that * gets translated properly + +if __name__ == "__main__": + unittest.main() diff --git a/tests/testGid.py b/tests/testGid.py new file mode 100755 index 00000000..85f92407 --- /dev/null +++ b/tests/testGid.py @@ -0,0 +1,63 @@ +import unittest +import xmlrpclib +from sfa.trust.certificate import Keypair +from sfa.trust.gid import * + +class TestGid(unittest.TestCase): + def setUp(self): + pass + + def testSetGetHrn(self): + gid = GID(subject="test") + hrn = "test.hrn" + + gid.set_hrn(hrn) + self.assertEqual(gid.get_hrn(), hrn) + + def testSetGetUuid(self): + gid = GID(subject="test") + u = uuid.uuid4().int + + gid.set_uuid(u) + self.assertEqual(gid.get_uuid(), u) + + def testEncodeDecode(self): + gid = GID(subject="test") + u = uuid.uuid4().int + hrn = "test.hrn" + + gid.set_uuid(u) + gid.set_hrn(hrn) + + gid.encode() + gid.decode() + + self.assertEqual(gid.get_hrn(), hrn) + self.assertEqual(gid.get_uuid(), u) + + def testSaveAndLoadString(self): + gid = GID(subject="test") + + u = uuid.uuid4().int + hrn = "test.hrn" + + gid.set_uuid(u) + gid.set_hrn(hrn) + + # create an issuer and sign the certificate + issuerKey = Keypair(create = True) + issuerSubject = "testissuer" + gid.set_issuer(issuerKey, issuerSubject) + gid.sign() + + certstr = gid.save_to_string() + + #print certstr + + gid2 = GID(string = certstr) + + self.assertEqual(gid.get_hrn(), hrn) + self.assertEqual(gid.get_uuid(), u) + +if __name__ == "__main__": + unittest.main() diff --git a/tests/testHierarchy.py b/tests/testHierarchy.py new file mode 100755 index 00000000..723c6db5 --- /dev/null +++ b/tests/testHierarchy.py @@ -0,0 +1,51 @@ +import unittest +import os +from sfa.util.faults import * +from sfa.trust.hierarchy import * +from sfa.util.config import * + +BASEDIR = "test_hierarchy" +PURGE_BASEDIR = "rm -rf test_hierarchy" + +class TestHierarchy(unittest.TestCase): + def setUp(self): + os.system(PURGE_BASEDIR) + pass + + def testInit(self): + h = Hierarchy(BASEDIR) + + def testGetAuthInfo(self): + h = Hierarchy(BASEDIR) + + name = "planetlab.us.arizona.stork" + + self.assertEqual(h.auth_exists(name), False) + + self.assertRaises(MissingAuthority, h.get_auth_info, name) + + h.create_auth(name, create_parents=True) + auth_info = h.get_auth_info(name) + self.assert_(auth_info) + + gid = auth_info.get_gid_object() + self.assert_(gid) + self.assertEqual(gid.get_subject(), name) + + pubkey = auth_info.get_pkey_object() + self.assert_(gid) + + # try to get it again, make sure it's still there + auth_info2 = h.get_auth_info(name) + self.assert_(auth_info2) + + gid = auth_info2.get_gid_object() + self.assert_(gid) + self.assertEqual(gid.get_subject(), name) + + pubkey = auth_info2.get_pkey_object() + self.assert_(gid) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/testInterfaces.py b/tests/testInterfaces.py new file mode 100755 index 00000000..c43da2c7 --- /dev/null +++ b/tests/testInterfaces.py @@ -0,0 +1,321 @@ +#!/usr/bin/python +import sys +import os +import random +import string +import unittest +import sfa.util.xmlrpcprotocol as xmlrpc +from unittest import TestCase +from optparse import OptionParser +from sfa.util.xmlrpcprotocol import ServerException +from sfa.util.namespace import * +from sfa.util.config import * +from sfa.trust.certificate import * +from sfa.trust.credential import * +from sfa.util.sfaticket import * +from sfa.util.rspec import * +from sfa.client import sfi + +def random_string(size): + return "".join(random.sample(string.letters, size)) + +class Client: + registry = None + aggregate = None + sm = None + cm = None + key = None + cert = None + credential = None + type = None + def __init__(self, options): + try: self.config = config = Config(options.config_file) + except: + print "failed to read config_file %s" % options.config_file + sys.exit(1) + key_path = os.path.dirname(options.config_file) + user_name = self.config.SFI_USER.split('.')[-1:][0] + key_file = key_path + os.sep + user_name + '.pkey' + cert_file = key_path + os.sep + user_name + '.cert' + self.key = Keypair(filename=key_file) + self.cert = Certificate(subject=self.config.SFI_USER) + self.cert.set_pubkey(self.key) + self.cert.set_issuer(self.key, self.config.SFI_USER) + self.cert.sign() + self.cert.save_to_file(cert_file) + SFI_AGGREGATE = config.SFI_SM.replace('12347', '12346') + SFI_CM = 'http://' + options.cm_host + ':12346' + self.registry = xmlrpc.get_server(config.SFI_REGISTRY, key_file, cert_file) + self.aggregate = xmlrpc.get_server(SFI_AGGREGATE, key_file, cert_file) + self.sm = xmlrpc.get_server(config.SFI_SM, key_file, cert_file) + self.cm = xmlrpc.get_server(SFI_CM, key_file, cert_file) + self.hrn = config.SFI_USER + # XX defaulting to user, but this should be configurable so we can + # test from components persepctive + self.type = 'user' + self.credential = self.get_credential(self.hrn) + + def get_credential(self, hrn = None, type = 'user'): + if not hrn: hrn = self.hrn + if hrn == self.hrn: + cert = self.cert.save_to_string(save_parents=True) + request_hash = self.key.compute_hash([cert, 'user', hrn]) + credential = self.registry.get_self_credential(cert, type, hrn, request_hash) + return credential + else: + if not self.credential: + self.credential = self.get_credential(self.hrn, 'user') + return self.registry.get_credential(self.credential, type, hrn) + +class BasicTestCase(unittest.TestCase): + def __init__(self, testname, client, test_slice=None): + unittest.TestCase.__init__(self, testname) + self.client = client + self.slice = test_slice + + def setUp(self): + self.registry = self.client.registry + self.aggregate = self.client.aggregate + self.sm = self.client.sm + self.cm = self.client.cm + self.credential = self.client.credential + self.hrn = self.client.hrn + self.type = self.client.type + +# Registry tests +class RegistryTest(BasicTestCase): + + def setUp(self): + """ + Make sure test records dont exsit + """ + BasicTestCase.setUp(self) + + def testGetSelfCredential(self): + cred = self.client.get_credential() + # this will raise an openssl error if the credential string isnt valid + Credential(string=cred) + + def testRegister(self): + authority = get_authority(self.hrn) + auth_cred = self.client.get_credential(authority, 'authority') + auth_record = {'hrn': '.'.join([authority, random_string(10).lower()]), + 'type': 'authority'} + node_record = {'hrn': '.'.join([authority, random_string(10)]), + 'type': 'node', + 'hostname': random_string(6) + '.' + random_string(6)} + slice_record = {'hrn': '.'.join([authority, random_string(10)]), + 'type': 'slice', 'researcher': [self.hrn]} + user_record = {'hrn': '.'.join([authority, random_string(10)]), + 'type': 'user', + 'email': random_string(6) +'@'+ random_string(5) +'.'+ random_string(3), + 'first_name': random_string(7), + 'last_name': random_string(7)} + + all_records = [auth_record, node_record, slice_record, user_record] + for record in all_records: + try: + self.registry.register(auth_cred, record) + self.registry.resolve(self.credential, record['hrn']) + except: + raise + finally: + try: self.registry.remove(auth_cred, record['type'], record['hrn']) + except: pass + + + def testRegisterPeerObject(self): + assert True + + def testUpdate(self): + authority = get_authority(self.hrn) + auth_cred = self.client.get_credential(authority, 'authority') + records = self.registry.resolve(self.credential, self.hrn) + if not records: assert False + record = records[0] + self.registry.update(auth_cred, record) + + def testResolve(self): + authority = get_authority(self.hrn) + self.registry.resolve(self.credential, self.hrn) + + def testRemove(self): + authority = get_authority(self.hrn) + auth_cred = self.client.get_credential(authority, 'authority') + record = {'hrn': ".".join([authority, random_string(10)]), + 'type': 'slice'} + self.registry.register(auth_cred, record) + self.registry.remove(auth_cred, record['type'], record['hrn']) + # should generate an exception + try: + self.registry.resolve(self.credential, record['hrn']) + assert False + except: + assert True + + def testRemovePeerObject(self): + assert True + + def testList(self): + authority = get_authority(self.client.hrn) + self.registry.list(self.credential, authority) + + def testGetRegistries(self): + self.registry.get_registries(self.credential) + + def testGetAggregates(self): + self.registry.get_aggregates(self.credential) + + def testGetTrustedCerts(self): + # this should fail unless we are a node + callable = self.registry.get_trusted_certs + server_exception = False + try: + callable(self.credential) + except ServerException: + server_exception = True + finally: + if self.type in ['user'] and not server_exception: + assert False + + +class AggregateTest(BasicTestCase): + def setUp(self): + BasicTestCase.setUp(self) + + def testGetSlices(self): + self.aggregate.get_slices(self.credential) + + def testGetResources(self): + # available resources + agg_rspec = self.aggregate.get_resources(self.credential) + # resources used by a slice + slice_rspec = self.aggregate.get_resources(self.credential, self.slice['hrn']) + # will raise an exception if the rspec isnt valid + RSpec(xml=agg_rspec) + RSpec(xml=slice_rspec) + + def testCreateSlice(self): + # get availabel resources + rspec = self.aggregate.get_resources(self.credential) + slice_credential = self.client.get_credential(self.slice['hrn'], 'slice') + self.aggregate.create_slice(slice_credential, self.slice['hrn'], rspec) + + def testDeleteSlice(self): + slice_credential = self.client.get_credential(self.slice['hrn'], 'slice') + self.aggregate.delete_slice(slice_credential, self.slice['hrn']) + + def testGetTicket(self): + slice_credential = self.client.get_credential(self.slice['hrn'], 'slice') + rspec = self.aggregate.get_resources(self.credential) + ticket = self.aggregate.get_ticket(slice_credential, self.slice['hrn'], rspec) + # will raise an exception if the ticket inst valid + SfaTicket(string=ticket) + +class SlicemgrTest(AggregateTest): + def setUp(self): + AggregateTest.setUp(self) + + # force calls to go through slice manager + self.aggregate = self.sm + + # get the slice credential + + +class ComponentTest(BasicTestCase): + def setUp(self): + BasicTestCase.setUp(self) + self.slice_cred = self.client.get_credential(self.slice['hrn'], 'slice') + + def testStartSlice(self): + self.cm.start_slice(self.slice_cred, self.slice['hrn']) + + def testStopSlice(self): + self.cm.stop_slice(self.slice_cred, self.slice['hrn']) + + def testDeleteSlice(self): + self.cm.delete_slice(self.slice_cred, self.slice['hrn']) + + def testRestartSlice(self): + self.cm.restart_slice(self.slice_cred, self.slice['hrn']) + + def testGetSlices(self): + self.cm.get_slices(self.slice_cred, self.slice['hrn']) + + def testRedeemTicket(self): + rspec = self.aggregate.get_resources(self.credential) + ticket = self.aggregate.get_ticket(slice_cred, self.slice['hrn'], rspec) + self.cm.redeem_ticket(slice_cred, ticket) + + +def test_names(testcase): + return [name for name in dir(testcase) if name.startswith('test')] + +def create_slice(client): + # register a slice that will be used for some test + authority = get_authority(client.hrn) + auth_cred = client.get_credential(authority, 'authority') + slice_record = {'hrn': ".".join([authority, random_string(10)]), + 'type': 'slice', 'researcher': [client.hrn]} + client.registry.register(auth_cred, slice_record) + return slice_record + +def delete_slice(cleint, slice): + authority = get_authority(client.hrn) + auth_cred = client.get_credential(authority, 'authority') + if slice: + client.registry.remove(auth_cred, 'slice', slice['hrn']) + +if __name__ == '__main__': + + args = sys.argv + prog_name = args[0] + default_config_dir = os.path.expanduser('~/.sfi/sfi_config') + default_cm = "echo.cs.princeton.edu" + parser = OptionParser(usage="%(prog_name)s [options]" % locals()) + parser.add_option('-f', '--config_file', dest='config_file', default=default_config_dir, + help='config file. default is %s' % default_config_dir) + parser.add_option('-r', '--registry', dest='registry', action='store_true', + default=False, help='run registry tests') + parser.add_option('-a', '--aggregate', dest='aggregate', action='store_true', + default=False, help='run aggregate tests') + parser.add_option('-s', '--slicemgr', dest='slicemgr', action='store_true', + default=False, help='run slicemgr tests') + parser.add_option('-c', '--component', dest='component', action='store_true', + default=False, help='run component tests') + parser.add_option('-d', '--cm_host', dest='cm_host', default=default_cm, + help='dns name of component to test. default is %s' % default_cm) + parser.add_option('-A', '--all', dest='all', action='store_true', + default=False, help='run component tests') + + options, args = parser.parse_args() + suite = unittest.TestSuite() + client = Client(options) + test_slice = {} + + # create the test slice if necessary + if options.all or options.slicemgr or options.aggregate \ + or options.component: + test_slice = create_slice(client) + + if options.registry or options.all: + for name in test_names(RegistryTest): + suite.addTest(RegistryTest(name, client)) + + if options.aggregate or options.all: + for name in test_names(AggregateTest): + suite.addTest(AggregateTest(name, client, test_slice)) + + if options.slicemgr or options.all: + for name in test_names(SlicemgrTest): + suite.addTest(SlicemgrTest(name, client, test_slice)) + + if options.component or options.all: + for name in test_names(ComponentTest): + suite.addTest(ComponentTest(name, client, test_slice)) + + # run tests + unittest.TextTestRunner(verbosity=2).run(suite) + + # remove teset slice + delete_slice(client, test_slice) diff --git a/tests/testKeypair.py b/tests/testKeypair.py new file mode 100755 index 00000000..ebe1edec --- /dev/null +++ b/tests/testKeypair.py @@ -0,0 +1,53 @@ +#!/usr/bin/python +import sys +sys.path.append('..') + +import unittest +import xmlrpclib +import base64 +from sfa.trust.certificate import Keypair + +class TestKeypair(unittest.TestCase): + def setUp(self): + pass + + def testCreate(self): + k = Keypair() + k.create() + + def testSaveLoadFile(self): + k = Keypair() + k.create() + + k.save_to_file("test.key") + + k2 = Keypair() + k2.load_from_file("test.key") + + self.assertEqual(k.as_pem(), k2.as_pem()) + + def test_get_m2_pkey(self): + k = Keypair() + k.create() + + m2 = k.get_m2_pkey() + self.assert_(m2 != None) + + def test_get_openssl_pkey(self): + k = Keypair() + k.create() + + pk = k.get_openssl_pkey() + self.assert_(pk != None) + + def test_sign_verify(self): + k = Keypair() + k.create() + + data = "this is a test" + sig = k.sign_string(data) + + print k.verify_string(data, sig) + +if __name__ == "__main__": + unittest.main() diff --git a/tests/testMisc.py b/tests/testMisc.py new file mode 100755 index 00000000..831d9495 --- /dev/null +++ b/tests/testMisc.py @@ -0,0 +1,18 @@ +import unittest +from sfa.util.misc import * + +class TestMisc(unittest.TestCase): + def setUp(self): + pass + + def testGetLeft(self): + self.assertEqual(get_leaf("foo"), "foo") + self.assertEqual(get_leaf("foo.bar"), "bar") + + def testGetAuthority(self): + self.assertEqual(get_authority("foo"), "") + self.assertEqual(get_authority("foo.bar"), "foo") + self.assertEqual(get_authority("foo.bar.x"), "foo.bar") + +if __name__ == "__main__": + unittest.main() diff --git a/tests/testRecord.py b/tests/testRecord.py new file mode 100755 index 00000000..081a9bf9 --- /dev/null +++ b/tests/testRecord.py @@ -0,0 +1,15 @@ +import unittest +import xmlrpclib +from sfa.trust.gid import * +from sfa.trust.config import * +from sfa.util.record import * + +class TestRecord(unittest.TestCase): + def setUp(self): + pass + + def testCreate(self): + r = SfaRecord() + +if __name__ == "__main__": + unittest.main() diff --git a/tests/testRights.py b/tests/testRights.py new file mode 100755 index 00000000..a67a25ff --- /dev/null +++ b/tests/testRights.py @@ -0,0 +1,86 @@ +import unittest +from sfa.trust.rights import * + +class TestRight(unittest.TestCase): + def setUp(self): + pass + + def testRightInit(self): + right = Right("embed") + self.assertEqual(right.kind, "embed") + + def testRightCanPerform(self): + right = Right("embed") + self.assert_(right.can_perform("getticket")) + self.assert_(not right.can_perform("resolve")) + + def testIsSuperset(self): + pright = Right("sa") + cright = Right("embed") + self.assert_(pright.is_superset(cright)) + self.assert_(not cright.is_superset(pright)) + + pright = Right("embed") + cright = Right("embed") + self.assert_(pright.is_superset(cright)) + self.assert_(cright.is_superset(pright)) + + pright = Right("control") + cright = Right("embed") + self.assert_(not pright.is_superset(cright)) + self.assert_(not cright.is_superset(pright)) + +class TestRightList(unittest.TestCase): + def setUp(self): + pass + + def testInit(self): + # create a blank right list + rightList = RightList() + + # create a right list with "embed" in it + rightList = RightList(string="embed") + + def testAsString(self): + rightList = RightList() + self.assertEqual(rightList.save_to_string(), "") + + rightList = RightList(string="embed") + self.assertEqual(rightList.save_to_string(), "embed") + + rightList = RightList(string="embed,resolve") + self.assertEqual(rightList.save_to_string(), "embed,resolve") + + def testCanPerform(self): + rightList = RightList(string="embed") + self.assert_(rightList.can_perform("getticket")) + self.assert_(not rightList.can_perform("resolve")) + + rightList = RightList(string="embed,resolve") + self.assert_(rightList.can_perform("getticket")) + self.assert_(rightList.can_perform("resolve")) + + def testIsSuperset(self): + pRightList = RightList(string="sa") + cRightList = RightList(string="embed") + self.assert_(pRightList.is_superset(cRightList)) + self.assert_(not cRightList.is_superset(pRightList)) + + pRightList = RightList(string="embed") + cRightList = RightList(string="embed") + self.assert_(pRightList.is_superset(cRightList)) + self.assert_(cRightList.is_superset(pRightList)) + + pRightList = RightList(string="control") + cRightList = RightList(string="embed") + self.assert_(not pRightList.is_superset(cRightList)) + self.assert_(not cRightList.is_superset(pRightList)) + + pRightList = RightList(string="control,sa") + cRightList = RightList(string="embed") + self.assert_(pRightList.is_superset(cRightList)) + self.assert_(not cRightList.is_superset(pRightList)) + + +if __name__ == "__main__": + unittest.main() diff --git a/wsdl/Makefile b/wsdl/Makefile new file mode 100644 index 00000000..1abba026 --- /dev/null +++ b/wsdl/Makefile @@ -0,0 +1,49 @@ +# attempt to update at build-time + +WSDLS = sfa.wsdl registry.wsdl slice-manager.wsdl aggregate.wsdl + +all: $(WSDLS) + +# temporary: turn off wsdl generation as it is failing +#TEMPORARY_OFF = yes + +ifdef TEMPORARY_OFF +registry.wsdl slice-manager.wsdl aggregate.wsdl sfa.wsdl: + touch $@ +else +registry.wsdl: + PYTHONPATH=../ ./sfa2wsdl.py --registry > $@ + +slice-manager.wsdl: + PYTHONPATH=../ ./sfa2wsdl.py --slice-manager > $@ + +aggregate.wsdl: + PYTHONPATH=../ ./sfa2wsdl.py --aggregate > $@ + +sfa.wsdl: + PYTHONPATH=../ ./sfa2wsdl.py --registry --slice-manager --aggregate > $@ +endif + +#################### install +# DESTDIR set but the calling Makefile in ../ +INSTALL_PATH=/var/www/html/wsdl +INSTALLED=$(foreach wsdl,$(WSDLS),$(DESTDIR)$(INSTALL_PATH)/$(wsdl)) + +install: $(INSTALLED) + +$(DESTDIR)$(INSTALL_PATH): + install -d -m 0755 $(DESTDIR)$(INSTALL_PATH) + +$(DESTDIR)$(INSTALL_PATH)/%: wsdl=$(notdir $@) +$(DESTDIR)$(INSTALL_PATH)/%: $(DESTDIR)$(INSTALL_PATH) % + install -c -m 0755 $(wsdl) $@ + +#################### clean +clean: + rm -f *wsdl + +install-clean: + rm -f $(INSTALLED) + +.PHONY: all clean install install-clean + diff --git a/wsdl/apistub.py b/wsdl/apistub.py new file mode 100644 index 00000000..198883f0 --- /dev/null +++ b/wsdl/apistub.py @@ -0,0 +1,12 @@ +import sfa.methods + + +methods = sfa.methods.all + +def callable(method): + classname = method.split(".")[-1] + module = __import__("sfa.methods." + method, globals(), locals(), [classname]) + callablemethod = getattr(module, classname)(None) + return getattr(module, classname)(None) + + diff --git a/wsdl/globals.py b/wsdl/globals.py new file mode 100644 index 00000000..36c1042f --- /dev/null +++ b/wsdl/globals.py @@ -0,0 +1,4 @@ +#!/usr/bin/python + +plc_ns="http://www.planet-lab.org/sfa" +version="2009/07" diff --git a/wsdl/sfa2wsdl.py b/wsdl/sfa2wsdl.py new file mode 100755 index 00000000..f3a6b934 --- /dev/null +++ b/wsdl/sfa2wsdl.py @@ -0,0 +1,342 @@ +#!/usr/bin/python +# +# Sapan Bhatia +# +# Generates a WSDL for sfa + + +import os, sys +import time +import pdb +import xml.dom.minidom +import xml.dom.ext +import apistub +import inspect + +from types import * +from optparse import OptionParser + +from sfa.util.parameter import Parameter,Mixed + +import globals + +class SoapError(Exception): + def __init__(self, value): + self.value = value + def __str__(self): + return repr(self.value) +try: + set +except NameError: + from sets import Set + set = Set + +class WSDLGen: + complex_types = {} + services = {} + num_types = 0 + wsdl = None + types = None + + def __init__(self, interface_options): + self.interface_options = interface_options + + def filter_argname(self,argname): + if (not self.interface_options.lite or (argname!="cred")): + if (argname.find('(') != -1): + # The name has documentation in it :-/ + brackright = argname.split('(')[1] + if (brackright.find(')') == -1): + raise Exception("Please fix the argument %s to be well-formed.\n"%argname) + inbrack = brackright.split(')')[0] + argname = inbrack + return argname + + def fold_complex_type_names(self,acc, arg): + name = arg.doc + if (type(acc)==list): + acc.append(name) + else: + p_i_b = acc.doc + acc = [p_i_b,name] + return acc + + def fold_complex_type(self,acc, arg): + name = self.name_complex_type(arg) + self.complex_types[arg]=name + if (type(acc)==list): + acc.append(name) + else: + p_i_b = self.name_complex_type(acc) + acc = [p_i_b,name] + return acc + + def name_complex_type(self,arg): + + types_section = self.types.getElementsByTagName("xsd:schema")[0] + + #pdb.set_trace() + if (isinstance(arg, Mixed)): + inner_types = reduce(self.fold_complex_type, arg) + inner_names = reduce(self.fold_complex_type_names, arg) + if (inner_types[-1]=="none"): + inner_types=inner_types[:-1] + min_args = 0 + else: + min_args = 1 + + self.num_types=self.num_types+1 + type_name = "Type%d"%self.num_types + complex_type = types_section.appendChild(self.types.createElement("xsd:complexType")) + complex_type.setAttribute("name", type_name) + + choice = complex_type.appendChild(self.types.createElement("xsd:choice")) + for n,t in zip(inner_names,inner_types): + element = choice.appendChild(self.types.createElement("element")) + n = self.filter_argname(n) + element.setAttribute("name", n) + element.setAttribute("type", "%s"%t) + element.setAttribute("minOccurs","%d"%min_args) + return "xsdl:%s"%type_name + elif (isinstance(arg, Parameter)): + return (self.name_simple_type(arg.type)) + elif type(arg) == ListType or type(arg) == TupleType: + inner_type = self.name_complex_type(arg[0]) + self.num_types=self.num_types+1 + type_name = "Type%d"%self.num_types + complex_type = types_section.appendChild(self.types.createElement("xsd:complexType")) + type_name = self.filter_argname(type_name) + complex_type.setAttribute("name", type_name) + complex_content = complex_type.appendChild(self.types.createElement("xsd:complexContent")) + restriction = complex_content.appendChild(self.types.createElement("xsd:restriction")) + restriction.setAttribute("base","soapenc:Array") + attribute = restriction.appendChild(self.types.createElement("xsd:attribute")) + attribute.setAttribute("ref","soapenc:arrayType") + attribute.setAttribute("wsdl:arrayType","%s[]"%inner_type) + + return "xsdl:%s"%type_name + + elif type(arg) == DictType or arg == DictType or (inspect.isclass(arg) and issubclass(arg, dict)): + self.num_types=self.num_types+1 + type_name = "Type%d"%self.num_types + complex_type = types_section.appendChild(self.types.createElement("xsd:complexType")) + type_name = self.filter_argname(type_name) + complex_type.setAttribute("name", type_name) + complex_content = complex_type.appendChild(self.types.createElement("xsd:sequence")) + + for k in arg.fields: + inner_type = self.name_complex_type(arg.fields[k]) + element=complex_content.appendChild(self.types.createElement("xsd:element")) + element.setAttribute("name",k) + element.setAttribute("type",inner_type) + + return "xsdl:%s"%type_name + else: + return (self.name_simple_type(arg)) + + def name_simple_type(self,arg_type): + # A Parameter is reported as an instance, even though it is serialized as a type <> + if type(arg_type) == InstanceType: + return (self.name_simple_type(arg_type.type)) + if arg_type == None: + return "none" + if arg_type == DictType: + return "xsd:anyType" + if arg_type in (ListType, TupleType): + return "xsd:arrayType" + elif arg_type == IntType or arg_type == LongType: + return "xsd:int" + elif arg_type == bool: + return "xsd:boolean" + elif arg_type == FloatType: + return "xsd:double" + elif arg_type in StringTypes: + return "xsd:string" + else: + pdb.set_trace() + raise SoapError, "Cannot handle %s objects" % arg_type + + def param_type(self, arg): + return (self.name_complex_type(arg)) + + def add_wsdl_ports_and_bindings (self): + for method in apistub.methods: + + # Skip system. methods + if "system." in method: + continue + + function = apistub.callable(method) # Commented documentation + #lines = ["// " + line.strip() for line in function.__doc__.strip().split("\n")] + #print "\n".join(lines) + #print + + + in_el = self.wsdl.firstChild.appendChild(self.wsdl.createElement("message")) + in_el.setAttribute("name", method + "_in") + + for service_name in function.interfaces: + if (self.services.has_key(service_name)): + if (not method in self.services[service_name]): + self.services[service_name].append(method) + else: + self.services[service_name]=[method] + + # Arguments + + if (function.accepts): + (min_args, max_args, defaults) = function.args() + for (argname,argtype) in zip(max_args,function.accepts): + argname = self.filter_argname(argname) + arg_part = in_el.appendChild(self.wsdl.createElement("part")) + arg_part.setAttribute("name", argname) + arg_part.setAttribute("type", self.param_type(argtype)) + + # Return type + return_type = function.returns + out_el = self.wsdl.firstChild.appendChild(self.wsdl.createElement("message")) + out_el.setAttribute("name", method + "_out") + ret_part = out_el.appendChild(self.wsdl.createElement("part")) + ret_part.setAttribute("name", "Result") + ret_part.setAttribute("type", self.param_type(return_type)) + + # Port connecting arguments with return type + + port_el = self.wsdl.firstChild.appendChild(self.wsdl.createElement("portType")) + port_el.setAttribute("name", method + "_port") + + op_el = port_el.appendChild(self.wsdl.createElement("operation")) + op_el.setAttribute("name", method) + inp_el=self.wsdl.createElement("input") + inp_el.setAttribute("message","tns:" + method + "_in") + inp_el.setAttribute("name",method+"_request") + op_el.appendChild(inp_el) + out_el = self.wsdl.createElement("output") + out_el.setAttribute("message","tns:" + method + "_out") + out_el.setAttribute("name",method+"_response") + op_el.appendChild(out_el) + + # Bindings + + bind_el = self.wsdl.firstChild.appendChild(self.wsdl.createElement("binding")) + bind_el.setAttribute("name", method + "_binding") + bind_el.setAttribute("type", "tns:" + method + "_port") + + soap_bind = bind_el.appendChild(self.wsdl.createElement("soap:binding")) + soap_bind.setAttribute("style", "rpc") + soap_bind.setAttribute("transport","http://schemas.xmlsoap.org/soap/http") + + + wsdl_op = bind_el.appendChild(self.wsdl.createElement("operation")) + wsdl_op.setAttribute("name", method) + wsdl_op.appendChild(self.wsdl.createElement("soap:operation")).setAttribute("soapAction", + "urn:" + method) + + + wsdl_input = wsdl_op.appendChild(self.wsdl.createElement("input")) + input_soap_body = wsdl_input.appendChild(self.wsdl.createElement("soap:body")) + input_soap_body.setAttribute("use", "encoded") + input_soap_body.setAttribute("namespace", "urn:" + method) + input_soap_body.setAttribute("encodingStyle","http://schemas.xmlsoap.org/soap/encoding/") + + + wsdl_output = wsdl_op.appendChild(self.wsdl.createElement("output")) + output_soap_body = wsdl_output.appendChild(self.wsdl.createElement("soap:body")) + output_soap_body.setAttribute("use", "encoded") + output_soap_body.setAttribute("namespace", "urn:" + method) + output_soap_body.setAttribute("encodingStyle","http://schemas.xmlsoap.org/soap/encoding/") + + + def add_wsdl_services(self): + for service in self.services.keys(): + if (getattr(self.interface_options,service)): + service_el = self.wsdl.firstChild.appendChild(self.wsdl.createElement("service")) + service_el.setAttribute("name", service) + + for method in self.services[service]: + name=method + servport_el = service_el.appendChild(self.wsdl.createElement("port")) + servport_el.setAttribute("name", name + "_port") + servport_el.setAttribute("binding", "tns:" + name + "_binding") + + soapaddress = servport_el.appendChild(self.wsdl.createElement("soap:address")) + soapaddress.setAttribute("location", "%s/%s" % (globals.plc_ns,service)) + + + def compute_wsdl_definitions(self): + wsdl_text_header = """ + + """ % (globals.plc_ns,globals.plc_ns,globals.plc_ns) + + self.wsdl = xml.dom.minidom.parseString(wsdl_text_header) + + + def compute_wsdl_definitions_and_types(self): + wsdl_text_header = """ + + + + + """ % (globals.plc_ns, globals.plc_ns, globals.plc_ns, globals.plc_ns) + self.types = xml.dom.minidom.parseString(wsdl_text_header) + + + def add_wsdl_types(self): + wsdl_types = self.wsdl.importNode(self.types.getElementsByTagName("types")[0], True) + self.wsdl.firstChild.appendChild(wsdl_types) + + def generate_wsdl(self): + self.compute_wsdl_definitions_and_types() + self.compute_wsdl_definitions() + self.add_wsdl_ports_and_bindings() + self.add_wsdl_types() + self.add_wsdl_services() + + def pretty_print(self): + if (self.wsdl): + xml.dom.ext.PrettyPrint(self.wsdl) + else: + raise Exception("Empty WSDL") + +def main(): + parser = OptionParser() + parser.add_option("-r", "--registry", dest="registry", action="store_true", + help="Generate registry.wsdl", metavar="FILE") + parser.add_option("-s", "--slice-manager", + action="store_true", dest="slicemgr", + help="Generate sm.wsdl") + parser.add_option("-a", "--aggregate", action="store_true", dest="aggregate", + help="Generate am.wsdl") + parser.add_option("-c", "--component", action="store_true", dest="component", + help="Generate cm.wsdl") + parser.add_option("-g", "--geni-aggregate", action="store_true", dest="geni_am", + help="Generate gm.wsdl") + parser.add_option("-l", "--lite", action="store_true", dest="lite", + help="Generate LITE version of the interface, in which calls exclude credentials") + (interface_options, args) = parser.parse_args() + + gen = WSDLGen(interface_options) + gen.generate_wsdl() + gen.pretty_print() + + +if __name__ == "__main__": + main() diff --git a/xmlbuilder-0.9/LICENSE b/xmlbuilder-0.9/LICENSE new file mode 100644 index 00000000..0d0f57c4 --- /dev/null +++ b/xmlbuilder-0.9/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2008 Konstantin Danilov aka koder + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/xmlbuilder-0.9/MANIFEST.in b/xmlbuilder-0.9/MANIFEST.in new file mode 100644 index 00000000..207725e9 --- /dev/null +++ b/xmlbuilder-0.9/MANIFEST.in @@ -0,0 +1,2 @@ +include xmlbuild/docs *.rst +include . LICENSE \ No newline at end of file diff --git a/xmlbuilder-0.9/PKG-INFO b/xmlbuilder-0.9/PKG-INFO new file mode 100644 index 00000000..d931c15a --- /dev/null +++ b/xmlbuilder-0.9/PKG-INFO @@ -0,0 +1,80 @@ +Metadata-Version: 1.0 +Name: xmlbuilder +Version: 0.9 +Summary: Pythonic way to create xml files +Home-page: http://pypi.python.org/pypi/xmlbuilder +Author: koder +Author-email: koder_dot_mail@gmail_dot_com +License: MIT +Download-URL: http://pypi.python.org/pypi/xmlbuilder +Description: Example of usage: + ----------------- + + + from __future__ import with_statement + from xmlbuilder import XMLBuilder + x = XMLBuilder(format=True) + with x.root(a = 1): + with x.data: + [x << ('node',{'val':i}) for i in range(10)] + + print str(x) + + will print + + <root a="1"> + <data> + <node val="0" /> + <node val="1" /> + <node val="2" /> + <node val="3" /> + <node val="4" /> + <node val="5" /> + <node val="6" /> + <node val="7" /> + <node val="8" /> + <node val="9" /> + </data> + </root> + + Mercurial repo:http://hg.assembla.com/MyPackages/ + + Documentations + -------------- + `XMLBuilder` is simple library build on top of `ElementTree.TreeBuilder` to + simplify xml files creation as much as possible. Althow it can produce + structured result with identated child tags. `XMLBuilder` use python `with` + statement to define xml tag levels and `<<` operator for simple cases - + text and tag without childs. + + First we need to create xmlbuilder + + from xmlbuilder import XMLBuilder + # params - encoding = 'utf8', + # builder = None, - ElementTree.TreeBuilder + # tab_level = None, - current tab l;evel - for formatted output only + # format = False, - create formatted output + # tab_step = " " * 4 - indentation step + xml = XMLBuilder() + + + Use `with` statement to make document structure + #create and open tag 'root_tag' with text 'text' and attributes + with xml.root_tag(text,attr1=val1,attr2=val2): + #create and open tag 'sub_tag' + with xml.sub_tag(text,attr3=val3): + #create tag which are not valid python identificator + with xml('one-more-sub-tag',attr7=val37): + xml << "Some textual data" + #here tag 'one-more-sub-tag' are closed + #Tags without children can be created using `<<` operator + for val in range(15): + xml << ('message',"python rocks!"[:i]) + #create 15 child tag like <message> python r</message> + #all tags closed + node = ~x # get etree.ElementTree object + xml_data = str(x) + unicode_xml_data = unicode(x) + +Keywords: xml +Platform: UNKNOWN diff --git a/xmlbuilder-0.9/README.txt b/xmlbuilder-0.9/README.txt new file mode 100644 index 00000000..7a7131fc --- /dev/null +++ b/xmlbuilder-0.9/README.txt @@ -0,0 +1 @@ +Pythonic way to build xml files \ No newline at end of file diff --git a/xmlbuilder-0.9/setup.cfg b/xmlbuilder-0.9/setup.cfg new file mode 100644 index 00000000..b14b0bc3 --- /dev/null +++ b/xmlbuilder-0.9/setup.cfg @@ -0,0 +1,5 @@ +[egg_info] +tag_build = +tag_date = 0 +tag_svn_revision = 0 + diff --git a/xmlbuilder-0.9/setup.py b/xmlbuilder-0.9/setup.py new file mode 100644 index 00000000..931cb315 --- /dev/null +++ b/xmlbuilder-0.9/setup.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +#------------------------------------------------------------------------------- +import os +import sys +import glob +import os.path +from setuptools import setup +#from distutils.core import setup +#------------------------------------------------------------------------------- +if 'upload' in sys.argv: + # for .pypirc file + try: + os.environ['HOME'] + except KeyError: + os.environ['HOME'] = '..\\' +#------------------------------------------------------------------------------- +fpath = lambda x : os.path.join(*x.split('/')) +#------------------------------------------------------------------------------- +PYPI_URL = 'http://pypi.python.org/pypi/xmlbuilder' +ld = open(fpath('xmlbuilder/docs/long_descr.rst')).read() +ld = ld.replace('&','&').replace('<','<').replace('>','>') +setup( + name = "xmlbuilder", + fullname = "xmlbuilder", + version = "0.9", + packages = ["xmlbuilder"], + package_dir = {'xmlbuilder':'xmlbuilder'}, + author = "koder", + author_email = "koder_dot_mail@gmail_dot_com", + maintainer = 'koder', + maintainer_email = "koder_dot_mail@gmail_dot_com", + description = "Pythonic way to create xml files", + license = "MIT", + keywords = "xml", + test_suite = "xml_buider.tests", + url = PYPI_URL, + download_url = PYPI_URL, + long_description = ld, + #include_package_data = True, + #package_data = {'xmlbuilder':["docs/*.rst"]}, + #data_files = [('', ['xmlbuilder/docs/long_descr.rst'])] +) +#------------------------------------------------------------------------------- diff --git a/xmlbuilder-0.9/xmlbuilder.egg-info/PKG-INFO b/xmlbuilder-0.9/xmlbuilder.egg-info/PKG-INFO new file mode 100644 index 00000000..bb65a9de --- /dev/null +++ b/xmlbuilder-0.9/xmlbuilder.egg-info/PKG-INFO @@ -0,0 +1,80 @@ +Metadata-Version: 1.0 +Name: xmlbuilder +Version: 0.9 +Summary: Pythonic way to create xml files +Home-page: http://pypi.python.org/pypi/xmlbuilder +Author: koder +Author-email: koder_dot_mail@gmail_dot_com +License: MIT +Download-URL: http://pypi.python.org/pypi/xmlbuilder +Description: Example of usage: + ----------------- + + + from __future__ import with_statement + from xmlbuilder import XMLBuilder + x = XMLBuilder(format=True) + with x.root(a = 1): + with x.data: + [x << ('node',{'val':i}) for i in range(10)] + + print str(x) + + will print + + <root a="1"> + <data> + <node val="0" /> + <node val="1" /> + <node val="2" /> + <node val="3" /> + <node val="4" /> + <node val="5" /> + <node val="6" /> + <node val="7" /> + <node val="8" /> + <node val="9" /> + </data> + </root> + + Mercurial repo:http://hg.assembla.com/MyPackages/ + + Documentations + -------------- + `XMLBuilder` is simple library build on top of `ElementTree.TreeBuilder` to + simplify xml files creation as much as possible. Althow it can produce + structured result with identated child tags. `XMLBuilder` use python `with` + statement to define xml tag levels and `<<` operator for simple cases - + text and tag without childs. + + First we need to create xmlbuilder + + from xmlbuilder import XMLBuilder + # params - encoding = 'utf8', + # builder = None, - ElementTree.TreeBuilder + # tab_level = None, - current tab l;evel - for formatted output only + # format = False, - create formatted output + # tab_step = " " * 4 - indentation step + xml = XMLBuilder() + + + Use `with` statement to make document structure + #create and open tag 'root_tag' with text 'text' and attributes + with xml.root_tag(text,attr1=val1,attr2=val2): + #create and open tag 'sub_tag' + with xml.sub_tag(text,attr3=val3): + #create tag which are not valid python identificator + with xml('one-more-sub-tag',attr7=val37): + xml << "Some textual data" + #here tag 'one-more-sub-tag' are closed + #Tags without children can be created using `<<` operator + for val in range(15): + xml << ('message',"python rocks!"[:i]) + #create 15 child tag like <message> python r</message> + #all tags closed + node = ~x # get etree.ElementTree object + xml_data = str(x) + unicode_xml_data = unicode(x) + +Keywords: xml +Platform: UNKNOWN diff --git a/xmlbuilder-0.9/xmlbuilder.egg-info/SOURCES.txt b/xmlbuilder-0.9/xmlbuilder.egg-info/SOURCES.txt new file mode 100644 index 00000000..4cc27de9 --- /dev/null +++ b/xmlbuilder-0.9/xmlbuilder.egg-info/SOURCES.txt @@ -0,0 +1,13 @@ +LICENSE +MANIFEST.in +PKG-INFO +README.txt +setup.cfg +setup.py +xmlbuilder/__init__.py +xmlbuilder.egg-info/PKG-INFO +xmlbuilder.egg-info/SOURCES.txt +xmlbuilder.egg-info/dependency_links.txt +xmlbuilder.egg-info/top_level.txt +xmlbuilder/docs/long_descr.rst +xmlbuilder/tests/__init__.py \ No newline at end of file diff --git a/xmlbuilder-0.9/xmlbuilder.egg-info/dependency_links.txt b/xmlbuilder-0.9/xmlbuilder.egg-info/dependency_links.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/xmlbuilder-0.9/xmlbuilder.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/xmlbuilder-0.9/xmlbuilder.egg-info/top_level.txt b/xmlbuilder-0.9/xmlbuilder.egg-info/top_level.txt new file mode 100644 index 00000000..9f1d4861 --- /dev/null +++ b/xmlbuilder-0.9/xmlbuilder.egg-info/top_level.txt @@ -0,0 +1 @@ +xmlbuilder diff --git a/xmlbuilder-0.9/xmlbuilder/__init__.py b/xmlbuilder-0.9/xmlbuilder/__init__.py new file mode 100644 index 00000000..1be17b0f --- /dev/null +++ b/xmlbuilder-0.9/xmlbuilder/__init__.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python +#------------------------------------------------------------------------------- +from __future__ import with_statement +#------------------------------------------------------------------------------- +from xml.etree.ElementTree import TreeBuilder,tostring +#------------------------------------------------------------------------------- +__all__ = ["XMLBuilder"] +__doc__ = """ +XMLBuilder is simple library build on top of ElementTree.TreeBuilder to +simplify xml files creation as much as possible. Althow it can produce +structured result with identated child tags. `XMLBuilder` use python `with` +statement to define xml tag levels and `<<` operator for simple cases - +text and tag without childs. + +from __future__ import with_statement +from xmlbuilder import XMLBuilder +x = XMLBuilder(format=True) +with x.root(a = 1): + with x.data: + [x << ('node',{'val':i}) for i in range(10)] + +etree_node = ~x +print str(x) +""" +#------------------------------------------------------------------------------- +class _XMLNode(object): + """Class for internal usage""" + def __init__(self,parent,name,builder): + self.builder = builder + self.name = name + self.text = [] + self.attrs = {} + self.entered = False + self.parent = parent + def __call__(self,*dt,**mp): + text = "".join(dt) + if self.entered: + self.builder.data(text) + else: + self.text.append(text) + if self.entered: + raise ValueError("Can't add attributes to already opened element") + smp = dict((k,str(v)) for k,v in mp.items()) + self.attrs.update(smp) + return self + def __enter__(self): + self.parent += 1 + self.builder.start(self.name,self.attrs) + self.builder.data("".join(self.text)) + self.entered = True + return self + def __exit__(self,x,y,z): + self.parent -= 1 + self.builder.end(self.name) + return False +#------------------------------------------------------------------------------- +class XMLBuilder(object): + """XmlBuilder(encoding = 'utf-8', # result xml file encoding + builder = None, #etree.TreeBuilder or compatible class + tab_level = None, #current tabulation level - string + format = False, # make formatted output + tab_step = " " * 4) # tabulation step + use str(builder) or unicode(builder) to get xml text or + ~builder to obtaine etree.ElementTree + """ + def __init__(self,encoding = 'utf-8', + builder = None, + tab_level = None, + format = False, + tab_step = " " * 4): + self.__builder = builder or TreeBuilder() + self.__encoding = encoding + if format : + if tab_level is None: + tab_level = "" + if tab_level is not None: + if not format: + raise ValueError("format is False, but tab_level not None") + self.__tab_level = tab_level # current format level + self.__tab_step = tab_step # format step + self.__has_sub_tag = False # True, if current tag had childrens + self.__node = None + # called from _XMLNode when tag opened + def __iadd__(self,val): + self.__has_sub_tag = False + if self.__tab_level is not None: + self.__builder.data("\n" + self.__tab_level) + self.__tab_level += self.__tab_step + return self + # called from XMLNode when tag closed + def __isub__(self,val): + if self.__tab_level is not None: + self.__tab_level = self.__tab_level[:-len(self.__tab_step)] + if self.__has_sub_tag: + self.__builder.data("\n" + self.__tab_level) + self.__has_sub_tag = True + return self + def __getattr__(self,name): + return _XMLNode(self,name,self.__builder) + def __call__(self,name,*dt,**mp): + x = _XMLNode(self,name,self.__builder) + x(*dt,**mp) + return x + #create new tag or add text + #possible shift values + #string - text + #tuple(string1,string2,dict) - new tag with name string1,attrs = dict,and text string2 + #dict and string2 are optional + def __lshift__(self,val): + if isinstance(val,basestring): + self.__builder.data(val) + else: + self.__has_sub_tag = True + assert hasattr(val,'__len__'),\ + 'Shifted value should be tuple or list like object not %r' % val + assert hasattr(val,'__getitem__'),\ + 'Shifted value should be tuple or list like object not %r' % val + name = val[0] + if len(val) == 3: + text = val[1] + attrs = val[2] + elif len(val) == 1: + text = "" + attrs = {} + elif len(val) == 2: + if isinstance(val[1],basestring): + text = val[1] + attrs = {} + else: + text = "" + attrs = val[1] + if self.__tab_level is not None: + self.__builder.data("\n" + self.__tab_level) + self.__builder.start(name, + dict((k,str(v)) for k,v in attrs.items())) + if text: + self.__builder.data(text) + self.__builder.end(name) + return self # to allow xml << some1 << some2 << some3 + #close builder + def __invert__(self): + if self.__node is not None: + return self.__node + self.__node = self.__builder.close() + return self.__node + def __str__(self): + """return generated xml""" + return tostring(~self,self.__encoding) + def __unicode__(self): + """return generated xml""" + res = tostring(~self,self.__encoding) + return res.decode(self.__encoding) +#------------------------------------------------------------------------------- diff --git a/xmlbuilder-0.9/xmlbuilder/docs/long_descr.rst b/xmlbuilder-0.9/xmlbuilder/docs/long_descr.rst new file mode 100644 index 00000000..4e82bc85 --- /dev/null +++ b/xmlbuilder-0.9/xmlbuilder/docs/long_descr.rst @@ -0,0 +1,68 @@ +Example of usage: +----------------- + + +from __future__ import with_statement +from xmlbuilder import XMLBuilder +x = XMLBuilder(format=True) +with x.root(a = 1): + with x.data: + [x << ('node',{'val':i}) for i in range(10)] + +print str(x) + +will print + + + + + + + + + + + + + + + + +Mercurial repo:http://hg.assembla.com/MyPackages/ + +Documentations +-------------- +`XMLBuilder` is simple library build on top of `ElementTree.TreeBuilder` to +simplify xml files creation as much as possible. Althow it can produce +structured result with identated child tags. `XMLBuilder` use python `with` +statement to define xml tag levels and `<<` operator for simple cases - +text and tag without childs. + +First we need to create xmlbuilder + + from xmlbuilder import XMLBuilder + # params - encoding = 'utf8', + # builder = None, - ElementTree.TreeBuilder + # tab_level = None, - current tab l;evel - for formatted output only + # format = False, - create formatted output + # tab_step = " " * 4 - indentation step + xml = XMLBuilder() + + +Use `with` statement to make document structure + #create and open tag 'root_tag' with text 'text' and attributes + with xml.root_tag(text,attr1=val1,attr2=val2): + #create and open tag 'sub_tag' + with xml.sub_tag(text,attr3=val3): + #create tag which are not valid python identificator + with xml('one-more-sub-tag',attr7=val37): + xml << "Some textual data" + #here tag 'one-more-sub-tag' are closed + #Tags without children can be created using `<<` operator + for val in range(15): + xml << ('message',"python rocks!"[:i]) + #create 15 child tag like python r + #all tags closed + node = ~x # get etree.ElementTree object + xml_data = str(x) + unicode_xml_data = unicode(x) diff --git a/xmlbuilder-0.9/xmlbuilder/tests/__init__.py b/xmlbuilder-0.9/xmlbuilder/tests/__init__.py new file mode 100644 index 00000000..67eaa67f --- /dev/null +++ b/xmlbuilder-0.9/xmlbuilder/tests/__init__.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python +from __future__ import with_statement +#------------------------------------------------------------------------------- +import unittest +from xml.etree.ElementTree import fromstring +#------------------------------------------------------------------------------- +from xmlbuilder import XMLBuilder +#------------------------------------------------------------------------------- +def xmlStructureEqual(xml1,xml2): + tree1 = fromstring(xml1) + tree2 = fromstring(xml2) + return _xmlStructureEqual(tree1,tree2) +#------------------------------------------------------------------------------- +def _xmlStructureEqual(tree1,tree2): + if tree1.tag != tree2.tag: + return False + attr1 = list(tree1.attrib.items()) + attr1.sort() + attr2 = list(tree2.attrib.items()) + attr2.sort() + if attr1 != attr2: + return False + return tree1.getchildren() == tree2.getchildren() +#------------------------------------------------------------------------------- +result1 = \ +""" + + + + + xyz + abc + + + + test + + +""".strip() +#------------------------------------------------------------------------------- +class TestXMLBuilder(unittest.TestCase): + def testShift(self): + xml = (XMLBuilder() << ('root',)) + self.assertEqual(str(xml),"") + + xml = XMLBuilder() + xml << ('root',"some text") + self.assertEqual(str(xml),"some text") + + xml = XMLBuilder() + xml << ('root',{'x':1,'y':'2'}) + self.assert_(xmlStructureEqual(str(xml),"some text")) + + xml = XMLBuilder() + xml << ('root',{'x':1,'y':'2'}) + self.assert_(xmlStructureEqual(str(xml),"")) + + xml = XMLBuilder() + xml << ('root',{'x':1,'y':'2'}) + self.assert_(not xmlStructureEqual(str(xml),"")) + + + xml = XMLBuilder() + xml << ('root',"gonduras.ua",{'x':1,'y':'2'}) + self.assert_(xmlStructureEqual(str(xml),"gonduras.ua")) + + xml = XMLBuilder() + xml << ('root',"gonduras.ua",{'x':1,'y':'2'}) + self.assert_(xmlStructureEqual(str(xml),"gonduras.com")) + #--------------------------------------------------------------------------- + def testWith(self): + xml = XMLBuilder() + with xml.root(lenght = 12): + pass + self.assertEqual(str(xml),'') + + xml = XMLBuilder() + with xml.root(): + xml << "text1" << "text2" << ('some_node',) + self.assertEqual(str(xml),"text1text2") + #--------------------------------------------------------------------------- + def testFormat(self): + x = XMLBuilder('utf-8',format = True) + with x.root(): + x << ('array',) + with x.array(len = 10): + with x.el(val = 0): + pass + with x.el('xyz',val = 1): + pass + x << ("el","abc",{'val':2}) << ('el',dict(val=3)) + x << ('el',dict(val=4)) << ('el',dict(val='5')) + with x('sup-el',val = 23): + x << "test " + self.assertEqual(str(x),result1) +#------------------------------------------------------------------------------- +if __name__ == '__main__': + unittest.main() +#------------------------------------------------------------------------------- -- 2.51.1
  • +
    Certificate(create=False, subject=None, string=None, filename=None) (class) [#]
    +
    +

    The certificate class implements a general purpose X509 certificate, making +use of the appropriate pyOpenSSL or M2Crypto abstractions.

    +

    For more information about this class, see The Certificate Class.

    +
    +
    Keypair(create=False, string=None, filename=None) (class) [#]
    +
    +

    Public-private key pairs are implemented by the Keypair class.

    +

    For more information about this class, see The Keypair Class.

    +
    +