summaryrefslogtreecommitdiffstats
path: root/os-plugins/plugins/vmgrid/files
diff options
context:
space:
mode:
authorSebastian Schmelzer2010-09-02 17:50:49 +0200
committerSebastian Schmelzer2010-09-02 17:50:49 +0200
commit416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5 (patch)
tree4715f7d742fec50931017f38fe6ff0a89d4ceccc /os-plugins/plugins/vmgrid/files
parentFix for the problem reported on the list (sed filter forgotten for the (diff)
downloadcore-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.tar.gz
core-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.tar.xz
core-416ab8a37f1b07dc9f6c0fb3ff1a8ff2036510b5.zip
change dir structure
Diffstat (limited to 'os-plugins/plugins/vmgrid/files')
-rw-r--r--os-plugins/plugins/vmgrid/files/run-vmgrid.sh430
-rw-r--r--os-plugins/plugins/vmgrid/files/vmgrid154
2 files changed, 0 insertions, 584 deletions
diff --git a/os-plugins/plugins/vmgrid/files/run-vmgrid.sh b/os-plugins/plugins/vmgrid/files/run-vmgrid.sh
deleted file mode 100644
index 51cb5dbc..00000000
--- a/os-plugins/plugins/vmgrid/files/run-vmgrid.sh
+++ /dev/null
@@ -1,430 +0,0 @@
-#!/bin/bash
-# -----------------------------------------------------------------------------
-# Copyright (c) 2010 - RZ Uni FR
-# Copyright (c) 2010 - OpenSLX GmbH
-#
-# This program is free software distributed under the GPL version 2.
-# See http://openslx.org/COPYING
-#
-# If you have any feedback please consult http://openslx.org/feedback and
-# send your suggestions, praise, or complaints to feedback@openslx.org
-#
-# General information about OpenSLX can be found at http://openslx.org/
-# -----------------------------------------------------------------------------
-# vmgrid
-# - This is the generic wrapper for the several virtualization solutions...
-################################################################################
-
-. /etc/opt/openslx/openslx.conf
-
-################################################################################
-### Define default dirs / get configs
-################################################################################
-
-PLUGINCONFROOT=${OPENSLX_DEFAULT_CONFDIR}/plugins
-PLUGINCONFVMGRID=${PLUGINCONFROOT}/vmgrid
-RWSHARE=/var/opt/openslx/plugins/vmgrid/share
-# include general configuration from vmgrid
-[ -f ${PLUGINCONFVMGRID}/vmgrid.conf ] && \
- . ${PLUGINCONFVMGRID}/vmgrid.conf
-# load general virtualization information
-[ -f ${PLUGINCONFROOT}/virtualization/virtualization.conf ] && \
- . ${PLUGINCONFROOT}/virtualization/virtualization.conf
-# get the vmchooser_active var
-[ -f ${PLUGINCONFROOT}/vmchooser/vmchooser.conf ] && \
- . ${PLUGINCONFROOT}/vmchooser/vmchooser.conf
-
-################################################################################
-### Functions used throughout the script
-################################################################################
-
-# function to write to stdout and logfile
-LOGFILE=${OPENSLX_DEFAULT_LOGDIR}/run-vmgrid.${USER}.$$.log
-writelog () {
- # write to stdout
- echo -e "$1"
- # log into file
- echo -e "$1" >> ${LOGFILE}
- # log into share dir, so that log is available in vm as well
- echo -e "$1" >> ${vmgrid_rwmnt}/logs/run-vmgrid.${USER}.$$.log
-}
-
-# remove config dirs when exit
-cleanexit () {
- if echo "${RMDIRS}" 2>/dev/null | grep -q ${vmgrid_virt}; then
- writelog "${vmgrid_virt} exited. Cleanning up... \c"
- rm -rf ${RMDIRS} >/dev/null 2>&1
- writelog "done"
- fi
-
- exit "$1"
-}
-
-################################################################################
-### Get XML file and dir
-################################################################################
-
-# check if mem, nice or graphical mode set
-headless=1
-unice=19
-while [ $# -gt 0 ]; do
- case "$1" in
- -h|--help)
- echo -e "Usage: run-vmgrid.sh [-g] [--mem <memory size in MB>] \c"
- echo -e "[--nice <nice level>] [/path/]filename[.xml]"
- exit
- ;;
- -g)
- headless=0
- ;;
- --mem)
- # get a result which can be divided through 4
- if echo $2 | grep -qE \
- '^[2-9][0-9][0-9]$|^[1-9][0-9][0-9][0-9]$|^1[0-9][0-9][0-9][0-9]$';
- then
- forcemem=$(expr $2 / 4 \* 4)
- else
- echo "memory $2 not supported (200-19999)!"
- exit 1
- fi
- shift
- ;;
- --nice)
- # set nice level
- if echo $2 | grep -qE '^-[1-9]$|-1[0-9]$|^-20$|^[0-9]$|^1[0-9]$'; then
- unice=$2
- else
- echo "nice level $2 does not exist!"
- exit 1
- fi
- shift
- ;;
- *)
- xmlfile=$@
- break
- ;;
- esac
- shift
-done
-
-# absolute or relative path?
-if ls ${xmlfile} 2>/dev/null | grep '/' >/dev/null 2>&1; then
- xmlpath=$(dirname ${xmlfile})
- xmlfile=$(basename ${xmlfile})
-else
- xmlpath=${vmgrid_xmlpath}
-fi
-# full path
-xmlfile="${xmlpath}/${xmlfile%.xml}.xml"
-
-################################################################################
-### Sanity checks
-################################################################################
-
-# test if the xml file is valid
-if ! [ -r "${xmlfile}" ]; then
- writelog "${xmlfile} not a readable XML file!"
- run-vmgrid.sh -h &
- exit 1
-fi
-
-# start to log, create shrare log dir
-mkdir -m 1777 -p ${vmgrid_rwmnt}/logs
-echo "Starting to log at $(date)" \
- >${vmgrid_rwmnt}/logs/run-vmgrid.${USER}.$$.log
-
-# test how many instances running
-runningvms=$(ps aux | grep "run-vmgrid.sh " | grep -v grep | wc -l)
-# 2 steps, /w only one is seems not to work
-runningvms=$(expr ${runningvms} - 1)
-# if Xen use different method
-if [ "${vmgrid_virt}" = "xen" ]; then
- runningvms=$(xm list 2>/dev/null | grep -vE "Domain-0|Name.*ID" | wc -l)
- runningvms=$(expr ${runningvms} + 1)
-fi
-# check value
-if [ ${runningvms} -le 0 ]; then
- writelog "Error in value: Running VMs: ${runningvms}. Exit!"
- exit 1
-fi
-# check if vmchooser plugin installed
-if [ -n "${vmchooser_active}" ] && [ ${runningvms} -gt 1 ]; then
- # only allow one instance of vmgrid
- writelog "Already 1 VMs running and vmchooser plugin is active."
- writelog "Can't start ${xmlfile}, exiting!"
- exit 1
-# else allow max. 4 instances
-elif [ ${runningvms} -gt 4 ]; then
- writelog "Already 4 VMs running, exiting!"
- exit 1
-fi
-VM_ID="0${runningvms}"
-
-# test if XML file
-if ! grep '<?xml' "${xmlfile}" >/dev/null 2>&1; then
- writelog \
- "Submitted configuration file ${xmlfile} seems to have wrong XML format"
- exit 1
-fi
-
-################################################################################
-### Logo for console
-################################################################################
-
-cat <<EOL
- __ __
- .----.--.--.-----.___.--.--.--------.-----.----.|__|.--| |
- | _| | | |___| | | | _ | _|| || _ |
- |__| |_____|__|__| \___/|__|__|__|___ |__| |__||_____|
- |_____|
- OpenSLX virtual machine environment preparation script ...
-
-EOL
-
-################################################################################
-### Read needed variables from XML file
-################################################################################
-
-writelog "Starting configuration..."
-writelog "\tVM-ID:\t\t\t${VM_ID}"
-writelog "\tLogfile:\t\t${OPENSLX_DEFAULT_LOGDIR}/run-vmgrid.${USER}.$$.log"
-writelog "\t/tmp info:\t\t$(df -h | grep " /tmp$" | awk '{print $2}') \c"
-writelog "$(grep "/tmp " /proc/mounts | awk '{print $1" "$2" "$3" "$4}')"
-writelog "\tVM XML dir:\t\t$(dirname ${xmlfile})"
-writelog "\tXML file:\t\t${xmlfile}"
-writelog "VM config:"
-
-# name of the virt image or dir
-imgname=$(grep -io '<image_name param=.*"' ${xmlfile} \
- | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
-
-# image mode
-imgmode=$(grep -io '<image_mode param=.*"' ${xmlfile} \
- | sed -e "s/&.*;/; /g" | awk -F '"' '{ print $2 }')
-
-# get boot attr
-boot=$(grep -io 'boot param=.*"' ${xmlfile} | awk -F '"' '{ print $2 }')
-diskless=0
-
-# special rw image
-if [ "${imgmode}" = "rwimg" ]; then
- # maybe you want to use an empty rw imgae?
- # define only for writelog, will be set in the plugin include again!
- vmpath="{special rw image}"
- # add new path for rwimg
- imgpath=${vmgrid_rwmnt}/specialrwimages
- unset $imgname
- mkdir -m 1777 -p ${imgpath}
-# diskless boot
-elif [ "${boot}" = "n" ] && [ -z "${imgname}" ]; then
- diskless=1
- vmpath="{diskless boot}"
-# imagename /w full path
-elif echo ${imgname} 2>/dev/null | grep -q '^/' >/dev/null 2>&1; then
- imgpath=$(dirname ${imgname})
- imgname=$(basename ${imgname})
- vmpath=${imgpath}/${imgname}
-# get path from var
-else
- imgpath=${vmgrid_imgpath}
- vmpath=${imgpath}/${imgname}
-fi
-
-# check if virtual machine container file exists, only if not rwimg
-if ! [ -e "${vmpath}" ] && [ "${imgmode}" != "rwimg" ] && [ ${diskless} -eq 0 ];
-then
- writelog "Virtual machine image or directory ${vmpath} not found!"
- exit 1
-fi
-
-# name of the virt machine, sed because of Windows formatting
-vm_name=$(grep -o 'short_description param=.*"' ${xmlfile} \
- | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
-# if ${vm_name} not defined use ${xmlfile}
-vm_name=${vm_name:-${xmlfile%.xml}}
-
-# define vm_shortname since vm_name can be very long
-vm_shortname=$(basename ${xmlfile%.xml} | sed -e "s, ,-,g")
-
-# vm_name = displayname, define for old scripts
-displayname=${vm_name}
-
-[ "${imgmode}" != "rwimg" ] && [ ${diskless} -eq 0 ] \
- && writelog "\tVM Image dir:\t\t${imgpath}"
-writelog "\tVM file/dir:\t\t$vmpath"
-
-# is there an additional configuration provided?
-additional_config=$(grep -o 'additional_config param=.*"' ${xmlfile} \
- | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
-
-# image is for the following virtual machine
-xmlvirt=$(grep -o 'virtualmachine param=.*"' ${xmlfile} \
- | sed -e "s/&.*;/; /g" | awk -F '"' '{print $2}')
-
-# make a guess from the filename extension if ${xmlvirt} is empty
-# (not set within the XML file)
-# TODO: implement possibility to submit own configuration files
-if [ -z "${xmlvirt}" ] && [ -n "${additional_config}" ]; then
- writelog "No virtual machine parameter defined in ${xmlfile}"
- writelog "Trying to guess VM...\c"
- case "$(cat ${additional_config} | tr [A-Z] [a-z])" in
- *config.version*|*virtualhw.version*|*independent-nonpersistent*|*vmdk*)
- xmlvirt="vmware"
- ;;
- *innotek*|*virtualbox*)
- xmlvirt="virtualbox"
- ;;
- *qemu*|*kvm*)
- xmlvirt="qemukvm"
- ;;
- *)
- xmlvirt="none"
- ;;
- esac
-elif [ -z "${xmlvirt}" ]; then
- case "$(echo ${imgname##*.} | tr [A-Z] [a-z])" in
- vmdk)
- xmlvirt="vmware"
- ;;
- vbox)
- xmlvirt="virtualbox"
- ;;
- img|qcow*)
- xmlvirt="qemukvm"
- ;;
- *)
- xmlvirt="none"
- ;;
- esac
- writelog "result:\t${xmlvirt}"
-fi
-
-# check for virt
-if [ "${vmgrid_virt}" != "${xmlvirt}" ]; then
- writelog "The virtual machine specified in ${xmlfile}"
- writelog "does not match the virtualization used here (${vmgrid_virt})"
- exit 1
-fi
-
-# definition of the client system
-vmostype=$(grep -io '<os param=.*"' ${xmlfile} | awk -F '"' '{ print $2 }' \
- | tr [A-Z] [a-z])
-
-# definition of the networking the client system is connected to
-network_kind=$(grep -io '<network param=.*"' ${xmlfile} \
- | awk -F '"' '{ print $2 }' | tr [A-Z] [a-z])
-network_card=$(grep -io '<netcard param=.*"' ${xmlfile} \
- | awk -F '"' '{ print $2 }'| tr [A-Z] [a-z])
-
-# define redirects
-redirects=$(grep -ic '<redirect name=.*"' ${xmlfile})
-[ -z "${redirects}" ] && redirects=0
-(( i=1 ))
-while [ ${i} -le ${redirects} ]; do
- # get only the $i-th line
- redirect_name[$i]=$(grep -m ${i} -io '<redirect.*' ${xmlfile} | tail -n 1 \
- | grep -o "name=\".*" | awk -F '"' '{ print $2 }')
- redirect_proto[$i]=$(grep -m ${i} -io '<redirect.*' ${xmlfile} | tail -n 1 \
- | grep -o "proto=\".*" | awk -F '"' '{ print $2 }')
- redirect_hport[$i]=$(grep -m ${i} -io '<redirect.*' ${xmlfile} | tail -n 1 \
- | grep -o "hostport=\".*" | awk -F '"' '{ print $2 }')
- redirect_gport[$i]=$(grep -m ${i} -io '<redirect.*' ${xmlfile} | tail -n 1 \
- | grep -o "guestport=\".*" | awk -F '"' '{ print $2 }')
- (( i=$i+1 ))
-done
-
-writelog "\tVirtualization:\t\t$xmlvirt"
-writelog "\tVM name:\t\t$vm_name"
-writelog "\tVM short name:\t\t$vm_shortname"
-
-###############################################################################
-### Declaration of default variables
-###############################################################################
-
-# make sure cpu_cores is not empty
-cpu_cores=${cpu_cores:-"1"}
-#vmgrid::maxvcpus
-#vmgrid::minvcpus
-# check for CPU virtualization flags
-#vmgrid::vt
-
-# total amount of memory defined in stage 3
-permem=60
-# get a result which can be divided through 4
-mem=$(expr ${totalmem} / 100 \* ${permem} / 4 \* 4)
-#vmgrid::maxmem
-#vmgrid::minmem
-
-# configuring ethernet mac address: first 3 bytes are fixed (00:50:56)
-# 4th byte is the VM-ID
-# last two bytes are taken from the bridge of the host
-# define one MAC per guest
-macguestpart="00:50:56:${VM_ID}"
-machostpart=$(echo ${hostmacaddr} | awk -F ":" '{print $(NF-1)":"$NF}')
-macaddr=$(echo "${macguestpart}:${machostpart}" | tr [a-z] [A-Z])
-
-# ide is expected default, test for the virtual disk image type should
-# be done while creating the runscripts ...
-# TODO: cdrom / floppy?
-ide="TRUE"
-scsi="FALSE"
-hddrv="ide"
-cdrom0="FALSE"
-audio="false"
-remotedesktopport="590${VM_ID}"
-
-# add rw share
-sharepath="${vmgrid_rwmnt}/folders/${vm_shortname}"
-mkdir -p ${sharepath}
-chmod -f 1777 "${vmgrid_rwmnt}/folders"
-sharename="share"
-
-# set hostname: using original hostname and adding string
-hostname="vmgrid${VM_ID}-$(hostname)"
-
-writelog "\tVM Hostname:\t\t$hostname"
-
-################################################################################
-### Setup the rest of the environment and run the configured vm
-################################################################################
-
-# Copy guest configuration (with added information) config.xml to be accessed
-# via virtual floppy
-# TODO: virt-floppy needed?
-
-# Get all virtual machine specific stuff from the respective include file
-if [ -e ${PLUGINCONFROOT}/${vmgrid_virt}/run-virt.include ] ; then
- writelog "Starting ${vmgrid_virt} specific part ..."
- self=${vmgrid_virt}
- . ${PLUGINCONFROOT}/${vmgrid_virt}/run-virt.include
-else
- writelog "Failed because of missing ${vmgrid_virt} plugin"
- exit 1
-fi
-
-# start graphical mode
-if [ ${headless} -eq 0 ]; then
- if [ -z "${VIRTCMD}" ]; then
- writelog "Grapical mode not available, exiting!"
- cleanexit 1
- fi
- writelog "Starting ${vmgrid_virt} in graphical mode /w nice level ${unice}..."
- # start /w low nice level
- nice -n ${unice} ${VIRTCMD} ${VIRTCMDOPTS} 2>/dev/null
-# start headless
-elif [ -n "${VIRTCMDHL}" ]; then
- writelog "Starting ${vmgrid_virt} in headless mode /w nice level ${unice}..."
- # start /w low nice level
- nice -n ${unice} ${VIRTCMDHL} ${VIRTCMDOPTSHL} 2>/dev/null
-else
- writelog "${vmgrid_virt}: No headless mode defined, exiting!"
- cleanexit 1
-fi
-
-# postrun for scripts after virtualization finishes
-if [ -n "${POSTRUN}" ]; then
- eval ${POSTRUN} >/dev/null 2>&1
-fi
-
-cleanexit 0
-exit 0
diff --git a/os-plugins/plugins/vmgrid/files/vmgrid b/os-plugins/plugins/vmgrid/files/vmgrid
deleted file mode 100644
index 2bb91481..00000000
--- a/os-plugins/plugins/vmgrid/files/vmgrid
+++ /dev/null
@@ -1,154 +0,0 @@
-#!/bin/bash
-# -----------------------------------------------------------------------------
-# Copyright (c) 2010 - RZ Uni FR
-# Copyright (c) 2010 - OpenSLX GmbH
-#
-# This program is free software distributed under the GPL version 2.
-# See http://openslx.org/COPYING
-#
-# If you have any feedback please consult http://openslx.org/feedback and
-# send your suggestions, praise, or complaints to feedback@openslx.org
-#
-# General information about OpenSLX can be found at http://openslx.org/
-# -----------------------------------------------------------------------------
-# vmgrid
-# - Script for autostarts defined in vmgrid::startvms
-################################################################################
-
-# include default directories
-. /etc/opt/openslx/openslx.conf
-
-################################################################################
-### Manual Start
-################################################################################
-
-if [ -n "$1" ]; then
- if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
- echo -e "Usage: vmgrid [[-g] [--mem <memory size in MB>] \c"
- echo -e "[--nice <nice level>] [/path/]filename[.xml]]"
- exit 0
- else
- echo "Starting run-vmgrid.sh with options '$@'"
- run-vmgrid.sh $@ 2>/dev/null
- exit
- fi
-fi
-
-################################################################################
-### Define default dirs / get configs
-################################################################################
-
-PLUGINCONFROOT=${OPENSLX_DEFAULT_CONFDIR}/plugins
-PLUGINCONFDIR=${PLUGINCONFROOT}/vmgrid
-RWSHARE=/var/opt/openslx/plugins/vmgrid/share
-# include general configuration from vmgrid
-[ -f ${PLUGINCONFDIR}/vmgrid.conf ] && \
- . ${PLUGINCONFDIR}/vmgrid.conf
-# load general virtualization information
-[ -f ${PLUGINCONFROOT}/virtualization/virtualization.conf ] && \
- . ${PLUGINCONFROOT}/virtualization/virtualization.conf
-
-################################################################################
-### Functions used throughout the script
-################################################################################
-
-# function to write to stdout and logfile
-writelog () {
- # write to stdout
- echo -e "$1"
- # log into file
- echo -e "$1" >> ${OPENSLX_DEFAULT_LOGDIR}/vmgrid.${USER}.$$.log
- # log into share dir, so that log is available in vm as well
- echo -e "$1" >> ${vmgrid_rwmnt}/logs/vmgrid.${USER}.$$.log
-}
-
-################################################################################
-### Configure VMs for autostart and set RAM
-################################################################################
-
-# start to log, create share log dir
-mkdir -m 1777 -p ${vmgrid_rwmnt}/logs
-mkdir -m 1777 -p /tmp/vmgrid
-mkdir -p /tmp/vmgrid/${USER}
-echo "Starting to log at $(date)" \
- >${vmgrid_rwmnt}/logs/vmgrid.${USER}.$$.log
-
-if [ -z "${hostratio}" ]; then
- writelog "There has been an error in the memory configuration in stage 3"
- writelog "Please check your memory ratio settings, exiting!"
- exit 1
-fi
-
-if [ -z "${hostratio}" ]; then
- writelog "There has been an error in the memory configuration in stage 3"
- writelog "Please check your memory ratio settings, exiting!"
- exit 1
-fi
-
-# remove blanks
-vmgrid_startvms=$(echo ${vmgrid_startvms} | sed -e "s, *,,g")
-vmgrid_memratio=$(echo ${vmgrid_memratio} | sed -e "s, *,,g")
-
-# hostmem, mainvirt from virtualization plugin
-# ratio minus other vms and host
-restratio=$(expr 100 - ${hostratio} - ${mainvirtratio})
-
-# hostmem, totalmem, mainvirtmem from virtualization plugin
-# calculate freemem
-freemem=$(expr ${totalmem} - ${hostmem} - ${mainvirtmem} 2>/dev/null)
-if [ ${freemem} -lt 512 2>/dev/null ]; then
- writelog "Not enough free RAM for this plugin, free: ${freemem} MB"
- exit 1
-fi
-
-# get clients mem ratio
-vmsumratios=0
-for i in {1..4}; do
- vm[$i]=$(echo ${vmgrid_startvms} | awk -F ',' '{print $1}')
- # remove ${vm[$i]} from list because of '{print $1}'
- vmgrid_startvms=$(echo ${vmgrid_startvms} | sed -e "s,${vm[$i]}\,*,,")
- vmratio[$i]=$(echo ${vmgrid_memratio} | awk -F ',' '{print $1}')
- # remove ${vmratio[$i]} from list because of '{print $1}'
- vmgrid_memratio=$(echo ${vmgrid_memratio} | sed -e "s/${vmratio[$i]},*//")
- vmsumratios=$(expr ${vmsumratios} + ${vmratio[$i]} 2>/dev/null)
-done
-
-for i in {1..4}; do
- # calculate VMs mem: mem = $freemem * $vmratio/100 * 100/$restratio
- # multiple of 4
- vmmem[$i]=$(expr ${freemem} \* ${vmratio[$i]} / ${restratio} / 4 \* 4 \
- 2>/dev/null)
- if [ -n "${vm[$i]}" ] && [ ${vmmem[$i]} -lt 512 2>/dev/null ]; then
- writelog "Not enough free RAM for ${vm[$i]} (min. 512 MB), \c"
- writelog "free: ${vmmem[$i]} MB"
- unset vm[$i]
- fi
-done
-
-################################################################################
-### Start the VMs
-################################################################################
-
-# start vms
-for i in {1..4}; do
- if [ -n "${vm[$i]}" ]; then
- alreadyrunning=$(ps aux | grep run-vmgrid.sh | grep -v grep \
- | grep "${vm[$i]}" | wc -l)
- # if Xen use different method
- if [ "${vmgrid_virt}" = "xen" ]; then
- alreadyrunning=$(xm list 2>/dev/null | grep -vE "Domain-0|Name.*ID" \
- | grep "${vm[$i]}-0.$" | wc -l)
- fi
- if [ ${alreadyrunning} -gt 0 2>/dev/null ]; then
- writelog "${vm[$i]} already running, skipping!"
- else
- writelog "Starting ${vm[$i]} via run-vmgrid.sh with ${vmmem[$i]} MB RAM"
- run-vmgrid.sh --mem ${vmmem[$i]} ${vm[$i]} 2>/dev/null &
- echo $! > /tmp/vmgrid/${USER}/vmgrid.pids
- # wait 10 secs for the next vm to start
- sleep 10
- fi
- fi
-done
-
-exit 0