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)