From 1c33cbaa104543d1d9deb8187cb78dc565d6f2c7 Mon Sep 17 00:00:00 2001 From: Javi Fontan Date: Wed, 2 Jul 2014 18:41:53 +0200 Subject: [PATCH] Move context packages to its own repository --- LICENSE | 202 +++++++++++++++++ README.md | 104 +++++++++ base/etc/init.d/vmcontext | 70 ++++++ base/etc/one-context.d/01-dns | 52 +++++ base/etc/one-context.d/02-ssh_public_key | 33 +++ base/etc/one-context.d/04-mount-swap | 1 + base/etc/one-context.d/99-execute-scripts | 20 ++ .../rules.d/75-cd-aliases-generator.rules | 0 .../rules.d/75-persistent-net-generator.rules | 0 base_deb/etc/one-context.d/00-network | 209 ++++++++++++++++++ base_deb/etc/one-context.d/05-hostname | 28 +++ base_rpm/etc/one-context.d/00-network | 174 +++++++++++++++ base_rpm/etc/one-context.d/03-selinux-ssh | 1 + base_rpm/etc/one-context.d/05-hostname | 29 +++ generate.sh | 63 ++++++ postinstall | 46 ++++ 16 files changed, 1032 insertions(+) create mode 100644 LICENSE create mode 100644 README.md create mode 100755 base/etc/init.d/vmcontext create mode 100755 base/etc/one-context.d/01-dns create mode 100755 base/etc/one-context.d/02-ssh_public_key create mode 100755 base/etc/one-context.d/04-mount-swap create mode 100755 base/etc/one-context.d/99-execute-scripts create mode 100644 base/etc/udev/rules.d/75-cd-aliases-generator.rules create mode 100644 base/etc/udev/rules.d/75-persistent-net-generator.rules create mode 100755 base_deb/etc/one-context.d/00-network create mode 100755 base_deb/etc/one-context.d/05-hostname create mode 100755 base_rpm/etc/one-context.d/00-network create mode 100755 base_rpm/etc/one-context.d/03-selinux-ssh create mode 100755 base_rpm/etc/one-context.d/05-hostname create mode 100755 generate.sh create mode 100755 postinstall diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + 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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..b32f0b1 --- /dev/null +++ b/README.md @@ -0,0 +1,104 @@ +# 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. + diff --git a/base/etc/init.d/vmcontext b/base/etc/init.d/vmcontext new file mode 100755 index 0000000..1e020a6 --- /dev/null +++ b/base/etc/init.d/vmcontext @@ -0,0 +1,70 @@ +#!/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") + if [ -e "/dev/disk/by-label/CONTEXT" ]; 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 + execute_scripts + fi + ;; + +esac + diff --git a/base/etc/one-context.d/01-dns b/base/etc/one-context.d/01-dns new file mode 100755 index 0000000..ee13101 --- /dev/null +++ b/base/etc/one-context.d/01-dns @@ -0,0 +1,52 @@ +#!/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 + diff --git a/base/etc/one-context.d/02-ssh_public_key b/base/etc/one-context.d/02-ssh_public_key new file mode 100755 index 0000000..cb83b2d --- /dev/null +++ b/base/etc/one-context.d/02-ssh_public_key @@ -0,0 +1,33 @@ +#!/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 diff --git a/base/etc/one-context.d/04-mount-swap b/base/etc/one-context.d/04-mount-swap new file mode 100755 index 0000000..e42ca2e --- /dev/null +++ b/base/etc/one-context.d/04-mount-swap @@ -0,0 +1 @@ +swapon -L swap diff --git a/base/etc/one-context.d/99-execute-scripts b/base/etc/one-context.d/99-execute-scripts new file mode 100755 index 0000000..06e071c --- /dev/null +++ b/base/etc/one-context.d/99-execute-scripts @@ -0,0 +1,20 @@ +#!/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 + diff --git a/base/etc/udev/rules.d/75-cd-aliases-generator.rules b/base/etc/udev/rules.d/75-cd-aliases-generator.rules new file mode 100644 index 0000000..e69de29 diff --git a/base/etc/udev/rules.d/75-persistent-net-generator.rules b/base/etc/udev/rules.d/75-persistent-net-generator.rules new file mode 100644 index 0000000..e69de29 diff --git a/base_deb/etc/one-context.d/00-network b/base_deb/etc/one-context.d/00-network new file mode 100755 index 0000000..a23bbf1 --- /dev/null +++ b/base_deb/etc/one-context.d/00-network @@ -0,0 +1,209 @@ +#!/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 the network gateway +get_gateway() { + 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 +} + +get_interfaces() { + IFCMD="/sbin/ifconfig -a" + + LANG=C + + $IFCMD | grep ^eth | sed 's/ *Link encap:Ethernet.*HWaddr /-/g' +} + +get_dev() { + echo $1 | cut -d'-' -f 1 +} + +get_mac() { + echo $1 | cut -d'-' -f 2 +} + +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 +} + +upcase() { + echo "$*" | tr '[:lower:]' '[:upper:]' +} + +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 + /sbin/ifdown $i + /sbin/ip addr flush dev $i + 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 diff --git a/base_deb/etc/one-context.d/05-hostname b/base_deb/etc/one-context.d/05-hostname new file mode 100755 index 0000000..c5f9e1d --- /dev/null +++ b/base_deb/etc/one-context.d/05-hostname @@ -0,0 +1,28 @@ +#!/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 diff --git a/base_rpm/etc/one-context.d/00-network b/base_rpm/etc/one-context.d/00-network new file mode 100755 index 0000000..74149b6 --- /dev/null +++ b/base_rpm/etc/one-context.d/00-network @@ -0,0 +1,174 @@ +#!/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 the network gateway +get_gateway() { + 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 +} + +get_interfaces() { + IFCMD="/sbin/ifconfig -a" + + $IFCMD | grep ^eth | sed 's/ *Link encap:Ethernet.*HWaddr /-/g' +} + +get_dev() { + echo $1 | cut -d'-' -f 1 +} + +get_mac() { + echo $1 | cut -d'-' -f 2 +} + +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 +} + +upcase() { + echo "$*" | tr '[:lower:]' '[:upper:]' +} + +gen_iface_conf() { + cat < /etc/sysconfig/network-scripts/ifcfg-${DEV} + + done +} + +configure_network() +{ + gen_network_configuration + + service network restart + + sleep 2 +} + +configure_network + diff --git a/base_rpm/etc/one-context.d/03-selinux-ssh b/base_rpm/etc/one-context.d/03-selinux-ssh new file mode 100755 index 0000000..164d1c1 --- /dev/null +++ b/base_rpm/etc/one-context.d/03-selinux-ssh @@ -0,0 +1 @@ +restorecon -R -v /root/.ssh diff --git a/base_rpm/etc/one-context.d/05-hostname b/base_rpm/etc/one-context.d/05-hostname new file mode 100755 index 0000000..dd43e8d --- /dev/null +++ b/base_rpm/etc/one-context.d/05-hostname @@ -0,0 +1,29 @@ +#!/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 diff --git a/generate.sh b/generate.sh new file mode 100755 index 0000000..080fefd --- /dev/null +++ b/generate.sh @@ -0,0 +1,63 @@ +#!/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.6.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) + +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 + + diff --git a/postinstall b/postinstall new file mode 100755 index 0000000..a92c146 --- /dev/null +++ b/postinstall @@ -0,0 +1,46 @@ +#!/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 <