Python、Bash、およびGitの単純なバックアップシステムのバリアント

最近、仕事に就くときに不快感を覚えました。 気持ちはそれほど強くありませんでしたが、集中することは困難でした。 怠だと思った。 すべてがもう少し複雑であることが判明しました:)私が働いているラップトップはほぼ3年です。 Mac OS X 10.6.1がインストールされていますが、リンゴは描かれておらず、定期的なバックアップシステムがクラスとして欠落しています。 一般に、安定性と信頼性の感覚がなかったので、この問題に厳密に対処しました。 実際、さらに潜在意識が満足した結果について説明します:)たぶん誰かが何か有用なものを見つけるでしょう。


挑戦する


バックアップとは



もちろん、保存したい写真やその他のバイナリがあることもありますが、10 GBを超えるスクリプトを1回以上プッシュできる信頼できる場所がないため、バックアップの問題については触れません。毎月、それらは正常に変化しません。

バックアップ先



おそらく近い将来、このリストは拡大するでしょうが、今のところ、これで十分かと思われます。

どのような機能




解決策


Googleからのリクエストは価値があり満足のいくものではなかったため、自分で作成する必要がありました。 Pythonとは何かに触れながら、私は長い間適切な機会を探していました。

コピー


「すべてコピー」オプションは、スペース不足のため機能しません。 さらに、不必要なファイル(オブジェクト、ビルドログなど)のバックアップコピーを大量に保持するのは、どういうわけかばかげているように見えます。 その結果、参照条件は、いわば次のようになりました。


コピースクリプトはPythonで作成されており、200行弱(インデント、コメントなどを含む)しかかかりません。 さらに、1つのgoogleモジュールを使用して、絶対パスを相対パスに、またはその逆に変換します。
使用法:
  sn-backup.py <combo file> <base directory> <backup directory> 

制限事項:
  1. 厳密なコンボファイル形式。 行形式:
      <ベースディレクトリからの相対パス> [\ t <カンマ区切りマスク>] 

    複数のタブ文字は使用できません。 マスクはスペースなしのカンマで区切られます。
  2. バカからの保護は事実上ありません。


リストの例(ベースディレクトリ〜を使用):
 .emacs
ドキュメント/プログラミング* .c、*。H、*。Cpp、*。Pro、*。Py、.git
スクリプト


ソース(おそらく、同じ200行がテキストを詰まらせるよりもファイルホスティングにある方が便利です):
sn-backup.pydumpz.orgを 見てください
relpath.pydumpz.orgをご覧ください

relpath.pyは、ここから、最初のコメントから取得され、わずかに修正されました。

圧縮と暗号化


圧縮と暗号化には1行が必要なので、それらをPythonで記述するのはどういうわけか奇妙です。 圧縮するものは好みの問題です。 7-zipが好きです。 したがって、ここのコマンドラインは単純です(アーカイブ名はbackup.7z、フォルダー名は.backupです)。
  7za a -mx7 backup.7z .backup 

暗号化にはopensslを選択しました。理論的には、ほとんどすべての場所にあり、何も生成することなくそのまま使用できます。 コマンドは次のようになります。
  openssl enc -aes-256-cbc -salt -in backup.7z -out backup.aes256cbc -pass file:<パスパス> 

したがって、backup.7zソースファイルの名前、backup.aes256cbc出力ファイルの名前(暗号化アルゴリズムの名前を突然忘れた場合に備えて)。 パスワードはファイルに保存され、任意の長さにすることができます。 ただし、より良いのは、少なくとも32文字です。

派遣


送信する方法はさまざまである可​​能性があるため、最初は非常にカスタマイズ可能なPythonスクリプトでもやりたいと思っていましたが、少数のホストへのコピーは手動で行う方がはるかに簡単で、多数のホストへのコピーは偏執臭がします。 したがって、送信はshスクリプトで実装されます。 クライアントがインストールされたDropboxのcopyコマンドは重要ではないため、send to mailコマンドのみを考慮します(さらに一般的ではありません)。
  uuencode <暗号化されたアーカイブへのパス> $(ベース名<暗号化されたアーカイブへのパス>)|  mail -s "[BACKUP] $(date)" <アドレス> 

注:このコマンドを機能させるには、ローカルマシンでSMTPサーバーを構成する必要があります。 このコマンドは、件名行「[BACKUP] <current date and time>」を使用して暗号化されたアーカイブをメッセージに添付し、メッセージを<address>に送信します。 sn-upload.shスクリプトにこのコマンドがあり、暗号化されたアーカイブファイルの名前を唯一の引数として使用します。

すべて一緒に


すべて一緒に、backup.shスクリプトが収集され、次のようになります。
# ~/.backup - , .
# .git-.
cd ~/.backup

# .
~/Scripts/sn-backup.py ./list ~ .

# , git.
git add .
git commit -m "Backup at $(date)"

# .
cd ..
7za a -mx7 backup.7z .backup > /dev/null

# .
openssl enc -aes-256-cbc -salt -in backup.7z -out backup.aes256cbc -pass file:///${SECRET_PATH}/.password

# .
~/Scripts/sn-upload.sh ./backup.aes256cbc

# ???
rm backup.7z
# PROFIT!


さらなる開発の方向性


空き時間には、次の改善を行うことができます。
  1. Pythonですべてのbashスクリプトを翻訳します。
  2. Pylzmaおよび組み込みのPython暗号化(クロスプラットフォーム用)に切り替えることができます。
  3. リストファイル形式をよりソフトでまともなものにします。


おわりに


私は自転車を発明した可能性を排除しません。 しかし、私はそれにあまり時間を費やさず、少し経験を得ました。 まず第一に、このシステムの設計はシンプルであることに留意してください。 どのファイルとどこにコピーする必要があるかを知っています。 後でそれらをどうするか知っています。 このすべてをマシンで実行できるようにするために、スクリプトが必要です。 私の意見では、彼は彼のタスクを完全に実行します。

ご清聴ありがとうございました!

Source: https://habr.com/ru/post/J74532/


All Articles