document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/pygment_trac.css" />');
document.write('<link rel="stylesheet" href="http://flowcoder.com/stylesheets/embed.css" />');
document.write('<div class="flowcoder_post flowcoder_clearfix">');
document.write('<div class="flowcoder_posttitle"><a href=\"http://flowcoder.com/154\">off-site backup to Amazon EBS using dirvish<\/a></div>');
document.write('<div class="flowcoder_postbody flowcoder_syntax"><div class=\"highlight\"><pre><span class=\"c\">#!/usr/bin/env python -t<\/span>\n<span class=\"c\"># encoding: utf-8<\/span>\n<span class=\"c\"># origin:   http://overt.org/2010/02/15/off-site-backup-for-010gb-using-dirvish-and-amazon-ec2-and-ebs/<\/span>\n<span class=\"sd\">&quot;&quot;&quot;<\/span>\n<span class=\"sd\">run_offsite_backups.py<\/span>\n<span class=\"sd\"> <\/span>\n<span class=\"sd\">Wake up the EC2 backup server, run dirvish backup, then shut it down<\/span>\n<span class=\"sd\"> <\/span>\n<span class=\"sd\">Created by Bryan Klingner (code.b@overt.org) on 2010-02-02.<\/span>\n<span class=\"sd\">Feel free to use this code yourself. Maybe email me if you do :)<\/span>\n<span class=\"sd\">&quot;&quot;&quot;<\/span>\n \n<span class=\"kn\">import<\/span> <span class=\"nn\">sys<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">os<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">boto<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">time<\/span>\n<span class=\"kn\">import<\/span> <span class=\"nn\">subprocess<\/span>\n \n<span class=\"n\">BACKUP_INSTANCE_ID<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&#39;YOUR_INSTANCE_ID&#39;<\/span>\n \n<span class=\"k\">def<\/span> <span class=\"nf\">main<\/span><span class=\"p\">():<\/span>\n \n    <span class=\"n\">conn<\/span> <span class=\"o\">=<\/span> <span class=\"n\">boto<\/span><span class=\"o\">.<\/span><span class=\"n\">connect_ec2<\/span><span class=\"p\">()<\/span>\n \n    <span class=\"c\"># get the backup instance object<\/span>\n    <span class=\"n\">instance<\/span> <span class=\"o\">=<\/span> <span class=\"n\">conn<\/span><span class=\"o\">.<\/span><span class=\"n\">get_all_instances<\/span><span class=\"p\">(<\/span><span class=\"n\">instance_ids<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"n\">BACKUP_INSTANCE_ID<\/span><span class=\"p\">,))[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span><span class=\"o\">.<\/span><span class=\"n\">instances<\/span><span class=\"p\">[<\/span><span class=\"mi\">0<\/span><span class=\"p\">]<\/span>\n \n    <span class=\"c\"># if the instance is stopped, start it up<\/span>\n    <span class=\"k\">if<\/span> <span class=\"n\">instance<\/span><span class=\"o\">.<\/span><span class=\"n\">state<\/span> <span class=\"o\">!=<\/span> <span class=\"s\">&#39;running&#39;<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">conn<\/span><span class=\"o\">.<\/span><span class=\"n\">start_instances<\/span><span class=\"p\">(<\/span><span class=\"n\">instance_ids<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"n\">BACKUP_INSTANCE_ID<\/span><span class=\"p\">,))<\/span>\n        <span class=\"n\">waited<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span>\n        <span class=\"k\">while<\/span> <span class=\"n\">instance<\/span><span class=\"o\">.<\/span><span class=\"n\">state<\/span> <span class=\"o\">!=<\/span> <span class=\"s\">&#39;running&#39;<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">instance<\/span><span class=\"o\">.<\/span><span class=\"n\">update<\/span><span class=\"p\">()<\/span>\n            <span class=\"n\">sys<\/span><span class=\"o\">.<\/span><span class=\"n\">stdout<\/span><span class=\"o\">.<\/span><span class=\"n\">write<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;<\/span><span class=\"se\">\\r<\/span><span class=\"s\">Instance starting up (<\/span><span class=\"si\">%d<\/span><span class=\"s\"> sec)...&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"p\">(<\/span><span class=\"n\">waited<\/span><span class=\"p\">))<\/span>\n            <span class=\"n\">sys<\/span><span class=\"o\">.<\/span><span class=\"n\">stdout<\/span><span class=\"o\">.<\/span><span class=\"n\">flush<\/span><span class=\"p\">()<\/span>\n            <span class=\"n\">time<\/span><span class=\"o\">.<\/span><span class=\"n\">sleep<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">waited<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n \n    <span class=\"k\">print<\/span> <span class=\"s\">&quot;<\/span><span class=\"se\">\\n<\/span><span class=\"s\">&quot;<\/span>\n    <span class=\"k\">print<\/span> <span class=\"s\">&quot;Backup instance running:&quot;<\/span>\n    <span class=\"k\">print<\/span> <span class=\"s\">&quot;    ID:       &quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">instance<\/span><span class=\"o\">.<\/span><span class=\"n\">id<\/span>\n    <span class=\"k\">print<\/span> <span class=\"s\">&quot;    State:    &quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">instance<\/span><span class=\"o\">.<\/span><span class=\"n\">state<\/span>\n    <span class=\"k\">print<\/span> <span class=\"s\">&quot;    DNS name: &quot;<\/span><span class=\"p\">,<\/span> <span class=\"n\">instance<\/span><span class=\"o\">.<\/span><span class=\"n\">dns_name<\/span>\n \n    <span class=\"c\"># chill for a few seconds so the SSH server is listening<\/span>\n    <span class=\"n\">time<\/span><span class=\"o\">.<\/span><span class=\"n\">sleep<\/span><span class=\"p\">(<\/span><span class=\"mi\">10<\/span><span class=\"p\">)<\/span>\n \n    <span class=\"k\">print<\/span> <span class=\"s\">&quot;&quot;<\/span>\n    <span class=\"k\">print<\/span> <span class=\"s\">&quot;Initiating backup...&quot;<\/span>\n    <span class=\"n\">retcode<\/span> <span class=\"o\">=<\/span> <span class=\"n\">ssh_cmd<\/span><span class=\"p\">(<\/span><span class=\"s\">&#39;dirvish-expire; dirvish-runall&#39;<\/span><span class=\"p\">,<\/span> <span class=\"n\">instance<\/span><span class=\"o\">.<\/span><span class=\"n\">dns_name<\/span><span class=\"p\">,<\/span> <span class=\"n\">user<\/span><span class=\"o\">=<\/span><span class=\"s\">&#39;username&#39;<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">print<\/span> <span class=\"s\">&quot;&quot;<\/span>\n \n    <span class=\"c\"># backup is done; shut down the instance<\/span>\n    <span class=\"n\">conn<\/span><span class=\"o\">.<\/span><span class=\"n\">stop_instances<\/span><span class=\"p\">(<\/span><span class=\"n\">instance_ids<\/span><span class=\"o\">=<\/span><span class=\"p\">(<\/span><span class=\"n\">BACKUP_INSTANCE_ID<\/span><span class=\"p\">,))<\/span>\n    <span class=\"n\">waited<\/span> <span class=\"o\">=<\/span> <span class=\"mi\">0<\/span>\n    <span class=\"k\">while<\/span> <span class=\"n\">instance<\/span><span class=\"o\">.<\/span><span class=\"n\">state<\/span> <span class=\"o\">!=<\/span> <span class=\"s\">&#39;stopped&#39;<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">instance<\/span><span class=\"o\">.<\/span><span class=\"n\">update<\/span><span class=\"p\">()<\/span>\n        <span class=\"n\">sys<\/span><span class=\"o\">.<\/span><span class=\"n\">stdout<\/span><span class=\"o\">.<\/span><span class=\"n\">write<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;<\/span><span class=\"se\">\\r<\/span><span class=\"s\">Instance shutting down (<\/span><span class=\"si\">%d<\/span><span class=\"s\"> sec)...&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"p\">(<\/span><span class=\"n\">waited<\/span><span class=\"p\">))<\/span>\n        <span class=\"n\">sys<\/span><span class=\"o\">.<\/span><span class=\"n\">stdout<\/span><span class=\"o\">.<\/span><span class=\"n\">flush<\/span><span class=\"p\">()<\/span>\n        <span class=\"n\">time<\/span><span class=\"o\">.<\/span><span class=\"n\">sleep<\/span><span class=\"p\">(<\/span><span class=\"mi\">1<\/span><span class=\"p\">)<\/span>\n        <span class=\"n\">waited<\/span> <span class=\"o\">+=<\/span> <span class=\"mi\">1<\/span>\n    <span class=\"k\">print<\/span> <span class=\"s\">&quot;&quot;<\/span>\n \n<span class=\"k\">def<\/span> <span class=\"nf\">ssh_cmd<\/span><span class=\"p\">(<\/span><span class=\"n\">cmd<\/span><span class=\"p\">,<\/span> <span class=\"n\">host<\/span><span class=\"p\">,<\/span> <span class=\"n\">user<\/span><span class=\"o\">=<\/span><span class=\"s\">&#39;root&#39;<\/span><span class=\"p\">):<\/span>\n    <span class=\"sd\">&quot;&quot;&quot; Run a shell command on a remote server via ssh &quot;&quot;&quot;<\/span>\n \n    <span class=\"n\">ssh_cmd<\/span> <span class=\"o\">=<\/span> <span class=\"s\">&#39;ssh -o ConnectTimeout=5 -o StrictHostKeyChecking=no &#39;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">user<\/span> <span class=\"o\">+<\/span> <span class=\"s\">&#39;@&#39;<\/span> <span class=\"o\">+<\/span> <span class=\"n\">host<\/span> <span class=\"o\">+<\/span> <span class=\"s\">&quot; &#39;<\/span><span class=\"si\">%s<\/span><span class=\"s\">&#39;&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"p\">(<\/span><span class=\"n\">cmd<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">print<\/span> <span class=\"s\">&quot;Running SSH command: <\/span><span class=\"si\">%s<\/span><span class=\"s\">&quot;<\/span> <span class=\"o\">%<\/span> <span class=\"n\">ssh_cmd<\/span>\n    <span class=\"n\">returncode<\/span> <span class=\"o\">=<\/span> <span class=\"n\">subprocess<\/span><span class=\"o\">.<\/span><span class=\"n\">call<\/span><span class=\"p\">(<\/span><span class=\"n\">ssh_cmd<\/span><span class=\"p\">,<\/span> <span class=\"n\">shell<\/span><span class=\"o\">=<\/span><span class=\"bp\">True<\/span><span class=\"p\">)<\/span>\n \n    <span class=\"c\">#logging.debug( output, returncode )<\/span>\n    <span class=\"k\">return<\/span> <span class=\"n\">returncode<\/span>\n \n<span class=\"k\">if<\/span> <span class=\"n\">__name__<\/span> <span class=\"o\">==<\/span> <span class=\"s\">&#39;__main__&#39;<\/span><span class=\"p\">:<\/span>\n    <span class=\"n\">main<\/span><span class=\"p\">()<\/span>\n<\/pre><\/div>\n</div>');
document.write('<div class="flowcoder_bottombar flowcoder_clearfix">');
document.write('<div class="flowcoder_postedby">Posted by <a href=\"http://flowcoder.com/zh\">zh<\/a> on <a href=\"http://flowcoder.com/\">Flowcoder<\/a></div>');
document.write('<div class="flowcoder_viewraw"><a href=\"http://flowcoder.com/154.txt\">view raw<\/a></div>');
document.write('</div></div>');
