FOSSology  4.4.0
Open Source License Compliance by Open Source Software
readmeoss.php
Go to the documentation of this file.
1 <?php
2 /*
3  Author: Daniele Fognini, Shaheem Azmal M MD
4  SPDX-FileCopyrightText: © 2016-2018 Siemens AG
5 
6  SPDX-License-Identifier: GPL-2.0-only
7 */
43 
44 include_once(__DIR__ . "/version.php");
45 
51 class ReadmeOssAgent extends Agent
52 {
53  const UPLOAD_ADDS = "uploadsAdd";
54 
59 
64 
69 
73  private $uploadDao;
74 
78  protected $additionalUploadIds = array();
79 
80  function __construct()
81  {
82  $this->cpClearedGetter = new XpClearedGetter("copyright", "statement");
83  $this->licenseClearedGetter = new LicenseClearedGetter();
84  $this->licenseMainGetter = new LicenseMainGetter();
85 
86  parent::__construct(README_AGENT_NAME, AGENT_VERSION, AGENT_REV);
87 
88  $this->uploadDao = $this->container->get('dao.upload');
89 
90  $this->agentSpecifLongOptions[] = self::UPLOAD_ADDS.':';
91  }
92 
98  function processUploadId($uploadId)
99  {
101 
102  $args = $this->args;
103  $this->additionalUploadIds = array_key_exists(self::UPLOAD_ADDS,$args) ? explode(',',$args[self::UPLOAD_ADDS]) : array();
104  $uploadIds = $this->additionalUploadIds;
105  array_unshift($uploadIds, $uploadId);
106 
107  $this->heartbeat(0);
108  $licenseStmts = array();
109  $copyrightStmts = array();
110  $licenseStmtsMain = array();
111  $licenseAcknowledgements = array();
112 
113  foreach ($uploadIds as $addUploadId) {
114  if (!$this->uploadDao->isAccessible($addUploadId, $groupId)) {
115  continue;
116  }
117  $moreLicenses = $this->licenseClearedGetter->getCleared($addUploadId, $this, $groupId, true, "license", false);
118  $licenseStmts = array_merge($licenseStmts, $moreLicenses['statements']);
119  $this->heartbeat(count($moreLicenses['statements']));
120  $this->licenseClearedGetter->setOnlyAcknowledgements(true);
121  $moreAcknowledgements = $this->licenseClearedGetter->getCleared($addUploadId, $this, $groupId, true, "license", false);
122  $licenseAcknowledgements = array_merge($licenseAcknowledgements, $moreAcknowledgements['statements']);
123  $this->heartbeat(count($moreAcknowledgements['statements']));
124  $moreCopyrights = $this->cpClearedGetter->getCleared($addUploadId, $this, $groupId, true, "copyright", false);
125  $copyrightStmts = array_merge($copyrightStmts, $moreCopyrights['statements']);
126  $this->heartbeat(count($moreCopyrights['statements']));
127  $moreMainLicenses = $this->licenseMainGetter->getCleared($addUploadId, $this, $groupId, true, null, false);
128  $licenseStmtsMain = array_merge($licenseStmtsMain, $moreMainLicenses['statements']);
129  $this->heartbeat(count($moreMainLicenses['statements']));
130  }
131  list($licenseStmtsMain, $licenseStmts) = $this->licenseClearedGetter->updateIdentifiedGlobalLicenses($licenseStmtsMain, $licenseStmts);
132  $contents = array('licensesMain'=>$licenseStmtsMain, 'licenses'=>$licenseStmts, 'copyrights'=>$copyrightStmts, 'licenseAcknowledgements' => $licenseAcknowledgements);
133  $this->writeReport($contents, $uploadId);
134 
135  return true;
136  }
137 
143  private function writeReport($contents, $uploadId)
144  {
145  global $SysConf;
146 
147  $packageName = $this->uploadDao->getUpload($uploadId)->getFilename();
148 
149  $fileBase = $SysConf['FOSSOLOGY']['path']."/report/";
150  $fileName = $fileBase. "ReadMe_OSS_".$packageName.'_'.time().".txt" ;
151 
152  foreach ($this->additionalUploadIds as $addUploadId) {
153  $packageName .= ', ' . $this->uploadDao->getUpload($addUploadId)->getFilename();
154  }
155 
156  if (!is_dir($fileBase)) {
157  mkdir($fileBase, 0777, true);
158  }
159  umask(0133);
160  $message = $this->generateReport($contents, $packageName);
161 
162  file_put_contents($fileName, $message);
163 
164  $this->updateReportTable($uploadId, $this->jobId, $fileName);
165  }
166 
173  private function updateReportTable($uploadId, $jobId, $filename)
174  {
175  $this->dbManager->insertTableRow('reportgen', array('upload_fk'=>$uploadId, 'job_fk'=>$jobId, 'filepath'=>$filename), __METHOD__);
176  }
177 
186  private function createReadMeOSSFormat($addSeparator, $dataForReadME, $extract, $break)
187  {
188  $outData = "";
189  foreach ($dataForReadME as $statements) {
190  if ($extract == 'text') {
191  $outData .= $statements["content"] . $break;
192  }
193  $outData .= str_replace("\n", "\r\n", $statements[$extract]) . $break;
194  if (!empty($addSeparator)) {
195  $outData .= $addSeparator . $break;
196  }
197  }
198  return htmlspecialchars_decode($outData, ENT_DISALLOWED);
199  }
200 
208  private function generateReport($contents, $packageName)
209  {
210  $separator1 = str_repeat("=", 120);
211  $separator2 = str_repeat("-", 120);
212  $break = str_repeat("\r\n", 2);
213  $output = $separator1 . $break . $packageName . $break . $separator2 . $break;
214  if (!empty($contents['licensesMain'])) {
215  $output .= $separator1 . $break . " MAIN LICENSES " . $break . $separator2 . $break;
216  $output .= $this->createReadMeOSSFormat($separator2, $contents['licensesMain'], 'text', $break);
217  }
218  if (!empty($contents['licenses'])) {
219  $output .= $separator1 . $break . " OTHER LICENSES " . $break . $separator2 . $break;
220  $output .= $this->createReadMeOSSFormat($separator2, $contents['licenses'], 'text', $break);
221  }
222  if (!empty($contents['licenseAcknowledgements'])) {
223  $output .= $separator1 . $break . " ACKNOWLEDGEMENTS " . $break . $separator2 . $break;
224  $output .= $this->createReadMeOSSFormat($separator2, $contents['licenseAcknowledgements'], 'text', $break);
225  }
226  $copyrights = $this->createReadMeOSSFormat("", $contents['copyrights'], 'content', "\r\n");
227  if (empty($copyrights)) {
228  $output .= "<Copyright notices>";
229  $output .= $break;
230  $output .= "<notices>";
231  } else {
232  $output .= "Copyright notices";
233  $output .= $break;
234  $output .= $copyrights;
235  }
236  return $output;
237  }
238 }
239 
240 $agent = new ReadmeOssAgent();
241 $agent->scheduler_connect();
242 $agent->run_scheduler_event_loop();
243 $agent->scheduler_disconnect(0);
Structure of an Agent with all required parameters.
Definition: Agent.php:41
heartbeat($newProcessed)
Send hear beat to the scheduler.
Definition: Agent.php:203
Readme_OSS agent generates list of licenses and copyrights found in an upload.
Definition: readmeoss.php:52
updateReportTable($uploadId, $jobId, $filename)
Update the report path.
Definition: readmeoss.php:173
writeReport($contents, $uploadId)
Write data to text file.
Definition: readmeoss.php:143
generateReport($contents, $packageName)
Gather all the data.
Definition: readmeoss.php:208
const UPLOAD_ADDS
The HTTP GET parameter name.
Definition: readmeoss.php:53
processUploadId($uploadId)
Given an upload ID, process the items in it.
Definition: readmeoss.php:98
createReadMeOSSFormat($addSeparator, $dataForReadME, $extract, $break)
This function lists elements of array.
Definition: readmeoss.php:186
int jobId
The id of the job.
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16