自動化SVN + Apache + LDAP

上記のリンクには多くのことが書かれていますが、新しいリポジトリを開くときにいつも不便を感じました:構成ファイルに新しい場所を作成し、svnadminを使用してリポジトリを作成し、Apacheを再起動する必要がありました。 そのような作業を月に1回行う必要がある場合、これは許容範囲ですが、そのような作業を週に数回行う必要がある場合、このプロセスの自動化を検討する価値があります。 実際、私たちはこのことについて話しています。





今後は、Apache自体の構成から始めたいと思います。



メイン設定ファイル/etc/httpd/conf/httpd.conf

...... # Load config files from the config directory "/etc/httpd/conf.d". # Include conf.d/*.conf ......
      
      





実際、ここではすべてが明確です(これは、標準のCentOS 5.6リポジトリからApacheをインストールするときのデフォルトの構成場所です)



/etc/httpd/conf.d/subversion.confファイル

 LoadModule dav_svn_module modules/mod_dav_svn.so LoadModule authz_svn_module modules/mod_authz_svn.so LoadModule authnz_ldap_module modules/mod_authnz_ldap.so <VirtualHost *:5553> ServerName svn.company.ru ServerAdmin svn_admin@company.ru DocumentRoot /opt/svn/repo LimitRequestBody 2147483647 CustomLog /var/log/httpd/subversion.log combined ErrorLog /var/log/httpd/subversion-error.log <IfModule rewrite_module> RewriteLogLevel 0 RewriteEngine On RewriteCond "%{REQUEST_METHOD}" !"^(GET|POST|HEAD)$" RewriteCond "%{REQUEST_FILENAME}" "^/([^/\.]+)$" RewriteCond "/opt/svn/repo/%1" -d RewriteRule "^/([^/\.]+)$" "/$1/" [passthrough] </IfModule> Include conf.d/subversion.d/*.conf </VirtualHost>
      
      





この構成ファイルには、実際のリポジトリ構成が記述されています。 構成ファイルのすべての場所をconf.d / subversion.dディレクトリに配置することは注目に値します。 なぜこれが必要なのですか? 第一に、どのリポジトリが含まれているかを追跡するのが簡単であり、第二に、スクリプトの開始時に設定の解析を取り除くことができます(詳細は下記)。

ファイル/etc/httpd/conf.d/subversion.d/example_repo.conf

 <Location "/example_repo/"> DAV svn SVNPath /opt/svn/repo/example_repo SVNListParentPath on AuthType Basic AuthName "SVN Server" AuthBasicProvider ldap AuthzLDAPAuthoritative Off AuthLDAPBindDN "cn=ldpcat,cn=users,dc=company,dc=ru" AuthLDAPBindPassword "12345678" AuthLDAPURL ldap://ldap.company.ru:389/ou=user,dc=company,dc=ru?sAMAccountName?sub?(objectClass=*) AuthBasicAuthoritative off <Limit GET PROPFIND> Require valid-user </Limit> <Limit GET PROFIND PROPPATCH DELETE MERGE PUT POST MKCOL MKACTIVITY COPY MOVE LOCK UNLOCK> Require ldap-group cn=example_group,ou=user,dc=company,dc=ru </Limit> </Location>
      
      





ここでは、リポジトリの名前と場所、ADディレクトリを確認するアカウント(この場合はADが使用されます)、このアカウントのパスワード、文字列、検索フィルターを示します。 さらに、ディレクトリを使用して、レポジトリの表示はドメインで許可されているすべてのユーザーに許可されることを示します(ただし、ドメイン内の特定のグループを指定できます)。 次に、次のディレクトリで、ドメイン内のユーザーのグループ(この場合、example_group)がリポジトリで他のすべてのアクションを実行できることを示します。



Apacheの設定ですべてが明確になったので、新しいリポジトリを作成するスクリプトの実装を開始します。 スクリプトは
  1. 空のリポジトリを作成する
  2. リポジトリの構成ファイルを作成する
  3. リポジトリを変更する権限を持つグループのメンバーに情報レターを送信します




始めましょう。




オプション--prefix = / opt / python2.7 --with-threads --enable-unicode = ucs4 --includedir = / usr / include --disable-ipv6でソースからインストールされたpythonバージョン2.7を使用しました。 また、python-ldapモジュールをインストールする必要があります(setuptoolsを使用しました)。 以下は、実際のスクリプト自体です。

 #!/usr/bin/env python2.7 # -*- coding: utf-8 -*- import os import ldap import ldap.sasl import sys import smtplib from email.mime.text import MIMEText server_init_file = '/etc/init.d/httpd' apache_config_dir = '/etc/httpd/conf.d/subversion.d/' repo_path = '/opt/svn/repo/' user_owner_repo = 'apache' group_owner_repo = 'apache' mail_server = 'mail.company.ru' mail_smtp_port = 25 mail_from = 'redmine@company.ru' list_mail = [ ] root_svn_url = 'http://svn.company.ru/' if len(sys.argv)<=2: print u"   " print u"           " print u": addsvnrepo example_repo example_group" sys.exit() server = 'ldap://ldap' user_id = 'ldpcat' pw = '12345678' dn_search = 'OU=User,DC=company,DC=ru' repo_name = sys.argv[1] group_commit = sys.argv[2] if repo_name != None: print "  "+repo_name else: sys.exit() def main(): try: con = ldap.initialize(server) con.set_option(ldap.OPT_REFERRALS, 0) con.simple_bind_s(user_id, pw) print ' ' except ldap.INVALID_CREDENTIALS: print "    " sys.exit() except ldap.LDAPError, e: if type(e.message) == dict and e.message.has_key('desc'): print 'Error - ' + e.message['desc'] else: print 'Error - ' + str(e) sys.exit() finally: print '' search(con, group_commit) repo_create() config_write() server_reload() mailer() def search(con, group_commit): try: base_dn = 'dc=company,dc=ru' filter = "(memberOf=CN="+group_commit+","+dn_search+")" attrs = ['mail'] timeout = 3 results = con.search_s(base_dn, ldap.SCOPE_SUBTREE, filter, attrs) for dn,entry in results: if dn != None: list_mail.extend(entry['mail']) con.unbind() print list_mail print u" " except ldap.LDAPError, e: print 'Error - ' + str(e) sys.exit() def mailer(): text = u' ' text2 = repo_name text3 = u' .\n    ' text4 = root_svn_url+repo_name text5 = u'/\n  !\n' text_s = text+text2+text3+text4+text5 subj = u'  '+repo_name msg = MIMEText(text_s, "", "cp1251") msg['Subject'] = subj msg['From'] = mail_from msg['To'] = ', '.join( list_mail ) print u"  " print msg['To'] s = smtplib.SMTP(mail_server, mail_smtp_port) s.sendmail(msg['From'], list_mail, msg.as_string()) s.quit() print u"...." def repo_create(): svnadmin_create_msg = result = os.popen("svnadmin create "+repo_path+repo_name).read() print svnadmin_create_msg chmod_msg = result = os.popen("chown -R "+user_owner_repo+":"+group_owner_repo+" "+repo_path+repo_name).read() print chmod_msg def config_write(): if os.path.exists(apache_config_dir+repo_name+".conf") : print u"   " sys.exit() else: print "  ......" f1 = open(apache_config_dir+repo_name+".conf", 'w') f = open(apache_config_dir+"skeleton.tpl", 'r') body_config = f.read() f.close() f1.write(body_config.format(repo_name, repo_path, group_commit, server, dn_search)) f1.close() def server_reload(): print u' apache.......' reload_msg = result = os.popen(server_init_file+" restart").read() print reload_msg if __name__=="__main__": main()
      
      







スクリプトからわかるように、各アクションを個別の関数にプッシュしました。 リポジトリの構成ファイルは、skeleton.tplテンプレートから作成され、/ etc / httpd / conf.d / subversion.dディレクトリ内に配置する必要があることに注意してください。 テンプレートコンテンツ

 <Location "/{0}/"> DAV svn SVNPath {1}{0} SVNListParentPath on AuthType Basic AuthName "SVN Server" AuthBasicProvider ldap AuthzLDAPAuthoritative Off AuthLDAPBindDN "cn=ldpcat,cn=users,dc=company,dc=ru" AuthLDAPBindPassword "12345678" AuthLDAPURL {3}/{4}?sAMAccountName?sub?(objectClass=*) AuthBasicAuthoritative off <Limit GET PROPFIND> Require valid-user </Limit> <Limit PROPPATCH DELETE MERGE PUT POST MKCOL MKACTIVITY COPY MOVE LOCK UNLOCK> Require ldap-group cn={2},{4} </Limit> </Location>
      
      







実際にはすべて。 ただし、ユーザーはリポジトリのリストを提供する必要があります。このリストを使用して、任意のリポジトリにアクセスし、そこから目的のファイルをダウンロードできます。 これは、SVNListParentPath Onディレクティブを追加することにより、/ etc / httpd / conf.d / subversion.confファイルで行われます。 ただし、メニューのあるページは企業スタイルに見える必要があります。 また、私はpythonを呼び出して助けました。 初期化スクリプトapache /etc/init.d/httpdのstart()関数で、次の行を追加しました

/opt/svn/repo/svn_gen > /opt/svn/repo/index.html







ファイル/ opt / svn / repo / svn_gen

 #!/usr/bin/env python2.7 import os sdir='/opt/svn/repo/' r, d, f = os.walk(sdir).next() lb=len(d) y=0 addrrepo='http://svn.company.ru/' print "<ul>" while y<lb: print "<li>" print "<a href='" print addrrepo+d[y] print "/" print "'" print ">" print d[y] print "</a>" print "<br \>" y=y+1 else: print "</ul>" print "<hr /" print '<h2>PopoWeb Server running on BolgenOS Server 1.6(fundamentally new system of Denis Popov)</ h2>'
      
      





ここで私はcssへのリンクを特に削除しました。これは私が働いている組織に色を付けないようにするためです(色が認識しやすい)が、ご理解のとおり、ページを好みに合わせて実装できます。 この場合、テンプレートを使用することもできますが、svn_genスクリプトは、ペンでリポジトリを追加することにうんざりする前に作成されました。



今後実装したいこと



PSスクリプトとteplightが追加されたアーカイブへのPSリンクvnrepo.tar

PSSコードは完璧ではないので、どんなコメントでも喜んで受け入れます。



All Articles