티스토리 뷰
"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 관리등을 수행하므로 동시에 두 서비스를 가동시킬 수는 없습니다. 둘중의 하나의 서비스 포트를 변경하거나 필요가 있을 경우만 둘 중에 하나만 서비스를 가동시켜 작업합니다.
'IT 일반' 카테고리의 다른 글
Trac 과 서브버전 사용자 관리하기 (0) | 2019.01.03 |
---|---|
Trac UI 변경과 설정 변경하기 (0) | 2019.01.03 |
Trac 설치하기 1 - Subversion Edge 및 MySQL 기반 (2) | 2019.01.01 |
간단한 MySQL 설치 요령 (0) | 2019.01.01 |
이슈 트래커와 형상 관리 도구를 사용하기 위한 일반적 지식 (0) | 2018.12.29 |