#!/usr/bin/php5
<?
/* rss2mantis
 * 
 * Parse RSS feed into mantis issue's
 *
 * 20150323 MV: Changed time check to feed timestamp only
 * 20150206 MV: Fixed minor bugs
 * 20150205 MV: Initial version
 */

require_once('/usr/share/php/simplepie/simplepie.inc');

function create_issue($summary, $description, $category) {

   if (isset($GLOBALS['config']['basiclogin'])) {
      $soapoptions = array(
        'login' => $GLOBALS['config']['basiclogin'],
        'password' => $GLOBALS['config']['basicpass'],
      );
      $c = new SoapClient($GLOBALS['config']['soapurl'], $soapoptions);
   }
   else
      $c = new SoapClient($GLOBALS['config']['soapurl']);

   $issue = array ( 
                 'summary' => "$summary", 
                 'description' => "$description", 
                 'project' => array('name' => $GLOBALS['config']['issueproject']),
                 'category' => $category,
                 'handler' => array('name' => $GLOBALS['config']['issueassign'])
     );
   $c->mc_issue_add($GLOBALS['config']['mantislogin'], $GLOBALS['config']['mantispass'], $issue);
}

function process_feed($name, $url, $category) {

   $feed = new SimplePie();
   $feed->set_feed_url($url);
   if (!$feed->init()) {
      echo "Error opening feed";
      return;
   } else
   {
      if (isset($GLOBALS['status'][$name]))
         $since = $GLOBALS['status'][$name];
      else
         $since = 0;
   }
   $newest = $since;

   $feed->handle_content_type();
   foreach ($feed->get_items() as $item):
      if ($item->get_date('U') > $since) {
         if ($item->get_date('U') > $newest)
            $newest = $item->get_date('U');
         create_issue(sprintf("%s: %s",$name, $item->get_title()), sprintf("%s\n\n%s", $item->get_description(), $item->get_link()), $category);
      }
   endforeach;
   if ($newest > $since)
      $GLOBALS['status'][$name] = $newest;
}

function read_config($configfile) {
   global $config;
   global $feed;

   $configinput = parse_ini_file($configfile, true);
   if (!is_array($configinput)) {
      printf("Unable to read/parse configfile: %s\n", $configfile);
      usage();
   }

   if (!is_array($configinput['settings'])) {
      printf("Settings section missing in config file\n");
      usage();
   }

   $config = $configinput['settings'];

   if (!isset($config['soapurl'])) {
      printf("soapurl missing in settings section of config file\n");
      usage();
   }

   if (isset($config['basiclogin'])) {
      if (!isset($config['basicpass'])) {
         printf("basiclogin is defined without basicpass in settings section of config file\n");
         usage();
      }
   }
   
   if (!isset($config['mantislogin'])) {
      printf("mantislogin missing in settings section of config file\n");
      usage();
   }

   if (!isset($config['mantispass'])) {
      printf("mantispass missing in settings section of config file\n");
      usage();
   }

   if (!isset($config['issuedefaultcat'])) {
      printf("issuedefaultcat missing in settings section of config file\n");
      usage();
   }

   if (!isset($config['issueproject'])) {
      printf("issueproject missing in settings section of config file\n");
      usage();
   }

   if (!isset($config['issueassign'])) {
      printf("issueassign missing in settings section of config file\n");
      usage();
   }

   if (!isset($config['statusfile'])) {
      printf("statusfile missing in settings section of config file\n");
      usage();
   }

   unset($configinput['settings']);
   $feed = $configinput;
}

function usage() {
   printf("Usage: rss2mantis -f configfile\n");
   printf("Converts rss feeds to mantis issue's.\n");
   exit(1);
}

function main() {
   //error_reporting(0);

   global $status;

   $options = getopt("f:");

   if (isset($options['f']))
      $configfile=$options['f'];
   else {
      printf("No configuration file given.\n");
      usage();
   }

   read_config($configfile);

   $content = file_get_contents($GLOBALS['config']['statusfile']);
   if (isset($content))
      $status = unserialize($content);

   foreach ($GLOBALS['feed'] as $item):
      if (!isset($item['url']) || !isset($item['name']))
         printf("Section does not contain all required variables for a feed. skipping\n");
      else {
         if (isset($item['category']))
            process_feed($item['name'], $item['url'], $item['category']);
         else
            process_feed($item['name'], $item['url'], $GLOBALS['config']['issuedefaultcat']);
      }
   endforeach;
   $content = serialize($status);
   file_put_contents($GLOBALS['config']['statusfile'], $content);
}

main();
?>
