github.com/deis/deis@v1.13.5-0.20170519182049-1d9e59fbdbfc/contrib/linode/create-linode-user-data.py (about)

     1  #!/usr/bin/env python
     2  """
     3  Create CoreOS user-data by merging contrib/coreos/user-data and contrib/linode/linode-user-data-template
     4  
     5  Usage: create-linode-user-data.py
     6  """
     7  import base64
     8  import sys
     9  import argparse
    10  
    11  import yaml
    12  import requests
    13  import linodeutils
    14  
    15  
    16  def validate_public_key(key):
    17      try:
    18          type, key_string, comment = key.split()
    19          data = base64.decodestring(key_string)
    20          return data[4:11] == type
    21      except:
    22          return False
    23  
    24  
    25  def generate_etcd_token():
    26      linodeutils.log_info('Generating new Etcd token...')
    27      data = requests.get('https://discovery.etcd.io/new').text
    28      token = data.replace('https://discovery.etcd.io/', '')
    29      linodeutils.log_success('Generated new token: ' + token)
    30      return token
    31  
    32  
    33  def validate_etcd_token(token):
    34      try:
    35          int(token, 16)
    36          return True
    37      except:
    38          return False
    39  
    40  
    41  def main():
    42      linodeutils.init()
    43  
    44      parser = argparse.ArgumentParser(description='Create Linode User Data')
    45      parser.add_argument('--public-key', action='append', required=True, type=file, dest='public_key_files', help='Authorized SSH Keys')
    46      parser.add_argument('--etcd-token', required=False, default=None, dest='etcd_token', help='Etcd Token')
    47      args = parser.parse_args()
    48  
    49      etcd_token = args.etcd_token
    50      if etcd_token is None:
    51          etcd_token = generate_etcd_token()
    52      else:
    53          if not validate_etcd_token(args.etcd_token):
    54              raise ValueError('Invalid Etcd Token. You can generate a new token at https://discovery.etcd.io/new.')
    55  
    56      public_keys = []
    57      for public_key_file in args.public_key_files:
    58          public_key = public_key_file.read()
    59          if validate_public_key(public_key):
    60              public_keys.append(public_key)
    61          else:
    62              linodeutils.log_warning('Invalid public key: ' + public_key_file.name)
    63  
    64      if not len(public_keys) > 0:
    65          raise ValueError('Must supply at least one valid public key')
    66  
    67      linode_user_data = linodeutils.get_file("linode-user-data.yaml", "w", True)
    68      linode_template = linodeutils.get_file("linode-user-data-template.yaml")
    69      coreos_template = linodeutils.get_file("../coreos/user-data.example")
    70  
    71      coreos_template_string = coreos_template.read()
    72      coreos_template_string = coreos_template_string.replace('#DISCOVERY_URL', 'https://discovery.etcd.io/' + str(etcd_token))
    73  
    74      configuration_linode_template = yaml.safe_load(linode_template)
    75      configuration_coreos_template = yaml.safe_load(coreos_template_string)
    76  
    77      configuration = linodeutils.combine_dicts(configuration_coreos_template, configuration_linode_template)
    78      configuration['ssh_authorized_keys'] = public_keys
    79  
    80      dump = yaml.dump(configuration, default_flow_style=False, default_style='|')
    81  
    82      with linode_user_data as outfile:
    83          outfile.write("#cloud-config\n\n" + dump)
    84          linodeutils.log_success('Wrote Linode user data to ' + linode_user_data.name)
    85  
    86  if __name__ == "__main__":
    87      try:
    88          main()
    89      except Exception as e:
    90          linodeutils.log_error(e.message)
    91          sys.exit(1)