diff --git a/LICENSE b/LICENSE deleted file mode 100644 index e69de29..0000000 diff --git a/alias_vps.sh b/alias_vps.sh new file mode 100755 index 0000000..82f4c80 --- /dev/null +++ b/alias_vps.sh @@ -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 diff --git a/delete-cores.sh b/delete-cores.sh new file mode 100755 index 0000000..6bb0663 --- /dev/null +++ b/delete-cores.sh @@ -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 diff --git a/feed_graphite_sys.pl b/feed_graphite_sys.pl deleted file mode 100644 index 7c44806..0000000 --- a/feed_graphite_sys.pl +++ /dev/null @@ -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 () { - 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 () { - 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); diff --git a/getsnap.sh b/getsnap.sh new file mode 100755 index 0000000..03634ae --- /dev/null +++ b/getsnap.sh @@ -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' + + diff --git a/perl_fastcgi.xml b/perl_fastcgi.xml deleted file mode 100644 index 968a968..0000000 --- a/perl_fastcgi.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/recursos.sh b/recursos.sh new file mode 100755 index 0000000..7c0276e --- /dev/null +++ b/recursos.sh @@ -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' diff --git a/restoresnaps.sh b/restoresnaps.sh new file mode 100755 index 0000000..bf462f3 --- /dev/null +++ b/restoresnaps.sh @@ -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} diff --git a/update_alias_vps.sh b/update_alias_vps.sh new file mode 100755 index 0000000..f570a98 --- /dev/null +++ b/update_alias_vps.sh @@ -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" diff --git a/zonebackuptofile.sh b/zonebackuptofile.sh index e3a8e98..9595629 100755 --- a/zonebackuptofile.sh +++ b/zonebackuptofile.sh @@ -2,100 +2,163 @@ 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 } -while getopts "z:d:r:l:s:t:" opt; +while getopts "z:h:p:k:n:d:" opt; do case "$opt" in z) - UUID=$OPTARG - ;; + UUID=$OPTARG + ;; + h) + HOSTNAME=$OPTARG + ;; + n) + NAME=$OPTARG + ;; + p) + PORT=$OPTARG + ;; + k) + KEY=$OPTARG + ;; 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 done 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 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 -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 -## TODO -# smb: query for username -# smb: query for password +send_snap ${UUID} + +check_multidataset + +send_config diff --git a/zonemigrate.sh b/zonemigrate.sh index a3699a9..e061d3b 100755 --- a/zonemigrate.sh +++ b/zonemigrate.sh @@ -97,20 +97,6 @@ echo "exportamos configuracion y enviamos a destino..." 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 $SSH $SERVER zfs mount ${ZONEPATH} @@ -125,13 +111,12 @@ zoneadm -z ${UUID} halt # actualizamos la zona en local para que no inicie -vmadm udpate ${UUID} autoboot=false +vmadm update ${UUID} autoboot=false # iniciamos la zona en remoto $SSH $SERVER zoneadm -z ${UUID} boot - # 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 DATASET en la zona, necesitamos iterar por el array y lanzar la funcion snapshot sobre cada uno