karideo/back/src/tools.py

205 lines
4.4 KiB
Python

#!/usr/bin/python
# -*- coding: utf-8 -*-
##
## @author Edouard DUPIN
##
## @copyright 2012, Edouard DUPIN, all right reserved
##
## @license MPL v2.0 (see license file)
##
import os
import shutil
import errno
import fnmatch
import stat
# Local import
from realog import debug
"""
"""
def get_run_path():
return os.getcwd()
"""
"""
def get_current_path(file):
return os.path.dirname(os.path.realpath(file))
def create_directory_of_file(file):
debug.info("Create directory of path: '" + file + "'")
path = os.path.dirname(file)
debug.info("Create directory: '" + path + "'")
try:
os.stat(path)
except:
os.makedirs(path)
def get_list_sub_path(path):
# TODO : os.listdir(path)
for dirname, dirnames, filenames in os.walk(path):
return dirnames
return []
def remove_path_and_sub_path(path):
if os.path.isdir(path):
debug.verbose("remove path : '" + path + "'")
shutil.rmtree(path)
def remove_file(path):
if os.path.isfile(path):
os.remove(path)
elif os.path.islink(path):
os.remove(path)
def exist(path):
if os.path.isdir(path):
return True
if os.path.isfile(path):
return True
if os.path.islink(path):
return True
return False
def file_size(path):
if not os.path.isfile(path):
return 0
statinfo = os.stat(path)
return statinfo.st_size
def file_read_data(path, binary=False):
debug.verbose("path= " + path)
if not os.path.isfile(path):
return ""
if binary == True:
file = open(path, "rb")
else:
file = open(path, "r")
data_file = file.read()
file.close()
return data_file
def version_to_string(version):
version_ID = ""
for id in version:
if len(version_ID) != 0:
if type(id) == str:
version_ID += "-"
else:
version_ID += "."
version_ID += str(id)
return version_ID
##
## @brief Write data in a specific path.
## @param[in] path Path of the data might be written.
## @param[in] data Data To write in the file.
## @param[in] only_if_new (default: False) Write data only if data is different.
## @return True Something has been copied
## @return False Nothing has been copied
##
def file_write_data(path, data, only_if_new=False):
if only_if_new == True:
if os.path.exists(path) == True:
old_data = file_read_data(path)
if old_data == data:
return False
#real write of data:
create_directory_of_file(path)
file = open(path, "w")
file.write(data)
file.close()
return True
def file_write_data_safe(path, data):
#real write of data:
create_directory_of_file(path)
file = open(path + ".tmp", "w")
file.write(data)
file.close()
shutil.move(path + ".tmp", path)
return True
def file_move(path_src, path_dst):
create_directory_of_file(path_dst)
shutil.move(path_src, path_dst)
return True
def file_copy(path_src, path_dst):
create_directory_of_file(path_dst)
shutil.copyfile(path_src, path_dst)
return True
def list_to_str(list):
if type(list) == type(str()):
return list + " "
else:
result = ""
# mulyiple imput in the list ...
for elem in list:
result += list_to_str(elem)
return result
import hashlib
def str_limit_4(_data):
data = str(_data)
if len(data) >= 4:
return data
if len(data) == 3:
return " " + data
if len(data) == 2:
return " " + data
return " " + data
def int_to_human(_data, _bigger = False):
tera = int(_data/(1024*1024*1024*1024))%1024
giga = int(_data/(1024*1024*1024))%1024
mega = int(_data/(1024*1024))%1024
kilo = int(_data/(1024))%1024
byte = int(_data)%1024
tera_str = str_limit_4(tera)
giga_str = str_limit_4(giga)
mega_str = str_limit_4(mega)
kilo_str = str_limit_4(kilo)
byte_str = str_limit_4(byte)
out = ""
if tera != 0:
out += tera_str + "T"
if _bigger == True:
return out
if giga != 0 or len(out) != 0:
out += giga_str + "G"
if _bigger == True:
return out
if mega != 0 or len(out) != 0:
out += mega_str + "M"
if _bigger == True:
return out
if kilo != 0 or len(out) != 0:
out += kilo_str + "k"
if _bigger == True:
return out
out += byte_str + "B"
return out
def calculate_sha512(_path):
sha1 = hashlib.sha512()
file = open(_path, "rb")
totalsize = os.path.getsize(_path)
current = 0
while True:
body = file.read(10*1024*1024)
if len(body) == 0:
break;
current += len(body)
sha1.update(body)
percent = current/totalsize*100
debug.debug("\r Checking data: {percent:3.0f}% {size} / {total_size}".format(percent=percent, size=int_to_human(current), total_size=int_to_human(totalsize)))
file.close()
return str(sha1.hexdigest())