fluxd.pl 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438
  1. #!/usr/bin/perl
  2. ################################################################################
  3. # $Id: fluxd.pl 3296 2007-12-03 20:45:41Z lordnor $
  4. # $Date: 2007-12-03 14:45:41 -0600 (Mon, 03 Dec 2007) $
  5. # $Revision: 3296 $
  6. ################################################################################
  7. # #
  8. # LICENSE #
  9. # #
  10. # This program is free software; you can redistribute it and/or #
  11. # modify it under the terms of the GNU General Public License (GPL) #
  12. # as published by the Free Software Foundation; either version 2 #
  13. # of the License, or (at your option) any later version. #
  14. # #
  15. # This program is distributed in the hope that it will be useful, #
  16. # but WITHOUT ANY WARRANTY; without even the implied warranty of #
  17. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
  18. # GNU General Public License for more details. #
  19. # #
  20. # To read the license please visit http://www.gnu.org/copyleft/gpl.html #
  21. # #
  22. # #
  23. ################################################################################
  24. # #
  25. # Requirements : #
  26. # * IO::Select ( perl -MCPAN -e "install IO::Select" ) #
  27. # * IO::Socket::UNIX ( perl -MCPAN -e "install IO::Socket::UNIX" ) #
  28. # * IO::Socket::INET ( perl -MCPAN -e "install IO::Socket::INET" ) #
  29. # * POSIX ( perl -MCPAN -e "install POSIX" ) #
  30. # #
  31. ################################################################################
  32. package Fluxd;
  33. use strict;
  34. use warnings;
  35. use FluxCommon;
  36. use StatFile;
  37. ################################################################################
  38. ################################################################################
  39. # fields #
  40. ################################################################################
  41. # constants
  42. use constant MOD_STATE_ERROR => -1;
  43. use constant MOD_STATE_NULL => 0;
  44. use constant MOD_STATE_OK => 1;
  45. # files and dirs
  46. my $path_data_dir = ".fluxd";
  47. my $path_transfer_dir = ".transfers";
  48. my $bin_fluxcli = "fluxcli.php";
  49. my $path_socket = "fluxd.sock";
  50. my $log_error = "fluxd-error.log";
  51. my $log = "fluxd.log";
  52. my $file_pid = "fluxd.pid";
  53. my $file_conf = "fluxd.conf";
  54. # defaults
  55. my $loglevel = 0;
  56. my $path_docroot = "/var/www/";
  57. my $path_path = "/usr/local/torrentflux/";
  58. my $bin_php = "/usr/bin/php";
  59. my $dbMode = "dbi";
  60. # delims of modList
  61. my $delimMod = ";";
  62. my $delimState = ":";
  63. # internal vars
  64. my ($VERSION, $DIR, $PROG, $EXTENSION);
  65. my $server;
  66. my $select;
  67. my $start_time = time();
  68. my $start_time_local = localtime();
  69. my $loop = 1;
  70. # db-bean
  71. my $fluxDB;
  72. # service-modules
  73. our %serviceModules;
  74. our %serviceModuleNames;
  75. my %serviceModuleObjects;
  76. ################################################################################
  77. # main #
  78. ################################################################################
  79. # flush the buffer
  80. $| = 1;
  81. # initialize
  82. initialize();
  83. # process arguments
  84. processArguments();
  85. # daemon-startup
  86. daemonStartup();
  87. # daemon-main
  88. daemonMain();
  89. # daemon-shutdown
  90. daemonShutdown();
  91. ################################################################################
  92. # subs #
  93. ################################################################################
  94. #------------------------------------------------------------------------------#
  95. # Sub: initialize #
  96. # Arguments: Null #
  97. # Returns: Null #
  98. #------------------------------------------------------------------------------#
  99. sub initialize {
  100. # initialize some variables
  101. $VERSION = do {
  102. my @r = (q$Revision: 3296 $ =~ /\d+/g); sprintf "%d"."%02d" x $#r, @r };
  103. ($DIR=$0) =~ s/([^\/\\]*)$//;
  104. ($PROG=$1) =~ s/\.([^\.]*)$//;
  105. $EXTENSION = $1;
  106. # load fluxd-conf
  107. eval 'require "'.$file_conf.'";';
  108. if ($@) {
  109. print STDERR "failed to load config-file ".$file_conf."\n";
  110. exit;
  111. }
  112. # fill name-list
  113. foreach my $smod (sort keys %serviceModules) {
  114. $serviceModuleNames{$serviceModules{$smod}{"name"}} = 1;
  115. }
  116. }
  117. #------------------------------------------------------------------------------#
  118. # Sub: processArguments #
  119. # Arguments: Null #
  120. # Returns: Null #
  121. #------------------------------------------------------------------------------#
  122. sub processArguments {
  123. my $temp = shift @ARGV;
  124. # first arg is operation.
  125. if (!(defined $temp)) {
  126. printUsage();
  127. exit;
  128. }
  129. # help
  130. if ($temp =~ /.*(help|-h).*/) {
  131. printUsage();
  132. exit;
  133. }
  134. # version
  135. if ($temp =~ /.*(version|-v).*/) {
  136. printVersion();
  137. exit;
  138. };
  139. # check
  140. if ($temp =~ /check/) {
  141. check();
  142. exit;
  143. };
  144. # debug
  145. if ($temp =~ /debug/) {
  146. debug();
  147. exit;
  148. };
  149. # daemon-stop
  150. if ($temp =~ /stop/) {
  151. # path_docroot
  152. $temp = shift @ARGV;
  153. if (!(defined $temp)) {
  154. printUsage();
  155. exit;
  156. }
  157. if (!((substr $temp, -1) eq "/")) {
  158. $temp .= "/";
  159. }
  160. $path_docroot = $temp;
  161. # path_path
  162. $temp = shift @ARGV;
  163. if (!(defined $temp)) {
  164. printUsage();
  165. exit;
  166. }
  167. if (!((substr $temp, -1) eq "/")) {
  168. $temp .= "/";
  169. }
  170. $path_path = $temp;
  171. # bin_php
  172. $temp = shift @ARGV;
  173. if (!(defined $temp)) {
  174. printUsage();
  175. exit;
  176. }
  177. $bin_php = $temp;
  178. # dbMode
  179. $temp = shift @ARGV;
  180. if (!(defined $temp)) {
  181. printUsage();
  182. exit;
  183. }
  184. $dbMode = $temp;
  185. # init paths
  186. initPaths();
  187. # check if running
  188. if (daemonIsRunning($path_docroot) == 0) {
  189. printError("CORE", "daemon not running.\n");
  190. exit;
  191. }
  192. printMessage("CORE", "Stopping daemon...\n");
  193. # shutdown
  194. if (-f $file_pid) {
  195. # get pid
  196. open(PIDFILE,"< $file_pid");
  197. my $daemonPid = <PIDFILE>;
  198. close(PIDFILE);
  199. chomp $daemonPid;
  200. # send TERM to daemon
  201. kill 'SIGTERM', $daemonPid;
  202. } else {
  203. printError("CORE", "Error : cant find pid-file (".$file_pid."), daemon running ?\n");
  204. }
  205. # exit
  206. exit;
  207. };
  208. # start
  209. if ($temp =~ /start/) {
  210. # path_docroot
  211. $temp = shift @ARGV;
  212. if (!(defined $temp)) {
  213. printUsage();
  214. exit;
  215. }
  216. if (!((substr $temp, -1) eq "/")) {
  217. $temp .= "/";
  218. }
  219. $path_docroot = $temp;
  220. # path_path
  221. $temp = shift @ARGV;
  222. if (!(defined $temp)) {
  223. printUsage();
  224. exit;
  225. }
  226. if (!((substr $temp, -1) eq "/")) {
  227. $temp .= "/";
  228. }
  229. $path_path = $temp;
  230. # bin_php
  231. $temp = shift @ARGV;
  232. if (!(defined $temp)) {
  233. printUsage();
  234. exit;
  235. }
  236. $bin_php = $temp;
  237. # dbMode
  238. $temp = shift @ARGV;
  239. if (!(defined $temp)) {
  240. printUsage();
  241. exit;
  242. }
  243. $dbMode = $temp;
  244. # init paths
  245. initPaths();
  246. # return
  247. return 1;
  248. };
  249. # hmmm dont know this arg, show usage screen
  250. printUsage();
  251. exit;
  252. }
  253. #------------------------------------------------------------------------------#
  254. # Sub: daemonStartup #
  255. # Arguments: null #
  256. # Returns: null #
  257. #------------------------------------------------------------------------------#
  258. sub daemonStartup {
  259. # print
  260. printMessage("CORE", "fluxd starting...\n");
  261. # daemonise the script
  262. &daemonize();
  263. # load flux-service-modules
  264. serviceModulesLoad();
  265. # print that we started ok
  266. printMessage("CORE", "fluxd-startup complete. fluxd is up and running.\n");
  267. }
  268. #------------------------------------------------------------------------------#
  269. # Sub: daemonize #
  270. # Arguments: Null #
  271. # Returns: Null #
  272. #------------------------------------------------------------------------------#
  273. sub daemonize {
  274. # umask
  275. umask 0;
  276. # STD-IN/OUT/ERR
  277. # STDIN
  278. unless (open STDIN, "/dev/null") {
  279. logError("CORE", "failed to open STDIN: ".$!."\n");
  280. exit;
  281. }
  282. # STDOUT
  283. unless (open STDOUT, ">>$log") {
  284. logError("CORE", "failed to open STDOUT: ".$!."\n");
  285. exit;
  286. }
  287. # STDERR
  288. unless (open STDERR, ">>$log_error") {
  289. logError("CORE", "failed to open STDERR: ".$!."\n");
  290. exit;
  291. }
  292. # check if already running
  293. if (daemonIsRunning($path_docroot) == 1) {
  294. printError("CORE", "daemon already running.\n");
  295. exit;
  296. }
  297. # check for pid-file
  298. if (-f $file_pid) {
  299. printMessage("CORE", "pid-file (".$file_pid.") exists but daemon not running. deleting...\n");
  300. pidFileDelete();
  301. }
  302. # check for socket
  303. if (-r $path_socket) {
  304. printMessage("CORE", "socket (".$path_socket.") exists but daemon not running. deleting...\n");
  305. socketRemove();
  306. }
  307. # load perl-modules
  308. loadModules();
  309. # print
  310. printMessage("CORE", "initialize FluxDB...\n");
  311. # db-bean
  312. require FluxDB;
  313. # create instance
  314. $fluxDB = FluxDB->new();
  315. # initialize
  316. $fluxDB->initialize($path_docroot, $bin_php, $dbMode);
  317. if ($fluxDB->getState() != MOD_STATE_OK) {
  318. printError("CORE", "Error : initializing FluxDB : ".$fluxDB->getMessage()."\n");
  319. exit;
  320. }
  321. # loglevel
  322. $loglevel = FluxDB->getFluxConfig("fluxd_loglevel");
  323. # chdir
  324. #chdir($path_docroot) or die "Can't chdir to docroot: $!";
  325. # fork
  326. if ($loglevel > 1) {
  327. printMessage("CORE", "forking and starting a new session...\n");
  328. }
  329. my $pid = fork;
  330. unless (defined($pid)) {
  331. printError("CORE", "could not fork: ".$!."\n");
  332. exit;
  333. }
  334. exit if $pid;
  335. unless (POSIX::setsid()) {
  336. printError("CORE", "could not start a new session: ".$!."\n");
  337. exit;
  338. }
  339. # log
  340. printMessage("CORE", "daemon starting with docroot ".$path_docroot." (pid: ".$$.")\n");
  341. # set up our signal handlers
  342. if ($loglevel > 1) {
  343. printMessage("CORE", "setting up signal handlers...\n");
  344. }
  345. $SIG{HUP} = \&gotSigHup;
  346. $SIG{INT} = \&gotSigInt;
  347. $SIG{TERM} = \&gotSigTerm;
  348. $SIG{QUIT} = \&gotSigQuit;
  349. # set up server socket
  350. socketInitialize();
  351. # write out pid-file
  352. pidFileWrite($$);
  353. }
  354. #------------------------------------------------------------------------------#
  355. # Sub: daemonMain #
  356. # Arguments: Null #
  357. # Returns: Null #
  358. #------------------------------------------------------------------------------#
  359. sub daemonMain {
  360. # loop
  361. while ($loop) {
  362. # check Connections
  363. checkConnections();
  364. # service-modules main-methods
  365. foreach my $smod (sort keys %serviceModules) {
  366. if ((exists $serviceModuleObjects{$serviceModules{$smod}{"name"}}) &&
  367. ($serviceModuleObjects{$serviceModules{$smod}{"name"}}->getState() == MOD_STATE_OK)) {
  368. eval {
  369. local $SIG{ALRM} = sub {die "alarm\n"};
  370. alarm $serviceModules{$smod}{"timeout"};
  371. $serviceModuleObjects{$serviceModules{$smod}{"name"}}->main();
  372. alarm 0;
  373. };
  374. # Check for alarm (timeout) condition
  375. if ($@) {
  376. printError("CORE", $serviceModules{$smod}{"name"}." Timed out:\n ".$@."\n");
  377. }
  378. }
  379. }
  380. # sleep
  381. select undef, undef, undef, 0.1;
  382. } # loop end
  383. }
  384. #------------------------------------------------------------------------------#
  385. # Sub: daemonShutdown #
  386. # Arguments: null #
  387. # Returns: null #
  388. #------------------------------------------------------------------------------#
  389. sub daemonShutdown {
  390. printMessage("CORE", "Shutting down!\n");
  391. # unload modules
  392. serviceModulesUnload();
  393. # remove socket
  394. socketRemove();
  395. # destroy db-bean
  396. printMessage("CORE", "shutting down FluxDB...\n");
  397. if (defined($fluxDB)) {
  398. $fluxDB->destroy();
  399. }
  400. # remove pid-file
  401. pidFileDelete();
  402. # print that we started ok
  403. printMessage("CORE", "fluxd-shutdown complete.\n");
  404. # get out here
  405. exit;
  406. }
  407. #------------------------------------------------------------------------------#
  408. # Sub: daemonIsRunning #
  409. # Arguments: docroot #
  410. # Returns: 0|1 #
  411. #------------------------------------------------------------------------------#
  412. sub daemonIsRunning {
  413. my $docroot = shift;
  414. if (!(defined $docroot)) {
  415. return 0;
  416. }
  417. my $qstring = "ps x -o pid='' -o ppid='' -o command='' -ww 2> /dev/null";
  418. my $pcount = 0;
  419. foreach my $line (grep(/fluxd running.*$docroot/, qx($qstring))) {
  420. print STDOUT $line."\n";
  421. $pcount++;
  422. }
  423. if ($pcount > 0) {
  424. return 1;
  425. }
  426. return 0;
  427. }
  428. #------------------------------------------------------------------------------#
  429. # Sub: initPaths #
  430. # Arguments: null #
  431. # Returns: Null #
  432. #------------------------------------------------------------------------------#
  433. sub initPaths {
  434. $path_transfer_dir = $path_path.$path_transfer_dir."/";
  435. $path_data_dir = $path_path.$path_data_dir."/";
  436. $path_socket = $path_data_dir.$path_socket;
  437. $log = $path_data_dir.$log;
  438. $log_error = $path_data_dir.$log_error;
  439. $file_pid = $path_data_dir.$file_pid;
  440. # check if our main-dir exists. try to create if it doesnt
  441. if (! -d $path_data_dir) {
  442. mkdir($path_data_dir, 0700);
  443. }
  444. }
  445. #------------------------------------------------------------------------------#
  446. # Sub: loadModules #
  447. # Arguments: null #
  448. # Returns: null #
  449. #------------------------------------------------------------------------------#
  450. sub loadModules {
  451. # print
  452. if ($loglevel > 1) {
  453. printMessage("CORE", "loading Perl-modules...\n");
  454. }
  455. # load IO::Socket::UNIX
  456. if ($loglevel > 2) {
  457. printMessage("CORE", "loading Perl-module IO::Socket::UNIX\n");
  458. }
  459. if (eval "require IO::Socket::UNIX") {
  460. IO::Socket::UNIX->import();
  461. } else {
  462. printError("CORE", "load perl-module IO::Socket::UNIX failed\n");
  463. exit;
  464. }
  465. # load IO::Select
  466. if ($loglevel > 2) {
  467. printMessage("CORE", "loading Perl-module IO::Select\n");
  468. }
  469. if (eval "require IO::Select") {
  470. IO::Select->import();
  471. } else {
  472. printError("CORE", "load perl-module IO::Select failed\n");
  473. exit;
  474. }
  475. # load POSIX
  476. if ($loglevel > 2) {
  477. printMessage("CORE", "loading Perl-module POSIX\n");
  478. }
  479. if (eval "require POSIX") {
  480. POSIX->import(qw(setsid));
  481. } else {
  482. printError("CORE", "load perl-module POSIX failed\n");
  483. exit;
  484. }
  485. # print
  486. if ($loglevel > 1) {
  487. printMessage("CORE", "Perl-modules loaded.\n");
  488. }
  489. }
  490. #------------------------------------------------------------------------------#
  491. # Sub: serviceModuleLoad #
  492. # Arguments: name of module #
  493. # Returns: 0|1 #
  494. #------------------------------------------------------------------------------#
  495. sub serviceModuleLoad {
  496. my $modName = shift;
  497. if (exists $serviceModuleObjects{$modName}) {
  498. return 1;
  499. }
  500. if ($loglevel > 1) {
  501. printMessage("CORE", "loading service-module ".$modName." ...\n");
  502. }
  503. # create and initialize
  504. if (eval "require ".$modName) {
  505. eval {
  506. $serviceModuleObjects{$modName} = eval $modName."->new();";
  507. $serviceModuleObjects{$modName}->initialize();
  508. if ($serviceModuleObjects{$modName}->getState() != MOD_STATE_OK) {
  509. my $msg = "error initializing service-module ".$modName." :\n";
  510. $msg .= " ".$serviceModuleObjects{$modName}->getMessage()."\n";
  511. printError("CORE", $msg);
  512. }
  513. };
  514. if ($@) {
  515. printError("CORE", "error loading service-module ".$modName." : ".$@."\n");
  516. } else {
  517. # everything ok
  518. if ($loglevel > 0) {
  519. printMessage("CORE", $modName." loaded\n");
  520. }
  521. return 1;
  522. }
  523. } else {
  524. printError("CORE", "error loading service-module ".$modName." : ".$@."\n");
  525. }
  526. }
  527. #------------------------------------------------------------------------------#
  528. # Sub: serviceModuleUnload #
  529. # Arguments: name of module #
  530. # Returns: 0|1 #
  531. #------------------------------------------------------------------------------#
  532. sub serviceModuleUnload {
  533. my $modName = shift;
  534. if (exists $serviceModuleObjects{$modName}) {
  535. if ($loglevel > 1) {
  536. printMessage("CORE", "unloading service-module ".$modName." ...\n");
  537. }
  538. eval {
  539. $serviceModuleObjects{$modName}->destroy();
  540. delete($serviceModuleObjects{$modName});
  541. };
  542. if ($@) {
  543. printError("CORE", "error unloading service-module ".$modName." : ".$@."\n");
  544. return 0;
  545. } else {
  546. # everything ok
  547. if ($loglevel > 0) {
  548. printMessage("CORE", $modName." unloaded\n");
  549. }
  550. }
  551. }
  552. return 1;
  553. }
  554. #------------------------------------------------------------------------------#
  555. # Sub: serviceModulesLoad #
  556. # Arguments: null #
  557. # Returns: null #
  558. #------------------------------------------------------------------------------#
  559. sub serviceModulesLoad {
  560. # print
  561. if ($loglevel > 0) {
  562. printMessage("CORE", "loading service-modules...\n");
  563. }
  564. # load/unload
  565. foreach my $smod (sort keys %serviceModules) {
  566. if (FluxDB->getFluxConfig("fluxd_".$serviceModules{$smod}{"name"}."_enabled") == 1) {
  567. # Load up module, unless it is already
  568. serviceModuleLoad($serviceModules{$smod}{"name"});
  569. } else {
  570. # Unload module, if it is loaded
  571. serviceModuleUnload($serviceModules{$smod}{"name"});
  572. }
  573. }
  574. # set command line
  575. my @cmdmodlist = ();
  576. foreach my $smod (sort keys %serviceModules) {
  577. if ((exists $serviceModuleObjects{$serviceModules{$smod}{"name"}}) &&
  578. ($serviceModuleObjects{$serviceModules{$smod}{"name"}}->getState() == MOD_STATE_OK)) {
  579. push(@cmdmodlist, $serviceModules{$smod}{"name"});
  580. }
  581. }
  582. my $cmdmodliststr = (scalar(@cmdmodlist) > 0)
  583. ? join(" ", @cmdmodlist)
  584. : "No service-modules loaded";
  585. $0 = '[ fluxd running ('.$path_docroot.') ('.$cmdmodliststr.') ]';
  586. # print
  587. if ($loglevel > 0) {
  588. printMessage("CORE", "done loading service-modules.\n");
  589. }
  590. }
  591. #------------------------------------------------------------------------------#
  592. # Sub: serviceModulesUnload #
  593. # Arguments: null #
  594. # Returns: null #
  595. #------------------------------------------------------------------------------#
  596. sub serviceModulesUnload {
  597. # print
  598. if ($loglevel > 0) {
  599. printMessage("CORE", "unloading service-modules...\n");
  600. }
  601. # unload
  602. foreach my $smod (sort keys %serviceModules) {
  603. serviceModuleUnload($serviceModules{$smod}{"name"});
  604. }
  605. # print
  606. if ($loglevel > 0) {
  607. printMessage("CORE", "done unloading service-modules.\n");
  608. }
  609. }
  610. #------------------------------------------------------------------------------#
  611. # Sub: serviceModuleList #
  612. # Arguments: null #
  613. # Returns: string with list of mods+state #
  614. #------------------------------------------------------------------------------#
  615. sub serviceModuleList {
  616. # retval
  617. my $modList = "";
  618. # build list
  619. foreach my $smod (sort keys %serviceModules) {
  620. $modList .= $serviceModules{$smod}{"name"}.$delimState;
  621. if (exists $serviceModuleObjects{$serviceModules{$smod}{"name"}}) {
  622. $modList .= $serviceModuleObjects{$serviceModules{$smod}{"name"}}->getState();
  623. } else {
  624. $modList .= MOD_STATE_NULL;
  625. }
  626. $modList .= $delimMod;
  627. }
  628. # return
  629. return (substr ($modList, 0, (length($modList)) - 1));
  630. }
  631. #------------------------------------------------------------------------------#
  632. # Sub: serviceModuleState #
  633. # Arguments: name of service-module #
  634. # Returns: state of service-module #
  635. #------------------------------------------------------------------------------#
  636. sub serviceModuleState {
  637. my $modName = shift;
  638. if (exists $serviceModuleObjects{$modName}) {
  639. return $serviceModuleObjects{$modName}->getState();
  640. } else {
  641. return MOD_STATE_NULL;
  642. }
  643. }
  644. #------------------------------------------------------------------------------#
  645. # Sub: gotSigHup #
  646. # Arguments: Null #
  647. # Returns: Null #
  648. #------------------------------------------------------------------------------#
  649. sub gotSigHup {
  650. printMessage("CORE", "got SIGHUP, reloading config and service-modules...\n");
  651. # have FluxDB reload the DB first, so we can see the changes
  652. if ($fluxDB->reload()) {
  653. serviceModulesLoad();
  654. } else {
  655. my $msg = "Error connecting to DB to read changes :\n";
  656. $msg .= $fluxDB->getMessage()."\n";
  657. printError("CORE", $msg);
  658. }
  659. }
  660. #------------------------------------------------------------------------------#
  661. # Sub: gotSigInt #
  662. # Arguments: null #
  663. # Returns: null #
  664. #------------------------------------------------------------------------------#
  665. sub gotSigInt {
  666. printMessage("CORE", "got SIGINT, setting shutdown-flag...\n");
  667. # set main-loop-flag
  668. $loop = 0;
  669. }
  670. #------------------------------------------------------------------------------#
  671. # Sub: gotSigTerm #
  672. # Arguments: null #
  673. # Returns: null #
  674. #------------------------------------------------------------------------------#
  675. sub gotSigTerm {
  676. printMessage("CORE", "got SIGTERM, setting shutdown-flag...\n");
  677. # set main-loop-flag
  678. $loop = 0;
  679. }
  680. #------------------------------------------------------------------------------#
  681. # Sub: gotSigQuit #
  682. # Arguments: null #
  683. # Returns: null #
  684. #------------------------------------------------------------------------------#
  685. sub gotSigQuit {
  686. printMessage("CORE", "got SIGQUIT, setting shutdown-flag...\n");
  687. # set main-loop-flag
  688. $loop = 0;
  689. }
  690. #------------------------------------------------------------------------------#
  691. # Sub: checkConnections #
  692. # Arguments: null #
  693. # Returns: null #
  694. #------------------------------------------------------------------------------#
  695. sub checkConnections {
  696. # Get the readable handles. timeout is 0, only process stuff that can be
  697. # read NOW.
  698. my $return = "";
  699. my @ready = $select->can_read(0);
  700. foreach my $socket (@ready) {
  701. if ($socket == $server) {
  702. my $new = $socket->accept();
  703. $select->add($new);
  704. } else {
  705. my $buf = "";
  706. my $char = getc($socket);
  707. while ((defined($char)) && ($char ne "\n")) {
  708. $buf .= $char;
  709. $char = getc($socket);
  710. }
  711. $return = processRequest($buf);
  712. $socket->send($return,0,$socket);
  713. $select->remove($socket);
  714. close($socket);
  715. }
  716. }
  717. }
  718. #------------------------------------------------------------------------------#
  719. # Sub: processRequest #
  720. # Arguments: Command #
  721. # Returns: String info on command success/failure #
  722. #------------------------------------------------------------------------------#
  723. sub processRequest {
  724. my @array = ();
  725. my $temp = shift;
  726. @array = split (/ /, $temp);
  727. @_ = @array;
  728. my $return;
  729. SWITCH: {
  730. $_ = shift;
  731. # Actual fluxd subroutine calls
  732. /^modlist/ && do {
  733. $return = serviceModuleList();
  734. last SWITCH;
  735. };
  736. /^modstate/ && do {
  737. $return = serviceModuleState(shift);
  738. last SWITCH;
  739. };
  740. /^status/ && do {
  741. $return = status();
  742. last SWITCH;
  743. };
  744. /^set/ && do {
  745. $return = set(shift, shift);
  746. last SWITCH;
  747. };
  748. /^reloadDBCache/ && do {
  749. $return = $fluxDB->reload();
  750. last SWITCH;
  751. };
  752. /^reloadModules/ && do {
  753. $return = serviceModulesLoad();
  754. last SWITCH;
  755. };
  756. /^check/ && do {
  757. $return = check();
  758. last SWITCH;
  759. };
  760. /^die/ && do {
  761. # set main-loop-flag
  762. $loop = 0;
  763. $return = 1;
  764. last SWITCH;
  765. };
  766. # module-calls
  767. /^!(.+):(.+)/ && do {
  768. my $mod = $1;
  769. my $command = $2;
  770. $return = "";
  771. if (exists $serviceModuleNames{$mod}) {
  772. if ((exists $serviceModuleObjects{$mod}) &&
  773. ($serviceModuleObjects{$mod}->getState() == MOD_STATE_OK)) {
  774. $return = $serviceModuleObjects{$mod}->command($command);
  775. }
  776. } else {
  777. $return = "Unknown Module";
  778. }
  779. last SWITCH;
  780. };
  781. # Default case.
  782. $return = printUsage(1);
  783. }
  784. # return
  785. return $return;
  786. }
  787. #------------------------------------------------------------------------------#
  788. # Sub: set #
  789. # Arguments: Variable, [Value] #
  790. # Returns: null #
  791. #------------------------------------------------------------------------------#
  792. sub set {
  793. my $variable = shift;
  794. my $value = shift;
  795. my $return;
  796. if ($variable =~/::/) {
  797. # setting/getting package variable
  798. my @pair = split(/::/, $variable);
  799. if (exists $serviceModuleNames{$pair[0]}) {
  800. if ((exists $serviceModuleObjects{$pair[0]}) &&
  801. ($serviceModuleObjects{$pair[0]}->getState() == MOD_STATE_OK)) {
  802. $return = $serviceModuleObjects{$pair[0]}->set($pair[1], $value);
  803. }
  804. } else {
  805. $return = "Unknown Module";
  806. }
  807. }
  808. return $return;
  809. }
  810. #------------------------------------------------------------------------------#
  811. # Sub: fluxcli #
  812. # Arguments: Command[, Args] #
  813. # Returns: string or 0|1 #
  814. #------------------------------------------------------------------------------#
  815. sub fluxcli {
  816. my ($Command, @Args) = @_;
  817. my $Args = $#Args + 1;
  818. my ($ArgsReq, $ArgsMax);
  819. # qx
  820. for ($Command) {
  821. if (/^transfers|^netstat/) { $ArgsReq = 0; last; }
  822. if (/^dump/) { $ArgsReq = 1; last; }
  823. }
  824. if (defined $ArgsReq) {
  825. return printUsage() if ($Args < $ArgsReq || $Args > (defined $ArgsMax ? $ArgsMax : $ArgsReq));
  826. my $shellCmd = $bin_php." bin/".$bin_fluxcli." ".quotemeta($Command).appendArgs(\@Args, $ArgsReq)." 2>> ".$log_error;
  827. return qx($shellCmd);
  828. }
  829. # syscall
  830. for ($Command) {
  831. if (/^start-all|^resume-all/) { $ArgsReq = 0; $ArgsMax = 2; last; }
  832. if (/^stop-all|^repair/) { $ArgsReq = 0; last; }
  833. if (/^start/) { $ArgsReq = 1; $ArgsMax = 3; last; }
  834. if (/^stop|^reset|^delete|^wipe|^xfer/) { $ArgsReq = 1; last; }
  835. if (/^inject|^watch/) { $ArgsReq = 2; $ArgsMax = 4; last; }
  836. if (/^maintenance/) { $ArgsReq = 0; $ArgsMax = 1; last; }
  837. if (/^rss/) { $ArgsReq = 4; $ArgsMax = 5; last; }
  838. }
  839. if (defined $ArgsReq) {
  840. return 0 if ($Args < $ArgsReq || $Args > (defined $ArgsMax ? $ArgsMax : $ArgsReq));
  841. my $shellCmd = $bin_php." bin/".$bin_fluxcli." ".quotemeta($Command).appendArgs(\@Args, $ArgsReq);
  842. return doSysCall($shellCmd);
  843. }
  844. }
  845. #------------------------------------------------------------------------------#
  846. # Sub: appendArgs #
  847. # Arguments: RefArgs[, ArgsReq] #
  848. # Returns: Command-string fragment #
  849. #------------------------------------------------------------------------------#
  850. sub appendArgs {
  851. my $Args = shift;
  852. my $ArgsReq = shift;
  853. $ArgsReq = 0 if (!defined $ArgsReq);
  854. # Iterate from last-to-first, to skip missing
  855. # rightmost non-mandatory args.
  856. my $return = '';
  857. my $canSkip = 1;
  858. for (my $i = ($ArgsReq > $#$Args ? $ArgsReq - 1 : $#$Args); $i >= 0; $i--) {
  859. my $Arg = $$Args[$i];
  860. my $ArgPresent = defined $Arg;
  861. $canSkip = 0 if ($canSkip && ($i < $ArgsReq || $ArgPresent));
  862. if ($canSkip && !$ArgPresent) { }
  863. elsif (!$ArgPresent || length($Arg) == 0) { $return = " ''".$return; }
  864. else { $return = ' '.quotemeta($Arg).$return; }
  865. }
  866. return $return;
  867. }
  868. #------------------------------------------------------------------------------#
  869. # Sub: doSysCall #
  870. # Arguments: Command-string #
  871. # Returns: 0|1 #
  872. #------------------------------------------------------------------------------#
  873. sub doSysCall {
  874. my $command = shift;
  875. $command .= " 1>> ".$log." 2>> ".$log_error." &";
  876. system($command);
  877. if ($? == -1) {
  878. printError("CORE", "failed to execute: ".$!."; command:\n".$command."\n");
  879. } elsif ($? & 127) {
  880. printError("CORE", (sprintf "child died with signal %d, %s coredump; command:\n%s\n", ($? & 127), ($? & 128) ? 'with' : 'without'), $command);
  881. } else {
  882. if ($loglevel > 2) {
  883. printMessage("CORE", (sprintf "child exited with value %d; command:\n%s\n", $? >> 8, $command));
  884. }
  885. return 1;
  886. }
  887. return 0;
  888. }
  889. #------------------------------------------------------------------------------#
  890. # Sub: lrtrim #
  891. # Arguments: string #
  892. # Returns: trimmed and chomped string #
  893. #------------------------------------------------------------------------------#
  894. sub lrtrim($) {
  895. $_ = shift;
  896. chomp;
  897. s/^\s+//;
  898. s/\s+$//;
  899. return $_;
  900. }
  901. #------------------------------------------------------------------------------#
  902. # Sub: socketInitialize #
  903. # Arguments: null #
  904. # Returns: null #
  905. #------------------------------------------------------------------------------#
  906. sub socketInitialize {
  907. $server = IO::Socket::UNIX->new(
  908. Type => IO::Socket::UNIX->SOCK_STREAM,
  909. Local => $path_socket,
  910. Listen => 16,
  911. Reuse => 1,
  912. );
  913. # check socket
  914. unless ($server) {
  915. printError("CORE", "could not create socket: ".$!."\n");
  916. exit;
  917. }
  918. # print
  919. if ($loglevel > 0) {
  920. printMessage("CORE", "created socket ".$path_socket."\n");
  921. }
  922. # create select
  923. $select = new IO::Select();
  924. # Add our server socket to the select read set.
  925. $select->add($server);
  926. }
  927. #------------------------------------------------------------------------------#
  928. # Sub: socketRemove #
  929. # Arguments: null #
  930. # Returns: null #
  931. #------------------------------------------------------------------------------#
  932. sub socketRemove {
  933. if ($loglevel > 0) {
  934. printMessage("CORE", "removing socket ".$path_socket."\n");
  935. }
  936. unlink($path_socket);
  937. }
  938. #------------------------------------------------------------------------------#
  939. # Sub: pidFileWrite #
  940. # Arguments: int with pid #
  941. # Returns: null #
  942. #------------------------------------------------------------------------------#
  943. sub pidFileWrite {
  944. my $pid = shift;
  945. if (!(defined $pid)) {
  946. $pid = $$;
  947. }
  948. if ($loglevel > 0) {
  949. printMessage("CORE", "writing pid-file ".$file_pid." (pid: ".$pid.")\n");
  950. }
  951. open(PIDFILE,">$file_pid");
  952. print PIDFILE $pid."\n";
  953. close(PIDFILE);
  954. }
  955. #------------------------------------------------------------------------------#
  956. # Sub: pidFileDelete #
  957. # Arguments: null #
  958. # Returns: return-val of delete #
  959. #------------------------------------------------------------------------------#
  960. sub pidFileDelete {
  961. if ($loglevel > 0) {
  962. printMessage("CORE", "deleting pid-file ".$file_pid."\n");
  963. }
  964. return unlink($file_pid);
  965. }
  966. #------------------------------------------------------------------------------#
  967. # Sub: status #
  968. # Arguments: Null #
  969. # Returns: Server information page #
  970. #------------------------------------------------------------------------------#
  971. sub status {
  972. my $head = "";
  973. $head .= "\n\nfluxd has been up since ".$start_time_local." (".FluxCommon::niceTimeString($start_time).")\n\n";
  974. $head .= "data-dir : ".$path_data_dir."\n";
  975. $head .= "log : ".$log."\n";
  976. $head .= "error-log : ".$log_error."\n";
  977. $head .= "pid : ".$file_pid."\n";
  978. $head .= "socket : ".$path_socket."\n";
  979. $head .= "transfers-dir : ".$path_transfer_dir."\n";
  980. $head .= "docroot : ".$path_docroot."\n";
  981. $head .= "fluxcli : ".$path_docroot."bin/".$bin_fluxcli."\n";
  982. $head .= "php : ".$bin_php."\n";
  983. $head .= "db-mode : ".$dbMode."\n";
  984. $head .= "loglevel : ".$loglevel."\n";
  985. $head .= "\n";
  986. my $status = "";
  987. my $modules = "- Loaded Modules -\n";
  988. foreach my $smod (sort keys %serviceModules) {
  989. if ((exists $serviceModuleObjects{$serviceModules{$smod}{"name"}}) &&
  990. ($serviceModuleObjects{$serviceModules{$smod}{"name"}}->getState() == MOD_STATE_OK)) {
  991. $modules .= " * ".$serviceModules{$smod}{"name"}."\n";
  992. $status .= eval { $serviceModuleObjects{$serviceModules{$smod}{"name"}}->status(); };
  993. }
  994. }
  995. # return
  996. return $head.$modules.$status;
  997. }
  998. #------------------------------------------------------------------------------#
  999. # Sub: printVersion #
  1000. # Arguments: Null #
  1001. # Returns: Version Information #
  1002. #------------------------------------------------------------------------------#
  1003. sub printVersion {
  1004. print $PROG.".".$EXTENSION." Version ".$VERSION."\n";
  1005. # FluxCommon
  1006. print "FluxCommon Version : ";
  1007. print FluxCommon::getVersion()."\n";
  1008. # StatFile
  1009. print "StatFile Version : ";
  1010. print StatFile::getVersion()."\n";
  1011. # FluxDB
  1012. print "FluxDB Version : ";
  1013. if (eval "require FluxDB") {
  1014. print FluxDB->getVersion()."\n";
  1015. } else {
  1016. print "cant load module\n";
  1017. }
  1018. # service-mods
  1019. foreach my $smod (sort keys %serviceModules) {
  1020. print $serviceModules{$smod}{"name"}." Version : ";
  1021. if (eval "require ".$serviceModules{$smod}{"name"}) {
  1022. my $modversion = eval $serviceModules{$smod}{"name"}."->getVersion();";
  1023. print $modversion."\n";
  1024. } else {
  1025. print "cant load module\n";
  1026. }
  1027. }
  1028. }
  1029. #------------------------------------------------------------------------------#
  1030. # Sub: check #
  1031. # Arguments: Null #
  1032. # Returns: info on sys requirements #
  1033. #------------------------------------------------------------------------------#
  1034. sub check {
  1035. my $errors = 0;
  1036. my $warnings = 0;
  1037. my @errorMessages = ();
  1038. my @warningMessages = ();
  1039. printMessage("CORE", "checking requirements...\n");
  1040. # 1. CORE-Perl-modules
  1041. printMessage("CORE", "1. CORE-Perl-modules\n");
  1042. my @mods = ('IO::Select', 'IO::Socket::UNIX', 'IO::Socket::INET', 'POSIX');
  1043. foreach my $mod (@mods) {
  1044. if (eval "require $mod") {
  1045. printMessage("CORE", " - OK : ".$mod."\n");
  1046. next;
  1047. } else {
  1048. $errors++;
  1049. push(@errorMessages, "Loading of CORE-Perl-module ".$mod." failed.\n");
  1050. printMessage("CORE", " - FAILED : ".$mod."\n");
  1051. }
  1052. }
  1053. # 2. FluxDB-Perl-modules
  1054. printMessage("CORE", "2. Database-Perl-modules\n");
  1055. if (eval "require DBI") {
  1056. printMessage("CORE", " - OK : DBI\n");
  1057. } else {
  1058. $warnings++;
  1059. push(@warningMessages, "Loading of FluxDB-Perl-module DBI failed. fluxd cannot work in DBI/DBD-mode but only in PHP-mode.\n");
  1060. printMessage("CORE", " - FAILED : DBI\n");
  1061. }
  1062. my $dbdwarnings = 0;
  1063. @mods = ('DBD::mysql', 'DBD::SQLite', 'DBD::Pg');
  1064. foreach my $mod (@mods) {
  1065. if (eval "require $mod") {
  1066. printMessage("CORE", " - OK : ".$mod."\n");
  1067. next;
  1068. } else {
  1069. $dbdwarnings++;
  1070. printMessage("CORE", " - FAILED : ".$mod."\n");
  1071. }
  1072. }
  1073. if ($dbdwarnings == 3) {
  1074. $warnings++;
  1075. push(@warningMessages, "No DBD-Module could be loaded. fluxd cannot work in DBI/DBD-mode but only in PHP-mode.\n");
  1076. }
  1077. # 3. Result
  1078. printMessage("CORE", "3. Result : ".(($errors == 0) ? "PASSED" : "FAILED")."\n");
  1079. # failures
  1080. if ($errors > 0) {
  1081. printMessage("CORE", "Errors:\n");
  1082. foreach my $msg (@errorMessages) {
  1083. printMessage("CORE", $msg);
  1084. }
  1085. }
  1086. # warnings
  1087. if ($warnings > 0) {
  1088. printMessage("CORE", "Warnings:\n");
  1089. foreach my $msg (@warningMessages) {
  1090. printMessage("CORE", $msg);
  1091. }
  1092. }
  1093. }
  1094. #------------------------------------------------------------------------------#
  1095. # Sub: debug #
  1096. # Arguments: Null #
  1097. # Returns: Null #
  1098. #------------------------------------------------------------------------------#
  1099. sub debug {
  1100. my $debug = shift @ARGV;
  1101. # first arg is debug-operation.
  1102. if (!(defined $debug)) {
  1103. printMessage("CORE", "debug is missing an operation.\n");
  1104. exit;
  1105. }
  1106. # database-debug
  1107. if ($debug =~ /db/) {
  1108. # $path_docroot
  1109. my $temp = shift @ARGV;
  1110. if (!(defined $temp)) {
  1111. printMessage("CORE", "debug database is missing an argument : path to docroot\n");
  1112. exit;
  1113. }
  1114. if (!((substr $temp, -1) eq "/")) {
  1115. $temp .= "/";
  1116. }
  1117. $path_docroot = $temp;
  1118. # PATH_PATH
  1119. $temp = shift @ARGV;
  1120. if (!(defined $temp)) {
  1121. printMessage("CORE", "debug database is missing an argument : path to path\n");
  1122. exit;
  1123. }
  1124. if (!((substr $temp, -1) eq "/")) {
  1125. $temp .= "/";
  1126. }
  1127. $path_path = $temp;
  1128. # $bin_php
  1129. $temp = shift @ARGV;
  1130. if (!(defined $temp)) {
  1131. printMessage("CORE", "debug database is missing an argument : path to php\n");
  1132. exit;
  1133. }
  1134. $bin_php = $temp;
  1135. printMessage("CORE", "debugging database...\n");
  1136. # require
  1137. require FluxDB;
  1138. # create instance
  1139. printMessage("CORE", "creating \$fluxDB\n");
  1140. $fluxDB = FluxDB->new();
  1141. # PHP
  1142. # initialize
  1143. printMessage("CORE", "initializing \$fluxDB (php)\n");
  1144. $fluxDB->initialize($path_docroot, $bin_php, "php");
  1145. if ($fluxDB->getState() != MOD_STATE_OK) {
  1146. printMessage("CORE", "error : ".$fluxDB->getMessage()."\n");
  1147. exit;
  1148. }
  1149. # something from the bean
  1150. printMessage("CORE", "FluxConfig(\"path\") : \"".FluxDB->getFluxConfig("path")."\"\n");
  1151. printMessage("CORE", "FluxConfig(\"docroot\") : \"".FluxDB->getFluxConfig("docroot")."\"\n");
  1152. # test to set a val
  1153. printMessage("CORE", "FluxConfig(\"default_theme\") : \"".FluxDB->getFluxConfig("default_theme")."\"\n");
  1154. $fluxDB->setFluxConfig("default_theme","foo");
  1155. printMessage("CORE", "FluxConfig(\"default_theme\") after set : \"".FluxDB->getFluxConfig("default_theme")."\"\n");
  1156. # now reload and check again
  1157. $fluxDB->reload();
  1158. printMessage("CORE", "FluxConfig(\"default_theme\") after reload : \"".FluxDB->getFluxConfig("default_theme")."\"\n");
  1159. # destroy
  1160. printMessage("CORE", "destroying \$fluxDB\n");
  1161. $fluxDB->destroy();
  1162. # DBI
  1163. # initialize
  1164. printMessage("CORE", "initializing \$fluxDB (dbi)\n");
  1165. $fluxDB->initialize($path_docroot, $bin_php, "dbi");
  1166. if ($fluxDB->getState() != MOD_STATE_OK) {
  1167. printMessage("CORE", "error : ".$fluxDB->getMessage()."\n");
  1168. # db-settings
  1169. printMessage("CORE", " DatabaseType : \"".$fluxDB->getDatabaseType()."\"\n");
  1170. printMessage("CORE", " DatabaseName : \"".$fluxDB->getDatabaseName()."\"\n");
  1171. printMessage("CORE", " DatabaseHost : \"".$fluxDB->getDatabaseHost()."\"\n");
  1172. printMessage("CORE", " DatabasePort : \"".$fluxDB->getDatabasePort()."\"\n");
  1173. printMessage("CORE", " DatabaseUser : \"".$fluxDB->getDatabaseUser()."\"\n");
  1174. printMessage("CORE", " DatabasePassword : \"".$fluxDB->getDatabasePassword()."\"\n");
  1175. printMessage("CORE", " DatabaseDSN : \"".$fluxDB->getDatabaseDSN()."\"\n");
  1176. exit;
  1177. }
  1178. # db-settings
  1179. printMessage("CORE", "DatabaseDSN : \"".$fluxDB->getDatabaseDSN()."\"\n");
  1180. # something from the bean
  1181. printMessage("CORE", "FluxConfig(\"path\") : \"".FluxDB->getFluxConfig("path")."\"\n");
  1182. printMessage("CORE", "FluxConfig(\"docroot\") : \"".FluxDB->getFluxConfig("docroot")."\"\n");
  1183. # test to set a val
  1184. printMessage("CORE", "FluxConfig(\"default_theme\") : \"".FluxDB->getFluxConfig("default_theme")."\"\n");
  1185. $fluxDB->setFluxConfig("default_theme","foo");
  1186. printMessage("CORE", "FluxConfig(\"default_theme\") after set : \"".FluxDB->getFluxConfig("default_theme")."\"\n");
  1187. # now reload and check again
  1188. $fluxDB->reload();
  1189. printMessage("CORE", "FluxConfig(\"default_theme\") after reload : \"".FluxDB->getFluxConfig("default_theme")."\"\n");
  1190. # destroy
  1191. printMessage("CORE", "destroying \$fluxDB\n");
  1192. $fluxDB->destroy();
  1193. # done
  1194. printMessage("CORE", "database debug done.\n");
  1195. exit;
  1196. }
  1197. # bail out
  1198. printMessage("CORE", "debug is missing an operation.\n");
  1199. exit;
  1200. }
  1201. #------------------------------------------------------------------------------#
  1202. # Sub: getLoglevel #
  1203. # Arguments: null #
  1204. # Returns: loglevel-int #
  1205. #------------------------------------------------------------------------------#
  1206. sub getLoglevel {
  1207. return $loglevel;
  1208. }
  1209. #------------------------------------------------------------------------------#
  1210. # Sub: getPathDataDir #
  1211. # Arguments: null #
  1212. # Returns: path-string #
  1213. #------------------------------------------------------------------------------#
  1214. sub getPathDataDir {
  1215. return $path_data_dir;
  1216. }
  1217. #------------------------------------------------------------------------------#
  1218. # Sub: getPathTransferDir #
  1219. # Arguments: null #
  1220. # Returns: path-string #
  1221. #------------------------------------------------------------------------------#
  1222. sub getPathTransferDir {
  1223. return $path_transfer_dir;
  1224. }
  1225. #------------------------------------------------------------------------------#
  1226. # Sub: printMessage #
  1227. # Arguments: module, message #
  1228. # Return: null #
  1229. #------------------------------------------------------------------------------#
  1230. sub printMessage {
  1231. my $module = shift;
  1232. my $message = shift;
  1233. print STDOUT FluxCommon::getTimeStamp()."[".$module."] ".$message;
  1234. }
  1235. #------------------------------------------------------------------------------#
  1236. # Sub: printError #
  1237. # Arguments: module, message #
  1238. # Return: null #
  1239. #------------------------------------------------------------------------------#
  1240. sub printError {
  1241. my $module = shift;
  1242. my $message = shift;
  1243. print STDERR FluxCommon::getTimeStamp()."[".$module."] ".$message;
  1244. }
  1245. #------------------------------------------------------------------------------#
  1246. # Sub: logMessage #
  1247. # Arguments: module, message #
  1248. # Return: null #
  1249. #------------------------------------------------------------------------------#
  1250. sub logMessage {
  1251. my $module = shift;
  1252. my $message = shift;
  1253. logToFile($log, FluxCommon::getTimeStamp()."[".$module."] ".$message);
  1254. }
  1255. #------------------------------------------------------------------------------#
  1256. # Sub: logError #
  1257. # Arguments: module, message #
  1258. # Return: null #
  1259. #------------------------------------------------------------------------------#
  1260. sub logError {
  1261. my $module = shift;
  1262. my $message = shift;
  1263. logToFile($log_error, FluxCommon::getTimeStamp()."[".$module."] ".$message);
  1264. }
  1265. #------------------------------------------------------------------------------#
  1266. # Sub: logToFile #
  1267. # Arguments: file, message #
  1268. # Return: null #
  1269. #------------------------------------------------------------------------------#
  1270. sub logToFile {
  1271. my $file = shift;
  1272. my $message = shift;
  1273. open(LOG, ">>$file");
  1274. print LOG $message;
  1275. close LOG;
  1276. }
  1277. #------------------------------------------------------------------------------#
  1278. # Sub: printUsage #
  1279. # Arguments: bool (or undefined) #
  1280. # Returns: Usage Information #
  1281. #------------------------------------------------------------------------------#
  1282. sub printUsage {
  1283. my $return = shift;
  1284. my $data = <<"USAGE";
  1285. $PROG.$EXTENSION Revision $VERSION
  1286. Usage:
  1287. $PROG.$EXTENSION <start> path-to-docroot path-to-path path-to-php db-mode
  1288. start fluxd daemon.
  1289. db-mode : dbi/php
  1290. $PROG.$EXTENSION <stop> path-to-docroot path-to-path path-to-php db-mode
  1291. stop fluxd daemon
  1292. db-mode : dbi/php
  1293. $PROG.$EXTENSION <check>
  1294. check for requirements.
  1295. $PROG.$EXTENSION <debug> type path-to-docroot path-to-path path-to-php
  1296. debug fluxd daemon
  1297. type : db
  1298. $PROG.$EXTENSION <-v|--version>
  1299. print out version-info
  1300. $PROG.$EXTENSION <-h|--help>
  1301. print out help screen.
  1302. USAGE
  1303. if ($return) {
  1304. return $data;
  1305. } else {
  1306. print $data;
  1307. }
  1308. }