2011-10-04 104 views
4

我想知道是否有最佳做法來檢查上載到您的ftp服務器是否成功。Proftpd驗證完成上傳

我正在使用的系統有一個上傳目錄,其中包含上傳文件的每個用戶的子目錄。

這些目錄中的文件只是臨時性的,它們在處理後會被丟棄。

系統循環遍歷這些子目錄和其中的新文件,併爲每個文件檢查它是否被修改了10秒。如果它在10秒內未被修改,則系統假定文件已成功上傳。

我不喜歡系統當前處理這些情況的方式,因爲它會嘗試處理文件,並在文件上傳不完整時失敗,而不是等待並允許用戶恢復上傳直到完成。 對於上傳時間不長的小文件可能會很好,但如果文件很大,我希望能夠恢復上傳。

我也不喜歡目錄和文件的循環,系統在高cpu使用率下閒置,所以我實現了pyinotify來觸發文件寫入時的動作。我沒有真正看過源代碼,我只能假設它比當前的實現更優化(比我所描述的要多得多)。

但是我仍然需要檢查文件是否成功上傳。

我知道我可以解析xferlog以獲得所有完整的上傳。像:

awk '($12 ~ /^i$/ && $NF ~ /^c$/){print $9}' /var/log/proftpd/xferlog 

這將使pyinotify不必要的,因爲我可以得到的路徑,完全和不完全上傳,如果我只尾巴日誌。

所以我的解決方案是檢查我的運行循環中的xferlog,只處理完整的文件。

除非有最佳做法或者只是一個更好的方法來做到這一點?

這種方法的缺點是什麼?

我在debian服務器上運行我的應用程序,proftpd安裝在同一臺服務器上。另外,我無法控制發送文件的客戶端。

+0

python腳本的基本目的是什麼?它是清理用完的文件,在網頁上顯示狀態還是其他的東西? –

+0

現在閱讀,發佈一年後,這個問題似乎還不清楚。基本上我想在上載完成後用上傳的文件做一些事情。但無法找到一種方式來使用proftpd來保證完整的上傳而不阻止FTP REST命令。所以在問題出現的時候,我最終使用iNotify做了一個解決方案,並在寫入時驗證這些文件。 – JayLev

回答

6

望着proftpd的文檔,我看到http://www.proftpd.org/docs/directives/linked/config_ref_HiddenStores.html

的HiddenStores指令啓用兩步文件上傳:文件上傳 爲「.in.filename。」一旦上傳完成,將 重命名爲「文件名」。這提供了一定程度的原子性,並幫助 防止1)不完整的上傳和2)在 仍在上傳過程中正在使用的文件。

這應該是「更好的方式」當你擁有的proftpd的控制,因爲它處理所有對你的工作要解決的問題 - 你可以認爲它沒有啓動任何.in.文件是完成上傳。您也可以安全地刪除任何孤兒.in.*文件,在某個地方整理腳本的任何一段時間處於非活動狀態。

+0

我看到了,但不幸的是我無法阻止REST命令。當我問這個問題的時候,我最終用pyinotify做了一個解決方案,並在處理之前驗證了寫入的文件。但是,如果proftpd可以爲我處理這個問題,無論是否使用REST或APPE命令都會很好。 – JayLev

+0

當使用'REST'或'APPE'時,我們可以使ProFTPD支持'HiddenStores'功能。但是,有一些可能的後果。當使用'REST'或'APPE'時,存在一個現有的文件;該現有文件需要_copied_作爲臨時文件。然後,當'STOR'(在'REST'命令之後)或'APPE'完成時,該文件被重新命名,*替換現有文件。如果其他客戶端同時修改同一個文件,則可能會有一場比賽 - 誰重命名文件最後獲勝。這對於您的需求會是可接受的行爲嗎? – Castaglia

1

如果您的pure-ftpd安裝使用 --with-uploadscript選項進行編譯,則可以使用pure-uploadscript。

它用於在每次上傳完成後啓動指定的腳本。

  1. 設置Call​​UploadScript爲 「yes」
  2. 使腳本的命令一樣touch /tmp/script.sh
  3. 把代碼寫在它。在我的例子腳本重命名該文件,並增加了「.completed」文件名前:

    #!/bin/bash fullpath=$1 filename=$(basename "$1") dirname=${fullpath%/*} mv "$fullpath" "$dirname/completed.$filename"

  4. 運行chmod 755 /tmp/script.sh由純uploadscript在

  5. 使腳本可執行文件,然後運行命令pure-uploadscript -B -r /etc/pure-ftpd/uploadscript.sh

現在/tmp/script.sh將每完成上傳後推出。