added support scripts and initscripts
[myplc.git] / db-config
index 7a414e8..d522bfd 100755 (executable)
--- a/db-config
+++ b/db-config
@@ -7,8 +7,8 @@
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
 #
 # Mark Huang <mlhuang@cs.princeton.edu>
 # Copyright (C) 2006 The Trustees of Princeton University
 #
-# $Id$
-#
+# $Id: db-config 7454 2007-12-11 18:55:00Z faiyaza $
+# $HeadURL$
 
 from plc_config import PLCConfiguration
 import sys
 
 from plc_config import PLCConfiguration
 import sys
@@ -142,18 +142,6 @@ def main():
          'error_cmd': '',
          'ignore_cmd_errors': False,
          'always_update': False},
          'error_cmd': '',
          'ignore_cmd_errors': False,
          'always_update': False},
-        {'enabled': True,
-         'source': 'PlanetLabConf/keys.php?role=admin',
-         'dest': '/home/pl_admin/.ssh/authorized_keys',
-         'file_permissions': '644',
-         'file_owner': 'pl_admin',
-         'file_group': 'pl_admin',
-         'preinstall_cmd': 'grep -q pl_admin /etc/passwd',
-         'postinstall_cmd': '/bin/chmod 700 /home/pl_admin/.ssh',
-         'error_cmd': '',
-         'ignore_cmd_errors': False,
-         'always_update': False},
-
         # Log rotation configuration
         {'enabled': True,
          'source': 'PlanetLabConf/logrotate.conf',
         # Log rotation configuration
         {'enabled': True,
          'source': 'PlanetLabConf/logrotate.conf',
@@ -250,53 +238,6 @@ def main():
          'ignore_cmd_errors': False,
          'always_update': False},
 
          'ignore_cmd_errors': False,
          'always_update': False},
 
-        # XXX Required for old Node Manager
-        # Node Manager configuration
-        {'enabled': True,
-         'source': 'PlanetLabConf/pl_nm.conf',
-         'dest': '/etc/planetlab/pl_nm.conf',
-         'file_permissions': '644',
-         'file_owner': 'root',
-         'file_group': 'root',
-         'preinstall_cmd': '',
-         'postinstall_cmd': '/etc/init.d/pl_nm restart',
-         'error_cmd': '',
-         'ignore_cmd_errors': False,
-         'always_update': False},
-        {'enabled': True,
-         'source': 'PlanetLabConf/RootResources/plc_slice_pool.php',
-         'dest': '/home/pl_nm/RootResources/plc_slice_pool',
-         'file_permissions': '644',
-         'file_owner': 'pl_nm',
-         'file_group': 'pl_nm',
-         'preinstall_cmd': '',
-         'postinstall_cmd': '',
-         'error_cmd': '',
-         'ignore_cmd_errors': False,
-         'always_update': False},
-        {'enabled': True,
-         'source': 'PlanetLabConf/RootResources/pl_conf.py',
-         'dest': '/home/pl_nm/RootResources/pl_conf',
-         'file_permissions': '644',
-         'file_owner': 'pl_nm',
-         'file_group': 'pl_nm',
-         'preinstall_cmd': '',
-         'postinstall_cmd': '/etc/init.d/pl_nm restart',
-         'error_cmd': '',
-         'ignore_cmd_errors': False,
-         'always_update': False},
-        {'enabled': True,
-         'source': 'PlanetLabConf/RootResources/pl_netflow.py',
-         'dest': '/home/pl_nm/RootResources/pl_netflow',
-         'file_permissions': '644',
-         'file_owner': 'pl_nm',
-         'file_group': 'pl_nm',
-         'preinstall_cmd': '',
-         'postinstall_cmd': '',
-         'error_cmd': '',
-         'ignore_cmd_errors': False,
-         'always_update': False},
-
         # XXX Required for old Node Manager
         # Proper configuration
         {'enabled': True,
         # XXX Required for old Node Manager
         # Proper configuration
         {'enabled': True,
@@ -320,7 +261,7 @@ def main():
          'file_owner': 'root',
          'file_group': 'root',
          'preinstall_cmd': '',
          'file_owner': 'root',
          'file_group': 'root',
          'preinstall_cmd': '',
-         'postinstall_cmd': '/etc/init.d/pl_nm restart',
+         'postinstall_cmd': '',
          'error_cmd': '',
          'ignore_cmd_errors': True,
          'always_update': False},
          'error_cmd': '',
          'ignore_cmd_errors': True,
          'always_update': False},
@@ -437,6 +378,7 @@ def main():
          'always_update': False},
 
         # Ping of death configuration
          'always_update': False},
 
         # Ping of death configuration
+        # the 'restart' postcommand doesn't work, b/c the pod script doesn't support it.
         {'enabled': True,
          'source': 'PlanetLabConf/ipod.conf.php',
          'dest': '/etc/ipod.conf',
         {'enabled': True,
          'source': 'PlanetLabConf/ipod.conf.php',
          'dest': '/etc/ipod.conf',
@@ -444,7 +386,7 @@ def main():
          'file_owner': 'root',
          'file_group': 'root',
          'preinstall_cmd': '',
          'file_owner': 'root',
          'file_group': 'root',
          'preinstall_cmd': '',
-         'postinstall_cmd': '',
+         'postinstall_cmd': '/etc/init.d/pod start',
          'error_cmd': '',
          'ignore_cmd_errors': False,
          'always_update': False},
          'error_cmd': '',
          'ignore_cmd_errors': False,
          'always_update': False},
@@ -508,8 +450,8 @@ def main():
          'min_role_id': 10},
 
         # CPU share
          'min_role_id': 10},
 
         # CPU share
-        {'name': "cpu_min",
-         'description': "Minimum CPU share (ms/s)",
+        {'name': "cpu_pct",
+         'description': "Reserved CPU percent",
          'min_role_id': 10},
         {'name': "cpu_share",
          'description': "Number of CPU shares",
          'min_role_id': 10},
         {'name': "cpu_share",
          'description': "Number of CPU shares",
@@ -557,17 +499,16 @@ def main():
          'description': "Proper operation (e.g. bind_socket)",
          'min_role_id': 10},
 
          'description': "Proper operation (e.g. bind_socket)",
          'min_role_id': 10},
 
-        # XXX Required for old Node Manager
-        # Special attributes applicable to Slice Creation Service (pl_conf) slice
-        {'name': "plc_slice_type",
-         'description': "Type of slice rspec to be created",
-         'min_role_id': 20},
-        {'name': "plc_agent_version",
-         'description': "Version of PLC agent (slice creation service) software to be deployed",
+        # VServer capabilities 
+        {'name': "capabilities",
+         'description': "VServer bcapabilities (separate by commas)",
          'min_role_id': 10},
          'min_role_id': 10},
-        {'name': "plc_ticket_pubkey",
-         'description': "Public key used to verify PLC-signed tickets",
+
+               # Vsys
+        {'name': "vsys",
+         'description': "Bind vsys script fd's to a slice's vsys directory.",
          'min_role_id': 10}
          'min_role_id': 10}
         ]
 
     # Get list of existing attribute types
         ]
 
     # Get list of existing attribute types
@@ -581,57 +522,107 @@ def main():
         else:
             UpdateSliceAttributeType(default_attribute_type['name'], default_attribute_type)
 
         else:
             UpdateSliceAttributeType(default_attribute_type['name'], default_attribute_type)
 
-    # Create/update system slices
-    legacy_slices = [
-        # XXX Required for old Node Manager
-        {'name': "pl_conf",
-         'description': "PlanetLab Slice Creation Service (SCS)",
-         'url': url,
-         'instantiation': "plc-instantiated",
-         # Renew forever
-         'expires': sys.maxint,
-         'attributes': [('plc_slice_type', "VServerSlice"),
-                        ('plc_agent_version', "1.0"),
-                        ('plc_ticket_pubkey', "")]},
+    # Default Initscripts
+    default_initscripts = []
 
 
-        # XXX Required for old Node Manager
-        {'name': "pl_conf_vserverslice",
-         'description': "Default attributes for vserver slices",
-         'url': url,
-         'instantiation': "plc-instantiated",
-         # Renew forever
-         'expires': sys.maxint,
-         'attributes': [('cpu_share', "32"),
-                        ('plc_slice_type', "VServerSlice"),
-                        ('disk_max', "5000000")]},
+    # Find initscripts and add them to the db
+    for (root, dirs, files) in os.walk("/etc/plc_sliceinitscripts"):
+        for f in files:
+            # Read the file
+            file = open(root + "/" + f, "ro")
+            default_initscripts.append({"name": plc['slice_prefix'] + "_" + f,
+                                        "enabled": True,
+                                        "script": file.read()})
+            file.close()
+
+    # Get list of existing initscripts
+    oldinitscripts = GetInitScripts()
+    oldinitscripts = [script['name'] for script in oldinitscripts]
+
+    for initscript in default_initscripts:
+        if initscript['name'] not in oldinitscripts:  AddInitScript(initscript)
+
+    # Setup default slice attribute types
+    default_setting_types = [
+
+        {'category' : "general",
+         'name' : "ifname",
+         'description': "Set interface name, instead of eth0 or the like",
+         'min_role_id' : 40},
+        {'category' : "general",
+         'name' : "driver",
+         'description': "Use this to specify an alternate driver",
+         'min_role_id' : 40 },
+        {'category' : "general",
+         'name' : "alias",
+         'description': "Allows to reuse an interface as eth0:alias",
+         'min_role_id' : 40},
+
+        {'category' : "hidden",
+         'name' : "backdoor",
+         'description': "For testing new settings",
+         'min_role_id' : 10},
+        ] + [
+        { "category" : "WiFi",
+          "name" : x,
+          "description" : "802.11 %s -- see %s"%(y,z),
+          "min_role_id" : 40 } for (x,y,z) in [
+            ("mode","Mode","iwconfig"),
+            ("essid","ESSID","iwconfig"),
+            ("nw","Network Id","iwconfig"),
+            ("freq","Frequency","iwconfig"),
+            ("channel","Channel","iwconfig"),
+            ("sens","sensitivity threshold","iwconfig"),
+            ("rate","Rate","iwconfig"),
+            ("key","key","iwconfig key"),
+            ("key1","key1","iwconfig key [1]"),
+            ("key2","key2","iwconfig key [2]"),
+            ("key3","key3","iwconfig key [3]"),
+            ("key4","key4","iwconfig key [4]"),
+            ("securitymode","Security mode","iwconfig enc"),
+            ("iwconfig","Additional parameters to iwconfig","ifup-wireless"),
+            ("iwpriv","Additional parameters to iwpriv","ifup-wireless"),
+            ]
         ]
         ]
+
+
+    # Get list of existing attribute types
+    setting_types = GetNodeNetworkSettingTypes()
+    setting_types = [setting_type['name'] for setting_type in setting_types]
+
+    # Create/update default slice setting types
+    for default_setting_type in default_setting_types:
+        if default_setting_type['name'] not in setting_types:
+            AddNodeNetworkSettingType(default_setting_type)
+        else:
+            UpdateNodeNetworkSettingType(default_setting_type['name'], default_setting_type)
+
+    # Create/update system slices
     default_slices = [
          # PlanetFlow
         {'name': plc['slice_prefix'] + "_netflow",
          'description': "PlanetFlow Traffic Auditing Service",
          'url': url,
          'instantiation': "plc-instantiated",
     default_slices = [
          # PlanetFlow
         {'name': plc['slice_prefix'] + "_netflow",
          'description': "PlanetFlow Traffic Auditing Service",
          'url': url,
          'instantiation': "plc-instantiated",
-         # Renew forever
-         'expires': sys.maxint,
+         # Renew forever (minus one day, work around date conversion weirdness)
+         'expires': sys.maxint - (60 * 60 * 24),
          'attributes': [('system', "1"),
                         ('vref', "planetflow"),
                         ('proper_op', "open file=/etc/passwd, flags=r"),
                         ('proper_op', "create_socket"),
                         ('proper_op', "bind_socket")]},
          'attributes': [('system', "1"),
                         ('vref', "planetflow"),
                         ('proper_op', "open file=/etc/passwd, flags=r"),
                         ('proper_op', "create_socket"),
                         ('proper_op', "bind_socket")]},
+          # Sirius
+        {'name': plc['slice_prefix'] + "_sirius",
+         'description': 'The Sirius Calendar Service.\n\nSirius provides system-wide reservations of 25% CPU and 2Mb/s outgoing\nbandwidth.  Sign up for hour-long slots using the Web GUI at the\nPlanetLab website.\n\nThis slice should not generate traffic external to PlanetLab.\n',
+         'url': url,
+         'instantiation': "plc-instantiated",
+         # Renew forever (minus one day, work around date conversion weirdness)
+         'expires': sys.maxint - (60 * 60 * 24),
+         'attributes': [('system', "1"),
+                        ('net_min_rate', "2000"),
+                        ('cpu_pct', "25"),
+                        ('initscript', plc['slice_prefix'] + "_sirius")]}
         ]
         ]
-         
-    ### xxx - to review once new node manager rolls out
-    # if PLC_SLICE_PREFIX is left to default - this is meant for the public PL only
-    if plc['slice_prefix'] == 'pl':
-        # create both legacy slices together with netflow through default_slices
-        default_slices += legacy_slices
-    else:
-        # we use another slice prefix : disable legacy slices if already created
-        for legacy_slice in legacy_slices:
-            try:
-                DeleteSlice(legacy_slice['name'])
-            except:
-                pass
     
     for default_slice in default_slices:
         slices = GetSlices([default_slice['name']])
     
     for default_slice in default_slices:
         slices = GetSlices([default_slice['name']])
@@ -807,9 +798,9 @@ Or,
     https://%(PLC_WWW_HOST)s:%(PLC_WWW_SSL_PORT)d/db/nodes/?id=%(node_id)d
 
     Under 'Download', follow the 'Download plnode.txt file for %(hostname)s'
     https://%(PLC_WWW_HOST)s:%(PLC_WWW_SSL_PORT)d/db/nodes/?id=%(node_id)d
 
     Under 'Download', follow the 'Download plnode.txt file for %(hostname)s'
-       option, and save the downloaded file as plnode.txt on either a floppy 
-       disk or a USB flash drive.  Be sure the 'Boot State' is set to 'Boot', 
-       and, then reboot the node.
+    option, and save the downloaded file as plnode.txt on either a floppy 
+    disk or a USB flash drive.  Be sure the 'Boot State' is set to 'Boot', 
+    and, then reboot the node.
 
 If you have already performed this step and are still receiving this
 message, please reply so that we can help investigate the problem.
 
 If you have already performed this step and are still receiving this
 message, please reply so that we can help investigate the problem.
@@ -896,9 +887,137 @@ message, please reply so that we may investigate the problem.
         ]
 
     for template in message_templates:
         ]
 
     for template in message_templates:
-       messages = GetMessages([template['message_id']])
-       if not messages:
-            AddMessage(template)       
+        messages = GetMessages([template['message_id']])
+        if not messages:
+            AddMessage(template)
+
+    
+    ### Setup Initial PCU information
+    pcu_types = [{'model': 'AP79xx',
+          'name': 'APC AP79xx',
+          'pcu_protocol_types': [{ 'port': 80,
+                                  'protocol': 'APC79xxHttp',
+                                  'supported': False},
+                                 { 'port': 23,
+                                  'protocol': 'APC79xx',
+                                  'supported': True},
+                                 { 'port': 22,
+                                  'protocol': 'APC79xx',
+                                  'supported': True}],
+          },
+         {'model': 'Masterswitch',
+          'name': 'APC Masterswitch',
+          'pcu_protocol_types': [{ 'port': 80,
+                                  'protocol': 'APCMasterHttp',
+                                  'supported': False},
+                                 { 'port': 23,
+                                  'protocol': 'APCMaster',
+                                  'supported': True},
+                                 { 'port': 22,
+                                  'protocol': 'APCMaster',
+                                  'supported': True}],
+          },
+         {'model': 'DS4-RPC',
+          'name': 'BayTech DS4-RPC',
+          'pcu_protocol_types': [{ 'port': 80,
+                                  'protocol': 'BayTechHttp',
+                                  'supported': False},
+                                 { 'port': 23,
+                                  'protocol': 'BayTech',
+                                  'supported': True},
+                                 { 'port': 22,
+                                  'protocol': 'BayTech',
+                                  'supported': True}],
+          },
+         {'model': 'IP-41x_IP-81x',
+          'name': 'Dataprobe IP-41x & IP-81x',
+          'pcu_protocol_types': [ { 'port': 23,
+                                  'protocol': 'IPALTelnet',
+                                  'supported': True},
+                                  { 'port': 80,
+                                  'protocol': 'IPALHttp',
+                                  'supported': False}],
+          },
+         {'model': 'DRAC3',
+          'name': 'Dell RAC Version 3',
+          'pcu_protocol_types': [],
+          },
+         {'model': 'DRAC4',
+          'name': 'Dell RAC Version 4',
+          'pcu_protocol_types': [{ 'port': 443,
+                                  'protocol': 'DRACRacAdm',
+                                  'supported': True},
+                                 { 'port': 80,
+                                  'protocol': 'DRACRacAdm',
+                                  'supported': False},
+                                 { 'port': 22,
+                                  'protocol': 'DRAC',
+                                  'supported': True}],
+          },
+         {'model': 'ePowerSwitch',
+          'name': 'ePowerSwitch 1/4/8x',
+          'pcu_protocol_types': [{ 'port': 80,
+                                  'protocol': 'ePowerSwitch',
+                                  'supported': True}],
+          },
+         {'model': 'ilo2',
+          'name': 'HP iLO2 (Integrated Lights-Out)',
+          'pcu_protocol_types': [{ 'port': 443,
+                                  'protocol': 'HPiLOHttps',
+                                  'supported': True},
+                                 { 'port': 22,
+                                  'protocol': 'HPiLO',
+                                  'supported': True}],
+          },
+         {'model': 'ilo1',
+          'name': 'HP iLO version 1',
+          'pcu_protocol_types': [],
+          },
+         {'model': 'PM211-MIP',
+          'name': 'Infratec PM221-MIP',
+          'pcu_protocol_types': [],
+          },
+         {'model': 'AMT2.5',
+          'name': 'Intel AMT v2.5 (Active Management Technology)',
+          'pcu_protocol_types': [],
+          },
+         {'model': 'AMT3.0',
+          'name': 'Intel AMT v3.0 (Active Management Technology)',
+          'pcu_protocol_types': [],
+          },
+         {'model': 'WTI_IPS-4',
+          'name': 'Western Telematic (WTI IPS-4)',
+          'pcu_protocol_types': [],
+          },
+         {'model': 'unknown',
+          'name': 'Unknown Vendor or Model',
+          'pcu_protocol_types': [{ 'port': 443,
+                                  'protocol': 'UnknownPCU',
+                                  'supported': False},
+                                 { 'port': 80,
+                                  'protocol': 'UnknownPCU',
+                                  'supported': False},
+                                 { 'port': 23,
+                                  'protocol': 'UnknownPCU',
+                                  'supported': False},
+                                 { 'port': 22,
+                                  'protocol': 'UnknownPCU',
+                                  'supported': False}],
+          }]
+
+    # Get all model names
+    pcu_models = [type['model'] for type in GetPCUTypes()]
+    for type in pcu_types:
+        protocol_types = type['pcu_protocol_types']
+        # Take this value out of the struct.
+        del type['pcu_protocol_types']
+        if type['model'] not in pcu_models:
+            # Add the name/model info into DB
+            id = AddPCUType(type)
+            # for each protocol, also add this.
+            for ptype in protocol_types:
+                AddPCUProtocolType(id, ptype)
+
 
 if __name__ == '__main__':
     main()
 
 if __name__ == '__main__':
     main()