| #!/usr/bin/env python |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| # |
| # This script connects to the system vm socket and writes the |
| # authorized_keys and cmdline data to it. The system VM then |
| # reads it from /dev/vport0p1 in cloud_early_config |
| # |
| |
| import argparse |
| import os |
| import socket |
| |
| SOCK_FILE = "/var/lib/libvirt/qemu/{name}.agent" |
| PUB_KEY_FILE = "/root/.ssh/id_rsa.pub.cloud" |
| MESSAGE = "pubkey:{key}\ncmdline:{cmdline}\n" |
| |
| |
| def send_to_socket(sock_file, key_file, cmdline): |
| if not os.path.exists(key_file): |
| print("ERROR: ssh public key not found on host at {0}".format(key_file)) |
| return 1 |
| |
| try: |
| with open(key_file, "r") as f: |
| pub_key = f.read() |
| except IOError as e: |
| print("ERROR: unable to open {0} - {1}".format(key_file, e.strerror)) |
| return 1 |
| |
| # Keep old substitution from perl code: |
| cmdline = cmdline.replace("%", " ") |
| |
| msg = MESSAGE.format(key=pub_key, cmdline=cmdline) |
| |
| if not os.path.exists(sock_file): |
| print("ERROR: {0} socket not found".format(sock_file)) |
| return 1 |
| |
| try: |
| s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) |
| s.connect(sock_file) |
| s.sendall(msg) |
| s.close() |
| except IOError as e: |
| print("ERROR: unable to connect to {0} - {1}".format(sock_file, e.strerror)) |
| return 1 |
| |
| return 0 # Success |
| |
| |
| if __name__ == "__main__": |
| parser = argparse.ArgumentParser(description="Send configuration to system VM socket") |
| parser.add_argument("-n", "--name", required=True, help="Name of VM") |
| parser.add_argument("-p", "--cmdline", required=True, help="Command line") |
| |
| arguments = parser.parse_args() |
| |
| socket_file = SOCK_FILE.format(name=arguments.name) |
| |
| exit(send_to_socket(socket_file, PUB_KEY_FILE, arguments.cmdline)) |