티스토리 뷰



"Trac 설치하기 1 - Subversion Edge 및 MySQL 기반"에 이어지는 글입니다. 앞선 글에서는 DBMS와 서브버전 에지를 설치하여 기반 환경을 준비했다면 이번 글에서는 본격적으로 파이썬을 사용하는 Trac을 설치 합니다.


■ 파이썬 레지스트리 등록과 기본 도구 설치


Subversion EDGE에 파이썬이 포함되어 설치되는 과정에서 환경변수에 파이썬 경로를 설정하는 작업은 하지만 레지스트리에 등록하는 작업은 누락되어 파이썬 배포판을 설치하거나 기타 여러 작업에서 레지스트리를 통해서 파이썬의 설치 여부와 버전등을 확인하는 작업이 있으면 파이썬이 서브버전 에지에 포함되어 있음에도 불구하고 해당 작업들은 모두 실패 합니다. 

 

그래서, 레지스트리 등록 작업이 꼭 필요한데 아래의 코드를 setreg.py등으로 저장하여  Subversion EDGE에 포함되어 있는 파이썬 인터프리터로 실행시키면 쉽게 레지스트리 등록이 가능 합니다.


import sys

from _winreg import *
 
# tweak as necessary
version = sys.version[:3]
installpath = sys.prefix
 
regpath = "SOFTWARE\\Python\\Pythoncore\\%s\\" % (version)
installkey = "InstallPath"
pythonkey = "PythonPath"
pythonpath = "%s;%s\\Lib\\;%s\\DLLs\\" % (
    installpath, installpath, installpath
)
 
def RegisterPy():
    try:
        reg = OpenKey(HKEY_CURRENT_USER, regpath)
    except EnvironmentError as e:
        try:
            reg = CreateKey(HKEY_CURRENT_USER, regpath)
            SetValue(reg, installkey, REG_SZ, installpath)
            SetValue(reg, pythonkey, REG_SZ, pythonpath)
            CloseKey(reg)
        except:
            print "*** Unable to register!"
            return
        print "--- Python", version, "is now registered!"
        return
    if (QueryValue(reg, installkey) == installpath and
        QueryValue(reg, pythonkey) == pythonpath):
        CloseKey(reg)
        print "=== Python", version, "is already registered!"
        return
    CloseKey(reg)
    print "*** Unable to register!"
    print "*** You probably have another Python installation!"
 
if __name__ == "__main__":
    RegisterPy()


위의 코드를 setreg.py라는 이름으로 csvn\Python25 폴더에 저장하고 아래와 같이 해당 폴더로 이동하여 커맨드라인에서 코드를 실행시키면 레지스트리 등록 작업을 간단히 끝낼수 있습니다.



등록 이후의 레지스트리 상태는 아래와 같습니다.



Trac 설치를 위한 기본 도구로 pip와 setuptools를 설치합니다. 기본 도구 설치는 https://bootstrap.pypa.io/get-pip.py를 다운로드 받아 실행시키면 됩니다.




위의 그림과 같이 get-pip.py를 실행하면 pip와 wheel 및  setuptools 도구를 간편하게 설치할 수 있습니다.  추후 편리한 작업을 위해서는 도구가 설치된 "D:\csvn\Python25\Scripts" 폴더를 PATH 환경 변수에 추가해 줍니다.




다른 파이썬 패키지는 pip도구로 간편하게 설치할 수 있지만 MySQL-python의 경우에는 설치 버전을 다운로드 받아 설치 합니다. 위의 그림은 https://pypi.org/project/MySQL-python/1.2.5/#files 에서 설치 버전(MySQL-python-1.2.5.win32-py2.7.exe)을 다운로드 받아 설치하는 과정입니다. 앞서 레지스트리 설정 과정에 문제가 없었다면 간단하게 설치 완료 할 수 있습니다.



pip install genshi 명령으로 젠시 패키지를 설치합니다.



pip install trac 명령으로 간단하게 Trac 시스템을 설치할 수 있습니다.



■ Tracd를 이용한 프로젝트 테스트


Trac에는 tracd라는 자체 응용 서버가 내장되어 있기 때문에 아파치와 같은 웹서버가 없어도 간편하게 서비스를 제공할 수 있습니다. tracd는 아파치와 같이 다양한 설정과 SSL 지원등의 기능은 제공하지 않지만 단순 CGI를 넘어서 mod_python 수준의 웹과 파이썬 간의 인터페이스 성능을 제공하고 무엇보다 별도의 서버나 설정이 필요없다는 단순성을 장점이라 할 수 있습니다.

 

우선 앞서 형상 관리 저장소로 생성했던 이름을 프로젝트 명으로 하여 Trac 프로젝트를 생성 합니다. 프로젝트 생성은 trac-admin을 사용하고 "trac-admin tracdata/test1 initenv"와 같이 입력 합니다. 예제에서는 \csvn\Python25 아래에 tracdata라는 폴더를 만들어 이곳에 모든 Trac 프로젝트를 통합 관리하려고 하므로 프로젝트 생성 이전에 tracdata 폴더를 먼저 만듭니다.

 

D:\csvn\Python25>trac-admin tracdata/test1 initenv
Creating a new Trac environment at D:\csvn\Python25\tracdata\test1

Trac will first ask a few questions about your environment
in order to initialize and prepare the project database.

 Please enter the name of your project.
 This name will be used in page titles and descriptions.

Project Name [My Project]> test1

 Please specify the connection string for the database to use.
 By default, a local SQLite database is created in the environment
 directory. It is also possible to use an existing MySQL or
 PostgreSQL database (check the Trac documentation for the exact
 connection string syntax).

Database connection string [sqlite:db/trac.db]> mysql://tracuser:password@localhost/
trac

Creating and Initializing Project
 Installing default wiki pages
  CamelCase imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\CamelCase
  InterMapTxt imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\InterMapTxt
  InterTrac imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\InterTrac
  InterWiki imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\InterWiki
  PageTemplates imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\PageTemplates
  RecentChanges imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\RecentChanges
  SandBox imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\SandBox
  TicketQuery imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TicketQuery
  TitleIndex imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TitleIndex
  TracAccessibility imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracAccessibility
  TracAdmin imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracAdmin
  TracBackup imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracBackup
  TracBatchModify imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracBatchModify
  TracBrowser imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracBrowser
  TracCgi imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracCgi
  TracChangeLog imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracChangeLog
  TracChangeset imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracChangeset
  TracEnvironment imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracEnvironment
  TracFastCgi imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracFastCgi
  TracFineGrainedPermissions imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracFineGrainedPermissions
  TracGuide imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracGuide
  TracImport imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracImport
  TracIni imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracIni
  TracInstall imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracInstall
  TracInterfaceCustomization imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracInterfaceCustomization
  TracLinks imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracLinks
  TracLogging imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracLogging
  TracModPython imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracModPython
  TracModWSGI imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracModWSGI
  TracNavigation imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracNavigation
  TracNotification imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracNotification
  TracPermissions imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracPermissions
  TracPlugins imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracPlugins
  TracQuery imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracQuery
  TracReports imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracReports
  TracRepositoryAdmin imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracRepositoryAdmin
  TracRevisionLog imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracRevisionLog
  TracRoadmap imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracRoadmap
  TracRss imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracRss
  TracSearch imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracSearch
  TracStandalone imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracStandalone
  TracSupport imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracSupport
  TracSyntaxColoring imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracSyntaxColoring
  TracTickets imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracTickets
  TracTicketsCustomFields imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracTicketsCustomFields
  TracTimeline imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracTimeline
  TracUnicode imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracUnicode
  TracUpgrade imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracUpgrade
  TracWiki imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracWiki
  TracWorkflow imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\TracWorkflow
  WikiDeletePage imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\WikiDeletePage
  WikiFormatting imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\WikiFormatting
  WikiHtml imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\WikiHtml
  WikiMacros imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\WikiMacros
  WikiNewPage imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\WikiNewPage
  WikiPageNames imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\WikiPageNames
  WikiProcessors imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\WikiProcessors
  WikiRestructuredText imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\WikiRestructuredText
  WikiRestructuredTextLinks imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\WikiRestructuredTextLinks
  WikiStart imported from D:\csvn\Python25\lib\site-packages\trac\wiki\default-pages\WikiStart

---------------------------------------------------------------------
Project environment for 'test1' created.

You may now configure the environment by editing the file:

  d:\csvn\python25\tracdata\test1\conf\trac.ini

If you'd like to take this new project environment for a test drive,
try running the Trac standalone web server `tracd`:

  tracd --port 8000 D:\csvn\Python25\tracdata\test1

Then point your browser to http://localhost:8000/test1.
There you can also browse the documentation for your installed
version of Trac, including information on further setup (such as
deploying Trac to a real web server).

The latest documentation can also always be found on the project
website:

  http://trac.edgewall.org/

Congratulations!


D:\csvn\Python25>


프로젝트 생성 명령을 입력하면 프롬프트로 프로젝트 이름과 데이터베이스 연결을 위한 정보를 입력 받는데 프로젝트 이름은 적절하게 기술하고 데이터베이스 연결 정보는 "mysql://데이터베이스사용자아이디:비밀번호@호스트/DB명"의 형식으로 지정합니다. 데이터베이스 사용자와 비밀번호는 앞선 단계에서 tracuser로 생성하였으므로 메모한 것을 참조하고 호스트는 별도 DB 서버를 두지 않을 것이므로 localhost, DB명은 앞선 단계에서 생성한 trac으로 지정하면 됩니다.

 

프로젝트를 생성한 다음 맨먼저 수행해야할  작업은 프로젝트의 관리자를 선정하여 해당 아이디에 관리자 권한을 부여하는 것으로 Subversion EDGE의 사용자 아이디를 Trac에서도 사용하기 위한 부가적인 설정이 필요 합니다. 일단 직전 작업에서 생성한 프로젝트 test1의 관리자로 사용자 아이디 admin을 지정하는 명령은 "trac-admin tracdata/test1 permission add admin TRAC_ADMIN"로 수행하면 됩니다.



■ Trac 인증 방식 변경


서브버전 에지가 버전이 올라가면서 /csvn/data/conf/svn_auth_file에 저장하는 아이디:비밀번호 저장 형식이 바뀌었습니다. 통상 아파치 웹서버에 내장되어 있는 htpasswd 도구를 이용하여 비밀번호를 MD5해시나 crypt(), SHA1등의 해시로 저장하는데(이전에는 MD5 해시로 저장했음) 서브버전 에지의 버전이 올라가면서 bcrypt() 형식으로 바뀌면서 예전에는 Trac에서도 인증 파일을 읽을 수 있었는데 더이상 읽을 수 없게 되었습니다.


해결 방법은 Trac에 bcrypt() 방식을 적용하거나 서브버전 에지의 암호 저장 방식을 MD5로 변경하는 좋겠지만 두가지 방법 모두 윈도우 환경에서는 녹록치 않더군요. 저의 경우 Trac 코드를 수정해서 서브버전 에지에 포함되어 있는 htpasswd.exe를 호출하여 인증하는 방식을 적용했습니다.


\csvn\Python25\Lib\site-packages\trac\web 폴더에 있는 auth.py를 수정합니다.


......
from subprocess import Popen, PIPE
......
class BasicAuthentication(PasswordFileAuthentication):
......
    def load(self, filename):
        self.hash = {}

    def test(self, user, password):
        p = Popen(['/csvn/bin/htpasswd', '-vBb', self.filename, user, password], stdin=PIPE, stdout=PIPE, stderr=PIPE)
        pout1, pout2 = p.communicate('')
        
        return 'correct' in pout2


위의 코드처럼 import subprocess... 구문을 상단에 추가해 주고, BasicAuthentication 클래스 정의를 찾아서 기존의 load 및 test 메소드를 위와 같이 변경합니다. load시 기존 인증 파일을 로드하는 작업이 있었지만 제거하고 실제 인증은 htpasswd에게 맡겨서 그 결과를 확인하는 방식입니다. 



■ Trac 가동 테스트

 

간단한 테스트를 위해서 tracd를 가동시키는 방법은 아래의 그림과 같이 "tracd -p 8000 --basic-auth="*,/csvn/data/conf/svn_auth_file,*" -e tracdata"와 같이 입력하면 Subversion EDGE의 사용자 정보를 인증으로 하는 Trac을 가동시킬 수 있습니다. tracd는 간단한 웹서버 역할을 수행하므로 백신에서 포트를 차단할 수 있으므로 정상적인 테스트를 위해서는 차단을 해제해 주어야 합니다.(-p 8000은 TCP 8000포트를 통해 서비스 하라는 명령 입니다)




그림과 같이 tracd는 서버 프로그램으로 강제 종료시키기 전까지는 클라이언트의 요청을 대기하며 서비스를 지속적으로 제공합니다.

 

테스트를 위해서 웹브라우저를 열고 주소창에 "httpd://localhost:8000/test1"을 입력하면 앞서 생성한 프로젝트의 Trac 페이지로 이동할 수 있습니다. 



한글 메뉴를 비롯해서 Trac이 정상적으로 동작하는지 확인하고 Subversion EDGE의 아이디가 정상적으로 Trac에서도 인증되는지 로그인 합니다.



로그인이 성공적으로 되어서 위의 그림과 같이 관리자 메뉴가 나오면 정상 가동임을 확인한 것입니다. 테스트가 끝나면 tracd를 가동시켰던 콘솔창에서 Ctrl+C로 서버를 중단시키면 됩니다.



■ Tracd의 서비스 등록 및 자동 시작 설정


컴퓨터 시동과 함께 Trac을 서비스로 가동시키기 위해서는 https://www.microsoft.com/en-us/download/details.aspx?id=17657 에서 "Windows Server 2003 Resource Kit Tools"를 다운로드 받아 설치 합니다.



동의와 함께 설치를 진행합니다.



기본 설치 폴더도 괜찮지만 서비스 등록 편의를 위해서 도구들의 설치 폴더를 \csvn\bin으로 설정하여 설치 합니다.


\csvn\bin\instsrv.exe tracd8000 C:\csvn\bin\srvany.exe

reg add HKLM\SYSTEM\CurrentControlSet\Services\tracd8000\Parameters /v Application /d "C:\csvn\Python25\Scripts\tracd.exe --port 8000 --basic-auth=\"*,/csvn/data/conf/svn_auth_file,*\" -e C:\csvn\Python25\tracdata"

net start tracd8000

sc config tracd8000 start= auto


위와 같은 명령을 통해서 서비스 등록(instsrv) > 레지스트리 등록(reg add) > 서비스 가동(net start) > 서비스 설정 변경(sc config)의 순서로 진행합니다.


C:\csvn\Python25>\csvn\bin\instsrv.exe tracd8000 C:\csvn\bin\srvany.exe

The service was successfuly added!

Make sure that you go into the Control Panel and use
the Services applet to change the Account Name and
Password that this newly installed service will use
for its Security Context.

C:\csvn\Python25>reg add HKLM\SYSTEM\CurrentControlSet\Services\tracd8000\Parame
ters /v Application /d "C:\csvn\Python25\Scripts\tracd.exe --port 8000 --basic-a
uth=\"*,/csvn/data/conf/svn_auth_file,*\" -e C:\csvn\Python25\tracdata"
작업을 완료했습니다.

C:\csvn\Python25>net start tracd8000
tracd8000 서비스를 시작합니다..
tracd8000 서비스가 잘 시작되었습니다.

C:\csvn\Python25>sc config tracd8000 start= auto
[SC] ChangeServiceConfig 성공


위의 내용은 서비스의 등록 및 수행 과정입니다. 



■ Trac과 Subversion EDGE 저장소 연동


위의 과정들이 정상적으로 진행되었다면 관리자(admin) 계정으로 http://localhost:8000에 접속하여 "관리" 메뉴를 확인합니다.  "저장소" 메뉴가 나오지 않으면 다음의 과정을 수행합니다.



일단 C:\csvn\lib\svn-python 폴더에 있는 libsvn과 svn 패키지를 C:\csvn\Python25\Lib에 복사 합니다.


[components]

tracopt.versioncontrol.svn.* = enabled


위의 설정 내용을 프로젝트 폴더 아래 conf\trac.ini 파일에 추가해 주고 Trac 서비스를 재가동 합니다.



위의 작업이 정상적으로 적용되었다면 위의 그림과 같이 관리자 메뉴 좌측에 "저장소" 메뉴를 확인할 수 있습니다.



관리 메뉴 좌측에 있는 저장소 메뉴를 클릭하여 위의 그림과 같이 새로운 저장소를 등록합니다. 저장소 종류는 "(기본값)"인 svn으로 두고 이름과 앞서 등록한 저장소 디렉토리(C:\csvn\data\repositories\test1)를 입력하고 [추가]를 클릭하면 Subversion EDGE와 Trac이 연동되기 시작 합니다.



 

정상적으로 Subversion EDGE와 Trac이 연동되면 소스둘러보기 메뉴가 나오고 위의그림과 같이 웹을 통해 저장소 내용을 확인할 수 있게 됩니다. 이제 Trac 사용을 위한 준비는 끝내고 본격적으로 티켓을 발급하는등 사용을 시작하면 됩니다.


다시 한번 말씀드리지만 기본 환경에서는 서브버전 에지도 80 포트로 웹서비스를 제공하고 XAMPP의 웹서버도 80 포트로 DB 관리등을 수행하므로 동시에 두 서비스를 가동시킬 수는 없습니다. 둘중의 하나의 서비스 포트를 변경하거나 필요가 있을 경우만 둘 중에 하나만 서비스를 가동시켜 작업합니다.




댓글
댓글쓰기 폼
«   2022/12   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함