#!/usr/local/bin/perl -w # -*- perl -*- # Cricket: a configuration, polling and data display wrapper for RRD files # # Copyright (C) 1998 Jeff R. Allen and WebTV Networks, Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. BEGIN { my $programdir = (($0 =~ m:^(.*/):)[0] || "./") . "."; eval "require '$programdir/cricket-conf.pl'"; eval "require '/usr/local/etc/cricket-conf.pl'" unless $Common::global::gInstallRoot; $Common::global::gInstallRoot ||= $programdir; } use lib "$Common::global::gInstallRoot/lib"; use Common::Version; use Common::global; use Common::Log; use Common::Options; use Common::Util; use Common::Map; use Common::HandleTarget; use ConfigTree::Node; my $starttime = time(); Common::Options::commonOptions(); Info("Starting compile: $Common::global::gVersion"); my($nodeCt, $fileCt) = (0, 0); $gCT = new ConfigTree::Node; $gCT->info(\&Common::Log::Info); $gCT->warn(\&Common::Log::Warn); $gCT->debug(\&Common::Log::Debug); $gCT->Base($Common::global::gConfigRoot); if (&check_and_set_lock) { exit; } $gCT->init(); $gCT->processTree(); ($nodeCt, $fileCt) = $gCT->compile(); # log summary info before exiting $time = runTime($starttime); Info("Processed $nodeCt nodes (in $fileCt files) in $time."); &unlock; exit; sub check_and_set_lock { my $lockfile = $gCT->Base() . "/config.db.lock"; if (-f $lockfile) { my($db_mtime) = (stat($lockfile))[9]; # Do not recompile if another process already is busy compiling if ((time() - $db_mtime) < 900) { Warn("Skipping recompile; already in progress"); return 1; } else { # But warn if that other process is dead Warn("Forcing recompile; previous compile aborted?"); } } open(LOCK, ">$lockfile") || die "Can't create $lockfile"; print LOCK "$$\n"; close LOCK; return 0; } sub unlock { my $lockfile = $gCT->Base() . "/config.db.lock"; unlink $lockfile; }