Fluxinet.pm 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. ################################################################################
  2. # $Id: Fluxinet.pm 3151 2007-07-04 20:26:57Z munk $
  3. # $Date: 2007-07-04 15:26:57 -0500 (Wed, 04 Jul 2007) $
  4. # $Revision: 3151 $
  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. # #
  24. # Requirements : #
  25. # * IO::Select ( perl -MCPAN -e "install IO::Select" ) #
  26. # * IO::Socket::INET ( perl -MCPAN -e "install IO::Socket::INET" ) #
  27. # #
  28. ################################################################################
  29. package Fluxinet;
  30. use strict;
  31. use warnings;
  32. ################################################################################
  33. ################################################################################
  34. # fields #
  35. ################################################################################
  36. # version in a var
  37. my $VERSION = do {
  38. my @r = (q$Revision: 3151 $ =~ /\d+/g); sprintf "%d"."%02d" x $#r, @r };
  39. # state
  40. my $state = Fluxd::MOD_STATE_NULL;
  41. # message, error etc. keep it in one string for simplicity atm.
  42. my $message = "";
  43. # loglevel
  44. my $loglevel = 0;
  45. # port
  46. my $port = 3150;
  47. # server-socket
  48. my ($server, $select);
  49. # modules loaded
  50. my $modsLoaded = 0;
  51. ################################################################################
  52. # constructor + destructor #
  53. ################################################################################
  54. #------------------------------------------------------------------------------#
  55. # Sub: new #
  56. # Arguments: Null #
  57. # Returns: Info String #
  58. #------------------------------------------------------------------------------#
  59. sub new {
  60. my $class = shift;
  61. my $self = bless ({}, ref ($class) || $class);
  62. return $self;
  63. }
  64. #------------------------------------------------------------------------------#
  65. # Sub: destroy #
  66. # Arguments: Null #
  67. # Returns: Info String #
  68. #------------------------------------------------------------------------------#
  69. sub destroy {
  70. # set state
  71. $state = Fluxd::MOD_STATE_NULL;
  72. # log
  73. Fluxd::printMessage("Fluxinet", "shutdown\n");
  74. # remove
  75. foreach my $handle ($select->handles) {
  76. $select->remove($handle);
  77. $handle->close;
  78. }
  79. }
  80. ################################################################################
  81. # public methods #
  82. ################################################################################
  83. #------------------------------------------------------------------------------#
  84. # Sub: initialize. this is separated from constructor to call it independent #
  85. # from object-creation. #
  86. # Arguments: null #
  87. # Returns: 0|1 #
  88. #------------------------------------------------------------------------------#
  89. sub initialize {
  90. shift; # class
  91. # loglevel
  92. $loglevel = Fluxd::getLoglevel();
  93. if (!(defined $loglevel)) {
  94. # message
  95. $message = "loglevel not defined";
  96. # set state
  97. $state = Fluxd::MOD_STATE_ERROR;
  98. # return
  99. return 0;
  100. }
  101. # $port
  102. $port = FluxDB->getFluxConfig("fluxd_Fluxinet_port");
  103. if (!(defined $port)) {
  104. # message
  105. $message = "port not defined";
  106. # set state
  107. $state = Fluxd::MOD_STATE_ERROR;
  108. # return
  109. return 0;
  110. }
  111. Fluxd::printMessage("Fluxinet", "initializing (loglevel: ".$loglevel." ; port: ".$port.")\n");
  112. # load modules
  113. if ($modsLoaded == 0) {
  114. if (loadModules() != 1) {
  115. return 0;
  116. }
  117. }
  118. # Create the read set
  119. $select = new IO::Select();
  120. # Create the server socket
  121. $server = IO::Socket::INET->new(
  122. LocalPort => $port,
  123. Proto => 'tcp',
  124. Listen => 16,
  125. Reuse => 1);
  126. if (!(defined $server)) {
  127. # message
  128. $message = "could not create server socket";
  129. # set state
  130. $state = Fluxd::MOD_STATE_ERROR;
  131. # return
  132. return 0;
  133. }
  134. $select->add($server);
  135. # log
  136. if ($loglevel > 1) {
  137. Fluxd::printMessage("Fluxinet", "tcp-server-socket setup on port ".$port."\n");
  138. }
  139. # set state
  140. $state = Fluxd::MOD_STATE_OK;
  141. # return
  142. return 1;
  143. }
  144. #------------------------------------------------------------------------------#
  145. # Sub: loadModules #
  146. # Arguments: null #
  147. # Returns: 0|1 #
  148. #------------------------------------------------------------------------------#
  149. sub loadModules {
  150. # load IO::Select
  151. if ($loglevel > 2) {
  152. Fluxd::printMessage("Fluxinet", "loading Perl-module IO::Select\n");
  153. }
  154. if (eval "require IO::Select") {
  155. IO::Select->import();
  156. } else {
  157. # message
  158. $message = "cant load perl-module IO::Socket::INET : ".$@;;
  159. # set state
  160. $state = Fluxd::MOD_STATE_ERROR;
  161. # return
  162. return 0;
  163. }
  164. # load IO::Socket::INET
  165. if ($loglevel > 2) {
  166. Fluxd::printMessage("Fluxinet", "loading Perl-module IO::Socket\n");
  167. }
  168. if (eval "require IO::Socket::INET") {
  169. IO::Socket::INET->import();
  170. } else {
  171. # message
  172. $message = "cant load perl-module IO::Socket::INET : ".$@;;
  173. # set state
  174. $state = Fluxd::MOD_STATE_ERROR;
  175. # return
  176. return 0;
  177. }
  178. # set flag
  179. $modsLoaded = 1;
  180. # return
  181. return 1;
  182. }
  183. #------------------------------------------------------------------------------#
  184. # Sub: getVersion #
  185. # Arguments: null #
  186. # Returns: VERSION #
  187. #------------------------------------------------------------------------------#
  188. sub getVersion {
  189. return $VERSION;
  190. }
  191. #------------------------------------------------------------------------------#
  192. # Sub: getState #
  193. # Arguments: null #
  194. # Returns: state #
  195. #------------------------------------------------------------------------------#
  196. sub getState {
  197. return $state;
  198. }
  199. #------------------------------------------------------------------------------#
  200. # Sub: getMessage #
  201. # Arguments: null #
  202. # Returns: message #
  203. #------------------------------------------------------------------------------#
  204. sub getMessage {
  205. return $message;
  206. }
  207. #------------------------------------------------------------------------------#
  208. # Sub: set #
  209. # Arguments: Variable [value] #
  210. # Returns: #
  211. #------------------------------------------------------------------------------#
  212. sub set {
  213. }
  214. #------------------------------------------------------------------------------#
  215. # Sub: main #
  216. # Arguments: Null #
  217. # Returns: Null #
  218. #------------------------------------------------------------------------------#
  219. sub main {
  220. # Get the readable handles. timeout is 0, only process stuff that can be
  221. # read NOW.
  222. my $return = "";
  223. my @ready = $select->can_read(0);
  224. foreach my $socket (@ready) {
  225. if ($socket == $server) {
  226. my $new = $socket->accept();
  227. $select->add($new);
  228. } else {
  229. my $buf = "";
  230. my $char = getc($socket);
  231. while (defined($char) && $char ne "\n") {
  232. $buf .= $char;
  233. $char = getc($socket);
  234. }
  235. $return = Fluxd::processRequest($buf);
  236. $socket->send($return);
  237. $select->remove($socket);
  238. close($socket);
  239. }
  240. }
  241. }
  242. #------------------------------------------------------------------------------#
  243. # Sub: command #
  244. # Arguments: command-string #
  245. # Returns: result-string #
  246. #------------------------------------------------------------------------------#
  247. sub command {
  248. shift; # class
  249. my $command = shift;
  250. # TODO
  251. return "";
  252. }
  253. #------------------------------------------------------------------------------#
  254. # Sub: status #
  255. # Arguments: Null #
  256. # Returns: Status information #
  257. #------------------------------------------------------------------------------#
  258. sub status {
  259. my $return = "";
  260. $return .= "\n-= Fluxinet Revision ".$VERSION." =-\n";
  261. $return .= "port : ".$port."\n";
  262. return $return;
  263. }
  264. ################################################################################
  265. # make perl happy #
  266. ################################################################################
  267. 1;