forked from uncloud/uncloud
		
	No longer using xattrs as they don't work on tmpfs/rootfs
This commit is contained in:
		
					parent
					
						
							
								344a957a3f
							
						
					
				
			
			
				commit
				
					
						180f6f4989
					
				
			
		
					 1 changed files with 36 additions and 42 deletions
				
			
		| 
						 | 
					@ -4,6 +4,7 @@ import pathlib
 | 
				
			||||||
import subprocess as sp
 | 
					import subprocess as sp
 | 
				
			||||||
import time
 | 
					import time
 | 
				
			||||||
import argparse
 | 
					import argparse
 | 
				
			||||||
 | 
					import bitmath
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from uuid import uuid4
 | 
					from uuid import uuid4
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,66 +29,59 @@ def sha512sum(file: str):
 | 
				
			||||||
    if not isinstance(file, str):
 | 
					    if not isinstance(file, str):
 | 
				
			||||||
        raise TypeError
 | 
					        raise TypeError
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        output = sp.check_output(["sha512sum", file], stderr=sp.PIPE)
 | 
					        output = sp.check_output(['sha512sum', file], stderr=sp.PIPE)
 | 
				
			||||||
    except sp.CalledProcessError as e:
 | 
					    except sp.CalledProcessError as e:
 | 
				
			||||||
        error = e.stderr.decode("utf-8")
 | 
					        error = e.stderr.decode('utf-8')
 | 
				
			||||||
        if "No such file or directory" in error:
 | 
					        if 'No such file or directory' in error:
 | 
				
			||||||
            raise FileNotFoundError from None
 | 
					            raise FileNotFoundError from None
 | 
				
			||||||
    else:
 | 
					    else:
 | 
				
			||||||
        output = output.decode("utf-8").strip()
 | 
					        output = output.decode('utf-8').strip()
 | 
				
			||||||
        output = output.split(" ")
 | 
					        output = output.split(' ')
 | 
				
			||||||
        return output[0]
 | 
					        return output[0]
 | 
				
			||||||
    return None
 | 
					    return None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def track_file(file, base_dir):
 | 
					def track_file(file, base_dir):
 | 
				
			||||||
    file_id = uuid4()
 | 
					    file_path = file.relative_to(base_dir)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Get Username
 | 
					    # Get Username
 | 
				
			||||||
    owner = pathlib.Path(file).parts[len(pathlib.Path(base_dir).parts)]
 | 
					    try:
 | 
				
			||||||
 | 
					        owner = file_path.parts[0]
 | 
				
			||||||
    # Get Creation Date of File
 | 
					    except IndexError:
 | 
				
			||||||
    # Here, we are assuming that ctime is creation time
 | 
					        pass
 | 
				
			||||||
    # which is mostly not true.
 | 
					    else:
 | 
				
			||||||
 | 
					        file_path = file_path.relative_to(owner)
 | 
				
			||||||
        creation_date = time.ctime(os.stat(file).st_ctime)
 | 
					        creation_date = time.ctime(os.stat(file).st_ctime)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    file_path = pathlib.Path(file).parts[-1]
 | 
					        entry_key = os.path.join(settings['etcd']['file_prefix'], str(uuid4()))
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Create Entry
 | 
					 | 
				
			||||||
    entry_key = os.path.join(
 | 
					 | 
				
			||||||
        settings["etcd"]["file_prefix"], str(file_id)
 | 
					 | 
				
			||||||
    )
 | 
					 | 
				
			||||||
        entry_value = {
 | 
					        entry_value = {
 | 
				
			||||||
        "filename": file_path,
 | 
					            'filename': str(file_path),
 | 
				
			||||||
        "owner": owner,
 | 
					            'owner': owner,
 | 
				
			||||||
        "sha512sum": sha512sum(file),
 | 
					            'sha512sum': sha512sum(str(file)),
 | 
				
			||||||
        "creation_date": creation_date,
 | 
					            'creation_date': creation_date,
 | 
				
			||||||
        "size": os.path.getsize(file),
 | 
					            'size': str(bitmath.Byte(os.path.getsize(str(file))).to_MB()),
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    logger.info("Tracking %s", file)
 | 
					        logger.info('Tracking %s', file)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        shared.etcd_client.put(entry_key, entry_value, value_in_json=True)
 | 
					        shared.etcd_client.put(entry_key, entry_value, value_in_json=True)
 | 
				
			||||||
    os.setxattr(file, "user.utracked", b"True")
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def main(debug=False):
 | 
					def main(debug=False):
 | 
				
			||||||
    base_dir = settings["storage"]["file_dir"]
 | 
					    base_dir = pathlib.Path(settings['storage']['file_dir'])
 | 
				
			||||||
 | 
					 | 
				
			||||||
    # Recursively Get All Files and Folder below BASE_DIR
 | 
					    # Recursively Get All Files and Folder below BASE_DIR
 | 
				
			||||||
    files = glob.glob("{}/**".format(base_dir), recursive=True)
 | 
					    files = glob.glob('{}/**'.format(base_dir), recursive=True)
 | 
				
			||||||
 | 
					    files = [pathlib.Path(f) for f in files if pathlib.Path(f).is_file()]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Retain only Files
 | 
					    # Files that are already tracked
 | 
				
			||||||
    files = [file for file in files if os.path.isfile(file)]
 | 
					    tracked_files = [
 | 
				
			||||||
 | 
					        pathlib.Path(os.path.join(base_dir, f.value['owner'], f.value['filename']))
 | 
				
			||||||
    untracked_files = []
 | 
					        for f in shared.etcd_client.get_prefix(settings['etcd']['file_prefix'], value_in_json=True)
 | 
				
			||||||
    for file in files:
 | 
					    ]
 | 
				
			||||||
        try:
 | 
					    untracked_files = set(files) - set(tracked_files)
 | 
				
			||||||
            os.getxattr(file, "user.utracked")
 | 
					    for file in untracked_files:
 | 
				
			||||||
        except OSError:
 | 
					 | 
				
			||||||
        track_file(file, base_dir)
 | 
					        track_file(file, base_dir)
 | 
				
			||||||
            untracked_files.append(file)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == "__main__":
 | 
					if __name__ == '__main__':
 | 
				
			||||||
    main()
 | 
					    main()
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue