[BACK]Return to fileops.pm CVS log [TXT][DIR] Up to [local] / wpscripts / ztransfer

Annotation of wpscripts/ztransfer/fileops.pm, Revision 1.1

1.1     ! yason       1: #!/usr/bin/perl
        !             2: # $Id: fileops.pm,v 1.1.1.4 2006/02/17 09:16:23 init Exp $
        !             3: package fileops;
        !             4: use log;
        !             5:
        !             6: my $FILE_LOCK = "/var/run/ztransfer.lock";
        !             7:
        !             8:
        !             9: sub cleanup()
        !            10: {
        !            11:     # clanup procedure
        !            12:     # remove all .rar files in /tmp
        !            13:     # THIS CODE SHOULD BE FIXED
        !            14:     `rm -f /tmp/*.rar`;
        !            15: }
        !            16:
        !            17:
        !            18: sub checkdir($)
        !            19: {
        !            20:     my $file = shift;
        !            21:     chomp( my $dir = `dirname '$file'` );
        !            22:
        !            23:     if(! -e $dir)
        !            24:     {
        !            25:        $_ = system("mkdir -p '$dir'");
        !            26:            if($_ == 0)
        !            27:            {
        !            28:                log::main("Created directory $dir");
        !            29:            }
        !            30:            else
        !            31:            {
        !            32:                # directory has not created
        !            33:                log::error("Can not create directory $dir");
        !            34:            }
        !            35:     }
        !            36:
        !            37: }
        !            38:
        !            39:
        !            40: sub take_lock()
        !            41: {
        !            42:     open( FILE, ">$FILE_LOCK") or log::critical("Can not create lock file $FILE_LOCK");
        !            43:     # write PID of current process to file
        !            44:     print FILE $$;
        !            45:     close(FILE);
        !            46: }
        !            47:
        !            48:
        !            49: sub release_lock()
        !            50: {
        !            51:     # I think this is bad for a while
        !            52:     `rm $FILE_LOCK`;
        !            53: }
        !            54:
        !            55:
        !            56: sub check_lock()
        !            57: {
        !            58:     # I'm really sure that this technique (file-locks) is not very
        !            59:     # good idea since it is no good way to determine if one copy
        !            60:     # of this script is already running now.
        !            61:     # My implementation based on writing a PID of a current process
        !            62:     # and (on startup) check if that file (or PID in it) is exists in
        !            63:     # processes tree (`ps ax`). It uses standart utility grep(1).
        !            64:     my $PID;
        !            65:
        !            66:     if(! -e $FILE_LOCK)
        !            67:     {
        !            68:        # continue running main transfer code
        !            69:        return()
        !            70:     }
        !            71:     else
        !            72:     {
        !            73:        open(FILE, $FILE_LOCK) or log::critical("Can not open existing lock file $FILE_LOCK");
        !            74:        $PID = <FILE>;
        !            75:        close(FILE);
        !            76:        $_ = `ps ax | egrep '\\b$PID\\b'`;
        !            77:         if($_ ne '')
        !            78:         {
        !            79:            # another copy is running
        !            80:            log::critical("Another copy is running! Exiting..");
        !            81:         }
        !            82:         else
        !            83:         {
        !            84:            # previous run of script ends incorrectly
        !            85:            # and he hadn't remove his lock
        !            86:
        !            87:            # return to main (should call take_lock() within it hardly)
        !            88:            return()
        !            89:         }
        !            90:     }
        !            91: }
        !            92:
        !            93: return(1);

CVSweb