2015年5月29日 星期五

【CentOS】rsync 異地備援

需求為有四台機器 ( OS:Linux CentOS )
Master A, Client B, Client C, Client D
Master A 為有版控的開發環境
希望 commit 到 Master A 後
能夠自動同步到三台 Client 機器上

Linux 有一個很好用的異地備援指令 rsync
rsync 第一次做完 Full Backup 後
日後備份檔案會是採取差異備份的策略
大幅降低備份檔案的傳輸時間
rsync 有兩種方法在 server / client 進行傳輸
1. 透過 ssh 的通道
2. 使用 rsync 提供的 daemon 服務
採用方法一透過 ssh 的通道來同步檔案
由於希望往後能靠自動排程(crontab)來進行同步
所以需要先製作出免密碼登入的 ssh 金鑰

ssh 遠端登入免密碼
  1. 在 Master 端建立 Public Key 與 Private Key
  2. Private Key 保存於 Master A
  3. Public Key 傳送給 Client B,C,D
#用 RSA 演算法產生 Key Pair
ssh-keygen -t rsa
#查看 keys
ll ~/.ssh
#Private Key 預設位置不用變更
#Public Key to Client B
scp id_rsa.pub root@clientB:~/.ssh
#Public Key to Client C
scp id_rsa.pub root@clientC:~/.ssh
#Public Key to Client D
scp ip_rsa.pub root@clientD:~/.ssh


接下來到三台 Client 端
將 Public Key 保存至 authorized_keys
完成後,ssh 登入 Client 就免密碼
cd ~/.ssh
cat id_rsa.pub >> authorized_keys
chmod 644 authorized_keys


將備份流程寫入 backup.sh 檔案
#!/bin/bash
# Master A 檔案路徑
localdir="/local/path"
# Client 端備份路徑
backupdir="/backups"
# Client 端 ip 位址
remoteip="192.168.100.252 192.168.100.253 192.168.100.254"
for ip in ${remoteip}
do
    rsync -av ${localdir} -e ssh root@${ip}:${backupdir}
done
# 建立 crontab 工作,每十五分鐘差異備份一次
crontab -e
0-59/15 * * * * sh backup.sh

2015年2月5日 星期四

【Ubuntu】crontab 刪除過期備份檔案

之前有寫過 crontab 排程 postgreSQL 自動備份
若沒有自動清除老舊的備份檔案
就會累積不少備份檔案
因此修改一下之前寫的 backup.sh 檔案
假設備份檔案保留三個月
#設定刪除日期
deldate=$(date -d'3 months ago' +%Y%m%d)
#刪除三個月前備份檔案
rm -f postgres."$deldate".tar.gz
設定刪除日期的地方
若是要刪除五天前的檔案
可修改為 '5 days ago'
若有需要修改自動排程
cd /etc
vi crontab
若要手動刪除過期備份檔案
可以善用 find 指令
find /path/to -mtime +5 -exec rm {} \;
-mtime 表示最後修改時間
+5 表示五天以前
-exec 接要執行的指令
{} 表示 find 指令找到的檔案

2015年1月13日 星期二

【Javascript】匯出 csv

將 table 的內容匯出成 csv 檔案
利用 encodeURIComponent
將字串轉為 Data URI
但要注意轉出的 code 為 UTF-8 編碼
若直接用 Microsoft Office Excel 開啟 csv 檔案時
中文會變成亂碼
因為 Excel 無法預設讀取 UTF-8 編碼的 CSV 檔案
所以利用增加 UTF-8 BOM 的方式
讓 Excel 直接開啟 csv 不會出現亂碼
navigator.appVersion.indexOf("Win") 若回傳值不為 -1
表示 OS 為 Windows 系列
指定 charset 為 帶 BOM 的 UTF-8

產生 CSV 內容的資料處理部分
傳入的參數 _csvString
除了每列資料要加斷行符號
不同欄位之間的資料要加逗號之外
還要額外處理兩個地方
1.資料若含有特殊符號,例如逗號,資料需加上雙引號
2.資料內容若已有雙引號,建議用 replace 取代為兩個雙引號
這樣用 Excel 開啟時,瀏覽效果較佳
function exportToCSV( _csvString ) {
    var downloadLink = document.createElement("a");
    downloadLink.download = "dataTable.csv";
    downloadLink.innerHTML = "Download File";
    if (window.webkitURL != null) {
        var code = encodeURIComponent( _csvString );
        if ( navigator.appVersion.indexOf("Win")==-1 ) {
            downloadLink.href = "data:application/csv;charset=utf-8," + code;
        } else {
            downloadLink.href = "data:application/csv;charset=utf-8,%EF%BB%BF" + code;
        }
    }

    downloadLink.click();
}

2015年1月8日 星期四

【Javascript】匯出txt


因為有將 Log 直接寫進 html 裡面
所以就想說將網頁上的純文字內容輸出為一個 txt 檔案
saveTextAsFile function 內有兩個參數
第一個參數 _fileName 為預設在本地端存檔的檔名
第二個參數 _text 為輸出的純文字內容

function saveTextAsFile( _fileName, _text ) {
    var textFileAsBlob = new Blob([_text], {type:'text/plain'});

    var downloadLink = document.createElement("a");
    downloadLink.download = _fileName;
    downloadLink.innerHTML = "Download File";
    if (window.webkitURL != null) {
        // Chrome allows the link to be clicked
        // without actually adding it to the DOM.
        downloadLink.href = window.webkitURL.createObjectURL(textFileAsBlob);
    } else {
        // Firefox requires the link to be added to the DOM
        // before it can be clicked.
        downloadLink.href = window.URL.createObjectURL(textFileAsBlob);
        downloadLink.onclick = destroyClickedElement;
        downloadLink.style.display = "none";
        document.body.appendChild(downloadLink);
    }

    downloadLink.click();
}

function destroyClickedElement(event) {
    document.body.removeChild(event.target);
}