| @@ -0,0 +1,9 @@ | |||||
| #!/bin/bash | |||||
| UUID=$1 | |||||
| for a in $(zoneadm list -n); do | |||||
| UUID=$a | |||||
| ZONEALIAS=`zonecfg -z ${UUID} info attr name=alias | awk '$1 ~ /value:/ { print $2 }' | openssl base64 -d` | |||||
| IP=`zonecfg -z ${UUID} info net | awk '$2 ~ /ips/ { print $2 }' | awk -F\" '{ print $2 }' | sed 's/,/ /'` | |||||
| echo ${UUID} ${ZONEALIAS} ${IP} | |||||
| done | |||||
| @@ -0,0 +1,2 @@ | |||||
| #!/usr/bin/bash | |||||
| zfs list -H | grep "cores$" | grep -v "global" | awk '$2 ~ /G/ { print "find",$5,"-type f -delete"}' | /usr/bin/sh | |||||
| @@ -1,236 +0,0 @@ | |||||
| #!/usr/bin/perl | |||||
| use strict; | |||||
| use IO::Socket; | |||||
| use Data::Dumper; | |||||
| my $graphitehost = "graphite.open6hosting.com"; | |||||
| my $port = "2003"; | |||||
| my $hostname = "o6hsmartos16"; | |||||
| my $grupo = "joyent"; | |||||
| my %ipmistatus = ( | |||||
| "CPU_Temp" => "cpu_temp", | |||||
| "CPU_Temperature" => "cpu_temp", | |||||
| "CPU1_Temperature" => "cpu_temp", | |||||
| "+12V_" => "12v", | |||||
| "12V" => "12v", | |||||
| "12V_" => "12v", | |||||
| "CPU_FAN1" => "cpu_fan1", | |||||
| "CPU_FAN1_" => "cpu_fan1", | |||||
| "FAN1" => "cpu_fan1", | |||||
| "FAN1_" => "cpu_fan1", | |||||
| ); | |||||
| my %mdbstatus = ( | |||||
| "Kernel_" => "kernel", | |||||
| "Boot_pages" => "boot_pages", | |||||
| "ZFS_File_Data_" => "zfs_file", | |||||
| "Anon_" => "anon", | |||||
| "Exec_and_libs_" => "exec_and_libs", | |||||
| "Page_cache" => "page_cache", | |||||
| "Free_(cachelist)" => "free_cachelist", | |||||
| "Free_(freelist)" => "free_freelist", | |||||
| ); | |||||
| # create Socket | |||||
| my $socket = IO::Socket::INET -> new | |||||
| ( | |||||
| PeerAddr => $graphitehost, | |||||
| PeerPort => $port, | |||||
| Proto => "tcp", | |||||
| Type => SOCK_STREAM | |||||
| ) or die "Couldn't connect to $graphitehost:$port: $@ \n"; | |||||
| # enviaremos algo asi | |||||
| # print $socket "$grupo.$hostname.vfsstat.read_s $estructura{read_s} $time\n"; | |||||
| sub enviadatos ($$$$) | |||||
| { | |||||
| my $hash = shift; | |||||
| my $socket = shift; | |||||
| my $tabla = shift; | |||||
| my $tiempo = shift; | |||||
| while ( my ( $keys, $values ) = each %{$hash} ) | |||||
| { | |||||
| print $socket "$grupo.$hostname.$tabla.$keys ${$hash}{$keys} $tiempo\n"; | |||||
| } | |||||
| } | |||||
| ######## | |||||
| # | |||||
| # iostat | |||||
| # | |||||
| ######## | |||||
| # numero de dispositivos | |||||
| my $devices = `zpool list -v | grep -c "c[0-9]*" | tr -d '\n'`; | |||||
| # r/s w/s kr/s kw/s read_t write_t | |||||
| # iostat -xzr 10 2 | |||||
| # device,r/s,w/s,kr/s,kw/s,wait,actv,svc_t,%w,%b | |||||
| # sd1,27.9,0.0,111.5,0.0,0.0,0.7,24.6,0,45 | |||||
| my $captura = `iostat -xr 15 2 | awk -F, '\$1 ~ /^sd[0-8]|blkdev/ { print \$1,\$2,\$3,\$4,\$5,\$7,\$8,\$9,\$10 }' | tail -n$devices`; | |||||
| my @fields = split(" ", $captura); | |||||
| my @wcfields = @fields; | |||||
| my %estructura; | |||||
| my $disco; | |||||
| foreach (@fields) | |||||
| { | |||||
| if ( $_ =~ /^sd[0-9]|blkdev[0-9]/ ) | |||||
| { | |||||
| $disco = $_; | |||||
| shift @wcfields; | |||||
| $estructura{$disco}{r_s} = shift @wcfields; | |||||
| $estructura{$disco}{w_s} = shift @wcfields; | |||||
| $estructura{$disco}{kr_s} = shift @wcfields; | |||||
| $estructura{$disco}{kw_s} = shift @wcfields; | |||||
| if ( $estructura{$disco}{kr_s} > 0 && $estructura{$disco}{r_s} > 0 ) | |||||
| { | |||||
| $estructura{$disco}{ars} = $estructura{$disco}{kr_s} / $estructura{$disco}{r_s}; | |||||
| } | |||||
| if ( $estructura{$disco}{kw_s} > 0 && $estructura{$disco}{w_s} > 0 ) | |||||
| { | |||||
| $estructura{$disco}{awrs} = $estructura{$disco}{kw_s} / $estructura{$disco}{w_s}; | |||||
| } | |||||
| $estructura{$disco}{actv} = shift @wcfields; | |||||
| $estructura{$disco}{svc_t} = shift @wcfields; | |||||
| $estructura{$disco}{w} = shift @wcfields; | |||||
| $estructura{$disco}{b} = shift @wcfields; | |||||
| } | |||||
| } | |||||
| my $time = time(); | |||||
| foreach $disco (keys %estructura) | |||||
| { | |||||
| &enviadatos (\%{ $estructura{$disco} }, $socket, "iostat.$disco", $time); | |||||
| } | |||||
| ######## | |||||
| # | |||||
| # ziostat | |||||
| # | |||||
| ######## | |||||
| # numero de zonas | |||||
| my $zonas = `vmadm list -H state=running | wc -l | tr -d '\n'`; | |||||
| $captura = `ziostat -Z -r 15 2 | awk -F, '\$1 ~ /^[0-9]/ { print \$7,\$1,\$2,\$3,\$4,\$5,\$6 }' | tail -n$zonas`; | |||||
| @fields = split(" ", $captura); | |||||
| @wcfields = @fields; | |||||
| my %ziostat; | |||||
| my $uuid; | |||||
| foreach (@fields) | |||||
| { | |||||
| if ( $_ =~ /.*[a-z].*/ ) | |||||
| { | |||||
| $uuid = $_; | |||||
| shift @wcfields; | |||||
| $ziostat{$uuid}{r_s} = shift @wcfields; | |||||
| $ziostat{$uuid}{kr_s} = shift @wcfields; | |||||
| $ziostat{$uuid}{actv} = shift @wcfields; | |||||
| $ziostat{$uuid}{wsvc_t} = shift @wcfields; | |||||
| $ziostat{$uuid}{asvc_t} = shift @wcfields; | |||||
| $ziostat{$uuid}{b} = shift @wcfields; | |||||
| } | |||||
| } | |||||
| $time = time(); | |||||
| foreach $uuid (keys %ziostat) | |||||
| { | |||||
| &enviadatos (\%{ $ziostat{$uuid} }, $socket, "ziostat.$uuid", $time); | |||||
| } | |||||
| ######## | |||||
| # | |||||
| # zonememstat | |||||
| # | |||||
| ######## | |||||
| my $memcommand = `zonememstat -H | awk '{ print \$1,\$2,\$4,\$5,\$6 }'`; | |||||
| my %zonememstat; | |||||
| my @memfields = split(" ", $memcommand); | |||||
| my @wcmemfields = @memfields; | |||||
| my $memuuid; | |||||
| foreach (@memfields) | |||||
| { | |||||
| if ( $_ =~ /^([a-z0-9]{8}-|global)/ ) { | |||||
| $memuuid = $_; | |||||
| shift @wcmemfields; | |||||
| $zonememstat{$memuuid}{rss} = shift @wcmemfields; | |||||
| $zonememstat{$memuuid}{nover} = shift @wcmemfields; | |||||
| $zonememstat{$memuuid}{pout} = shift @wcmemfields; | |||||
| $zonememstat{$memuuid}{swap} = shift @wcmemfields; | |||||
| } | |||||
| } | |||||
| my $memtime = time(); | |||||
| foreach my $uuid (keys %zonememstat) | |||||
| { | |||||
| &enviadatos ( \%{ $zonememstat{$uuid} }, $socket, "zonememstat.$uuid", $memtime ); | |||||
| } | |||||
| ######## | |||||
| # | |||||
| # cerramos el descriptor | |||||
| # | |||||
| ######## | |||||
| shutdown($socket,2); | |||||
| ######## | |||||
| # | |||||
| # collect IPMI sensors | |||||
| # | |||||
| ######## | |||||
| my $ipmicommand = "ipmitool sdr list | sed 's/|//g' | sed 's/ /_/' | awk '\$1 ~ /CPU_Temp/ || \$1 ~ /CPU1_Temp/ || \$1 ~ /CPU_FAN1/ || \$1 ~ /^FAN1/ || \$1 ~ /12V/ { print \$1,\$2 }'"; | |||||
| open(IPMI, "$ipmicommand |") or die("Could not execute '$ipmicommand': $!"); | |||||
| while (<IPMI>) { | |||||
| my ($k, $v) = (m/([\+\w\d]*).*?(\d+(?:\.\d+)?)/); | |||||
| next unless ($k); | |||||
| if (exists $ipmistatus{$k} ) { | |||||
| system("echo -n '$grupo.$hostname.ipmi.$ipmistatus{$k} $v $time' | nc -w 0 $graphitehost $port"); | |||||
| } | |||||
| } | |||||
| close (IPMI); | |||||
| ######## | |||||
| # | |||||
| # collect memstat mdb data | |||||
| # | |||||
| ######## | |||||
| my $mdbcommand = "mdb -ke '::memstat' | sed 's/ZFS File Data/ZFS_File_Data/' | sed 's/Exec and libs/Exec_and_libs/' | sed 's/ /_/' | awk '{ print \$1,\$3 }'"; | |||||
| open(MEMSTAT, "$mdbcommand |") or die("Could not execute '$mdbcommand': $!"); | |||||
| while (<MEMSTAT>) { | |||||
| my ($k, $v) = (m/([\w_()]+)\s+?(\d+)?/); | |||||
| next unless ($k); | |||||
| if (exists $mdbstatus{$k} ) { | |||||
| system("echo '$grupo.$hostname.memstat.$mdbstatus{$k} $v $time' | nc -w 0 $graphitehost $port"); | |||||
| } | |||||
| } | |||||
| close (MEMSTAT); | |||||
| @@ -0,0 +1,62 @@ | |||||
| #!/bin/bash | |||||
| usage() | |||||
| { | |||||
| echo "Usage: $0 -z UUID -h NODE -d DIR -p PORT -i KEY -s STORAGEBOX -u USER" >&2 | |||||
| exit 1 | |||||
| } | |||||
| while getopts "z:h:d:p:i:s:u:" opt; | |||||
| do | |||||
| case "$opt" in | |||||
| z) | |||||
| UUID=$OPTARG | |||||
| ;; | |||||
| h) | |||||
| NODE=$OPTARG | |||||
| ;; | |||||
| d) | |||||
| DIR=$OPTARG | |||||
| ;; | |||||
| p) | |||||
| PORT=$OPTARG | |||||
| ;; | |||||
| i) | |||||
| KEY=$OPTARG | |||||
| ;; | |||||
| s) | |||||
| STORAGEBOX=$OPTARG | |||||
| ;; | |||||
| u) | |||||
| USER=$OPTARG | |||||
| ;; | |||||
| \?) | |||||
| echo "Error: Invalid Option: -${OPTARG}" >&2 | |||||
| usage | |||||
| ;; | |||||
| :) | |||||
| echo "Error: -${OPTARG} requires an argument." | |||||
| usage | |||||
| ;; | |||||
| *) | |||||
| usage | |||||
| ;; | |||||
| esac | |||||
| done | |||||
| shift $((OPTIND-1)) | |||||
| if [ -z "${UUID}" ] || [ -z "${NODE}" ] || [ -z "${DIR}" ] || [ -z "${PORT}" ] || [ -z "${KEY}" ] || [ -z "${STORAGEBOX}" ] || [ -z "${USER}" ]; then | |||||
| usage | |||||
| fi | |||||
| VPS=$UUID | |||||
| #ssh -p ${PORT} -i ${KEY} -l ${USER} ${STORAGEBOX} ls -hl ${DIR}/${NODE}/${VPS}/${VPS}.zfs | awk '{ print "size;"$5",date;"$7,$6,$8 }' | tr -d '\n' | |||||
| SIZE="$(ssh -p ${PORT} -i ${KEY} -l ${USER} ${STORAGEBOX} du -h ${DIR}/${NODE}/${VPS}/${VPS}.zfs | awk '{ print $1 }' | tr -d '\n')" | |||||
| DATE="$(ssh -p ${PORT} -i ${KEY} -l ${USER} ${STORAGEBOX} ls -l ${DIR}/${NODE}/${VPS}/${VPS}.zfs | awk '{ print $7,$6,$8 }' | tr -d '\n')" | |||||
| echo "size; ${SIZE},date; ${DATE}" | tr -d '\n' | |||||
| @@ -1,32 +0,0 @@ | |||||
| <?xml version='1.0'?> | |||||
| <!DOCTYPE service_bundle SYSTEM '/usr/share/lib/xml/dtd/service_bundle.dtd.1'> | |||||
| <service_bundle type='manifest' name='export'> | |||||
| <service name='perl/fastcgi' type='service' version='0'> | |||||
| <create_default_instance enabled='true'/> | |||||
| <single_instance/> | |||||
| <dependency name='network' grouping='require_all' restart_on='error' type='service'> | |||||
| <service_fmri value='svc:/milestone/network:default'/> | |||||
| </dependency> | |||||
| <dependency name='filesystem-local' grouping='require_all' restart_on='none' type='service'> | |||||
| <service_fmri value='svc:/system/filesystem/local:default'/> | |||||
| </dependency> | |||||
| <exec_method name='start' type='method' exec='%{app} -l %{address}:%{port} -n %{procs} -p %{pidfile} -e -d' timeout_seconds='60'/> | |||||
| <exec_method name='stop' type='method' exec='kill `cat %{pidfile}`' timeout_seconds='60'/> | |||||
| <property_group name='application' type='application'> | |||||
| <propval name='app' type='astring' value='/data/www/open6hosting.com/web/o6h/script/o6h_fastcgi.pl'/> | |||||
| <propval name='address' type='astring' value='127.0.0.1'/> | |||||
| <propval name='port' type='astring' value='8986'/> | |||||
| <propval name='procs' type='astring' value='5'/> | |||||
| <propval name='pidfile' type='astring' value='/var/run/o6h_fastcgi.pid'/> | |||||
| </property_group> | |||||
| <template> | |||||
| <common_name> | |||||
| <loctext xml:lang='C'>Open6Hosting WEBAPP daemon</loctext> | |||||
| </common_name> | |||||
| </template> | |||||
| </service> | |||||
| </service_bundle> | |||||
| @@ -0,0 +1,38 @@ | |||||
| #!/bin/bash | |||||
| usage() | |||||
| { | |||||
| echo "Usage: $0 -z UUID" >&2 | |||||
| exit 1 | |||||
| } | |||||
| while getopts "z:" opt; | |||||
| do | |||||
| case "$opt" in | |||||
| z) | |||||
| UUID=$OPTARG | |||||
| ;; | |||||
| \?) | |||||
| echo "Error: Invalid Option: -${OPTARG}" >&2 | |||||
| usage | |||||
| ;; | |||||
| :) | |||||
| echo "Error: -${OPTARG} requires an argument." | |||||
| usage | |||||
| ;; | |||||
| *) | |||||
| usage | |||||
| ;; | |||||
| esac | |||||
| done | |||||
| shift $((OPTIND-1)) | |||||
| if [ -z "${UUID}" ]; then | |||||
| usage | |||||
| fi | |||||
| VPS=$UUID | |||||
| zonememstat -Hz ${VPS} | awk '{ print "uso:"$2",ram:"$3",swap:"$6 }' | tr -d '\n' | |||||
| @@ -0,0 +1,127 @@ | |||||
| #!/bin/bash | |||||
| usage() | |||||
| { | |||||
| echo "Usage: $0 [ -n NODE ] [ -z UUID ] [ -h hostname ] [ -p port ] [ -k KEY ] [ -d dir ] [ -u user ]" >&2 | |||||
| exit 1 | |||||
| } | |||||
| while getopts "n:z:h:p:k:d:u:" opt; | |||||
| do | |||||
| case "$opt" in | |||||
| n) | |||||
| NODE=$OPTARG | |||||
| ;; | |||||
| z) | |||||
| UUID=$OPTARG | |||||
| ;; | |||||
| h) | |||||
| HOSTNAME=$OPTARG | |||||
| ;; | |||||
| p) | |||||
| PORT=$OPTARG | |||||
| ;; | |||||
| k) | |||||
| KEY=$OPTARG | |||||
| ;; | |||||
| d) | |||||
| DIR=$OPTARG | |||||
| ;; | |||||
| u) | |||||
| USER=$OPTARG | |||||
| ;; | |||||
| \?) | |||||
| echo "Error: Invalid Option: -${OPTARG}" >&2 | |||||
| usage | |||||
| ;; | |||||
| :) | |||||
| echo "Error: -${OPTARG} requires an argument." | |||||
| usage | |||||
| ;; | |||||
| *) | |||||
| usage | |||||
| ;; | |||||
| esac | |||||
| done | |||||
| shift $((OPTIND-1)) | |||||
| if [ -z "${UUID}" ] || [ -z "${NODE}" ] || [ -z ${HOSTNAME} ] || [ -z ${PORT} ] || [ -z ${KEY} ] || [ -z "${DIR}" ] || [ -z "${USER}" ]; then | |||||
| usage | |||||
| fi | |||||
| SSH="ssh -i $KEY -p ${PORT} -l ${USER} -o StrictHostKeyChecking=no" | |||||
| SCP="scp -q -i $KEY -P ${PORT} -o StrictHostKeyChecking=no" | |||||
| DSTDIR="${DIR}/${UUID}" | |||||
| ################# | |||||
| # functions | |||||
| ################# | |||||
| check_err() | |||||
| { | |||||
| STATUS=$? | |||||
| if [ ${STATUS} -ne 0 ]; then | |||||
| echo "Unexpected error: ${STATUS}" | |||||
| exit ${STATUS} | |||||
| fi | |||||
| } | |||||
| remove_vps() | |||||
| { | |||||
| VPS=$1 | |||||
| echo "Deleteing VPS ${VPS}..." | |||||
| vmadm destroy ${VPS} | |||||
| check_err | |||||
| echo "...done." | |||||
| } | |||||
| recover_dataset() | |||||
| { | |||||
| VPS=$1 | |||||
| echo "Recovering VPS ${VPS}..." | |||||
| ${SSH} ${HOSTNAME} "dd if=${DIR}/${NODE}/${VPS}/${VPS}.zfs bs=4M" | /usr/sbin/zfs receive zones/${VPS} | |||||
| check_err | |||||
| echo "...done." | |||||
| } | |||||
| recover_config() | |||||
| { | |||||
| VPS=$1 | |||||
| echo "Recovering config from backup..." | |||||
| ${SCP} ${USER}@${HOSTNAME}:${DIR}/${NODE}/${VPS}/${VPS}.cfg /zones/tools/descargas/ | |||||
| cat /zones/tools/descargas/${VPS}.cfg | zonecfg -z ${VPS} | |||||
| check_err | |||||
| echo "...done." | |||||
| } | |||||
| final_steps() | |||||
| { | |||||
| VPS=$1 | |||||
| echo "Attaching dataset..." | |||||
| zoneadm -z ${VPS} attach | |||||
| check_err | |||||
| echo "...done." | |||||
| echo "Booting VPS..." | |||||
| zoneadm -z ${VPS} boot | |||||
| check_err | |||||
| echo "...done." | |||||
| } | |||||
| ################# | |||||
| # main | |||||
| ################# | |||||
| echo "--- | |||||
| BACKUP_SERVER: ${HOSTNAME} | |||||
| UUID to restore: ${UUID} | |||||
| ---" | |||||
| remove_vps ${UUID} | |||||
| recover_config ${UUID} | |||||
| recover_dataset ${UUID} | |||||
| final_steps ${UUID} | |||||
| @@ -0,0 +1,6 @@ | |||||
| #!/bin/bash | |||||
| UUID=$1 | |||||
| ALIAS=$2 | |||||
| NEWALIAS=`echo ${ALIAS} | tr -d '\n' | openssl base64` | |||||
| zonecfg -z ${UUID} "select attr name=alias; set value=\"${NEWALIAS}\";end" | |||||
| @@ -2,100 +2,163 @@ | |||||
| usage() | usage() | ||||
| { | { | ||||
| echo "Usage: $0 -z UUID -d days -r remote_folder -l local_folder -s server -t type" >&2 | |||||
| echo "ex: $0 -z bbba5ecb-5bda-47a5-e103-a6bfa368bf68 -d 1 -r remote_folder -l /zone/tools/nfsshare -s 192.168.5.243 -t nfs" >&2 | |||||
| echo "Usage: $0 [ -z UUID ] [ -h hostname ] [ -p port ] [ -k KEY ] [ -n name ] [ -d dir ]" >&2 | |||||
| exit 1 | exit 1 | ||||
| } | } | ||||
| while getopts "z:d:r:l:s:t:" opt; | |||||
| while getopts "z:h:p:k:n:d:" opt; | |||||
| do | do | ||||
| case "$opt" in | case "$opt" in | ||||
| z) | z) | ||||
| UUID=$OPTARG | |||||
| ;; | |||||
| UUID=$OPTARG | |||||
| ;; | |||||
| h) | |||||
| HOSTNAME=$OPTARG | |||||
| ;; | |||||
| n) | |||||
| NAME=$OPTARG | |||||
| ;; | |||||
| p) | |||||
| PORT=$OPTARG | |||||
| ;; | |||||
| k) | |||||
| KEY=$OPTARG | |||||
| ;; | |||||
| d) | d) | ||||
| DAYS=$OPTARG | |||||
| ;; | |||||
| r) | |||||
| RFOLDER=$OPTARG | |||||
| ;; | |||||
| l) | |||||
| LFOLDER=$OPTARG | |||||
| ;; | |||||
| s) | |||||
| SERVER=$OPTARG | |||||
| ;; | |||||
| t) | |||||
| TYPE=$OPTARG | |||||
| ;; | |||||
| DIR=$OPTARG | |||||
| ;; | |||||
| \?) | |||||
| echo "Error: Invalid Option: -${OPTARG}" >&2 | |||||
| usage | |||||
| ;; | |||||
| :) | |||||
| echo "Error: -${OPTARG} requires an argument." | |||||
| usage | |||||
| ;; | |||||
| *) | *) | ||||
| usage | |||||
| ;; | |||||
| usage | |||||
| ;; | |||||
| esac | esac | ||||
| done | done | ||||
| shift $((OPTIND-1)) | shift $((OPTIND-1)) | ||||
| if [ -z "${UUID}" || -z "${DAYS}" || -z "${RFOLDER}" || -z "${LFOLDER}" || -z "${SERVER}" && -z "${TYPE}" ]; then | |||||
| if [ -z "${UUID}" ] || [ -z "${HOSTNAME}" ] || [ -z ${PORT} ] || [ -z ${KEY} ] || [ -z "${NAME}" ] || [ -z "${DIR}" ]; then | |||||
| usage | usage | ||||
| fi | fi | ||||
| BRAND=`/usr/sbin/vmadm get $UUID | json brand | tr -d '\n'` | |||||
| SSH="ssh -i $KEY -p ${PORT} -o StrictHostKeyChecking=no" | |||||
| DSTDIR="${DIR}/${NAME}" | |||||
| mkdir -p $LFOLDER | |||||
| ################# | |||||
| # functions | |||||
| ################# | |||||
| if [ $TYPE = "nfs" ]; then | |||||
| OVH="/export/ftpbackup/${RFOLDER}" | |||||
| mount $SERVER:$OVH $LFOLDER | |||||
| create_snap() | |||||
| { | |||||
| DATASET=$1 | |||||
| echo "Creating snapshot of ${DATASET}..." | |||||
| /usr/sbin/zfs snapshot zones/${DATASET}@`date +%Y%m%d` | |||||
| check_err | |||||
| echo "...done." | |||||
| } | |||||
| if [ $? != 0 ]; then | |||||
| echo "MOUNT FAILED." | |||||
| umount $LFOLDER | |||||
| exit | |||||
| fi | |||||
| elif [ $TYPE = "smb" ]; then | |||||
| mount -F smbfs //o6h.smartos5:c0c0l1s0@${SERVER}/${RFOLDER} $LFOLDER | |||||
| send_snap() | |||||
| { | |||||
| DATASET=$1 | |||||
| echo "Sending snapshot of ${DATASET}..." | |||||
| if [ $? != 0 ]; then | |||||
| echo "MOUNT FAILED." | |||||
| exit | |||||
| # taking care for additional datasets | |||||
| SLASH=`echo ${DATASET} | grep -c '/'` | |||||
| if [ ${SLASH} -ne 0 ]; then | |||||
| RENAME=`echo ${DATASET} | sed 's/\//-/'` | |||||
| /usr/sbin/zfs send zones/${DATASET}@`date +%Y%m%d` | ${SSH} ${HOSTNAME} "dd of=${DSTDIR}/${UUID}/${RENAME}.zfs bs=4M" | |||||
| else | |||||
| /usr/sbin/zfs send zones/${DATASET}@`date +%Y%m%d` | ${SSH} ${HOSTNAME} "dd of=${DSTDIR}/${DATASET}/${DATASET}.zfs bs=4M" | |||||
| fi | fi | ||||
| fi | |||||
| mkdir -p $LFOLDER/$UUID | |||||
| check_err | |||||
| echo "...done." | |||||
| } | |||||
| if [ $? != 0 ]; then | |||||
| echo "FAIL TO CREATE FOLDER $UUID." | |||||
| umount $LFOLDER | |||||
| exit | |||||
| fi | |||||
| check_snap() | |||||
| { | |||||
| ZONE=$1 | |||||
| echo "Checking for snapshot of ${ZONE}..." | |||||
| zfs list -t snapshot zones/${ZONE}@`date +%Y%m%d` 2>/dev/null 1>&2 | |||||
| } | |||||
| # mantain backups of the last N days | |||||
| #find $LFOLDER/$UUID -type f -mtime +$DAYS -delete | |||||
| check_err() | |||||
| { | |||||
| STATUS=$? | |||||
| if [ ${STATUS} -ne 0 ]; then | |||||
| echo "Unexpected error: ${STATUS}" | |||||
| exit ${STATUS} | |||||
| fi | |||||
| } | |||||
| snapshot() | |||||
| send_config() | |||||
| { | { | ||||
| /usr/sbin/zfs snapshot zones/$1@`date +%Y%m%d` | |||||
| /usr/sbin/zfs send zones/$1@`date +%Y%m%d` > $LFOLDER/$UUID/$1@`date +%Y%m%d` | |||||
| echo "Sending config to ${HOSTNAME}..." | |||||
| zonecfg -z ${UUID} export | ${SSH} ${HOSTNAME} "dd of=${DSTDIR}/${UUID}/${UUID}.cfg" | |||||
| check_err | |||||
| echo "...done." | |||||
| } | } | ||||
| snapshot $UUID | |||||
| create_dir() | |||||
| { | |||||
| echo "Creating directory at ${HOSTNAME}..." | |||||
| ${SSH} ${HOSTNAME} mkdir -p ${DSTDIR}/${UUID} | |||||
| check_err | |||||
| echo "...done." | |||||
| } | |||||
| if [ $BRAND = "kvm" ] | |||||
| then | |||||
| snapshot ${UUID}-disk0 | |||||
| elif [ $BRAND = "bhyve" ] | |||||
| then | |||||
| snapshot ${UUID}/disk0 | |||||
| fi | |||||
| check_multidataset() | |||||
| { | |||||
| echo "Looking for addtional children datasets in ${UUID}..." | |||||
| DATASET=`vmadm get ${UUID} | json datasets.0 | sed 's/zones\///' | tr -d '\n'` | |||||
| echo "...done." | |||||
| if [ ! -z "${DATASET}" ]; then | |||||
| echo "Finded children dataset: ${DATASET}" | |||||
| check_snap ${DATASET} | |||||
| if [ $? -ne 0 ]; then | |||||
| create_snap ${DATASET} | |||||
| else | |||||
| echo "Snapshot of ${DATASET} already available" | |||||
| echo "Skipping create snapshot..." | |||||
| fi | |||||
| send_snap ${DATASET} | |||||
| else | |||||
| echo "No children datasets finded." | |||||
| fi | |||||
| } | |||||
| /usr/sbin/zonecfg -z $UUID export > $LFOLDER/$UUID/$UUID.`date +%Y%m%d`.cfg | |||||
| ################# | |||||
| # main | |||||
| ################# | |||||
| if [ $TYPE = "nfs" ]; then | |||||
| umount $LFOLDER | |||||
| echo "--- | |||||
| BACKUP_SERVER: ${HOSTNAME} | |||||
| UUID to backup: ${UUID} | |||||
| ---" | |||||
| create_dir ${UUID} | |||||
| check_snap ${UUID} | |||||
| if [ $? -ne 0 ]; then | |||||
| create_snap ${UUID} | |||||
| else | |||||
| echo "Snapshot of ${UUID} already available" | |||||
| echo "...done." | |||||
| fi | fi | ||||
| ## TODO | |||||
| # smb: query for username | |||||
| # smb: query for password | |||||
| send_snap ${UUID} | |||||
| check_multidataset | |||||
| send_config | |||||
| @@ -97,20 +97,6 @@ echo "exportamos configuracion y enviamos a destino..." | |||||
| zonecfg -z ${UUID} export | $SSH $SERVER "zonecfg -z ${UUID}" | zonecfg -z ${UUID} export | $SSH $SERVER "zonecfg -z ${UUID}" | ||||
| # modificamos de acuerdo a la config de datacenter remoto | |||||
| echo "modificamos config de acuerdo a datacenter remoto..." | |||||
| echo " | |||||
| select net physical=eth0 | |||||
| clear vlan-id | |||||
| set global-nic=v/100 | |||||
| add property (name=mtu,value="1200") | |||||
| remove property (name=gateway,value="194.53.148.1") | |||||
| remove property (name=gateways,value="194.53.148.1") | |||||
| add property (name=gateway,value="194.53.148.2") | |||||
| add property (name=gateways,value="194.53.148.2") | |||||
| end" | $SSH $SERVER "zonecfg -z ${UUID}" | |||||
| # montamos el dataset | # montamos el dataset | ||||
| $SSH $SERVER zfs mount ${ZONEPATH} | $SSH $SERVER zfs mount ${ZONEPATH} | ||||
| @@ -125,13 +111,12 @@ zoneadm -z ${UUID} halt | |||||
| # actualizamos la zona en local para que no inicie | # actualizamos la zona en local para que no inicie | ||||
| vmadm udpate ${UUID} autoboot=false | |||||
| vmadm update ${UUID} autoboot=false | |||||
| # iniciamos la zona en remoto | # iniciamos la zona en remoto | ||||
| $SSH $SERVER zoneadm -z ${UUID} boot | $SSH $SERVER zoneadm -z ${UUID} boot | ||||
| # TODO: | # TODO: | ||||
| # - puede haber mas de un FILESYSTEM en la zona, necesitamos iterar por el array y lanzar la funcion snapshot sobre cada uno de ellos | # - puede haber mas de un FILESYSTEM en la zona, necesitamos iterar por el array y lanzar la funcion snapshot sobre cada uno de ellos | ||||
| # - puede haber mas de un DATASET en la zona, necesitamos iterar por el array y lanzar la funcion snapshot sobre cada uno | # - puede haber mas de un DATASET en la zona, necesitamos iterar por el array y lanzar la funcion snapshot sobre cada uno | ||||