2012-05-24 29 views
10

Tôi biết rằng điều này đã được hỏi nhiều lần trước đây, nhưng tôi tin rằng tình hình của tôi là khác nhau.SVN hook pre-revprop-change không hoạt động

Tôi đang cố gắng thêm móc thay đổi trước khi sửa đổi vào kho lưu trữ SVN của chúng tôi để cho phép thay đổi được thực hiện để ghi nhật ký.

Trước khi tôi được thêm vào tập tin pre-revprop-change tôi đã nhận được lỗi này:

$ svn propset -r 557 --revprop svn:log "New message!" https://myserver/repos/myrepo 
svn: DAV request failed; it's possible that the repository's pre-revprop-change hook either failed or is non-existent 
svn: At least one property change failed; repository is unchanged 
svn: Error setting property 'log': 
Repository has not been enabled to accept revision propchanges; 
ask the administrator to create a pre-revprop-change hook 

Không sao, tôi nghĩ. Tôi sẽ thêm nó:

$ cd /var/www/svn/myrepo/hooks 

$ # Create the simplest hook possible 
$ echo '#!/bin/sh' > pre-revprop-change 
$ echo 'exit 0' >> pre-revprop-change 

$ # Check that it looks correct 
$ cat pre-revprop-change 
#!/bin/sh 
exit 0 

$ # Looks good, now make it executable 
$ chmod a+x pre-revprop-change 

$ # Check the permissions 
$ ls -al pre-revprop-change 
-rwxr-xr-x 1 apache apache 17 2012-05-24 12:05 pre-revprop-change 

$ # Run it, to make sure it runs, and check the error code 
$ ./pre-revprop-change 
$ echo $? 
0 

Vì vậy, theo mọi thứ khác tôi đã đọc trên SO, đó là tất cả những gì tôi cần để làm cho nó hoạt động. Tuy nhiên, khi tôi cố gắng để chỉnh sửa nội dung log lần nữa, tôi vẫn nhận được một lỗi (mật khẩu khác thời gian này):

$ svn propset -r 557 --revprop svn:log "New message!" https://myserver/repos/myrepo 
svn: DAV request failed; it's possible that the repository's pre-revprop-change hook either failed or is non-existent 
svn: At least one property change failed; repository is unchanged 
svn: Error setting property 'log': 
Revprop change blocked by pre-revprop-change hook (exit code 255) with no output. 

Có một vài điểm cần lưu ý:

1) Các kho được lưu trữ trên máy chủ SELinux (lõi Fedora 10). Có lẽ có điều gì đó mà tôi cần phải làm liên quan đến các điều khoản đó? Dưới đây là các điều khoản SE của móc:

$ ls -alZ pre-revprop-change 
-rwxr-xr-x apache apache unconfined_u:object_r:httpd_sys_content_rw_t:s0 pre-revprop-change 

2) Các kho đang được truy cập thông qua WebDAV (chú ý https:// trong tên kho). Có điều gì mà tôi cần phải thiết lập ở phía WebDAV để cho phép thay đổi trước khi thay đổi không?

Trả lời

8

Sau vài giờ thử, tôi đã tìm thấy câu trả lời. Và, vì nó dường như không tồn tại ở bất kỳ nơi nào khác trên internet, tôi sẽ đăng ở đây ...

Vấn đề do SELinux gây ra (không có bất ngờ lớn ở đó). Có vẻ như apache (/usr/sbin/httpd) không có các quyền cần thiết để chạy tập lệnh móc với các quyền SE nêu trên. Để có được nó để thực thi, các điều khoản SELinux cần phải được thay đổi với

$ chcon -t httpd_exec_t pre-revprop-change 

(đầu tiên tôi đã cố gắng thay đổi nó để httpd_sys_script_exec_t, nhưng điều này là chưa đủ để có được kịch bản để thực thi. Nhưng với kiểu httpd_exec_t nó làm việc.)

Câu hỏi cuối cùng: đây có phải là điều an toàn để thực hiện không?

+1

Cho dù đây là an toàn phụ thuộc vào tiêu chuẩn của bạn về "an toàn" :) ... nhưng có, SELinux có thể gây ra một số vấn đề tế nhị, có thể được chẩn đoán bằng cách bật ghi nhật ký. – 0xC0000022L

+0

Cảm ơn. Yeah, tôi không nghĩ rằng máy chủ của chúng tôi sẽ là trung tâm hack, nhưng tôi chỉ muốn chắc chắn rằng tôi đã không chỉ mở ra một lỗ hổng bảo mật lớn! Bạn có biết tại sao sử dụng 'httpd_sys_script_exec_t' không hoạt động? Có vẻ như từ tài liệu mà nó cần phải có ... –

+0

Tôi cũng nghĩ rằng điều này đáng lẽ đã có hiệu quả. Không biết tại sao nó phải là 'httpd_exec_t' thay vì' httpd_sys_script_exec_t'. Nhưng có khả năng SELinux bằng cách nào đó có thể phân biệt các kịch bản có đầu ra đi tới Apache từ những nơi mà nó đi đâu đó.Bạn sử dụng Apache và không phải 'svnserve' (mặc dù Apache có thể ủy quyền nó), phải không? – 0xC0000022L

1

Có điều tương tự trên CentOS. Vấn đề có lẽ là một nơi nào đó trong bộ nhớ đệm như khi tôi chỉnh sửa các tập tin và sau đó thay đổi nó trở lại nó bắt đầu làm việc.

Vì vậy, nếu ai có một vấn đề tương tự đơn giản là thử:

touch hooks/pre-revprop-change 
Các vấn đề liên quan