• CentOS 6 搭建SVN支持httpd和svnserve独立服务器两种模式 以及邮件配置


    Linux下SVN服务器同时支持Apache的http和svnserve独立服务器两种模式且使用相同的访问权限账号

    服务器操作系统:CentOS 6.x

    1、在服务器上安装配置SVN服务;

    2、配置SVN服务同时支持Apache的http和svnserve独立服务器两种模式访问;

    3、Apache的http和svnserve独立服务器两种模式使用相同的访问权限账号。

    具体操作:

    一、关闭SELINUX

    vim /etc/selinux/config

    #SELINUX=enforcing #注释掉

    #SELINUXTYPE=targeted #注释掉

    SELINUX=disabled #增加

    setenforce 0   #使配置立即生效

    二、开启防火墙

    基于Apache的http模式,默认端口为80

    基于svnserve的独立服务器模式,默认端口为3690

    vim /etc/sysconfig/iptables #编辑防火墙配置文件

    # Firewall configuration written by system-config-firewall

    # Manual customization of this file is not recommended.

    *filter

    :INPUT ACCEPT [0:0]

    :FORWARD ACCEPT [0:0]

    :OUTPUT ACCEPT [0:0]

    -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

    -A INPUT -p icmp -j ACCEPT

    -A INPUT -i lo -j ACCEPT

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

    -A INPUT -m state --state NEW -m tcp -p tcp --dport 3690 -j ACCEPT

    -A INPUT -j REJECT --reject-with icmp-host-prohibited

    -A FORWARD -j REJECT --reject-with icmp-host-prohibited

    COMMIT

    :wq! #保存退出

    service iptables restart 

    三、安装Apache

    yum install httpd 

    #安装基于Apache的http模式访问的支持模块:

    yum -y install mod_dav_svn mod_auth_mysql 
    chkconfig httpd on                service httpd start    

    cd /etc/httpd/modules/

    #查看是否有mod_dav_svn.so和mod_authz_svn.so模块,如果有,说明mod_dav_svn安装成功!

    #mod_auth_mysql模块是用数据库存储账号信息,本次教程没有涉及,可以不安装!

    注意:如果Apache启动之后提示错误:

    httpd:httpd: Could not reliably determine the server's fully qualif domain name, using ::1 for ServerName

    解决办法:

    vi /etc/httpd/conf/httpd.conf #编辑

    ServerName www.example.com:80 #去掉前面的注释

    :wq! #保存退出

    四、安装SVN

    yum install subversion
    svnserve --version #查看svn版本信息

    五、配置SVN

    1、创建svn版本库

    mkdir -p /home/svn #创建svn版本库存放目录
    
    cd /home/svn #进入目录
    
    svnadmin create /home/svn/project1 #创建svn版本库project1
    
    svnadmin create /home/svn/project2 #创建svn版本库project2
    
    svnadmin create /home/svn/project3 #创建svn版本库project3

    2、设置配置文件

    mkdir -p /home/svn/conf #创建配置文件目录
    
    cp /home/svn/project1/conf/passwd /home/svn/conf/passwd #拷贝账号密码配置文件模板
    
    cp /home/svn/project1/conf/authz /home/svn/conf/authz #拷贝目录权限配置文件模板
    
    cp /home/svn/project1/conf/svnserve.conf /home/svn/conf/svnserve.conf #拷贝全局配置文件模板

    vi /home/svn/conf/passwd #编辑,添加以下代码

    [users]
    
    # harry = harryssecret
    
    # sally = sallyssecret
    
    osyunwei=123456
    
    osyunwei1=123456
    
    osyunwei2=123456
    
    osyunwei3=123456

    vi /home/svn/conf/authz #编辑,添加以下代码

    [groups]
    
    admin = osyunwei
    
    project1 = osyunwei1
    
    project2 = osyunwei2
    
    project3 = osyunwei3
    
    [/]
    
    @admin = rw
    
    * =
    
    [project1:/]
    
    @admin = rw
    
    @project1 = rw
    
    * =
    
    [project2:/]
    
    @admin = rw
    
    @project2 = rw
    
    * =
    
    [project3:/]
    
    @admin = rw
    
    @project3 = rw
    
    * =

    vi /home/svn/conf/svnserve.conf #配置全局文件,在最后添加以下代码

    [general]
    
    anon-access=none #禁止匿名访问,设置为none。默认为read,参数:read,write,none
    
    auth-access=write #授权用户写权限
    
    password-db=/home/svn/conf/passwd #用户账号密码文件路径,可以写绝对路径
    
    authz-db=/home/svn/conf/authz #访问控制权限文件路径,可以写绝对路径
    
    realm=svn #每个SVN项目的认证命,会在认证提示里显示,建议写项目名称。

    3、启动SVN

    svnserve -d -r /home/svn --config-file /home/svn/conf/svnserve.conf --listen-port 3690

    #--config-file后面跟全局配置参数文件

    ps -ef|grep svn|grep -v grep #查看进程

    netstat -ln |grep 3690 #检查端口

    killall svnserve #关闭svn

    4、添加svn服务开机启动脚本:

      vi /etc/init.d/svn     #编辑,添加以下代码

    #!/bin/sh
    
    # chkconfig: 2345 85 85
    
    # processname: svn
    
    svn_bin=/usr/bin
    
    svn_port=3690
    
    svn_home=/home/svn
    
    svn_config=/home/svn/conf/svnserve.conf
    
    if [ ! -f "$svn_bin/svnserve" ]
    
    then
    
    echo "svnserver startup: cannot start"
    
    exit
    
    fi
    
    case "$1" in
    
    start)
    
    echo "Starting svnserve..."
    
    $svn_bin/svnserve -d -r $svn_home --config-file $svn_config --listen-port $svn_port
    
    echo "Successfully!"
    
    ;;
    
    stop)
    
    echo "Stoping svnserve..."
    
    killall svnserve
    
    echo "Successfully!"
    
    ;;
    
    restart)
    
    $0 stop
    
    $0 start
    
    ;;
    
    *)
    
    echo "Usage: svn { start | stop | restart } "
    
    exit 1
    
    esac
    chmod +x /etc/init.d/svn #添加执行权限
    
    chkconfig svn on #开机自启动
    
    service svn start #启动

    六、配置svn支持http访问

    1、创建账号密码认证文件

    htpasswd -cm /home/svn/conf/http_passwd osyunwei
    
    htpasswd -m /home/svn/conf/http_passwd osyunwei1
    
    htpasswd -m /home/svn/conf/http_passwd osyunwei2
    
    htpasswd -m /home/svn/conf/http_passwd osyunwei3

    根据提示输入2次密码即可。

    注意:

    /home/svn/conf/目录下面passwd文件是svnserve独立服务器使用的认证文件,密码没有加密,明文显示。

    /home/svn/conf/目录下面http_passwd文件是Apache的http模式使用的认证文件,密码使用MD5加密。

    passwd和http_passwd文件中,账号密码必须设置相同。

    2、设置Apache配置文件

    vi /etc/httpd/conf.d/subversion.conf #编辑,在最后添加以下代码

    <Location /svn>
    
    DAV svn
    
    #SVNPath /home/svn
    
    SVNParentPath /home/svn
    
    # # Limit write permission to list of valid users.
    
    # <LimitExcept GET PROPFIND OPTIONS REPORT>
    
    # # Require SSL connection for password protection.
    
    # # SSLRequireSSL
    
    #
    
    AuthType Basic
    
    AuthName "Authorization SVN"
    
    AuthzSVNAccessFile /home/svn/conf/authz
    
    AuthUserFile /home/svn/conf/http_passwd
    
    Require valid-user
    
    # </LimitExcept>
    
    </Location>

    3、设置目录权限

    chown apache:apache /home/svn -R #设置svn目录所有者为Apache服务运行账号apache

    4、重启Apache服务

    service httpd restart 

    七、测试svn

    Windows下安装svn客户端TortoiseSVN。

    TortoiseSVN下载地址:http://tortoisesvn.net/downloads.html

    安装完成之后,桌面-右键单击,选择TortoiseSVN-版本库浏览器

    URL输入:svn://192.168.21.134/project1

    用户名:osyunwei1

    密码:123456

    勾选:保存认证

    确定

    可以进入project1版本库目录,右键单击之后,可以选择创建文件夹等操作。

    URL输入:http://192.168.21.134/svn/project1

    用户名和密码跟上面一样,可以进入project1版本库目录,右键单击之后,可以选择创建文件夹等操作。

    project1访问:

    svn://192.168.21.134/project1

    http://192.168.21.134/svn/project1

    用户名:osyunwei1

    密码:123456

    project2访问:

    svn://192.168.21.134/project2

    http://192.168.21.134/svn/project2

    用户名:osyunwei2

    密码:123456

    project3访问:

    svn://192.168.21.134/project3 #svnserve独立服务器模式

    http://192.168.21.134/svn/project3 #Apache的http模式

    用户名:osyunwei3

    密码:123456

    扩展阅读:

    1、Apache htpasswd命令选项参数说明

    -c 创建一个加密文件

    -n 不更新加密文件,只将apache htpasswd命令加密后的用户名密码显示在屏幕上

    -m apache htpasswd命令采用md5算法对密码进行加密

    -d apache htpasswd命令采用CRYPT算法对密码进行加密

    -p apache htpasswd命令不对密码进行进行加密,即明文密码

    -s apache htpasswd命令采用SHA算法对密码进行加密

    -b 在apache htpasswd命令行中一并输入用户名和密码而不是根据提示输入密码

    -D 删除指定的用户

    2、SVNPath 与 SVNParentPath区别:

    SVNParentPath:支持多个相同父目录的SVN版本库。

    SVNPath:只支持一个主目录的SVN版本库,如果在主目录下面建新项目,则提示无权访问。

     如果需要备份svn仓库可以使用 svnadmin dump D:Repositoriespc-api >  C:UsersAdministratorDesktopsvnbakpc-api.dump

     恢复使用:svnadmin load /home/svn/pc-api < /home/svn/pcapi.dump

     八、 邮件配置

    将sendmail.py和post-commit文件放到对应仓库hooks文件目录下:

     sendmail.py    需要更改邮箱的一些配置 (邮箱smtp地址、账号密码、仓库名、收件人列表)

    #coding:utf-8
    
    import sys
    
    import os
    
    import smtplib
    
    from email.mime.text import MIMEText
    
    from email.header import Header
    
    
    
    mail_host= 'smtp.163.com' #发送邮件的smtp地址
    mail_user= 'your_username' # 发送通知邮件的用户名
    mail_pass= 'your_passwd' # 用户的密码
    me= '版本库:你的仓库名' + '<' + 'svn' + '@' + 'test.com' + '>' #发送邮件人的地址标识
    to_list= ['test1@test.com','test2.test.com'] # 收件人
    
    html_template= """
    <html> 
            <h2 style="color:#FFFFFF; background: #008040;">基本信息</h2> 
            <div> <b>版本库:</b> 
                    <a href="svn:%s">%s</a> 
            </div> 
            <div>
                    <b>版本号:</b>%s 
            </div> 
            <div> 
                    <b>提交者:</b>%s 
            </div> 
            <div> 
                    <b>提交时间:</b>%s 
            </div> 
            <h2 style="color:#FFFFFF; background: #4682B4;">提交说明</h2> <font size="4" color="#BF6000"><xmp>%s</xmp></font> 
            <h2 style="color:#FFFFFF; background: #5353A8;">文件清单</h2> 
            <xmp>%s</xmp> 
            <hr> 
            <center> 
                    Powered by "xx科技" 
                    <a href="http://xxx.com">SCM</a> 
            </center> 
    </html> 
    
    """
    
     
    
    def get_repo_name(repo):  
            return os.path.basename(repo)  
      
    def get_author(repo, rev):  
            """svnlook author -r REV REPOS 获得提交者 
            """  
            cmd = '%s author -r %s %s' % (svnlook_bin_path, rev, repo)  
            output = os.popen(cmd).read()  
            return output  
      
    def get_date(repo, rev):  
            """svnlook date -r REV REPOS 获得提交时间 
            """  
            cmd = '%s date -r %s %s' % (svnlook_bin_path, rev, repo)  
            output = os.popen(cmd).read()  
            return output
      
    def get_log(repo, rev):  
            """svnlook log -r REV REPOS 获得提交日志 
            """  
            cmd = '%s log -r %s %s' % (svnlook_bin_path, rev, repo)  
            output = os.popen(cmd).read()  
            return output  
      
    def get_file_list(repo, rev):  
            """svnlook changed -r REV REPOS 获得发生变更的文件 
            """  
            cmd = '%s changed -r %s %s' % (svnlook_bin_path, rev, repo)  
            output = os.popen(cmd).read()  
            return output  
      
    def send_mail(msg, sender, to_list):  
            try:  
                    s = smtplib.SMTP()  
                    s.connect(mail_host)  
                    s.login(mail_user,mail_pass)  
                    s.sendmail(sender, to_list, msg.as_string())  
                    s.close()  
                    return True  
            except Exception, e:  
                    print str(e)  
                    return False  
      
    def write_mail(sender, to_list, sub, content):  
            msg = MIMEText(content, _subtype = 'html', _charset='utf-8')  
            msg['Subject'] = sub  
            msg['From'] = sender  
            msg['To'] = ';'.join(to_list)  
            msg["Accept-Language"]="zh-CN"  
            msg["Accept-Charset"]="ISO-8859-1,utf-8"  
            return msg  
      
    global svnlook_bin_path  
      
    def write_mail_content(repo, rev):  
            """ 
            repo: repository 
            rev: revision 
            """  
            repo_name = get_repo_name(repo)  
            author = get_author(repo, rev)  
            date = get_date(repo, rev)  
            log = get_log(repo, rev)  
            file_list = get_file_list(repo, rev)  
            content = html_template % (repo, repo_name, rev, author, date, log.decode("GBK").encode('UTF-8'), file_list.decode("GBK").encode('UTF-8'))  
            return content
    
    if __name__ == '__main__':  
            svnlook_bin_path = '"/usr/bin/svnlook"'  
      
            subject = 'SVN Commit Notification'  
            content = write_mail_content(sys.argv[1], sys.argv[2])  
            msg = write_mail(me, to_list, subject, content)  
            send_mail(msg, me, to_list)  

    post-commit      需要将脚本中HOOK_DIR改成你的svn仓库地址

    #!/bin/sh
    
    REPOS="$1"
    REV="$2"
    export LANG=zh_CN.UTF-8
    HOOK_DIR="/home/svn/repo/hooks"
    PYTHON_BIN=/usr/bin/python
    $PYTHON_BIN $HOOK_DIR/sendemail.py $REPOS $REV
  • 相关阅读:
    使用一系列命令生成字母数字符号组合
    linux分析apache日志获取最多访问的前10个IP
    shell脚本输出九九乘法表
    shell脚本输出空心等腰三角形
    awk与sed命令面试题整理
    linux分析apache日志获取最多访问的前10个IP
    iOS开发-由浅至深学习block
    PM常用软件&工作平台
    iOS开发之—— 各种加密的使用(MD5,base64,DES,AES,RSA,DSA)
    MVVM With ReactiveCocoa
  • 原文地址:https://www.cnblogs.com/Template/p/9151647.html
Copyright © 2020-2023  润新知