Skip to content
This repository has been archived by the owner on Oct 30, 2018. It is now read-only.

Commit

Permalink
Add command templates and initial support for EC2
Browse files Browse the repository at this point in the history
  • Loading branch information
higebu committed Dec 20, 2016
1 parent 78411f0 commit 6449dd3
Show file tree
Hide file tree
Showing 14 changed files with 240 additions and 65 deletions.
17 changes: 17 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@

*.status
*.log
*.substvars

COPYING
INSTALL
build-stamp
config
config.guess
config.sub
configure
Makefile
Makefile.in
debian/files
debian/vyos-cloudinit
aclocal.m4
19 changes: 11 additions & 8 deletions Makefile.am
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
cfgdir = $(datadir)/vyatta-cfg/templates
opdir = $(datadir)/vyatta-op/templates
curverdir = $(sysconfdir)/config-migrate/current
bin_sudo_usersdir = $(bindir)/sudo-users
initddir = /etc/init.d
sysconfdir = /opt/vyatta/etc/vyos-cloudinit

vprefix = /opt/vyatta
vsbindir = $(vprefix)/sbin
initd_SCRIPTS =
initd_SCRIPTS += etc/init.d/vyos-cloudinit

sbin_SCRIPTS =
sbin_SCRIPTS += scripts/vyos-cloudinit

bin_sudo_users_SCRIPTS =

curver_DATA =
sysconf_DATA =
sysconf_DATA += sysconf/vyos-cloudinit/vyos-cloudinit.conf
sysconf_DATA += sysconf/vyos-cloudinit/ec2.conf

cpiop = find . ! -regex '\(.*~\|.*\.bak\|.*\.swp\|.*\#.*\#\)' -print0 | \
cpio -0pd

install-exec-hook:
mkdir -p $(DESTDIR)$(cfgdir)
cd templates-cfg; $(cpiop) $(DESTDIR)$(cfgdir)
20 changes: 18 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,23 @@

vyos-cloudinit enables a user to customize VyOS machines by providing either a VyOS config document or an executable script through user-data.

## Configuration with vyos-config
## Configuration

```
set service cloudinit environment ec2
```

or

```
set service cloudinit ssh-user <user name>
set service cloudinit ssh-key <ssh key url>
set service cloudinit user-data <user data url>
```

## User data

### Configuration with vyos-config

vyos-cloudinit doesn't support cloud-init spec, but supports VyOS config spec.

Expand All @@ -15,7 +31,7 @@ system {
}
```

## Executing a Script
### Executing a Script

vyos-cloudinit supports executing user-data as a script instead of parsing it as a VyOS config document.

Expand Down
7 changes: 7 additions & 0 deletions debian/changelog
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
vyos-cloudinit (0.1.0) unstable; urgency=low

* Add command templates.
* Initial support for EC2.

-- Yuya Kusakabe <[email protected]> Tue, 20 Dec 2016 12:41:22 +0900

vyos-cloudinit (0.0.1) unstable; urgency=low

* Initial release.
Expand Down
53 changes: 53 additions & 0 deletions etc/init.d/vyos-cloudinit
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
#!/bin/sh
### BEGIN INIT INFO
# Provides: vyos-cloudinit
# Required-Start: vyatta-router
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop:
# Short-Description: Merge user VyOS config or run user script.
# Description: Merge user VyOS config or run user script.
### END INIT INFO

. /lib/lsb/init-functions

: ${vyatta_env:=/etc/default/vyatta}
source $vyatta_env

ENVIRONMENT=""
SSH_USER="vyos"
SSH_KEY=""
USER_DATA=""

conf_dir="${vyatta_sysconfdir}/vyos-cloudinit"

. ${conf_dir}/vyos-cloudinit.conf

log_action_begin_msg "Starting vyos-cloudinit"
if [ -n "${ENVIRONMENT}" ]; then
env_conf=${conf_dir}/${ENVIRONMENT}.conf
if [ -f ${env_conf} ]; then
. ${env_conf}
else
echo "${ENVIRONMENT} is not supported"
fi
fi

# override with user specified parameters
. ${conf_dir}/vyos-cloudinit.conf

code=0
if [[ -z "${SSH_KEY}" && -z "${USER_DATA}" ]]; then
log_action_msg "both ssh-key and user-data are not specified"
elif [[ -n "${SSH_KEY}" && -z "${USER_DATA}" ]]; then
${vyatta_sbindir}/vyos-cloudinit -u "${SSH_USER}" -s "${SSH_KEY}"
code=$?
elif [[ -z "${SSH_KEY}" && -n "${USER_DATA}" ]]; then
${vyatta_sbindir}/vyos-cloudinit -u "${SSH_USER}" -d "${USER_DATA}"
code=$?
elif [[ -n "${SSH_KEY}" && -n "${USER_DATA}" ]]; then
${vyatta_sbindir}/vyos-cloudinit -u "${SSH_USER}" -s "${SSH_KEY}" -d "${USER_DATA}"
code=$?
fi

log_action_end_msg $code
23 changes: 0 additions & 23 deletions examples/etc/init.d/vyos-cloudinit

This file was deleted.

128 changes: 96 additions & 32 deletions scripts/vyos-cloudinit
Original file line number Diff line number Diff line change
@@ -1,49 +1,113 @@
#!/bin/vbash

usage() {
cat <<EOF
Usage: $0 [options...]
-s ssh key path
-u ssh user
-d user data path
-h show this message
EOF
exit 1
}

SSH_KEY=""
SSH_USER="vyos"
USER_DATA=""
while getopts e:s:u:d:h: OPT
do
case $OPT in
s) SSH_KEY=$OPTARG;;
u) SSH_USER=$OPTARG;;
d) USER_DATA=$OPTARG;;
h) usage;;
\?) usage;;
esac
done

if [[ -z "${SSH_KEY}" && -z "${USER_DATA}" ]]; then
usage
fi

: ${vyatta_env:=/etc/default/vyatta}
source $vyatta_env

LOAD_KEY="${vyatta_sbindir}/vyatta-load-user-key.pl"
LOAD_CONFIG="${vyatta_sbindir}/vyatta-load-config.pl"

if [ $# -ne 1 ]; then
echo "user-data path is required."
exit 1
fi
USER_DATA="$1"
code=0

_exit=exit
source ${vyatta_sysconfdir}/functions/script-template

function load_key() {
echo "loading ssh key..."
${LOAD_KEY} ${SSH_USER} ${SSH_KEY}
code=$?
}

if [[ -n "${SSH_KEY}" && "${SSH_KEY}" == "http"* ]]; then
/usr/bin/curl -m 3 -sf "${SSH_KEY}"
if [ $? -ne 0 ]; then
echo "could not retrieve ssh key from ${SSH_KEY}"
code=1
else
load_key
fi
elif [[ -n "${SSH_KEY}" ]]; then
load_key
fi

if [[ -z "${USER_DATA}" ]]; then
$_exit $code
fi

tmpfiles=""
if [[ "${USER_DATA}" == "http"* ]]; then
tmp=$(mktemp /tmp/XXXXXX-user-data)
tmpfiles=$tmp
/usr/bin/curl -m 3 -sf "${USER_DATA}" -o ${tmp}
if [ $? -ne 0 ]; then
echo "could not retrieve user-data from ${USER_DATA}"
code=1
fi
USER_DATA="${tmp}"
fi

header=$(head -n1 ${USER_DATA})

if [ "${header}" = "#vyos-config" ]; then
tmpfile=$(mktemp /tmp/XXXXXX-user-data)
output=$(mktemp /tmp/XXXXXX-output)
tail -n +2 ${USER_DATA} > ${tmpfile}
echo Y | python -c 'import pty, sys; pty.spawn(sys.argv[1:])' ${LOAD_CONFIG} ${tmpfile} --merge > ${output}
result=$(cat ${output} | tail -n +5 | head -n -1)
grep -q fail ${output}
code=$?
if [ ${code} -eq 0 ]; then
echo "merge failed"
echo "${result}"
code=1
else
commit
save
code=0
fi
elif [ "${header}" = "#!/bin/vbash" ]; then
chmod +x ${USER_DATA}
result=$(${USER_DATA})
code=$?
if [ ${code} -ne 0 ]; then
echo "user script failed"
echo "${result}"
fi
if [[ "${header}" == "#vyos-config" ]]; then
echo "merging VyOS config..."
tmp=$(mktemp /tmp/XXXXXX-config)
tmpfiles="${tmpfiles} ${tmp}"
output=$(mktemp /tmp/XXXXXX-output)
tail -n +2 ${USER_DATA} > ${tmp}
echo Y | python -c 'import pty, sys; pty.spawn(sys.argv[1:])' ${LOAD_CONFIG} ${tmpfile} --merge > ${output}
result=$(cat ${output} | tail -n +5 | head -n -1)
grep -q fail ${output}
code=$?
if [ ${code} -eq 0 ]; then
echo "merge failed"
echo "${result}"
code=1
else
commit
save
code=0
fi
elif [[ "${header}" == "#!/bin/vbash" ]]; then
echo "running user script..."
chmod +x ${USER_DATA}
result=$(${USER_DATA})
code=$?
if [[ ${code} -ne 0 ]]; then
echo "user script failed"
echo "${result}"
fi
fi

if [ ${code} -eq 0 ]; then
rm -f $tmpfile $output
if [[ ${code} -eq 0 ]]; then
rm -f $tmpfiles $output
fi

$_exit $code
3 changes: 3 additions & 0 deletions sysconf/vyos-cloudinit/ec2.conf
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
SSH_USER="vyos"
SSH_KEY="http://169.254.169.254/latest/meta-data/public-keys/0/openssh-key"
USER_DATA="http://169.254.169.254/latest/user-data"
Empty file.
8 changes: 8 additions & 0 deletions templates-cfg/service/cloudinit/environment/node.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
type: txt
help: Environment
syntax:expression: exec "[ -f /opt/vyatta/etc/vyos-cloudinit/$VAR(@).conf ]"
; "$VAR(@) is not supported"
allowed: sudo ls -1 /opt/vyatta/etc/vyos-cloudinit/ | sed 's/.conf//' | grep -v vyos-cloudinit
create: sudo sh -c "echo ENVIRONMENT=$VAR(@) >> /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"
update: sudo sh -c "sed -i '/^ENVIRONMENT=/c/ENVIRONMENT=$VAR(@)/' /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"
delete: sudo sh -c "sed -i '/ENVIRONMENT=/d' /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"
4 changes: 4 additions & 0 deletions templates-cfg/service/cloudinit/node.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
priority: 400
help: Cloud init
create: sudo /usr/sbin/update-rc.d vyos-cloudinit defaults
delete: sudo /usr/sbin/update-rc.d -f vyos-cloudinit remove
6 changes: 6 additions & 0 deletions templates-cfg/service/cloudinit/ssh-key/node.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
type: txt
help: SSH key URL
syntax:expression: pattern $VAR(@) "^[^!]+$" ; "SSH key URL must not be null and must not contain '!'"
create: sudo sh -c "echo SSH_KEY=$VAR(@) >> /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"
update: sudo sh -c "sed -i '/^SSH_KEY=/c/SSH_KEY=$VAR(@)/' /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"
delete: sudo sh -c "sed -i '/SSH_KEY=/d' /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"
11 changes: 11 additions & 0 deletions templates-cfg/service/cloudinit/ssh-user/node.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
type: txt
help: SSH user

syntax:expression: exec "cli-shell-api exists system login user $VAR(@)"
; "$VAR(@) does not exist"
allowed: list=`cli-shell-api listNodes system login user`
echo $list

create: sudo sh -c "echo SSH_USER=$VAR(@) >> /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"
update: sudo sh -c "sed -i '/^SSH_USER=/c/SSH_USER=$VAR(@)/' /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"
delete: sudo sh -c "sed -i '/SSH_USER=/d' /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"
6 changes: 6 additions & 0 deletions templates-cfg/service/cloudinit/user-data/node.def
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
type: txt
help: User Data URL
syntax:expression: pattern $VAR(@) "^[^!]+$" ; "user-data URL must not be null and must not contain '!'"
create: sudo sh -c "echo USER_DATA=$VAR(@) >> /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"
update: sudo sh -c "sed -i '/^USER_DATA=/c/USER_DATA=$VAR(@)/' /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"
delete: sudo sh -c "sed -i '/USER_DATA=/d' /opt/vyatta/etc/vyos-cloudinit/vyos-cloudinit.conf"

0 comments on commit 6449dd3

Please sign in to comment.