1
0

Watch.pm 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. ################################################################################
  2. # $Id: Watch.pm 2979 2007-05-11 21:04:11Z warion $
  3. # $Date: 2007-05-11 16:04:11 -0500 (Fri, 11 May 2007) $
  4. # $Revision: 2979 $
  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 Watch;
  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: 2979 $ =~ /\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-hash: dir => { # anonymous hash
  44. # U => user,
  45. # P => profile, # optional
  46. # # optional other attributes, currently ignored
  47. # D => dir
  48. # }
  49. my %jobs;
  50. ################################################################################
  51. # constants #
  52. ################################################################################
  53. my $delimJobs = ';';
  54. my $delimJob = ':';
  55. my $delimComponent = '=';
  56. ################################################################################
  57. # constructor + destructor #
  58. ################################################################################
  59. #------------------------------------------------------------------------------#
  60. # Sub: new #
  61. # Arguments: Null #
  62. # Returns: object reference #
  63. #------------------------------------------------------------------------------#
  64. sub new {
  65. my $class = shift;
  66. my $self = bless ({}, ref ($class) || $class);
  67. return $self;
  68. }
  69. #------------------------------------------------------------------------------#
  70. # Sub: destroy #
  71. # Arguments: Null #
  72. # Returns: Null #
  73. #------------------------------------------------------------------------------#
  74. sub destroy {
  75. # set state
  76. $state = Fluxd::MOD_STATE_NULL;
  77. # log
  78. Fluxd::printMessage("Watch", "shutdown\n");
  79. # undef
  80. undef %jobs;
  81. }
  82. ################################################################################
  83. # public methods #
  84. ################################################################################
  85. #------------------------------------------------------------------------------#
  86. # Sub: initialize. this is separated from constructor to call it independent #
  87. # from object-creation. #
  88. # Arguments: null #
  89. # Returns: 0|1 #
  90. #------------------------------------------------------------------------------#
  91. sub initialize {
  92. shift; # class
  93. # loglevel
  94. $loglevel = Fluxd::getLoglevel();
  95. if (!(defined $loglevel)) {
  96. # message
  97. $message = "loglevel not defined";
  98. # set state
  99. $state = Fluxd::MOD_STATE_ERROR;
  100. # return
  101. return 0;
  102. }
  103. # interval
  104. $interval = FluxDB->getFluxConfig("fluxd_Watch_interval");
  105. if (!(defined $interval)) {
  106. # message
  107. $message = "interval not defined";
  108. # set state
  109. $state = Fluxd::MOD_STATE_ERROR;
  110. # return
  111. return 0;
  112. }
  113. # jobs
  114. my $jobs = FluxDB->getFluxConfig("fluxd_Watch_jobs");
  115. if (!(defined $jobs)) {
  116. # message
  117. $message = "jobs not defined";
  118. # set state
  119. $state = Fluxd::MOD_STATE_ERROR;
  120. # return
  121. return 0;
  122. }
  123. Fluxd::printMessage("Watch", "initializing (loglevel: ".$loglevel." ; interval: ".$interval." ; jobs: ".$jobs.")\n");
  124. # parse jobs
  125. my (@jobsAry) = split(/$delimJobs/,$jobs);
  126. foreach my $jobEntry (@jobsAry) {
  127. # U=user:[P=profile:]D=dir
  128. $_ = Fluxd::lrtrim $jobEntry;
  129. next if !defined $_ || length $_ == 0;
  130. my %jobEntry;
  131. while (1) {
  132. if (/^D$delimComponent/) { # Dir: final component.
  133. $jobEntry{D} = substr $_, 2;
  134. last;
  135. } else { # Other component.
  136. my (@jobAry) = split /$delimJob/, $_, 2;
  137. if ($#jobAry != 1 || $jobAry[0] !~ /^\s*[A-Z]$delimComponent/) {
  138. # message
  139. $message = "invalid job entry";
  140. # set state
  141. $state = Fluxd::MOD_STATE_ERROR;
  142. # return
  143. return 0;
  144. }
  145. $_ = Fluxd::lrtrim shift @jobAry;
  146. $jobEntry{substr $_, 0, 1} = substr $_, 2;
  147. $_ = Fluxd::lrtrim shift @jobAry;
  148. }
  149. }
  150. if (
  151. defined $jobEntry{U} && length $jobEntry{U} > 0 &&
  152. defined $jobEntry{D} && -d $jobEntry{D}
  153. ) {
  154. if ($loglevel > 1) {
  155. Fluxd::printMessage("Watch",
  156. "job : user=".$jobEntry{U}.
  157. ((defined $jobEntry{P} && length $jobEntry{P} > 0) ? ", profile=".$jobEntry{P} : '').
  158. ", dir=".$jobEntry{D}.
  159. "\n"
  160. );
  161. }
  162. $jobs{$jobEntry{D}} = { %jobEntry };
  163. }
  164. }
  165. # reset last run time
  166. $time_last_run = time();
  167. # set state
  168. $state = Fluxd::MOD_STATE_OK;
  169. # return
  170. return 1;
  171. }
  172. #------------------------------------------------------------------------------#
  173. # Sub: getVersion #
  174. # Arguments: null #
  175. # Returns: VERSION #
  176. #------------------------------------------------------------------------------#
  177. sub getVersion {
  178. return $VERSION;
  179. }
  180. #------------------------------------------------------------------------------#
  181. # Sub: getState #
  182. # Arguments: null #
  183. # Returns: state #
  184. #------------------------------------------------------------------------------#
  185. sub getState {
  186. return $state;
  187. }
  188. #------------------------------------------------------------------------------#
  189. # Sub: getMessage #
  190. # Arguments: null #
  191. # Returns: message #
  192. #------------------------------------------------------------------------------#
  193. sub getMessage {
  194. return $message;
  195. }
  196. #------------------------------------------------------------------------------#
  197. # Sub: set #
  198. # Arguments: Variable [value] #
  199. # Returns: #
  200. #------------------------------------------------------------------------------#
  201. sub set {
  202. }
  203. #------------------------------------------------------------------------------#
  204. # Sub: main #
  205. # Arguments: Null #
  206. # Returns: #
  207. #------------------------------------------------------------------------------#
  208. sub main {
  209. if ((time() - $time_last_run) >= $interval) {
  210. # watch in dirs for dropped meta-files
  211. foreach my $key (sort keys %jobs) {
  212. my $job = $jobs{$key};
  213. my $user = defined $$job{U} ? $$job{U} : '';
  214. my $profile = defined $$job{P} ? $$job{P} : '';
  215. my $dir = defined $$job{D} ? $$job{D} : '';
  216. if (length $user > 0 && -d $dir) {
  217. if ($loglevel > 1) {
  218. my $msg = "executing job :\n";
  219. $msg .= " user: ".$user."\n";
  220. $msg .= " profile: ".$profile."\n" if length $profile > 0;
  221. $msg .= " dir: ".$dir."\n";
  222. Fluxd::printMessage("Watch", $msg);
  223. }
  224. # exec
  225. tfwatch($dir, $user, $profile);
  226. }
  227. }
  228. # set last run time
  229. $time_last_run = time();
  230. }
  231. }
  232. #------------------------------------------------------------------------------#
  233. # Sub: command #
  234. # Arguments: command-string #
  235. # Returns: result-string #
  236. #------------------------------------------------------------------------------#
  237. sub command {
  238. shift; # class
  239. my $command = shift;
  240. # TODO
  241. return "";
  242. }
  243. #------------------------------------------------------------------------------#
  244. # Sub: status #
  245. # Arguments: Null #
  246. # Returns: Status information #
  247. #------------------------------------------------------------------------------#
  248. sub status {
  249. my $return = "";
  250. $return .= "\n-= Watch Revision ".$VERSION." =-\n";
  251. $return .= "interval : ".$interval." s \n";
  252. $return .= "jobs :\n";
  253. foreach my $key (sort keys %jobs) {
  254. my $job = $jobs{$key};
  255. my $user = defined $$job{U} ? $$job{U} : '';
  256. my $profile = defined $$job{P} ? $$job{P} : '';
  257. my $dir = defined $$job{D} ? $$job{D} : '';
  258. if (length $user > 0 && -d $dir) {
  259. $return .= " * user: ".$user."\n";
  260. $return .= " profile: ".$profile."\n" if length $profile > 0;
  261. $return .= " dir: ".$dir."\n";
  262. }
  263. }
  264. return $return;
  265. }
  266. #------------------------------------------------------------------------------#
  267. # Sub: tfwatch #
  268. # Arguments: dir, user[, profile] #
  269. # Returns: 0|1 #
  270. #------------------------------------------------------------------------------#
  271. sub tfwatch {
  272. my $dir = shift;
  273. my $user = shift;
  274. my $profile = shift;
  275. my $options = 'ds';
  276. my @extra;
  277. if (defined($profile) && length($profile) > 0) {
  278. $options .= 'p';
  279. push @extra, $profile;
  280. }
  281. # fluxcli-call
  282. return Fluxd::fluxcli("watch", $dir, $user, $options, @extra);
  283. }
  284. ################################################################################
  285. # make perl happy #
  286. ################################################################################
  287. 1;