5 * Copyright (c) Xerox Corporation, Codendi 2007-2008.
6 * @author Marc Nazarian <marc.nazarian@xrce.xerox.com>
7 * Copyright (C) 2010-2011 Alain Peyrat - Alcatel-Lucent
8 * Copyright 2013-2014,2016,2019, Franck Villaume - TrivialDev
10 * This file is a part of Fusionforge.
12 * Fusionforge is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * Fusionforge is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with Fusionforge. If not, see <http://www.gnu.org/licenses/>.
26 require_once 'PluginHudsonJobDao.class.php';
28 class hudsonPlugin extends Plugin {
30 function __construct($id=0) {
31 parent::__construct($id);
32 $this->name = "hudson";
33 $this->text = _('Hudson/Jenkins'); // To show in the tabs, use...
35 _("This plugin contains the Hudson/Jenkins subsystem of FusionForge. It allows each
36 FusionForge project to have its own Hudson/Jenkins, and gives some
37 control over it to the project administrator.");
38 $this->_addHook("user_personal_links"); //to make a link to the user's personal part of the plugin
39 //$this->_addHook("usermenu") ;
40 $this->_addHook("groupmenu"); // To put into the project tabs
41 $this->_addHook("groupisactivecheckbox") ; // The "use ..." checkbox in editgroupinfo
42 $this->_addHook("groupisactivecheckboxpost") ; //
43 //$this->_addHook("userisactivecheckbox") ; // The "use ..." checkbox in user account
44 //$this->_addHook("userisactivecheckboxpost") ; //
45 $this->_addHook("project_admin_plugins"); // to show up in the admin page fro group
46 $this->_addHook('javascript', false);
47 $this->_addHook('cssfile', 'cssFile', false);
48 $this->_addHook('group_delete', 'projectIsDeleted', false);
49 $this->_addHook('widget_instance', 'myPageBox', false);
50 $this->_addHook('widgets', 'widgets', false);
51 $this->_addHook('get_available_reference_natures', 'getAvailableReferenceNatures', false);
52 $this->_addHook('ajax_reference_tooltip', 'ajax_reference_tooltip', false);
53 $this->_addHook('role_get');
54 $this->_addHook('role_normalize');
55 $this->_addHook('role_unlink_project');
56 $this->_addHook('role_translate_strings');
57 $this->_addHook('role_has_permission');
58 $this->_addHook('role_get_setting');
59 $this->_addHook('list_roles_by_permission');
60 $this->_addHook('project_public_area');
63 function CallHook($hookname, &$params) {
64 global $G_SESSION,$HTML;
65 // if ($hookname == "usermenu") {
66 // $text = $this->text; // this is what shows in the tab
67 // if ($G_SESSION->usesPlugin("hudson")) {
68 // $param = '?type=user&id=' . $G_SESSION->getId(); // we indicate the part we're calling is the user one
69 // echo $HTML->PrintSubMenu(array($text), array('/plugins/hudson/index.php'.$param));
71 // } elseif ($hookname == "groupmenu") {
72 if ($hookname == "groupmenu") {
73 $group_id=$params['group'];
74 $project = group_get_object($group_id);
75 if (!$project || !is_object($project)) {
78 if ($project->isError()) {
81 if ( $project->usesPlugin( $this->name )) {
82 $params['TITLES'][] = $this->text;
83 $params['DIRS'][] = '/plugins/hudson/?group_id=' . $group_id; // we indicate the part we're calling is the project one
84 $params['ADMIN'][] = '';
85 $params['TOOLTIPS'][] = _('Continuous Integration Scheduler');
87 if (isset($params['toptab'])) {
88 (($params['toptab'] == $this->name) ? $params['selected']=(count($params['TITLES'])-1) : '' );
90 } elseif ($hookname == 'cssfile') {
91 $this->cssFile($params);
92 } elseif ($hookname == 'group_delete') {
93 $this->projectIsDeleted($params);
94 } elseif ($hookname == "widget_instance") {
95 $this->myPageBox($params);
96 } elseif ($hookname == "widgets") {
97 $this->widgets($params);
98 } elseif ($hookname == "get_available_reference_natures") {
99 $this->getAvailableReferenceNatures($params);
100 } elseif ($hookname == "ajax_reference_tooltip") {
101 $this->ajax_reference_tooltip($params);
102 } elseif ($hookname == 'role_get') {
103 $this->role_get($params);
104 } elseif ($hookname == 'role_normalize') {
105 $this->role_normalize($params);
106 } elseif ($hookname == 'role_translate_strings') {
107 $this->role_translate_strings($params);
108 } elseif ($hookname == 'role_has_permission') {
109 $this->role_has_permission($params);
110 } elseif ($hookname == 'role_get_setting') {
111 $this->role_get_setting($params);
112 } elseif ($hookname == 'list_roles_by_permission') {
113 $this->list_roles_by_permission($params);
114 } elseif ($hookname == 'project_public_area') {
115 $this->project_public_area();
119 function &getPluginInfo() {
120 if (!is_a($this->pluginInfo, 'hudsonPluginInfo')) {
121 require_once 'hudsonPluginInfo.class.php';
122 $this->pluginInfo = new hudsonPluginInfo($this);
124 return $this->pluginInfo;
127 function cssFile($params) {
128 // Only show the stylesheet if we're actually in the hudson pages.
129 // This stops styles inadvertently clashing with the main site.
130 if (strpos($_SERVER['REQUEST_URI'], $this->getPluginPath()) === 0 ||
131 strpos($_SERVER['REQUEST_URI'], '/my/') === 0 ||
132 strpos($_SERVER['REQUEST_URI'], '/projects/') === 0 ||
133 strpos($_SERVER['REQUEST_URI'], '/widgets/') === 0
135 use_stylesheet($this->getThemePath().'/css/style.css');
140 * When a project is deleted,
141 * we delete all the hudson jobs of this project
143 * @param mixed $params ($param['group_id'] the ID of the deleted project)
145 function projectIsDeleted($params) {
147 require_once $gfcommon.'dao/CodendiDataAccess.class.php';
148 $group_id = $params['group_id'];
149 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
150 $job_dao->deleteHudsonJobsByGroupID($group_id);
153 function myPageBox($params) {
154 require_once 'common/widget/WidgetLayoutManager.class.php';
156 $user = UserManager::instance()->getCurrentUser();
159 if ($params['widget'] == 'plugin_hudson_my_jobs') {
160 require_once 'hudson_Widget_MyMonitoredJobs.class.php';
161 $params['instance'] = new hudson_Widget_MyMonitoredJobs($this);
163 if ($params['widget'] == 'plugin_hudson_my_joblastbuilds') {
164 require_once 'hudson_Widget_JobLastBuilds.class.php';
165 $params['instance'] = new hudson_Widget_JobLastBuilds(WidgetLayoutManager::OWNER_TYPE_USER, $user->getId());
167 if ($params['widget'] == 'plugin_hudson_my_jobtestresults') {
168 require_once 'hudson_Widget_JobTestResults.class.php';
169 $params['instance'] = new hudson_Widget_JobTestResults(WidgetLayoutManager::OWNER_TYPE_USER, $user->getId());
171 if ($params['widget'] == 'plugin_hudson_my_jobtesttrend') {
172 require_once 'hudson_Widget_JobTestTrend.class.php';
173 $params['instance'] = new hudson_Widget_JobTestTrend(WidgetLayoutManager::OWNER_TYPE_USER, $user->getId());
175 if ($params['widget'] == 'plugin_hudson_my_jobbuildhistory') {
176 require_once 'hudson_Widget_JobBuildHistory.class.php';
177 $params['instance'] = new hudson_Widget_JobBuildHistory(WidgetLayoutManager::OWNER_TYPE_USER, $user->getId());
179 if ($params['widget'] == 'plugin_hudson_my_joblastartifacts') {
180 require_once 'hudson_Widget_JobLastArtifacts.class.php';
181 $params['instance'] = new hudson_Widget_JobLastArtifacts(WidgetLayoutManager::OWNER_TYPE_USER, $user->getId());
185 if ($params['widget'] == 'plugin_hudson_project_jobsoverview') {
186 require_once 'hudson_Widget_ProjectJobsOverview.class.php';
187 $params['instance'] = new hudson_Widget_ProjectJobsOverview($this);
189 if ($params['widget'] == 'plugin_hudson_project_joblastbuilds') {
190 require_once 'hudson_Widget_JobLastBuilds.class.php';
191 $params['instance'] = new hudson_Widget_JobLastBuilds(WidgetLayoutManager::OWNER_TYPE_GROUP, $GLOBALS['group_id']);
193 if ($params['widget'] == 'plugin_hudson_project_jobtestresults') {
194 require_once 'hudson_Widget_JobTestResults.class.php';
195 $params['instance'] = new hudson_Widget_JobTestResults(WidgetLayoutManager::OWNER_TYPE_GROUP, $GLOBALS['group_id']);
197 if ($params['widget'] == 'plugin_hudson_project_jobtesttrend') {
198 require_once 'hudson_Widget_JobTestTrend.class.php';
199 $params['instance'] = new hudson_Widget_JobTestTrend(WidgetLayoutManager::OWNER_TYPE_GROUP, $GLOBALS['group_id']);
201 if ($params['widget'] == 'plugin_hudson_project_jobbuildhistory') {
202 require_once 'hudson_Widget_JobBuildHistory.class.php';
203 $params['instance'] = new hudson_Widget_JobBuildHistory(WidgetLayoutManager::OWNER_TYPE_GROUP, $GLOBALS['group_id']);
205 if ($params['widget'] == 'plugin_hudson_project_joblastartifacts') {
206 require_once 'hudson_Widget_JobLastArtifacts.class.php';
207 $params['instance'] = new hudson_Widget_JobLastArtifacts(WidgetLayoutManager::OWNER_TYPE_GROUP, $GLOBALS['group_id']);
211 function widgets($params) {
212 $group = group_get_object($GLOBALS['group_id']);
213 if ( !$group || !$group->usesPlugin ( $this->name ) ) {
217 require_once 'common/widget/WidgetLayoutManager.class.php';
218 if ($params['owner_type'] == WidgetLayoutManager::OWNER_TYPE_USER) {
219 $params['codendi_widgets'][] = 'plugin_hudson_my_jobs';
220 $params['codendi_widgets'][] = 'plugin_hudson_my_joblastbuilds';
221 $params['codendi_widgets'][] = 'plugin_hudson_my_jobtestresults';
222 $params['codendi_widgets'][] = 'plugin_hudson_my_jobtesttrend';
223 $params['codendi_widgets'][] = 'plugin_hudson_my_jobbuildhistory';
224 $params['codendi_widgets'][] = 'plugin_hudson_my_joblastartifacts';
226 if ($params['owner_type'] == WidgetLayoutManager::OWNER_TYPE_GROUP) {
227 $params['codendi_widgets'][] = 'plugin_hudson_project_jobsoverview';
228 $params['codendi_widgets'][] = 'plugin_hudson_project_joblastbuilds';
229 $params['codendi_widgets'][] = 'plugin_hudson_project_jobtestresults';
230 $params['codendi_widgets'][] = 'plugin_hudson_project_jobtesttrend';
231 $params['codendi_widgets'][] = 'plugin_hudson_project_jobbuildhistory';
232 $params['codendi_widgets'][] = 'plugin_hudson_project_joblastartifacts';
236 function getAvailableReferenceNatures($params) {
237 $hudson_plugin_reference_natures = array(
238 'hudson_build' => array('keyword' => 'build', 'label' => _("Hudson Build")),
239 'hudson_job' => array('keyword' => 'job', 'label' => _("Hudson Job")));
240 $params['natures'] = array_merge($params['natures'], $hudson_plugin_reference_natures);
243 function ajax_reference_tooltip($params) {
245 require_once 'HudsonJob.class.php';
246 require_once 'HudsonBuild.class.php';
247 require_once 'hudson_Widget_JobLastBuilds.class.php';
249 $ref = $params['reference'];
250 switch ($ref->getNature()) {
252 $val = $params['val'];
253 $group_id = $params['group_id'];
254 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
255 if (strpos($val, "/") !== false) {
256 $arr = explode("/", $val);
259 $dar = $job_dao->searchByJobName($job_name, $group_id);
262 $dar = $job_dao->searchByGroupID($group_id);
263 if ($dar->rowCount() != 1) {
267 if ($dar && $dar->valid()) {
268 $row = $dar->current();
269 $build = new HudsonBuild($row['job_url'].'/'.$build_id.'/');
270 echo '<strong>' . _('Build performed on')._(': ').'</strong> ' . $build->getBuildTime() . '<br />';
271 echo '<strong>' . _("Status") . _(": ") . '</strong> ' . $build->getResult();
273 echo $HTML->error_msg(_('Error: Hudson object not found.'));
277 $job_dao = new PluginHudsonJobDao(CodendiDataAccess::instance());
278 $job_name = $params['val'];
279 $group_id = $params['group_id'];
280 $dar = $job_dao->searchByJobName($job_name, $group_id);
282 $row = $dar->current();
284 $job = new HudsonJob($row['job_url']);
285 $job_id = $row['job_id'];
289 $html .= ' <td colspan="2">';
290 $html .= ' '.$job->getName().': <img src="'.$job->getStatusIcon().'" />';
296 if ($job->hasBuilds()) {
297 $html .= ' <li>'._("Last Build")._(":").util_make_link('/plugins/hudson/?action=view_build&group_id='.$group_id.'&job_id='.$job_id.'&build_id='.$job->getLastBuildNumber(), '# '.$job->getLastBuildNumber()).'</li>';
298 $html .= ' <li>'._("Last Success")._(": ").util_make_link('/plugins/hudson/?action=view_build&group_id='.$group_id.'&job_id='.$job_id.'&build_id='.$job->getLastSuccessfulBuildNumber(), '# '.$job->getLastSuccessfulBuildNumber()).'</li>';
299 $html .= ' <li>'._("Last Failure")._(": ").util_make_link('/plugins/hudson/?action=view_build&group_id='.$group_id.'&job_id='.$job_id.'&build_id='.$job->getLastFailedBuildNumber(), '# '.$job->getLastFailedBuildNumber()).'</li>';
301 $html .= ' <li>'. _("No build found for this job.") . '</li>';
305 $html .= ' <td class="widget_lastbuilds_weather">';
306 $html .= _('Weather Report')._(':').'<img src="'.$job->getWeatherReportIcon().'" align="middle" />';
311 } catch (Exception $e) {
314 echo $HTML->error_msg(_('Error')._(': ')._('Hudson object not found.'));
321 require_once 'hudson.class.php';
322 $controler = new hudson();
323 $controler->process();
326 function role_get(&$params) {
327 $role =& $params['role'];
330 $right = new PluginSpecificRoleSetting($role, 'plugin_hudson_read');
331 $right->SetAllowedValues(array('0', '1'));
332 $right->SetDefaultValues(array('Admin' => '1',
333 'Senior Developer' => '1',
334 'Junior Developer' => '1',
336 'Support Tech' => '1'));
340 function role_normalize(&$params) {
341 $role =& $params['role'];
342 $new_pa =& $params['new_pa'];
344 $projects = $role->getLinkedProjects();
345 foreach ($projects as $p) {
346 $role->normalizePermsForSection($new_pa, 'plugin_hudson_read', $p->getID());
351 function role_unlink_project(&$params) {
352 $role =& $params['role'] ;
353 $project =& $params['project'] ;
355 $settings = array('plugin_hudson_read');
357 foreach ($settings as $s) {
358 db_query_params('DELETE FROM pfo_role_setting WHERE role_id=$1 AND section_name=$2 AND ref_id=$3',
359 array($role->getID(),
365 function role_translate_strings(&$params) {
366 $right = new PluginSpecificRoleSetting($params['role'], 'plugin_hudson_read');
367 $right->setDescription(_('Hudson access'));
368 $right->setValueDescriptions(array('0' => _('No Access'),
369 '1' => _('Full access')));
373 function role_has_permission(&$params) {
374 $value = $params['value'];
376 switch ($params['section']) {
377 case 'plugin_hudson_read':
379 switch ($params['action']) {
382 $params['result'] |= ($value >= 1);
390 function role_get_setting(&$params) {
391 $role = $params['role'];
392 $reference = $params['reference'];
393 $value = $params['value'];
395 switch ($params['section']) {
396 case 'plugin_hudson_read':
398 if ($role->hasPermission('project_admin', $reference)) {
399 $params['result'] = 1;
401 $params['result'] = $value;
408 function list_roles_by_permission(&$params) {
409 switch ($params['section']) {
410 case 'plugin_hudson_read':
412 switch ($params['action']) {
415 $params['qpa'] = db_construct_qpa($params['qpa'], ' AND perm_val >= 1') ;
423 function project_public_area(&$params) {
424 if (isset($params['group_id'])) {
425 $group_id=$params['group_id'];
426 } elseif (isset($params['group'])) {
427 $group_id=$params['group'];
432 $project = group_get_object($group_id);
433 if (!$project || !is_object($project)) {
436 if ($project->isError()) {
439 if ( $project->usesPlugin($this->name)) {
440 $params['result'] .= '<div class="public-area-box">';
441 $params['result'] .= util_make_link('/plugins/'.$this->name.'/?group_id='.$project->getID(),
442 html_abs_image(util_make_url('/plugins/'.$this->name.'/icon.png'),'20','20',array('alt'=>'Hudson/Jenkins')).
444 $params['result'] .= '</div>';