Python tail 实现S3 动态上

发布时间:2019-09-21 10:47:35编辑:auto阅读(1470)

    本文源码转至:https://github.com/kasun/python-tail 感谢作者, 稍加修改,实现了文件动态上传的功能

    一: 主体执行部分
    [root@linux219 base]# cat vsftp.py
    #!/usr/bin/env python
    #-*-coding:UTF-8-*-
    """
    @Item   :  cheetah v1.0
    @Author :  william
    @Group  :  System YunWei
    @Date   :  2015-01-28
    @E-mail :  swq.499809608@163.com
    @Funtion:
        
    """
    import json,sys,time,os
    import time
    import hmac
    import hashlib
    import requests
    import re
    import tail
    Dfile = "/data/base/vsftp"
    Vfile = "/var/log/vsftpd.log"
    Nfile = "/data/base/vsftp/n.log"
    def s3Vsftp():
        os.system("cp -fr %s %s "%(Vfile,Nfile))
        os.system("echo ''>%s "%Vfile)
        fp = open(Nfile,'r').readlines()
        for x in fp:
            if  re.search("CHMOD",x) or re.search("UPLOAD",x):
                x =  x.strip()
                x =  x.split('"')[3]
                nx = x.split()[0]
                
                if os.path.isfile("/data/cifs"+nx):
                    os.system("s3cmd --acl-public put /data/cifs%s s3://swq499809608.aws.com%s" %(nx,nx))
                elif re.search('zip',nx):
                    try:
                        os.system("s3cmd --acl-public put %s s3://swq499809608.aws.com%s" %(nx,nx.split('imguser')[1]))
                    except:
                        pass
        os.system("mv  %s %s/%s.file"%(Nfile,Dfile,time.strftime("%F-%H-%M")))
    def  work():
        while True:
            t = tail.Tail(Vfile)
            print t.follow()
    if __name__ == "__main__":
        sc = work()
        
        
    二: tail. 实现部分
    源码转至: https://github.com/kasun/python-tail
    [root@linux219 base]# cat tail.py
    #!/usr/bin/env python
    '''
    Python-Tail - Unix tail follow implementation in Python.
    python-tail can be used to monitor changes to a file.
    Example:
        import tail
        # Create a tail instance
        t = tail.Tail('file-to-be-followed')
        # Register a callback function to be called when a new line is found in the followed file.
        # If no callback function is registerd, new lines would be printed to standard out.
        t.register_callback(callback_function)
        # Follow the file with 5 seconds as sleep time between iterations.
        # If sleep time is not provided 1 second is used as the default time.
        t.follow(s=5) '''
    # Author - Kasun Herath <kasunh01 at gmail.com>
    # Source - https://github.com/kasun/python-tail
    import os
    import sys
    import time
    import re
    class Tail(object):
        ''' Represents a tail command. '''
        def __init__(self, tailed_file):
            ''' Initiate a Tail instance.
                Check for file validity, assigns callback function to standard out.
                
                Arguments:
                    tailed_file - File to be followed. '''
            self.check_file_validity(tailed_file)
            self.tailed_file = tailed_file
            self.callback = sys.stdout.write
        def follow(self, s=1):
            ''' Do a tail follow. If a callback function is registered it is called with every new line.
            Else printed to standard out.
        
            Arguments:
                s - Number of seconds to wait between each iteration; Defaults to 1. '''
            with open(self.tailed_file) as file_:
                # Go to the end of file
                file_.seek(0,2)
                while True:
                    curr_position = file_.tell()
                    line = file_.readline()
                    if not line:
                        file_.seek(curr_position)
                        time.sleep(s)
                    else:
                        #self.callback(line)
                        if  re.search("CHMOD",line) or re.search("UPLOAD",line):
                            #修改主体部分
                            x =  line.strip()
                            x =  x.split('"')[3]
                            nx = x.split()[0]
                            # commad s3cmd put file
                  
                            if os.path.isfile("/data/cifs"+nx):
                                print "/data/cifs"+nx
                                os.system("s3cmd --acl-public put /data/cifs%s s3://swq499809608.aws.com%s" %(nx,nx))
                                print ("s3cmd --acl-public put /data/cifs%s s3://swq499809608.aws.com%s" %(nx,nx))
                            elif re.search('zip',nx):
                                try:
                                    os.system("s3cmd --acl-public put %s s3://swq499809608.aws.com%s" %(nx,nx.split('imguser')[1]))
                                except:
                                    pass
                            else:
                                print 'no'
                            #主体结束部分
        def register_callback(self, func):
            ''' Overrides default callback function to provided function. '''
            self.callback = func
        def check_file_validity(self, file_):
            ''' Check whether the a given file exists, readable and is a file '''
            if not os.access(file_, os.F_OK):
                raise TailError("File '%s' does not exist" % (file_))
            if not os.access(file_, os.R_OK):
                raise TailError("File '%s' not readable" % (file_))
            if os.path.isdir(file_):
                raise TailError("File '%s' is a directory" % (file_))
    class TailError(Exception):
        def __init__(self, msg):
            self.message = msg
        def __str__(self):
            return 'yes',self.message.split('')

关键字