方永、南天紫雲

道亦有道

svn管理之submin
2015年04月22日

subversion可以直接用 svnserve 启动服务,

svn://host/repo 访问即可。如果使用 http/https 协议,就要用 Apache 来配合做授权。另外,还需要一个简单的页面来管理用户,分配权限,用submin可以满足这个需求。

submin是Python写的,依赖 libsvn , 这个包在Centos中安装 subversion 会自动安装,如果系统存在多个Python版本,那么需要做好链接。先上一幅图:

安装其实很简单,下载源码,然后 python setup.py install ,然后运行 submin2-admin /var/lib/submin initenv [email protected], 就会安装submin到 /var/lib/submin 目录,然后按提示完成配置文件的生成。

默认会在 conf 中生成包含apache、nginx的配置,而且apache有2.4及2.4以下的两种版本的配置文件,低于2.4的,用到 apache-svn.confapache-webui-wsgi.conf 这两个文件, apache-trac- 开头的的配置文件是trac用的。

apache-svn.conf 用来配置svn的http协议的,内容如下:

<IfModule !mod_authn_dbd.c>                                                                                                                    
    # Nothing should work, so show a page describing this                                                                                      
    AliasMatch "^/svn" /usr/local/lib/python2.7/site-packages/submin/static/www/nomodauthndbd.html                                             
    <Location "/svn">                                                                                                                          
        Order allow,deny                                                                                                                       
            Allow from all                                                                                                                     
    </Location>                                                                                                                                
</IfModule>                                                                                                                                    
<IfModule mod_authn_dbd.c>                                                                                                                     
    DBDriver sqlite3                                                                                                                           
    DBDParams "/srv/www/submin/conf/submin.db"                                                                                                 
    <IfModule mod_dav_svn.c>                                                                                                                   
        <Location "/svn">                                                                                                                      
            DAV svn                                                                                                                            
            SVNParentPath /srv/svn                                                                                                             
            AuthType Basic                                                                                                                     
            AuthName "Subversion repository"                                                                                                   
            # Authentication                                                                                                                   
            AuthBasicProvider dbd                                                                                                              
            AuthDBDUserPWQuery "SELECT password FROM users WHERE name=%s"                                                                      
            # Authorization                                                                                                                    
            AuthzSVNAccessFile /srv/www/submin/conf/authz                                                                                      
            Satisfy Any                                                                                                                        
            Require valid-user                                                                                                                 
        </Location>                                                                                                                            
    </IfModule>                                                                                                                                
</IfModule>

apache-webui-wsgi.conf用来配置submin用户管理页面的:

<IfModule mod_wsgi.c>                                                                                                                      
        WSGIScriptAlias "/submin" /usr/local/lib/python2.7/site-packages/submin/static/www/submin.wsgi                                         
        AliasMatch ^/submin/css/(.*) /usr/local/lib/python2.7/site-packages/submin/static/www/css/$1                                           
        AliasMatch ^/submin/img/(.*) /usr/local/lib/python2.7/site-packages/submin/static/www/img/$1                                           
        AliasMatch ^/submin/js/(.*) /usr/local/lib/python2.7/site-packages/submin/static/www/js/$1                                             
                                                                                                                                               
        <Location "/submin">                                                                                                                   
            Order allow,deny                                                                                                                   
            Allow from all                                                                                                                     
                                                                                                                                               
            SetEnv SUBMIN_ENV "/srv/www/submin"                                                                                                
        </Location>                                                                                                                            
    </IfModule>                                                                                                                                
    <IfModule !mod_wsgi.c>                                                                                                                     
        AliasMatch "^/submin" /usr/local/lib/python2.7/site-packages/submin/static/www/nowsgi.html                                             
        <Location "/submin">                                                                                                                   
            Order allow,deny                                                                                                                   
            Allow from all                                                                                                                     
                                                                                                                                               
        </Location>                                                                                                                            
</IfModule>

可以看到,Python服务是uwsgi,另外就是subversion用到的模块,http.conf中加载的模块如下:

LoadModule authn_dbd_module modules/mod_authn_dbd.so
LoadModule dbd_module modules/mod_dbd.so
LoadModule wsgi_module modules/mod_wsgi.so
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

一些模块外置,需要用系统的包管理器安装:

mod_dav_svn
apr-util-sqlite

uwsgi、mod_wsgi可以用pip安装, 如果是自编译安装的Python,注意编译时打开 --enable-shared 选项。

submin使用邮件来设置或重置密码,在smtp有问题时,可以用以下命令重置密码:

# 1. 生成密码
openssl passwd -apr1
# 2. 打开数据库
sqlite3 conf/submin.db
# 3. 更新密码
update users set password='$apr1$331' where id=1;

smtp配置命令:

submin2-admin /var/lib/submin
config set smtp_hostname <smtp_host>
config set smtp_port <smtp_port>
config set smtp_username <smtp_user>
config set smtp_password <smtp_pass>
config set smtp_from Submin <[email protected]>
config set commit_email_from Submin <[email protected]>