pax_global_header00006660000000000000000000000064125336724540014525gustar00rootroot0000000000000052 comment=6e57b077f204b58bb95b93b94a6da549660d476d addon-context-linux-4.14.0/000077500000000000000000000000001253367245400155175ustar00rootroot00000000000000addon-context-linux-4.14.0/LICENSE000066400000000000000000000261361253367245400165340ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed 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. addon-context-linux-4.14.0/README.md000066400000000000000000000077201253367245400170040ustar00rootroot00000000000000# Linux VM Contextualization ## Description These are the source of the contextualization packages used by VM to be configured with the information generated by OpenNebula. ## Development To contribute bug patches or new features, you can use the github Pull Request model. It is assumed that code and documentation are contributed under the Apache License 2.0. More info: * [How to Contribute](http://opennebula.org/addons/contribute/) * Support: [OpenNebula user mailing list](http://opennebula.org/community:mailinglists) * Development: [OpenNebula developers mailing list](http://opennebula.org/community:mailinglists) * Issues Tracking: Github issues (https://github.com/OpenNebula/addon-context-linux/issues) ## Authors * Leader: Javier Fontan (jfontan@opennebula.org) ## Compatibility This add-on is compatible with OpenNebula >= 4.6. ## Requirements * Ruby >= 1.8.7 * gem fpm * dpkg utils for deb package creation * rpm utils for rpm package creation On Ubuntu/Debian you can install the package `rpm` and you will be able to generate both rpm and deb packages. ## Use ### Package Description Here are located the files needed to generate OpenNebula contextualization packages. The packages generated contain these files: * `/etc/udev/rules.d/*` These files disable the udev network an cdrom generation * `/etc/init.d/vmcontext` This is the startup script that will try to mount context cdrom, load contextualizaton variables, call scripts in the contextualization scripts directory and call init.sh if it exists in the context cd. * `/etc/one-context.d/*` This directory holds the scripts that will be called by vmcontext script. They should be named starting with a number so they are called in order. By default only the network configuration context script is included in the packages. These scripts are different for rpm and deb based distributions and are located in `base_` directories. The packages also have a post-install script that does these steps: * Delete persistent cd and net rules from /etc/udev/rules.d * Links vmcontext script to /etc/rc.d * Deletes network configuration files ### Package Generation The script `generator.sh` generates both deb and rpm packages and can be configured to include more files in the package or change some of its parameters. On start it creates a temporary directory and copies there: * `base` directory * `base_` directory * Any file or directory from the arguments. Then these files are included in the package. The default parameters to create a package are as follows: VERSION=1.0.1 MAINTAINER=C12G Labs LICENSE=Apache PACKAGE_NAME=one-context VENDOR=C12G Labs DESCRIPTION=" This package prepares a VM image for OpenNebula: * Disables udev net and cd persistent rules * Deletes udev net and cd persistent rules * Unconfigures the network * Adds OpenNebula contextualization scripts to startup To get support use the OpenNebula mailing list: http://opennebula.org/community:mailinglists " PACKAGE_TYPE=deb URL=http://opennebula.org You can change any parameter setting an environment variable with the same name. For example, to generate an rpm package with a different package name: $ PACKAGE_TYPE=rpm PACKAGE_NAME=my-context ./generate.sh You can also include new files. This is handy to, for example, include new scripts executed to contextualize an image. For example, we can have an script that install a user ssh key. We will create the file hierarchy that will go inside the package in a directory: $ mkdir -p ssh/etc/one-context.d $ cp ssh/etc/one-context.d/01-ssh-key $ ./generate.sh ssh/etc NOTE: The generator must be executed from the same directory it resides. addon-context-linux-4.14.0/base/000077500000000000000000000000001253367245400164315ustar00rootroot00000000000000addon-context-linux-4.14.0/base/etc/000077500000000000000000000000001253367245400172045ustar00rootroot00000000000000addon-context-linux-4.14.0/base/etc/init.d/000077500000000000000000000000001253367245400203715ustar00rootroot00000000000000addon-context-linux-4.14.0/base/etc/init.d/vmcontext000077500000000000000000000046121253367245400223510ustar00rootroot00000000000000#!/bin/bash # # chkconfig: 2345 9 99 # description: network reconfigure # # -------------------------------------------------------------------------- # # Copyright 2010-2014, C12G Labs S.L. # # # # Licensed 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. # #--------------------------------------------------------------------------- # ### BEGIN INIT INFO # Provides: vmcontext # Required-Start: $all # Required-Stop: # Should-Start: networking # Should-Stop: networking # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: OpenNebula contextualization script ### END INIT INFO function export_rc_vars { if [ -f $1 ] ; then ONE_VARS=`cat $1 | egrep -e '^[a-zA-Z\-\_0-9]*=' | sed 's/=.*$//'` . $1 for v in $ONE_VARS; do export $v done fi } function execute_scripts { SCRIPTS_DIR="/etc/one-context.d" for script in $SCRIPTS_DIR/*; do $script done } case "$1" in "start") CONTEXT_DEV=`blkid -l -t LABEL="CONTEXT" -o device` if [ -e "$CONTEXT_DEV" ]; then mount -t iso9660 -L CONTEXT -o ro /mnt if [ -f /mnt/context.sh ]; then export_rc_vars /mnt/context.sh fi execute_scripts umount /mnt else if type vmtoolsd ; then vmtoolsd --cmd 'info-get guestinfo.opennebula.context' | openssl base64 -d > /tmp/context.sh export_rc_vars /tmp/context.sh fi execute_scripts fi ;; esac addon-context-linux-4.14.0/base/etc/one-context.d/000077500000000000000000000000001253367245400216715ustar00rootroot00000000000000addon-context-linux-4.14.0/base/etc/one-context.d/01-dns000077500000000000000000000037071253367245400226300ustar00rootroot00000000000000#!/bin/bash # -------------------------------------------------------------------------- # # Copyright 2010-2014, C12G Labs S.L. # # # # Licensed 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. # #--------------------------------------------------------------------------- # export DNS_VARIABLES="DNS $(env | sed 's/=.*$//' | grep -E '^ETH[0-9]+_DNS$' | sort)" export SEARCH_VARIABLES="SEARCH_DOMAIN $(env | sed 's/=.*$//' | grep -E '^ETH[0-9]+_SEARCH_DOMAIN$' | sort)" nameservers=$( for var in ${DNS_VARIABLES}; do value=$(eval "echo \"\${$var}\"") if [ -n "$value" ]; then echo "$value" fi done ) searchdomains=$( for var in ${SEARCH_VARIABLES}; do value=$(eval "echo \"\${$var}\"") if [ -n "$value" ]; then echo "$value" fi done ) [ -z "$nameservers" ] && exit 0 echo -n '' > /etc/resolv.conf for nameserver in $nameservers; do echo nameserver $nameserver >> /etc/resolv.conf done [ -z "$searchdomains" ] && exit 0 echo search $searchdomains >> /etc/resolv.conf addon-context-linux-4.14.0/base/etc/one-context.d/02-ssh_public_key000077500000000000000000000030161253367245400250410ustar00rootroot00000000000000#!/bin/bash # -------------------------------------------------------------------------- # # Copyright 2010-2014, C12G Labs S.L. # # # # Licensed 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. # #--------------------------------------------------------------------------- # [ -z "${SSH_PUBLIC_KEY}${EC2_PUBLIC_KEY}" ] && exit 0 mkdir -m0700 -p /root/.ssh echo -n '' > /root/.ssh/authorized_keys if [ -n "$SSH_PUBLIC_KEY" ]; then echo "$SSH_PUBLIC_KEY" >> /root/.ssh/authorized_keys fi if [ -n "$EC2_PUBLIC_KEY" ]; then echo "$EC2_PUBLIC_KEY" >> /root/.ssh/authorized_keys fi chmod 600 /root/.ssh/authorized_keys addon-context-linux-4.14.0/base/etc/one-context.d/04-mount-swap000077500000000000000000000000171253367245400241500ustar00rootroot00000000000000swapon -L swap addon-context-linux-4.14.0/base/etc/one-context.d/06-gen-env000077500000000000000000000006451253367245400234060ustar00rootroot00000000000000#!/bin/bash ENV_FILE="/tmp/one_env" TOKENTXT=$(cat /mnt/token.txt) echo "export TOKENTXT=\"$TOKENTXT\"" > $ENV_FILE function export_rc_vars { if [ -f $1 ] ; then ONE_VARS=$(cat $1 | egrep -e '^[a-zA-Z\-\_0-9]*=' | sed 's/=.*$//') . $1 for v in $ONE_VARS; do echo "export $v=\"${!v}\"" >> $ENV_FILE done fi } export_rc_vars /mnt/context.sh chown root:root $ENV_FILE chmod a+r $ENV_FILE addon-context-linux-4.14.0/base/etc/one-context.d/99-execute-scripts000077500000000000000000000004511253367245400252050ustar00rootroot00000000000000#!/bin/bash MOUNT_DIR=/mnt TMP_DIR=/tmp/one-context-tmp if [ -z "$INIT_SCRIPTS" ]; then if [ -f "$MOUNT_DIR/init.sh" ]; then INIT_SCRIPTS=init.sh fi fi mkdir -p $TMP_DIR cd $MOUNT_DIR for f in $INIT_SCRIPTS; do cp $f $TMP_DIR chmod +x $TMP_DIR/$f $TMP_DIR/$f done addon-context-linux-4.14.0/base/etc/one-context.d/99-start-script000077500000000000000000000007651253367245400245250ustar00rootroot00000000000000#!/bin/bash MOUNT_DIR=/mnt TMP_DIR=/tmp/one-context-tmp TMP_FILE=$TMP_DIR/one-start-script START_SCRIPT_AVAILABLE=no mkdir -p $TMP_DIR if [ -n "$START_SCRIPT_BASE64" ]; then echo -en "$START_SCRIPT_BASE64" | openssl enc -d -base64 -A > $TMP_FILE START_SCRIPT_AVAILABLE=yes elif [ -n "$START_SCRIPT" ]; then echo -en "$START_SCRIPT" > $TMP_FILE START_SCRIPT_AVAILABLE=yes fi if [ "$START_SCRIPT_AVAILABLE" = "yes" ]; then cd $MOUNT_DIR chmod +x $TMP_FILE $TMP_FILE fi addon-context-linux-4.14.0/base/etc/udev/000077500000000000000000000000001253367245400201475ustar00rootroot00000000000000addon-context-linux-4.14.0/base/etc/udev/rules.d/000077500000000000000000000000001253367245400215235ustar00rootroot00000000000000addon-context-linux-4.14.0/base/etc/udev/rules.d/75-cd-aliases-generator.rules000066400000000000000000000000001253367245400270070ustar00rootroot00000000000000addon-context-linux-4.14.0/base/etc/udev/rules.d/75-persistent-net-generator.rules000066400000000000000000000000001253367245400277660ustar00rootroot00000000000000addon-context-linux-4.14.0/base/usr/000077500000000000000000000000001253367245400172425ustar00rootroot00000000000000addon-context-linux-4.14.0/base/usr/bin/000077500000000000000000000000001253367245400200125ustar00rootroot00000000000000addon-context-linux-4.14.0/base/usr/bin/onegate000077500000000000000000000002131253367245400213560ustar00rootroot00000000000000#!/bin/bash ENV_FILE=/tmp/one_env if [ -f $ENV_FILE ]; then . $ENV_FILE fi DIR=$(dirname $(readlink -f $0)) ruby $DIR/onegate.rb $* addon-context-linux-4.14.0/base/usr/bin/onegate.rb000077500000000000000000000374231253367245400217750ustar00rootroot00000000000000#!/usr/bin/env ruby require 'rubygems' require 'uri' require 'net/https' require 'json' require 'pp' ############################################################################### # The CloudClient module contains general functionality to implement a # Cloud Client ############################################################################### module CloudClient # OpenNebula version VERSION = '4.14.0' # ######################################################################### # Default location for the authentication file # ######################################################################### DEFAULT_AUTH_FILE = ENV["HOME"]+"/.one/one_auth" # ######################################################################### # Gets authorization credentials from ONE_AUTH or default # auth file. # # Raises an error if authorization is not found # ######################################################################### def self.get_one_auth if ENV["ONE_AUTH"] and !ENV["ONE_AUTH"].empty? and File.file?(ENV["ONE_AUTH"]) one_auth=File.read(ENV["ONE_AUTH"]).strip.split(':') elsif File.file?(DEFAULT_AUTH_FILE) one_auth=File.read(DEFAULT_AUTH_FILE).strip.split(':') else raise "No authorization data present" end raise "Authorization data malformed" if one_auth.length < 2 one_auth end # ######################################################################### # Starts an http connection and calls the block provided. SSL flag # is set if needed. # ######################################################################### def self.http_start(url, timeout, &block) host = nil port = nil if ENV['http_proxy'] uri_proxy = URI.parse(ENV['http_proxy']) host = uri_proxy.host port = uri_proxy.port end http = Net::HTTP::Proxy(host, port).new(url.host, url.port) if timeout http.read_timeout = timeout.to_i end if url.scheme=='https' http.use_ssl = true http.verify_mode=OpenSSL::SSL::VERIFY_NONE end begin res = http.start do |connection| block.call(connection) end rescue Errno::ECONNREFUSED => e str = "Error connecting to server (#{e.to_s}).\n" str << "Server: #{url.host}:#{url.port}" return CloudClient::Error.new(str,"503") rescue Errno::ETIMEDOUT => e str = "Error timeout connecting to server (#{e.to_s}).\n" str << "Server: #{url.host}:#{url.port}" return CloudClient::Error.new(str,"504") rescue Timeout::Error => e str = "Error timeout while connected to server (#{e.to_s}).\n" str << "Server: #{url.host}:#{url.port}" return CloudClient::Error.new(str,"504") rescue SocketError => e str = "Error timeout while connected to server (#{e.to_s}).\n" return CloudClient::Error.new(str,"503") rescue return CloudClient::Error.new($!.to_s,"503") end if res.is_a?(Net::HTTPSuccess) res else CloudClient::Error.new(res.body, res.code) end end # ######################################################################### # The Error Class represents a generic error in the Cloud Client # library. It contains a readable representation of the error. # ######################################################################### class Error attr_reader :message attr_reader :code # +message+ a description of the error def initialize(message=nil, code="500") @message=message @code=code end def to_s() @message end end # ######################################################################### # Returns true if the object returned by a method of the OpenNebula # library is an Error # ######################################################################### def self.is_error?(value) value.class==CloudClient::Error end end module OneGate module VirtualMachine VM_STATE=%w{INIT PENDING HOLD ACTIVE STOPPED SUSPENDED DONE FAILED POWEROFF UNDEPLOYED} LCM_STATE=%w{LCM_INIT PROLOG BOOT RUNNING MIGRATE SAVE_STOP SAVE_SUSPEND SAVE_MIGRATE PROLOG_MIGRATE PROLOG_RESUME EPILOG_STOP EPILOG SHUTDOWN CANCEL FAILURE CLEANUP_RESUBMIT UNKNOWN HOTPLUG SHUTDOWN_POWEROFF BOOT_UNKNOWN BOOT_POWEROFF BOOT_SUSPENDED BOOT_STOPPED CLEANUP_DELETE HOTPLUG_SNAPSHOT HOTPLUG_NIC HOTPLUG_SAVEAS HOTPLUG_SAVEAS_POWEROFF HOTPLUG_SAVEAS_SUSPENDED SHUTDOWN_UNDEPLOY EPILOG_UNDEPLOY PROLOG_UNDEPLOY BOOT_UNDEPLOY} SHORT_VM_STATES={ "INIT" => "init", "PENDING" => "pend", "HOLD" => "hold", "ACTIVE" => "actv", "STOPPED" => "stop", "SUSPENDED" => "susp", "DONE" => "done", "FAILED" => "fail", "POWEROFF" => "poff", "UNDEPLOYED"=> "unde" } SHORT_LCM_STATES={ "PROLOG" => "prol", "BOOT" => "boot", "RUNNING" => "runn", "MIGRATE" => "migr", "SAVE_STOP" => "save", "SAVE_SUSPEND" => "save", "SAVE_MIGRATE" => "save", "PROLOG_MIGRATE" => "migr", "PROLOG_RESUME" => "prol", "EPILOG_STOP" => "epil", "EPILOG" => "epil", "SHUTDOWN" => "shut", "CANCEL" => "shut", "FAILURE" => "fail", "CLEANUP_RESUBMIT" => "clea", "UNKNOWN" => "unkn", "HOTPLUG" => "hotp", "SHUTDOWN_POWEROFF" => "shut", "BOOT_UNKNOWN" => "boot", "BOOT_POWEROFF" => "boot", "BOOT_SUSPENDED" => "boot", "BOOT_STOPPED" => "boot", "CLEANUP_DELETE" => "clea", "HOTPLUG_SNAPSHOT" => "snap", "HOTPLUG_NIC" => "hotp", "HOTPLUG_SAVEAS" => "hotp", "HOTPLUG_SAVEAS_POWEROFF" => "hotp", "HOTPLUG_SAVEAS_SUSPENDED" => "hotp", "SHUTDOWN_UNDEPLOY" => "shut", "EPILOG_UNDEPLOY" => "epil", "PROLOG_UNDEPLOY" => "prol", "BOOT_UNDEPLOY" => "boot" } def self.state_to_str(id, lcm_id) id = id.to_i state_str = VM_STATE[id] if state_str=="ACTIVE" lcm_id = lcm_id.to_i return LCM_STATE[lcm_id] end return state_str end def self.print(json_hash) OneGate.print_header("VM " + json_hash["VM"]["ID"]) OneGate.print_key_value("NAME", json_hash["VM"]["NAME"]) OneGate.print_key_value( "STATE", self.state_to_str( json_hash["VM"]["STATE"], json_hash["VM"]["LCM_STATE"])) vm_nics = [json_hash['VM']['TEMPLATE']['NIC']].flatten vm_nics.each { |nic| # TODO: IPv6 OneGate.print_key_value("IP", nic["IP"]) } end end module Service STATE = { 'PENDING' => 0, 'DEPLOYING' => 1, 'RUNNING' => 2, 'UNDEPLOYING' => 3, 'WARNING' => 4, 'DONE' => 5, 'FAILED_UNDEPLOYING' => 6, 'FAILED_DEPLOYING' => 7, 'SCALING' => 8, 'FAILED_SCALING' => 9, 'COOLDOWN' => 10 } STATE_STR = [ 'PENDING', 'DEPLOYING', 'RUNNING', 'UNDEPLOYING', 'WARNING', 'DONE', 'FAILED_UNDEPLOYING', 'FAILED_DEPLOYING', 'SCALING', 'FAILED_SCALING', 'COOLDOWN' ] # Returns the string representation of the service state # @param [String] state String number representing the state # @return the state string def self.state_str(state_number) return STATE_STR[state_number.to_i] end def self.print(json_hash) OneGate.print_header("SERVICE " + json_hash["SERVICE"]["id"]) OneGate.print_key_value("NAME", json_hash["SERVICE"]["name"]) OneGate.print_key_value("STATE", Service.state_str(json_hash["SERVICE"]['state'])) puts roles = [json_hash['SERVICE']['roles']].flatten roles.each { |role| OneGate.print_header("ROLE " + role["name"], false) if role["nodes"] role["nodes"].each{ |node| OneGate::VirtualMachine.print(node["vm_info"]) } end puts } end end class Client def initialize(opts={}) @vmid = ENV["VMID"] @token = ENV["TOKENTXT"] url = opts[:url] || ENV['ONEGATE_ENDPOINT'] @uri = URI.parse(url) @user_agent = "OpenNebula #{CloudClient::VERSION} " << "(#{opts[:user_agent]||"Ruby"})" @host = nil @port = nil if ENV['http_proxy'] uri_proxy = URI.parse(ENV['http_proxy']) @host = uri_proxy.host @port = uri_proxy.port end end def get(path) req = Net::HTTP::Proxy(@host, @port)::Get.new(path) do_request(req) end def delete(path) req =Net::HTTP::Proxy(@host, @port)::Delete.new(path) do_request(req) end def post(path, body) req = Net::HTTP::Proxy(@host, @port)::Post.new(path) req.body = body do_request(req) end def put(path, body) req = Net::HTTP::Proxy(@host, @port)::Put.new(path) req.body = body do_request(req) end def login req = Net::HTTP::Proxy(@host, @port)::Post.new('/login') do_request(req) end def logout req = Net::HTTP::Proxy(@host, @port)::Post.new('/logout') do_request(req) end private def do_request(req) req.basic_auth @username, @password req['User-Agent'] = @user_agent req['X-ONEGATE-TOKEN'] = @token req['X-ONEGATE-VMID'] = @vmid res = CloudClient::http_start(@uri, @timeout) do |http| http.request(req) end res end end def self.parse_json(response) if CloudClient::is_error?(response) puts "ERROR: " puts response.message exit -1 else return JSON.parse(response.body) end end # Sets bold font def self.scr_bold print "\33[1m" end # Sets underline def self.scr_underline print "\33[4m" end # Restore normal font def self.scr_restore print "\33[0m" end # Print header def self.print_header(str, underline=true) if $stdout.tty? scr_bold scr_underline if underline print "%-80s" % str scr_restore else print str end puts end def self.print_key_value(key, value) puts "%-20s: %-20s" % [key, value] end def self.help_str return <<-EOT Available commands $ onegate vm show [VMID] [--json] $ onegate vm update [VMID] --data KEY=VALUE[\\nKEY2=VALUE2] $ onegate vm ACTION VMID $ onegate resume [VMID] $ onegate stop [VMID] $ onegate suspend [VMID] $ onegate delete [VMID] [--hard] $ onegate shutdown [VMID] [--hard] $ onegate reboot [VMID] [--hard] $ onegate poweroff [VMID] [--hard] $ onegate resubmit [VMID] $ onegate resched [VMID] $ onegate unresched [VMID] $ onegate hold [VMID] $ onegate release [VMID] $ onegate service show [--json] $ onegate service scale --role ROLE --cardinality CARDINALITY EOT end end require 'optparse' options = {} OptionParser.new do |opts| opts.on("-d", "--data DATA", "Data to be included in the VM") do |data| options[:data] = data end opts.on("-r", "--role ROLE", "Service role") do |role| options[:role] = role end opts.on("-c", "--cardinality CARD", "Service cardinality") do |cardinality| options[:cardinality] = cardinality end opts.on("-j", "--json", "Print resource information in JSON") do |json| options[:json] = json end opts.on("-f", "--hard", "Hard option for power off operations") do |hard| options[:hard] = hard end opts.on("-h", "--help", "Show this message") do puts OneGate.help_str exit end end.parse! client = OneGate::Client.new() case ARGV[0] when "vm" case ARGV[1] when "show" if ARGV[2] response = client.get("/vms/"+ARGV[2]) else response = client.get("/vm") end json_hash = OneGate.parse_json(response) if options[:json] puts JSON.pretty_generate(json_hash) else OneGate::VirtualMachine.print(json_hash) end when "update" if !options[:data] puts "You have to provide the data as a param (--data)" exit -1 end if ARGV[2] response = client.put("/vms/"+ARGV[2], options[:data]) else response = client.put("/vm", options[:data]) end if CloudClient::is_error?(response) puts "ERROR: " puts response.message exit -1 end when "resume", "stop", "suspend", "delete", "shutdown", "reboot", "poweroff", "resubmit", "resched", "unresched", "hold", "release" if ARGV[2] action_hash = { "action" => { "perform" => ARGV[1] } } if options[:hard] action_hash["action"]["params"] = true end response = client.post("/vms/"+ARGV[2]+"/action", action_hash.to_json) if CloudClient::is_error?(response) puts "ERROR: " puts response.message exit -1 end else puts "You have to provide a VM ID" exit -1 end else puts OneGate.help_str puts puts "Action #{ARGV[1]} not supported" exit -1 end when "service" case ARGV[1] when "show" response = client.get("/service") json_hash = OneGate.parse_json(response) #pp json_hash if options[:json] puts JSON.pretty_generate(json_hash) else OneGate::Service.print(json_hash) end when "scale" response = client.put( "/service/role/" + options[:role], { :cardinality => options[:cardinality] }.to_json) if CloudClient::is_error?(response) puts "ERROR: " puts response.message exit -1 end else puts OneGate.help_str puts puts "Action #{ARGV[1]} not supported" exit -1 end else puts OneGate.help_str exit -1 end addon-context-linux-4.14.0/base_deb/000077500000000000000000000000001253367245400172435ustar00rootroot00000000000000addon-context-linux-4.14.0/base_deb/etc/000077500000000000000000000000001253367245400200165ustar00rootroot00000000000000addon-context-linux-4.14.0/base_deb/etc/one-context.d/000077500000000000000000000000001253367245400225035ustar00rootroot00000000000000addon-context-linux-4.14.0/base_deb/etc/one-context.d/00-network000077500000000000000000000123241253367245400243410ustar00rootroot00000000000000#!/bin/bash # -------------------------------------------------------------------------- # # Copyright 2010-2014, C12G Labs S.L. # # # # Licensed 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. # #--------------------------------------------------------------------------- # # Gets IP address from a given MAC mac2ip() { mac=$1 let ip_a=0x`echo $mac | cut -d: -f 3` let ip_b=0x`echo $mac | cut -d: -f 4` let ip_c=0x`echo $mac | cut -d: -f 5` let ip_d=0x`echo $mac | cut -d: -f 6` ip="$ip_a.$ip_b.$ip_c.$ip_d" echo $ip } # Gets the network part of an IP get_network() { network=$(get_iface_var "NETWORK") if [ -z "$network" ]; then network="$(echo $IP | cut -d'.' -f1,2,3).0" fi echo $network } # Gets the network mask get_mask() { mask=$(get_iface_var "MASK") if [ -z "$mask" ]; then mask="255.255.255.0" fi echo $mask } # Gets device MTU get_mtu() { mtu=$(get_iface_var "MTU") echo $mtu } is_gateway() { if [ -z "$GATEWAY_IFACE_NUM" ]; then true else [ "$IFACE_NUM" = "$GATEWAY_IFACE_NUM" ] fi } # Gets the network gateway get_gateway() { if is_gateway; then gateway=$(get_iface_var "GATEWAY") if [ -z "$gateway" ]; then if [ "$DEV" = "eth0" ]; then net_prefix=$(echo $NETWORK | cut -d'.' -f1,2,3) gateway="${net_prefix}.1" fi fi echo $gateway fi } # Gets the network gateway6 get_gateway6() { if is_gateway; then get_iface_var "GATEWAY6" fi } get_ip() { ip=$(get_iface_var "IP") if [ -z "$ip" ]; then ip=$(mac2ip $MAC) fi echo $ip } get_iface_var() { var_name="${UPCASE_DEV}_$1" var=$(eval "echo \"\${$var_name}\"") echo $var } gen_iface_conf() { cat < /etc/network/interfaces echo "source /etc/network/interfaces.d/*.cfg" >> /etc/network/interfaces } deactivate_network() { . /etc/os-release if [ $ID = "ubuntu" ]; then IFACES=`/sbin/ifquery -la` for i in $IFACES; do if [ $i != 'lo' ]; then /sbin/ifdown $i /sbin/ip addr flush dev $i fi done else service networking stop fi } activate_network() { . /etc/os-release if [ $ID = "ubuntu" ]; then IFACES=`/sbin/ifquery -la` for i in $IFACES; do /sbin/ifup $i done else service networking stop sleep 1 service networking start fi sleep 2 } deactivate_network configure_network activate_network addon-context-linux-4.14.0/base_deb/etc/one-context.d/05-hostname000077500000000000000000000010461253367245400244720ustar00rootroot00000000000000#!/bin/bash CONFIG_FILE="/etc/hostname" function set_hostname() { NAME=$1 [ -n "$NAME" ] || exit 0 echo $NAME > $CONFIG_FILE hostname $NAME } function get_dns_name() { first_ip=$(hostname -I | cut -d' ' -f1) text=$(host $first_ip) [ $? = 0 ] || exit 0 [[ $text == *"has no PTR record" ]] && exit 0 name=$(echo "$text" | awk '{print $(NF)}' | sed 's/\.$//') echo $name } if [ -n "$SET_HOSTNAME" ]; then set_hostname $SET_HOSTNAME elif [ -n "$DNS_HOSTNAME" ]; then set_hostname $(get_dns_name) fi addon-context-linux-4.14.0/base_rpm/000077500000000000000000000000001253367245400173075ustar00rootroot00000000000000addon-context-linux-4.14.0/base_rpm/etc/000077500000000000000000000000001253367245400200625ustar00rootroot00000000000000addon-context-linux-4.14.0/base_rpm/etc/one-context.d/000077500000000000000000000000001253367245400225475ustar00rootroot00000000000000addon-context-linux-4.14.0/base_rpm/etc/one-context.d/00-network000077500000000000000000000110541253367245400244040ustar00rootroot00000000000000#!/bin/bash # -------------------------------------------------------------------------- # # Copyright 2010-2014, C12G Labs S.L. # # # # Licensed 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. # #--------------------------------------------------------------------------- # # Gets IP address from a given MAC mac2ip() { mac=$1 let ip_a=0x`echo $mac | cut -d: -f 3` let ip_b=0x`echo $mac | cut -d: -f 4` let ip_c=0x`echo $mac | cut -d: -f 5` let ip_d=0x`echo $mac | cut -d: -f 6` ip="$ip_a.$ip_b.$ip_c.$ip_d" echo $ip } # Gets the network part of an IP get_network() { network=$(get_iface_var "NETWORK") if [ -z "$network" ]; then network="$(echo $IP | cut -d'.' -f1,2,3).0" fi echo $network } # Gets the network mask get_mask() { mask=$(get_iface_var "MASK") if [ -z "$mask" ]; then mask="255.255.255.0" fi echo $mask } # Gets device MTU get_mtu() { mtu=$(get_iface_var "MTU") echo $mtu } is_gateway() { if [ -z "$GATEWAY_IFACE_NUM" ]; then true else [ "$IFACE_NUM" = "$GATEWAY_IFACE_NUM" ] fi } # Gets the network gateway get_gateway() { if is_gateway; then gateway=$(get_iface_var "GATEWAY") if [ -z "$gateway" ]; then if [ "$DEV" = "eth0" ]; then net_prefix=$(echo $NETWORK | cut -d'.' -f1,2,3) gateway="${net_prefix}.1" fi fi echo $gateway fi } # Gets the network gateway6 get_gateway6() { if is_gateway; then get_iface_var "GATEWAY6" fi } get_ip() { ip=$(get_iface_var "IP") if [ -z "$ip" ]; then ip=$(mac2ip $MAC) fi echo $ip } get_iface_var() { var_name="${UPCASE_DEV}_$1" var=$(eval "echo \"\${$var_name}\"") echo $var } gen_iface_conf() { cat < /etc/sysconfig/network-scripts/ifcfg-${DEV} ifup ${DEV} done } configure_network() { gen_network_configuration service network restart sleep 2 } configure_network addon-context-linux-4.14.0/base_rpm/etc/one-context.d/03-selinux-ssh000077500000000000000000000000341253367245400251740ustar00rootroot00000000000000restorecon -R -v /root/.ssh addon-context-linux-4.14.0/base_rpm/etc/one-context.d/05-hostname000077500000000000000000000011461253367245400245370ustar00rootroot00000000000000#!/bin/bash CONFIG_FILE="/etc/sysconfig/network" function set_hostname() { NAME=$1 [ -n "$NAME" ] || exit 0 sed -i '/^HOSTNAME=.*$/d' $CONFIG_FILE echo "HOSTNAME=$NAME" >> $CONFIG_FILE hostname $NAME } function get_dns_name() { first_ip=$(hostname -I | cut -d' ' -f1) text=$(host $first_ip) [ $? = 0 ] || exit 0 [[ $text == *"has no PTR record" ]] && exit 0 name=$(echo "$text" | awk '{print $(NF)}' | sed 's/\.$//') echo $name } if [ -n "$SET_HOSTNAME" ]; then set_hostname $SET_HOSTNAME elif [ -n "$DNS_HOSTNAME" ]; then set_hostname $(get_dns_name) fi addon-context-linux-4.14.0/generate.sh000077500000000000000000000046401253367245400176540ustar00rootroot00000000000000#!/bin/bash # -------------------------------------------------------------------------- # # Copyright 2010-2014, C12G Labs S.L. # # # # Licensed 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. # #--------------------------------------------------------------------------- # VERSION=${VERSION:-4.14.0} MAINTAINER=${MAINTAINER:-C12G Labs } LICENSE=${LICENSE:-Apache 2.0} PACKAGE_NAME=${PACKAGE_NAME:-one-context} VENDOR=${VENDOR:-C12G Labs} DESC=" This package prepares a VM image for OpenNebula: * Disables udev net and cd persistent rules * Deletes udev net and cd persistent rules * Unconfigures the network * Adds OpenNebula contextualization scripts to startup * Configure network * Configure dns (from DNS and ETH*_DNS context variables) * Set root authorized keys (from SSH_PUBLIC_KEY and EC2_PUBLIC_KEY) * Add onegate tool (NEEDS RUBY AND JSON GEM TO WORK) To get support check the OpenNebula web page: http://OpenNebula.org " DESCRIPTION=${DESCRIPTION:-$DESC} PACKAGE_TYPE=${PACKAGE_TYPE:-deb} URL=${URL:-http://opennebula.org} SCRIPTS_DIR=$PWD NAME="${PACKAGE_NAME}_${VERSION}.${PACKAGE_TYPE}" rm $NAME rm -rf tmp mkdir tmp cp -r base/* tmp cp -r base_$PACKAGE_TYPE/* tmp for i in $*; do cp -r "$i" tmp done cd tmp fpm -n "$PACKAGE_NAME" -t "$PACKAGE_TYPE" -s dir --vendor "$VENDOR" \ --license "$LICENSE" --description "$DESCRIPTION" --url "$URL" \ -m "$MAINTAINER" -v "$VERSION" --after-install $SCRIPTS_DIR/postinstall \ -a all -p $SCRIPTS_DIR/$NAME * echo $NAME addon-context-linux-4.14.0/postinstall000077500000000000000000000035121253367245400200220ustar00rootroot00000000000000#!/bin/bash # -------------------------------------------------------------------------- # # Copyright 2010-2014, C12G Labs S.L. # # # # Licensed 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. # #--------------------------------------------------------------------------- # rm -f /etc/udev/rules.d/70-persistent-cd.rules rm -f /etc/udev/rules.d/70-persistent-net.rules # Debian based distros if [ -d /etc/network ]; then # Register Service update-rc.d vmcontext defaults 9 99 # Prepare network files cp /etc/network/interfaces /etc/network/interfaces.$(date "+%s") cat > /etc/network/interfaces <