FluxdServiceMod.Rssad.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656
  1. <?php
  2. /* $Id: FluxdServiceMod.Rssad.php 3057 2007-05-27 13:06:39Z b4rt $ */
  3. /*******************************************************************************
  4. LICENSE
  5. This program is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU General Public License (GPL)
  7. as published by the Free Software Foundation; either version 2
  8. of the License, or (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. To read the license please visit http://www.gnu.org/copyleft/gpl.html
  14. *******************************************************************************/
  15. // class for the Fluxd-Service-module Rssad
  16. class FluxdRssad extends FluxdServiceMod
  17. {
  18. // private fields
  19. // basedir
  20. var $_basedir = ".fluxd/rssad/";
  21. // jobs-delim
  22. var $_delimJobs = "|";
  23. // job-delim
  24. var $_delimJob = "#";
  25. // =========================================================================
  26. // public static methods
  27. // =========================================================================
  28. /**
  29. * accessor for singleton
  30. *
  31. * @return FluxdRssad
  32. */
  33. function getInstance() {
  34. global $instanceFluxdRssad;
  35. // initialize if needed
  36. if (!isset($instanceFluxdRssad))
  37. FluxdRssad::initialize();
  38. return $instanceFluxdRssad;
  39. }
  40. /**
  41. * initialize FluxdRssad.
  42. */
  43. function initialize() {
  44. global $instanceFluxdRssad;
  45. // create instance
  46. if (!isset($instanceFluxdRssad))
  47. $instanceFluxdRssad = new FluxdRssad();
  48. }
  49. /**
  50. * getState
  51. *
  52. * @return state
  53. */
  54. function getState() {
  55. global $instanceFluxdRssad;
  56. return (isset($instanceFluxdRssad))
  57. ? $instanceFluxdRssad->state
  58. : FLUXDMOD_STATE_NULL;
  59. }
  60. /**
  61. * getMessages
  62. *
  63. * @return array
  64. */
  65. function getMessages() {
  66. global $instanceFluxdRssad;
  67. return (isset($instanceFluxdRssad))
  68. ? $instanceFluxdRssad->messages
  69. : array();
  70. }
  71. /**
  72. * getModState
  73. *
  74. * @return state
  75. */
  76. function getModState() {
  77. global $instanceFluxdRssad;
  78. return (isset($instanceFluxdRssad))
  79. ? $instanceFluxdRssad->modstate
  80. : FLUXDMOD_STATE_NULL;
  81. }
  82. /**
  83. * isRunning
  84. *
  85. * @return boolean
  86. */
  87. function isRunning() {
  88. global $instanceFluxdRssad;
  89. return (isset($instanceFluxdRssad))
  90. ? ($instanceFluxdRssad->modstate == FLUXDMOD_STATE_RUNNING)
  91. : false;
  92. }
  93. /**
  94. * check if filter exists
  95. *
  96. * @param $filtername
  97. * @return boolean
  98. */
  99. function filterExists($filtername) {
  100. global $instanceFluxdRssad;
  101. return $instanceFluxdRssad->instance_filterExists($filtername);
  102. }
  103. /**
  104. * checks if filter-id is a valid filter-id
  105. *
  106. * @param $id
  107. * @param $new
  108. * @param boolean
  109. */
  110. function filterIdCheck($id, $new = false) {
  111. global $instanceFluxdRssad;
  112. return $instanceFluxdRssad->instance_filterIdCheck($id, $new);
  113. }
  114. /**
  115. * get filter-list
  116. *
  117. * @return filter-list as array or false on error / no files
  118. */
  119. function filterGetList() {
  120. global $instanceFluxdRssad;
  121. return $instanceFluxdRssad->instance_filterGetList();
  122. }
  123. /**
  124. * get filter-content
  125. *
  126. * @param $filtername
  127. * @return filter as string or false on error / no files
  128. */
  129. function filterGetContent($filtername) {
  130. global $instanceFluxdRssad;
  131. return $instanceFluxdRssad->instance_filterGetContent($filtername);
  132. }
  133. /**
  134. * saves a filter
  135. *
  136. * @param $filtername
  137. * @param $content
  138. * @return boolean
  139. */
  140. function filterSave($filtername, $content) {
  141. global $instanceFluxdRssad;
  142. return $instanceFluxdRssad->instance_filterSave($filtername, $content);
  143. }
  144. /**
  145. * deletes a filter
  146. *
  147. * @param $filtername
  148. * @return boolean
  149. */
  150. function filterDelete($filtername) {
  151. global $instanceFluxdRssad;
  152. return $instanceFluxdRssad->instance_filterDelete($filtername);
  153. }
  154. /**
  155. * get job-list
  156. *
  157. * @return job-list as array or false on error / no files
  158. */
  159. function jobsGetList() {
  160. global $instanceFluxdRssad;
  161. return $instanceFluxdRssad->instance_jobsGetList();
  162. }
  163. /**
  164. * get jobs-content
  165. *
  166. * @param $jobnumber
  167. * @return job as array or false on error
  168. */
  169. function jobGetContent($jobnumber) {
  170. global $instanceFluxdRssad;
  171. return $instanceFluxdRssad->instance_jobGetContent($jobnumber);
  172. }
  173. /**
  174. * adds a job
  175. *
  176. * @param $jobNumber
  177. * @param $savedir
  178. * @param $url
  179. * @param $filtername
  180. * @return boolean
  181. */
  182. function jobAdd($savedir, $url, $filtername, $checkdir = false) {
  183. global $instanceFluxdRssad;
  184. return $instanceFluxdRssad->instance_jobAdd($savedir, $url, $filtername, $checkdir);
  185. }
  186. /**
  187. * updates a single job
  188. *
  189. * @param $jobNumber
  190. * @param $savedir
  191. * @param $url
  192. * @param $filtername
  193. * @return boolean
  194. */
  195. function jobUpdate($jobNumber, $savedir, $url, $filtername, $checkdir = false) {
  196. global $instanceFluxdRssad;
  197. return $instanceFluxdRssad->instance_jobUpdate($jobNumber, $savedir, $url, $filtername, $checkdir);
  198. }
  199. /**
  200. * deletes a single job
  201. *
  202. * @param $jobNumber
  203. * @return boolean
  204. */
  205. function jobDelete($jobNumber) {
  206. global $instanceFluxdRssad;
  207. return $instanceFluxdRssad->instance_jobDelete($jobNumber);
  208. }
  209. // =========================================================================
  210. // ctor
  211. // =========================================================================
  212. /**
  213. * ctor
  214. */
  215. function FluxdRssad() {
  216. global $cfg;
  217. // name
  218. $this->moduleName = "Rssad";
  219. // initialize
  220. $this->instance_initialize();
  221. // check our base-dir
  222. if (!(checkDirectory($cfg["path"].$this->_basedir))) {
  223. array_push($this->messages , "Rssad base-dir ".$this->_basedir." error.");
  224. $this->state = FLUXDMOD_STATE_ERROR;
  225. }
  226. }
  227. // =========================================================================
  228. // public methods
  229. // =========================================================================
  230. /**
  231. * check if filter exists
  232. *
  233. * @param $filtername
  234. * @return boolean
  235. */
  236. function instance_filterExists($filtername) {
  237. global $cfg;
  238. // filter-file
  239. $file = $cfg["path"].$this->_basedir.$filtername.".dat";
  240. // return
  241. return file_exists($file);
  242. }
  243. /**
  244. * checks if filter-id is a valid filter-id
  245. *
  246. * @param $id
  247. * @param $new
  248. * @param boolean
  249. */
  250. function instance_filterIdCheck($id, $new = false) {
  251. // sanity-checks
  252. if (strpos(urldecode($id), "/") !== false)
  253. return false;
  254. if (preg_match("/\\\/", urldecode($id)))
  255. return false;
  256. if (preg_match("/\.\./", urldecode($id)))
  257. return false;
  258. // check id
  259. if (!$new)
  260. return $this->instance_filterExists($id);
  261. // looks ok
  262. return true;
  263. }
  264. /**
  265. * get filter-list
  266. *
  267. * @return filter-list as array or false on error / no files
  268. */
  269. function instance_filterGetList() {
  270. global $cfg;
  271. $dirFilter = $cfg["path"].$this->_basedir;
  272. if (is_dir($dirFilter)) {
  273. $dirHandle = false;
  274. $dirHandle = @opendir($dirFilter);
  275. if ($dirHandle !== false) {
  276. $retVal = array();
  277. while (false !== ($file = @readdir($dirHandle))) {
  278. if ((strlen($file) > 4) && ((substr($file, -4)) == ".dat"))
  279. array_push($retVal, substr($file, 0, -4));
  280. }
  281. @closedir($dirHandle);
  282. return $retVal;
  283. } else {
  284. return false;
  285. }
  286. } else {
  287. return false;
  288. }
  289. }
  290. /**
  291. * get filter-content
  292. *
  293. * @param $filtername
  294. * @return filter as string or false on error / no files
  295. */
  296. function instance_filterGetContent($filtername) {
  297. global $cfg;
  298. // filter-file
  299. $file = $cfg["path"].$this->_basedir.$filtername.".dat";
  300. // check
  301. if (!(file_exists($file)))
  302. return false;
  303. // open
  304. $handle = false;
  305. $handle = @fopen($file, "r");
  306. if (!$handle) {
  307. $msg = "cannot open ".$file.".";
  308. array_push($this->messages , $msg);
  309. AuditAction($cfg["constants"]["error"], "Rssad Filter Load-Error : ".$msg);
  310. return false;
  311. }
  312. $data = "";
  313. while (!@feof($handle))
  314. $data .= @fgets($handle, 8192);
  315. @fclose ($handle);
  316. return $data;
  317. }
  318. /**
  319. * saves a filter
  320. *
  321. * @param $filtername
  322. * @param $content
  323. * @return boolean
  324. */
  325. function instance_filterSave($filtername, $content) {
  326. global $cfg;
  327. // filter-file
  328. $file = $cfg["path"].$this->_basedir.$filtername.".dat";
  329. $handle = false;
  330. $handle = @fopen($file, "w");
  331. if (!$handle) {
  332. $msg = "cannot open ".$file." for writing.";
  333. array_push($this->messages , $msg);
  334. AuditAction($cfg["constants"]["error"], "Rssad Filter Save-Error : ".$msg);
  335. return false;
  336. }
  337. $result = @fwrite($handle, str_replace("\r\n", "\n", $content));
  338. @fclose($handle);
  339. if ($result === false) {
  340. $msg = "cannot write content to ".$file.".";
  341. array_push($this->messages , $msg);
  342. AuditAction($cfg["constants"]["error"], "Rssad Filter Save-Error : ".$msg);
  343. return false;
  344. }
  345. // log
  346. AuditAction($cfg["constants"]["fluxd"], "Rssad Filter Saved : ".$filtername);
  347. // return
  348. return true;
  349. }
  350. /**
  351. * deletes a filter
  352. *
  353. * @param $filtername
  354. * @return boolean
  355. */
  356. function instance_filterDelete($filtername) {
  357. global $cfg;
  358. $extAry = array('.dat', '.hist', '.log');
  359. // count files
  360. $fileCount = 0;
  361. for ($i = 0; $i < 3; $i++) {
  362. $file = $cfg["path"].$this->_basedir.$filtername.$extAry[$i];
  363. if (file_exists($file))
  364. $fileCount++;
  365. }
  366. // delete files
  367. $deleted = 0;
  368. for ($i = 0; $i < 3; $i++) {
  369. $file = $cfg["path"].$this->_basedir.$filtername.$extAry[$i];
  370. if (file_exists($file)) {
  371. @unlink($file);
  372. if (!(file_exists($file)))
  373. $deleted++;
  374. }
  375. }
  376. if ($fileCount == $deleted) {
  377. // log + return
  378. AuditAction($cfg["constants"]["fluxd"], "Rssad Filter Deleted : ".$filtername." (".$deleted."/".$fileCount.")");
  379. return true;
  380. } else {
  381. // log + return
  382. AuditAction($cfg["constants"]["error"], "Rssad Filter Delete Error : ".$filtername." (".$deleted."/".$fileCount.")");
  383. return false;
  384. }
  385. }
  386. /**
  387. * get job-list
  388. *
  389. * @return job-list as array or false on error / no files
  390. */
  391. function instance_jobsGetList() {
  392. global $cfg;
  393. // job1|job2|job3
  394. // savedir#url#filtername
  395. if ((isset($cfg["fluxd_Rssad_jobs"])) && (strlen($cfg["fluxd_Rssad_jobs"]) > 0)) {
  396. $joblist = array();
  397. $jobs = explode($this->_delimJobs, trim($cfg["fluxd_Rssad_jobs"]));
  398. if (count($jobs) > 0) {
  399. foreach ($jobs as $job) {
  400. $jobAry = explode($this->_delimJob, trim($job));
  401. $savedir = trim(array_shift($jobAry));
  402. $url = trim(array_shift($jobAry));
  403. $filtername = trim(array_shift($jobAry));
  404. if ((strlen($savedir) > 0) && (strlen($url) > 0) && (strlen($filtername) > 0)) {
  405. array_push($joblist, array(
  406. 'savedir' => $savedir,
  407. 'url' => $url,
  408. 'filtername' => $filtername
  409. )
  410. );
  411. }
  412. }
  413. return $joblist;
  414. }
  415. }
  416. return false;
  417. }
  418. /**
  419. * get jobs-content
  420. *
  421. * @param $jobnumber
  422. * @return job as array or false on error
  423. */
  424. function instance_jobGetContent($jobnumber) {
  425. $jobInt = intval($jobnumber);
  426. if ($jobInt > 0) {
  427. $jobs = $this->instance_jobsGetList();
  428. return (($jobs !== false) && (count($jobs) > ($jobInt - 1)))
  429. ? $jobs[$jobInt - 1]
  430. : false;
  431. } else {
  432. return false;
  433. }
  434. }
  435. /**
  436. * adds a job
  437. *
  438. * @param $jobNumber
  439. * @param $savedir
  440. * @param $url
  441. * @param $filtername
  442. * @return boolean
  443. */
  444. function instance_jobAdd($savedir, $url, $filtername, $checkdir = false) {
  445. if ((strlen($savedir) > 0) && (strlen($url) > 0) && (strlen($filtername) > 0)) {
  446. $jobsString = "";
  447. $jobs = $this->instance_jobsGetList();
  448. if (($jobs !== false) && (count($jobs) > 0)) {
  449. foreach ($jobs as $job) {
  450. $jobsString .= $job["savedir"].$this->_delimJob;
  451. $jobsString .= $job["url"].$this->_delimJob;
  452. $jobsString .= $job["filtername"];
  453. $jobsString .= $this->_delimJobs;
  454. }
  455. }
  456. $jobsString .= trim(checkDirPathString($savedir)).$this->_delimJob;
  457. $jobsString .= $url.$this->_delimJob;
  458. $jobsString .= $filtername;
  459. // check dir
  460. if ($checkdir) {
  461. $check = checkDirectory($savedir);
  462. if (!$check)
  463. array_push($this->messages , "dir ".$savedir." does not exist and could not be created.");
  464. } else {
  465. $check = true;
  466. }
  467. // update setting
  468. return ($check && $this->_jobsUpdate($jobsString));
  469. } else {
  470. return false;
  471. }
  472. }
  473. /**
  474. * updates a single job
  475. *
  476. * @param $jobNumber
  477. * @param $savedir
  478. * @param $url
  479. * @param $filtername
  480. * @return boolean
  481. */
  482. function instance_jobUpdate($jobNumber, $savedir, $url, $filtername, $checkdir = false) {
  483. if (($jobNumber > 0) && (strlen($savedir) > 0) && (strlen($url) > 0) && (strlen($filtername) > 0)) {
  484. $jobs = $this->instance_jobsGetList();
  485. if (($jobs !== false) && (count($jobs) > 0)) {
  486. $result = array();
  487. $idx = 1;
  488. while (count($jobs) > 0) {
  489. $job = array_shift($jobs);
  490. if ($idx != $jobNumber)
  491. array_push($result, $job);
  492. else
  493. array_push($result, array(
  494. 'savedir' => trim(checkDirPathString($savedir)),
  495. 'url' => $url,
  496. 'filtername' => $filtername
  497. )
  498. );
  499. $idx++;
  500. }
  501. $jobsString = "";
  502. $resultCount = count($result);
  503. for ($i = 0; $i < $resultCount; $i++) {
  504. $jobsString .= $result[$i]["savedir"].$this->_delimJob;
  505. $jobsString .= $result[$i]["url"].$this->_delimJob;
  506. $jobsString .= $result[$i]["filtername"];
  507. if ($i < ($resultCount - 1))
  508. $jobsString .= $this->_delimJobs;
  509. }
  510. // check dir
  511. if ($checkdir) {
  512. $check = checkDirectory($savedir);
  513. if (!$check)
  514. array_push($this->messages , "dir ".$savedir." does not exist and could not be created.");
  515. } else {
  516. $check = true;
  517. }
  518. // update setting
  519. return ($check && $this->_jobsUpdate($jobsString));
  520. }
  521. return false;
  522. } else {
  523. return false;
  524. }
  525. }
  526. /**
  527. * deletes a single job
  528. *
  529. * @param $jobNumber
  530. * @return boolean
  531. */
  532. function instance_jobDelete($jobNumber) {
  533. if ($jobNumber > 0) {
  534. $jobs = $this->instance_jobsGetList();
  535. if (($jobs !== false) && (count($jobs) > 0)) {
  536. $result = array();
  537. $idx = 1;
  538. while (count($jobs) > 0) {
  539. $job = array_shift($jobs);
  540. if ($idx != $jobNumber)
  541. array_push($result, $job);
  542. $idx++;
  543. }
  544. $jobsString = "";
  545. $resultCount = count($result);
  546. for ($i = 0; $i < $resultCount; $i++) {
  547. $jobsString .= $result[$i]["savedir"].$this->_delimJob;
  548. $jobsString .= $result[$i]["url"].$this->_delimJob;
  549. $jobsString .= $result[$i]["filtername"];
  550. if ($i < ($resultCount - 1))
  551. $jobsString .= $this->_delimJobs;
  552. }
  553. // update setting
  554. return $this->_jobsUpdate($jobsString);
  555. }
  556. return false;
  557. } else {
  558. return false;
  559. }
  560. }
  561. // =========================================================================
  562. // private methods
  563. // =========================================================================
  564. /**
  565. * updates jobs
  566. *
  567. * @param $content
  568. * @return boolean
  569. */
  570. function _jobsUpdate($content) {
  571. global $cfg;
  572. $jobsSane = array();
  573. $jobs = explode($this->_delimJobs, trim($content));
  574. if (($jobs !== false) && (count($jobs) > 0)) {
  575. while (count($jobs) > 0) {
  576. $job = array_shift($jobs);
  577. $jobAry = explode($this->_delimJob, trim($job));
  578. $savedir = trim(array_shift($jobAry));
  579. $url = trim(array_shift($jobAry));
  580. $filtername = trim(array_shift($jobAry));
  581. if ((strlen($savedir) > 0) && (strlen($url) > 0) && (strlen($filtername) > 0))
  582. array_push($jobsSane, array(
  583. 'savedir' => trim(checkDirPathString($savedir)),
  584. 'url' => $url,
  585. 'filtername' => $filtername
  586. )
  587. );
  588. }
  589. $jobsString = "";
  590. $resultCount = count($jobsSane);
  591. for ($i = 0; $i < $resultCount; $i++) {
  592. $jobsString .= $jobsSane[$i]["savedir"].$this->_delimJob;
  593. $jobsString .= $jobsSane[$i]["url"].$this->_delimJob;
  594. $jobsString .= $jobsSane[$i]["filtername"];
  595. if ($i < ($resultCount - 1))
  596. $jobsString .= $this->_delimJobs;
  597. }
  598. // update setting
  599. updateSetting("tf_settings", "fluxd_Rssad_jobs", $jobsString);
  600. // log
  601. AuditAction($cfg["constants"]["fluxd"], "Rssad Jobs Saved : \n".$jobsString);
  602. return true;
  603. } else {
  604. return false;
  605. }
  606. }
  607. }
  608. ?>