Rssad.pm 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. ################################################################################
  2. # $Id: Rssad.pm 3132 2007-06-26 18:17:46Z b4rt $
  3. # $Date: 2007-06-26 13:17:46 -0500 (Tue, 26 Jun 2007) $
  4. # $Revision: 3132 $
  5. ################################################################################
  6. # #
  7. # LICENSE #
  8. # #
  9. # This program is free software; you can redistribute it and/or #
  10. # modify it under the terms of the GNU General Public License (GPL) #
  11. # as published by the Free Software Foundation; either version 2 #
  12. # of the License, or (at your option) any later version. #
  13. # #
  14. # This program is distributed in the hope that it will be useful, #
  15. # but WITHOUT ANY WARRANTY; without even the implied warranty of #
  16. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
  17. # GNU General Public License for more details. #
  18. # #
  19. # To read the license please visit http://www.gnu.org/copyleft/gpl.html #
  20. # #
  21. # #
  22. ################################################################################
  23. package Rssad;
  24. use strict;
  25. use warnings;
  26. ################################################################################
  27. ################################################################################
  28. # fields #
  29. ################################################################################
  30. # version in a var
  31. my $VERSION = do {
  32. my @r = (q$Revision: 3132 $ =~ /\d+/g); sprintf "%d"."%02d" x $#r, @r };
  33. # state
  34. my $state = Fluxd::MOD_STATE_NULL;
  35. # message, error etc. keep it in one string for simplicity atm.
  36. my $message = "";
  37. # loglevel
  38. my $loglevel = 0;
  39. # run-interval
  40. my $interval;
  41. # time of last run
  42. my $time_last_run = 0;
  43. # jobs
  44. my @jobs;
  45. # data-dir
  46. my $dataDir = "rssad/";
  47. ################################################################################
  48. # constructor + destructor #
  49. ################################################################################
  50. #------------------------------------------------------------------------------#
  51. # Sub: new #
  52. # Arguments: Null #
  53. # Returns: object reference #
  54. #------------------------------------------------------------------------------#
  55. sub new {
  56. my $class = shift;
  57. my $self = bless ({}, ref ($class) || $class);
  58. return $self;
  59. }
  60. #------------------------------------------------------------------------------#
  61. # Sub: destroy #
  62. # Arguments: Null #
  63. # Returns: Null #
  64. #------------------------------------------------------------------------------#
  65. sub destroy {
  66. # set state
  67. $state = Fluxd::MOD_STATE_NULL;
  68. # log
  69. Fluxd::printMessage("Rssad", "shutdown\n");
  70. # undef
  71. undef @jobs;
  72. }
  73. ################################################################################
  74. # public methods #
  75. ################################################################################
  76. #------------------------------------------------------------------------------#
  77. # Sub: initialize. this is separated from constructor to call it independent #
  78. # from object-creation. #
  79. # Arguments: null #
  80. # Returns: 0|1 #
  81. #------------------------------------------------------------------------------#
  82. sub initialize {
  83. shift; # class
  84. # loglevel
  85. $loglevel = Fluxd::getLoglevel();
  86. if (!(defined $loglevel)) {
  87. # message
  88. $message = "loglevel not defined";
  89. # set state
  90. $state = Fluxd::MOD_STATE_ERROR;
  91. # return
  92. return 0;
  93. }
  94. # data-dir
  95. my $ddir = Fluxd::getPathDataDir();
  96. if (!(defined $ddir)) {
  97. # message
  98. $message = "data-dir not defined";
  99. # set state
  100. $state = Fluxd::MOD_STATE_ERROR;
  101. # return
  102. return 0;
  103. }
  104. $dataDir = $ddir . $dataDir;
  105. # check if our main-dir exists. try to create if it doesnt
  106. if (! -d $dataDir) {
  107. Fluxd::printMessage("Rssad", "creating data-dir : ".$dataDir."\n");
  108. mkdir($dataDir, 0700);
  109. if (! -d $dataDir) {
  110. # message
  111. $message = "data-dir does not exist and cannot be created";
  112. # set state
  113. $state = Fluxd::MOD_STATE_ERROR;
  114. # return
  115. return 0;
  116. }
  117. }
  118. # interval
  119. $interval = FluxDB->getFluxConfig("fluxd_Rssad_interval");
  120. if (!(defined $interval)) {
  121. # message
  122. $message = "interval not defined";
  123. # set state
  124. $state = Fluxd::MOD_STATE_ERROR;
  125. # return
  126. return 0;
  127. }
  128. # jobs
  129. my $jobs = FluxDB->getFluxConfig("fluxd_Rssad_jobs");
  130. if (!(defined $jobs)) {
  131. # message
  132. $message = "jobs not defined";
  133. # set state
  134. $state = Fluxd::MOD_STATE_ERROR;
  135. # return
  136. return 0;
  137. }
  138. Fluxd::printMessage("Rssad", "initializing (loglevel: ".$loglevel." ; data-dir: ".$dataDir." ; interval: ".$interval." ; jobs: ".$jobs.")\n");
  139. # parse jobs
  140. # job1|job2|job3
  141. my (@jobsAry) = split(/\|/, $jobs);
  142. foreach my $jobEntry (@jobsAry) {
  143. # savedir#url#filtername
  144. chomp $jobEntry;
  145. my (@jobAry) = split(/#/,$jobEntry);
  146. my $savedir = shift @jobAry;
  147. chomp $savedir;
  148. my $url = shift @jobAry;
  149. chomp $url;
  150. my $filter = shift @jobAry;
  151. chomp $filter;
  152. # job-entry
  153. if ($loglevel > 1) {
  154. Fluxd::printMessage("Rssad", "job : savedir=".$savedir.", url=".$url.", filter=".$filter."\n");
  155. }
  156. # add to jobs-array
  157. if ((!($savedir eq "")) && (!($url eq "")) && (!($filter eq ""))) {
  158. my $index = scalar(@jobs);
  159. $jobs[$index] = {
  160. 'savedir' => $savedir,
  161. 'filter' => $filter,
  162. 'url' => $url
  163. };
  164. }
  165. }
  166. # reset last run time
  167. $time_last_run = time();
  168. # set state
  169. $state = Fluxd::MOD_STATE_OK;
  170. # return
  171. return 1;
  172. }
  173. #------------------------------------------------------------------------------#
  174. # Sub: getVersion #
  175. # Arguments: null #
  176. # Returns: VERSION #
  177. #------------------------------------------------------------------------------#
  178. sub getVersion {
  179. return $VERSION;
  180. }
  181. #------------------------------------------------------------------------------#
  182. # Sub: getState #
  183. # Arguments: null #
  184. # Returns: state #
  185. #------------------------------------------------------------------------------#
  186. sub getState {
  187. return $state;
  188. }
  189. #------------------------------------------------------------------------------#
  190. # Sub: getMessage #
  191. # Arguments: null #
  192. # Returns: message #
  193. #------------------------------------------------------------------------------#
  194. sub getMessage {
  195. return $message;
  196. }
  197. #------------------------------------------------------------------------------#
  198. # Sub: set #
  199. # Arguments: Variable [value] #
  200. # Returns: #
  201. #------------------------------------------------------------------------------#
  202. sub set {
  203. }
  204. #------------------------------------------------------------------------------#
  205. # Sub: main #
  206. # Arguments: Null #
  207. # Returns: #
  208. #------------------------------------------------------------------------------#
  209. sub main {
  210. if ((time() - $time_last_run) >= $interval) {
  211. # exec tfrss-jobs
  212. my $jobCount = scalar(@jobs);
  213. for (my $i = 0; $i < $jobCount; $i++) {
  214. if ($loglevel > 1) {
  215. my $msg = "executing job :\n";
  216. $msg .= " savedir: ".$jobs[$i]{"savedir"}."\n";
  217. $msg .= " filter: ".$dataDir.$jobs[$i]{"filter"}."\n";
  218. $msg .= " url: ".$jobs[$i]{"url"}."\n";
  219. Fluxd::printMessage("Rssad", $msg);
  220. }
  221. # exec
  222. tfrss($jobs[$i]{"savedir"}, $dataDir.$jobs[$i]{"filter"}, $jobs[$i]{"url"});
  223. }
  224. # set last run time
  225. $time_last_run = time();
  226. }
  227. }
  228. #------------------------------------------------------------------------------#
  229. # Sub: command #
  230. # Arguments: command-string #
  231. # Returns: result-string #
  232. #------------------------------------------------------------------------------#
  233. sub command {
  234. shift; # class
  235. my $command = shift;
  236. # TODO
  237. return "";
  238. }
  239. #------------------------------------------------------------------------------#
  240. # Sub: status #
  241. # Arguments: Null #
  242. # Returns: Status information #
  243. #------------------------------------------------------------------------------#
  244. sub status {
  245. my $return = "";
  246. $return .= "\n-= Rssad Revision ".$VERSION." =-\n";
  247. $return .= "interval : ".$interval." s \n";
  248. $return .= "jobs :\n";
  249. my $jobCount = scalar(@jobs);
  250. for (my $i = 0; $i < $jobCount; $i++) {
  251. $return .= " * savedir: ".$jobs[$i]{"savedir"}."\n";
  252. $return .= " filter: ".$jobs[$i]{"filter"}."\n";
  253. $return .= " url: ".$jobs[$i]{"url"}."\n";
  254. }
  255. return $return;
  256. }
  257. #------------------------------------------------------------------------------#
  258. # Sub: tfrss #
  259. # Arguments: save-location, filter, rss-feed-url #
  260. # Returns: 0|1 #
  261. #------------------------------------------------------------------------------#
  262. sub tfrss {
  263. my $save = shift;
  264. my $filter = shift;
  265. my $url = shift;
  266. my $logfile = $filter.".log";
  267. # log the invocation
  268. open(FILTERLOG,">>$logfile");
  269. print FILTERLOG localtime()." - ".$url."\n";
  270. close(FILTERLOG);
  271. # fluxcli-call
  272. return Fluxd::fluxcli("rss", $save, $filter.".dat", $filter.".hist", $url);
  273. }
  274. ################################################################################
  275. # make perl happy #
  276. ################################################################################
  277. 1;