Warning: opendir(/var/www/html/wp-content/mu-plugins): Failed to open directory: Permission denied in /var/www/html/wp-includes/load.php on line 981
ㅠㅠ 이름부터 맘에 들지 않아요. 사마귀라니 사.마.귀. 단순 버그이슈용이라는 점도 아쉽습니다. 그리고 정말 센스없는 디자인.

그런 Mantis 이지만 PHP와 MySQL 을 사용하다는 점 때문에 웹호스팅에서도 맘껏 사용 할 수 있는 장점이 있습니다. 또 제가 개인적으로 싫어해서 그렇지 이미 많은 분들이 사용해서 기능은 인정받고 있습니다.
Mantis 는 사실 버그트래킹외에는 거의 기능이 전무합니다. 전 Gantt 도 쓰고 싶고 저장소도 쓰고 싶고 달력, 게시판 등등 쓰고 싶지만 없습니다. 뭐 다른건 포기 할 수 있지만 딱 하나 포기할 수 없는게 바로 Wiki 입니다. 물론 프로젝트에서 생성되는 문서들은 파일로 저장되지만 레퍼런스라든가 관련 링크들은 Wiki에 남겨두는게 훨씬 빠르게 확인 할 수 있어서 좋습니다. DokuWiki 를 선택한 이유는 딱히 없습니다. 사실 심지어 처음 본 Wiki 입니다.ㅋㅋㅋ 여튼 이 DokuWiki 와 Mantis 를 연동해서 앞으로 프로젝트 관리를 할 예정입니다.
위의 링크를 통해 최신버전을 받아서 설치 합니다. 설치법은 간단하므로 특별히 설명 하지 않겠습니다. 제가 사용한 버전은 MantisBT 1.2.12 와 dokuwiki-2012-10-13 입니다.
Mantis 와 Wiki 연동을 검색해보면 대부분 아래의 문서를 참고합니다. 저도 처음에 이 문서를 참고했는데 2007년 문서에 업데이트도 안되서 현재 상황과는 조금 다릅니다. http://www.mantisbt.org/wiki/doku.php/mantisbt:issue:7075:integration_with_dokuwiki 괜히 고생만 합니다.
Mantis 는 /서버/manits 그리고 DokuWiki는 /서버/dokuwiki 에 설치 되어 있습니다.
[php]
# Wiki Integration Enabled?
$g_wiki_enable = ON;
# Wiki Engine
$g_wiki_engine = ‘dokuwiki’;
# Wiki namespace to be used as root for all pages relating to this mantis installation.
$g_wiki_root_namespace = ‘mantis’;
# URL under which the wiki engine is hosted. Must be on the same server.
$g_wiki_engine_url = $t_protocol . ‘://’ . $t_host . ‘/%wiki_engine%/’;
[/php]
Mantis가 업데이트 되면서 이미 Wiki 설정을 위한 준비가 다 되어 있습니다. config_inc.php 에 위의 코드만 추가해주면 끝입니다. $g_wiki_engine 의 값은 DokuWiki가 설치 된 폴더명입니다.
DokuWiki 와 Mantis 의 연동은 사실 Mantis 의 계정인증을 DokuWiki에서 사용 할 수 있게 하는게 주 입니다. DokuWiki 에서 Mantis 의 계정을 사용 할 수 있도록 아래와 같이 수정합니다.
[php]
$conf[‘useacl’] = 1;
$conf[‘authtype’] = ‘mantis’;
$conf[‘defaultgroup’] = ‘VIEWER’;
[/php]
[php]
* @VIEWER 1
* @REPORTER 2
* @UPDATER 4
* @DEVELOPER 8
* @MANAGER 16
* @ADMINISTRATOR 16
[/php]
[php]
define( ‘MANTIS_ROOT’, ‘/서버 내 절대경로/mantis/’ ); // file path to Mantis, must terminate with /
define( ‘MANTIS_URL’, ‘http://도메인/mantis/’ ); // url to Mantis, must terminate with /
require_once( MANTIS_ROOT . ‘core.php’ );
[/php]
Mantis 와 DokuWiki 의 UTF8 처리 함수가 충돌이 나므로 Mantis의 core.php 를 여기서 한번 불러옵니다.
[php]
<?php
/**
* Mantis auth backend
*
* Uses external Trust mechanism to check against Mantis’
* user cookie.
* 13/12/2009 ~ @Tiago Gomes:
* added modifications to make possible to set project related user rights.(http://www.mantisbt.org/bugs/view.php?id=8249)
* added modifications so that mantis support logging in/out from DokuWiki’s login page (http://www.mantisbt.org/bugs/view.php?id=8277)
*
*
* @author Victor Boctor (http://www.futureware.biz)
*
*/
require_once( MANTIS_ROOT . ‘core.php’ );
#dbg($GLOBALS);
class auth_mantis extends auth_basic {
/**
* Constructor.
*
* Sets additional capabilities and config strings
*/
function auth_mantis(){
$this->cando[‘external’] = true;
$this->cando[‘logoff’ ] = true; // module has a logoff method
}
/**
* Authenticates the user using Mantis APIs.
*/
function trustExternal($user,$pass,$sticky=false){
global $USERINFO;
global $conf;
$ValidUser = false;
// Manage HTTP authentication with Negotiate protocol enabled
$user = auth_prepare_username($user);
$pass = auth_prepare_password($pass);
// This is necessary in all cases where Authorization HTTP header is always set
if(auth_is_user_authenticated())
{
$user=”;
}
// Has a user name been provided?
if ( !empty ( $user ) )
{
// User name provided, so login via form in progress…
// Are the specified user name and password valid?
if ( auth_attempt_login ( $user, $pass, $sticky ) )
{
// Credential accepted…
$_SERVER[‘REMOTE_USER’] = $user; // Set the user name (makes things work…)
$ValidUser = true; // Report success.
}
else
{
// Invalid credentials
if ( !$silent )
{
msg ( $lang [ ‘badlogin’ ], -1 );
}
$ValidUser = false;
}
}
else
{
// No user name provided.
// Is a user already logged in?
if ( auth_is_user_authenticated ( ) )
{
// Yes, a user is logged in, so set the globals…
// is it a media display or a page?
if (isset($_REQUEST[‘media’])) {
//media
$t_project_name = explode( ‘:’, getNS( getID("media",false) ) );
} else {
// normal page
$t_project_name = explode( ‘:’, getNS( getID() ) );
}
$t_project_id = project_get_id_by_name( $t_project_name[1] );
$t_access_level = access_get_project_level( $t_project_id );
$t_access_level_string = strtoupper( MantisEnum::getLabel( config_get( ‘access_levels_enum_string’ ), $t_access_level ) ); // mantis 1.2.0rc
// $t_access_level_string = strtoupper( get_enum_to_string( config_get( ‘access_levels_enum_string’ ), $t_access_level ) );
$t_access_level_string_ex = strtoupper( $t_project_name[1] ) . ‘_’ . $t_access_level_string;
$USERINFO[‘grps’] = array( $t_access_level_string, $t_access_level_string_ex );
$USERINFO[ ‘pass’ ] = current_user_get_field ( ‘password’ );
$USERINFO[ ‘name’ ] = current_user_get_field ( ‘username’ );
$USERINFO[ ‘mail’ ] = current_user_get_field ( ’email’ );
$_SERVER[ ‘REMOTE_USER’ ] = $USERINFO[ ‘name’ ];
$_SESSION[ $conf[ ‘title’ ]][ ‘auth’ ][ ‘user’ ] = $USERINFO[ ‘name’ ];
$_SESSION[ $conf[ ‘title’ ]][ ‘auth’ ][ ‘info’ ] = $USERINFO;
$ValidUser = true;
}
else
{
$ValidUser = false;
}
}
// Is there a valid user login?
if ( true != $ValidUser )
{
// No, so make sure any existing authentication is revoked.
auth_logoff ( );
}
return $ValidUser;
}
/**
* Logout from Mantis
*/
function logOff(){
auth_logout();
}
/**
* Get user data
* (needed for e-mail subscriptions)
*
* @author Martin Arends http://www.web-gestaltung.de
*/
function getUserData($user)
{
$data = array();
$t_user_id = user_get_id_by_name( $user );
if (isset($_REQUEST[‘media’])) {
//media
$t_project_name = explode( ‘:’, getNS( getID("media",false) ) );
} else {
// normal page
$t_project_name = explode( ‘:’, getNS( getID() ) );
}
$t_project_id = project_get_id_by_name( $t_project_name[1] );
$t_access_level = access_get_project_level( $t_project_id, $t_user_id );
$t_access_level_string = strtoupper( MantisEnum::getLabel( config_get( ‘access_levels_enum_string’ ), $t_access_level ) );
$t_access_level_string_ex = strtoupper( $t_project_name[1] ) . ‘_’ . $t_access_level_string;
$data[‘name’] = $user;
$data[‘grps’] = array( $t_access_level_string, $t_access_level_string_ex );
$data[‘mail’] = user_get_email( $t_user_id );
return $data;
}
}
[/php]
[php]
<?php
/**
* Mantis Plugin: Hyperlinks references to Mantis Issues
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Victor Boctor (http://www.futureware.biz)
*/
if(!defined(‘DOKU_INC’)) define(‘DOKU_INC’,realpath(dirname(__FILE__).’/../../’).’/’);
if(!defined(‘DOKU_PLUGIN’)) define(‘DOKU_PLUGIN’,DOKU_INC.’lib/plugins/’);
require_once(DOKU_PLUGIN.’syntax.php’);
/**
* A plug-in that hyper links references to Mantis issues. References
* to Mantis issues should use the following format: ~~Mantis:123~~.
*
* All DokuWiki plugins to extend the parser/rendering mechanism
* need to inherit from this class
*/
class syntax_plugin_mantis extends DokuWiki_Syntax_Plugin {
/**
* return some info
*/
function getInfo(){
return array(
‘author’ => ‘Victor Boctor’,
’email’ => ‘vboctor at users . sourceforge . net’,
‘date’ => ‘2006-05-18’,
‘name’ => ‘Mantis Issues Plugin’,
‘desc’ => ‘Support References to Mantis Issues’,
‘url’ => ‘http://www.futureware.biz’,
);
}
/**
* What kind of syntax are we?
*/
function getType(){
return ‘substition’; # typo is intentional
}
/**
* What about paragraphs?
*/
function getPType(){
return ‘normal’;
}
/**
* Where to sort in?
*/
function getSort(){
return 156;
}
/**
* Connect pattern to lexer
*/
function connectTo($mode) {
$this->Lexer->addSpecialPattern(‘~~Mantis:[0-9]+~~’, $mode, ‘plugin_mantis’);
}
/**
* Handle the match
*/
function handle($match, $state, $pos, &$handler){
$match = substr( $match, 9, -2 ); // strip "~~Mantis:" from start and "~~" from end
return array( strtolower( $match ) );
}
/**
* Create output
*/
function render($format, &$renderer, $data) {
if ( $format == ‘xhtml’ ) {
$renderer->externallink( MANTIS_URL . ‘view.php?id=’ . $data[0], $data[0] );
return true;
}
return false;
}
}
[/php]
위에서 언급한 수정된 파일들만 첨부합니다. 몇몇 설정 파일들은 본인의 서버설정에 맞게 수정해 줘야 하는 점 잊지마시기 바랍니다. 이제 버그트래커와 위키로 프로젝트 잘 관리하세요~!
]]>
다른 Office와 호환도 완벽하고 Project Server를 이용하면 대단위 프로젝트에서는 정말 좋을 것 같지만 역시 고가라는 게 문제다. 본인은 겨우 알바관리를 위한 프로젝트 관리 툴이면 만족한다. 그래서 좀 찾아봤는데 의외로 상당히 많은 오픈소스 프로젝트 관리툴이 나와있었다.
이중 3종을 다운받아 사용해 보았는데 반나절 동안 사용해 본 점을 비교해 보겠다.
1. OpenProj

제일 처음 다운 받아서 사용해 본 OpenProj 이다. 사용해본 프로젝트 관리툴 3종의 공통점은 전부 자바 기반이라는 것이다. 자바 기반이다보니 기본으로 멀티플랫폼을 지원한다. OpenProj는 3개 중 가장 많은 기능과 옵션을 자랑한다. 거기에 한글화도 매우 잘되어 있어서 왠만한 프로젝트 관리에는 부족함이 없을 것 같다. 다만 치명적인 단점이 있는데 내보내기 기능이 없다는 것이다. 저장은 오로지 자체 포멧과 Microsoft Project 포멧 만을 지원한다. 출력을 해서 공유할게 아니면 다른 인원과 프로젝트를 공유 할 방법이 없다. 유일하게 PDF 가 지원하는데 이 또한 유료버전에서만 가능하다.
[button url=’http://www.projity.com/’ target=’_blank’ size=’large’]OpenProj 다운로드[/button]
2. jxProject

위에 소개한 OpenProj가 훌륭한 기능에도 불구하고 사용할 수 없게 되서 찾아본게 jxProject 이다. jxProject의 장점은 다양한 포멧으로 프로젝트 시트를 내보낼 수 있다는 것이다. html 뿐만 아니라 bmp, jpg 등 다양한 이미지 포멧도 지원한다. 다만 한글지원이 제대로 안되다는 점과 Task가 제대로 생성되지 않는다는 단점이 있다.
[button url=’http://www.jxproject.com/’ target=’_blank’ size=’large’]jxProject다운로드[/button]
3. GanttProject

GanttProject는 위에서 언급한 모든 단점들이 해결 되었다. 다양한 포멧으로 내보내기가 가능하며 Task 또한 매우 잘 생성된다. 거기에다 한글화 까지 깔끔하게 되어 있어 프로젝트 관리툴을 처음 사용하는 초심자들도 쉽게 사용 할 수 있다. 다만 단점이라면 OpenProj 처럼 많은 기능과 차트를 제공하지 않는 다는 것이다. 하지만 기본적인 일정관리와 인력관리 정도만을 필요로 하는 소규모 프로젝트에서는 간편하게 사용 할 수 있지 않을 가 싶다.
[button url=’http://www.ganttproject.biz/’ target=’_blank’ size=’large’]GanttProject다운로드[/button]
]]>