This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
snapshot_backup [2011/09/20 20:48] k2patel |
snapshot_backup [2011/09/23 15:28] k2patel [backup.sh] |
||
---|---|---|---|
Line 20: | Line 20: | ||
* delete_snap.pl # Delete Snapshot which is out of retention. | * delete_snap.pl # Delete Snapshot which is out of retention. | ||
- | ==== C0D3s ==== | + | ===== C0D3s ===== |
- | === config === | + | ==== config ==== |
<code bash | config > | <code bash | config > | ||
Line 32: | Line 32: | ||
</code> | </code> | ||
- | === db.pl === | + | ==== bash config ==== |
+ | <code bash | config_bash> | ||
+ | # this file contain what need to be backup. | ||
+ | # Follow the format of value | ||
+ | # instance<serial number must be unique> = <Volume ID> <Retention Freq.> <total Retention> | ||
+ | |||
+ | instance1="vol-2222pqrs 7 2" | ||
+ | instance2="vol-1111abcd 1 1" | ||
+ | </code> | ||
+ | |||
+ | ==== db.pl ==== | ||
<code perl | db.pl > | <code perl | db.pl > | ||
Line 99: | Line 109: | ||
</code> | </code> | ||
- | === backup.sh === | + | ==== backup.sh ==== |
+ | |||
+ | <code bash | backup.sh> | ||
+ | #!/bin/bash | ||
+ | |||
+ | # developed by k2patel | ||
+ | # k2patel@hotmail.com | ||
+ | |||
+ | ############# Read ME ############### | ||
+ | # this Script will do the Backup and remove old copy. | ||
+ | # This script work based on existing DB Entry. | ||
+ | # When you initialize it only create one copy rest of the dummy entry need to be entered by you. | ||
+ | ##################################### | ||
+ | |||
+ | source config_bash | ||
+ | |||
+ | BASE="$( cd "$( dirname "$0" )" && pwd )" | ||
+ | cd $BASE | ||
+ | DATE=$(date +%Y%m%d) | ||
+ | perl=$(which perl) | ||
+ | |||
+ | |||
+ | for inst in instance{1..10} | ||
+ | do | ||
+ | eval var1=\$$inst | ||
+ | arry=($var1) | ||
+ | if [[ $1 == "init" ]]; then | ||
+ | if [ "$var1" != "" ] | ||
+ | then | ||
+ | vol=${arry[0]} | ||
+ | echo "Running backup for $vol stored in " | ||
+ | newsnp=`$perl create_snap.pl $vol $DATE` | ||
+ | $perl db.pl add $vol $newsnp $DATE | ||
+ | echo "waiting." | ||
+ | $perl snap_status.pl $newsnp | ||
+ | echo "done" | ||
+ | fi | ||
+ | else | ||
+ | if [ "$var1" != "" ] | ||
+ | then | ||
+ | freq=${arry[1]} | ||
+ | vol=${arry[0]} | ||
+ | iter=${arry[2]} | ||
+ | lookup=$(echo "$iter * $freq" | bc) | ||
+ | isit=`date -d "now -$lookup days" +%Y%m%d` | ||
+ | isit_nxt=`date -d "now -$freq days" +%Y%m%d` | ||
+ | lstnc=(`$perl $BASE/db.pl get "$vol" "$isit"`) | ||
+ | if [ "$isit" == "${lstnc[1]}" ];then | ||
+ | echo "Running backup for $vol stored in " | ||
+ | newsnp=`$perl create_snap.pl $vol $DATE` | ||
+ | $perl db.pl add $vol $newsnp $DATE | ||
+ | echo "waiting." | ||
+ | $perl snap_status.pl $newsnp | ||
+ | echo "done" | ||
+ | lstnx=(`$perl $BASE/db.pl get "$vol" "$isit_nxt"`) | ||
+ | if [ "${lstnx[0]}" == '' ]; then | ||
+ | echo "Notify Admin" | ||
+ | else | ||
+ | if [ "${lstnc[0]}" != '' ]; then | ||
+ | $perl delete_snap.pl ${lstnc[0]} | ||
+ | fi | ||
+ | fi | ||
+ | else | ||
+ | echo "backup is not needed" | ||
+ | fi | ||
+ | fi | ||
+ | fi | ||
+ | done | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ==== create snapshot ==== | ||
+ | |||
+ | <code perl | create_snap.pl> | ||
+ | #!/usr/bin/perl -w | ||
+ | # Created / written by k2patel@hotmail.com | ||
+ | # this script create snapshot for given volume. | ||
+ | |||
+ | use Data::Dumper; | ||
+ | use strict; | ||
+ | #use Date::Calc qw( :all ); | ||
+ | |||
+ | use lib "/usr/share/perl5/vendor_perl"; | ||
+ | use Net::Amazon::EC2; | ||
+ | |||
+ | # Configuration. | ||
+ | require "config"; | ||
+ | |||
+ | # our $ec2; | ||
+ | our $awsId; | ||
+ | our $awsKey; | ||
+ | our $awsinstance; | ||
+ | |||
+ | my($num_args) = $#ARGV + 1; | ||
+ | if ($num_args < 2) { | ||
+ | print "\nUsage: create_snap.pl <Volume_ID> <Today>\n"; | ||
+ | print "This will create Snapshot for given Volume\n"; | ||
+ | print "Format for today's Date must be \"YYYYMMDD\"\n"; | ||
+ | exit 1; | ||
+ | } | ||
+ | |||
+ | ## Define Access Keys for Amazon. | ||
+ | my $ec2 = Net::Amazon::EC2->new( | ||
+ | AWSAccessKeyId => $awsId, | ||
+ | SecretAccessKey => $awsKey | ||
+ | ); | ||
+ | |||
+ | my @result = $ec2->create_snapshot( | ||
+ | VolumeId => $ARGV[0], | ||
+ | Description => $ARGV[1] | ||
+ | ); | ||
+ | |||
+ | print $result[0]->{snapshot_id}; | ||
+ | #print Dumper \@result; | ||
+ | </code> | ||
+ | |||
+ | ==== delete shnapshot ==== | ||
+ | <code perl | delete_snap.pl> | ||
+ | # This script delete snapshot of requested volume | ||
+ | # Author : k2patel <k2patel@hotmail.com> | ||
+ | # Please send me message for suggestion or update. | ||
+ | |||
+ | # this script delete snapshot | ||
+ | |||
+ | use Data::Dumper; | ||
+ | use strict; | ||
+ | #use Date::Calc qw( :all ); | ||
+ | |||
+ | use lib "/usr/share/perl5/vendor_perl"; | ||
+ | use Net::Amazon::EC2; | ||
+ | |||
+ | # Configuration. | ||
+ | require "config"; | ||
+ | |||
+ | # our $ec2; | ||
+ | our $awsId; | ||
+ | our $awsKey; | ||
+ | our $awsinstance; | ||
+ | |||
+ | my($num_args) = $#ARGV + 1; | ||
+ | if ($num_args < 1) { | ||
+ | print "\nUsage: delete_snap.pl <Snapshot_ID>\n"; | ||
+ | print "This will Delete Snapshot\n"; | ||
+ | exit 1; | ||
+ | } | ||
+ | |||
+ | ## Define Access Keys for Amazon. | ||
+ | my $ec2 = Net::Amazon::EC2->new( | ||
+ | AWSAccessKeyId => $awsId, | ||
+ | SecretAccessKey => $awsKey | ||
+ | ); | ||
+ | |||
+ | my @result = $ec2->delete_snapshot( | ||
+ | SnapshotId => $ARGV[0] | ||
+ | ); | ||
+ | |||
+ | |||
+ | if ( $result[0] eq 1 ){ | ||
+ | #print "Good to go \n"; | ||
+ | exit 0; | ||
+ | }else{ | ||
+ | my $err = Dumper \@result; | ||
+ | open F,">./rnd895896"; | ||
+ | print F $err; | ||
+ | close F; | ||
+ | if(system ("/bin/mail -s \"ERROR : Dump Of Error\" k2patel\@hotmail.com < ./rnd895896") == 0){ | ||
+ | unlink "./rnd895896"; | ||
+ | } | ||
+ | exit 1; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Check Snapshot status ==== | ||
+ | <code perl | snap_status.pl > | ||
+ | # This script check status of given snapshot and wait for it get completed. | ||
+ | # Author : k2patel <k2patel@hotmail.com> | ||
+ | # Please send me message for suggestion or update. | ||
+ | |||
+ | |||
+ | use Data::Dumper; | ||
+ | use strict; | ||
+ | #use Date::Calc qw( :all ); | ||
+ | |||
+ | use lib "/usr/share/perl5/vendor_perl"; | ||
+ | use Net::Amazon::EC2; | ||
+ | |||
+ | # Configuration. | ||
+ | require "config"; | ||
+ | |||
+ | # our $ec2; | ||
+ | our $awsId; | ||
+ | our $awsKey; | ||
+ | our $awsinstance; | ||
+ | |||
+ | my($num_args) = $#ARGV + 1; | ||
+ | if ($num_args < 1) { | ||
+ | print "\nUsage: snap_status.pl <Snapshot_ID>\n"; | ||
+ | print "This will check Snapshot Status\n"; | ||
+ | exit 1; | ||
+ | } | ||
+ | |||
+ | ## Define Access Keys for Amazon. | ||
+ | my $ec2 = Net::Amazon::EC2->new( | ||
+ | AWSAccessKeyId => $awsId, | ||
+ | SecretAccessKey => $awsKey | ||
+ | ); | ||
+ | |||
+ | my @result = $ec2->describe_snapshots( | ||
+ | SnapshotId => $ARGV[0] | ||
+ | ); | ||
+ | |||
+ | while ( $result[0][0]->{status} ne 'completed' ){ | ||
+ | sleep 10; | ||
+ | } | ||
+ | |||
+ | if ( $result[0][0]->{status} eq 'completed' ){ | ||
+ | my $tst = "Good to go \n"; | ||
+ | exit 0; | ||
+ | }else{ | ||
+ | my $err = Dumper \@result; | ||
+ | open F,">./rnd892346"; | ||
+ | print F $err; | ||
+ | close F; | ||
+ | if(system ("/bin/mail -s \"ERROR : Dump Of Error\" k2patel\@hotmail.com < ./rnd892346") == 0){ | ||
+ | unlink "./rnd892346"; | ||
+ | } | ||
+ | exit 1; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | ==== Machine DB ==== | ||
+ | |||
+ | <code bash> | ||
+ | sqlite3 machine.db | ||
+ | </code> | ||
+ | |||
+ | <code sql | machine.db> | ||
+ | PRAGMA foreign_keys=OFF; | ||
+ | BEGIN TRANSACTION; | ||
+ | CREATE TABLE DESK ( v_ID, s_ID, Dte ); | ||
+ | </code> | ||