Advertisement
Guest User

Untitled

a guest
May 23rd, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.47 KB | None | 0 0
  1. #!/usr/bin/python3
  2. """
  3. Script for periodical cleaning of log or backup folders.
  4. This script will check for disk space in folderToObserve
  5. and make sure that there's at least minDiskSpaceGB free space
  6. oldest files will be removed first regardless of their folder
  7.  
  8. empty folders are removed, links are not followed
  9.  
  10. the params can be provided in command line like:
  11. diskFreeKeep.py 10 /myFolder1 /otherFolder /asManyULike
  12.  
  13. more folders can be provided, but they must be from same filesystem
  14. """
  15. import os, sys, datetime
  16.  
  17. foldersToObserve = ['/tmp']
  18. minDiskSpaceGB = 1 # gigabytes
  19. minDiskSpace = 1024 * 1024 * 1024;
  20. # if true we print initial content of folder to observe
  21. printContent = True
  22.  
  23.  
  24. def files_to_delete(folders):
  25. files = []
  26. for rootfolder in folders:
  27. files.extend(
  28. os.path.join(dirname, filename)
  29. for dirname, dirnames, filenames in os.walk(rootfolder)
  30. for filename in filenames
  31. )
  32. files.sort(key=getFileTime, reverse=True)
  33. return files
  34.  
  35.  
  36. def getFileTime(file):
  37. return os.lstat(file).st_mtime
  38.  
  39.  
  40. def free_space_up_to(free_bytes_required, rootfolder):
  41. file_list = files_to_delete(rootfolder)
  42. if printContent:
  43. print("files in folder", len(file_list))
  44. print("\n==============");
  45. for file in file_list:
  46. print(datetime.datetime.fromtimestamp(os.lstat(file).st_mtime).isoformat(),
  47. '{:10.3f}'.format(round(os.lstat(file).st_size / 1024 / 1024, 3)),
  48. "MB",
  49. file)
  50. print("==============\n");
  51. rf = os.open(rootfolder[0], os.O_RDONLY)
  52. for fileToRemove in file_list:
  53. try:
  54. statv = os.fstatvfs(rf)
  55. if statv.f_bfree * statv.f_bsize >= free_bytes_required:
  56. print("free space now:", '{:10.3f}'.format(round(statv.f_bfree * statv.f_bsize / 1024 / 1024, 3)), "MB")
  57. print("We have enough space now")
  58. break
  59. print("free space now:", '{:10.3f}'.format(round(statv.f_bfree * statv.f_bsize / 1024 / 1024, 3)), "MB", "removing file", fileToRemove)
  60. os.remove(fileToRemove)
  61. except:
  62. print("Oops!", sys.exc_info()[0], "occured.")
  63.  
  64.  
  65. def setParams(cliParams):
  66. global minDiskSpace, minDiskSpaceGB, foldersToObserve, printContent
  67.  
  68. if len(cliParams) > 1:
  69. if cliParams[1]:
  70. minDiskSpaceGB = float(cliParams[1])
  71.  
  72. if len(cliParams) > 2:
  73. foldersToObserve = cliParams[2:]
  74.  
  75. minDiskSpace = float(minDiskSpaceGB) * 1024 * 1024 * 1024
  76. print("Will free up folder", foldersToObserve, "until there's free", minDiskSpaceGB, "GB")
  77.  
  78.  
  79. def deleteEmptyFolders(folderToDelete, removeRoot=False):
  80. if not removeRoot:
  81. print ("will try to delete empty folders from", folderToDelete)
  82. try:
  83. files = os.listdir(folderToDelete)
  84. if len(files):
  85. for f in files:
  86. fullpath = os.path.join(folderToDelete, f)
  87. if os.path.isdir(fullpath):
  88. deleteEmptyFolders(fullpath, True)
  89. # if folder empty, delete it
  90. files = os.listdir(folderToDelete)
  91. if len(files) == 0 and removeRoot:
  92. print("Removing empty folder:", folderToDelete)
  93. os.rmdir(folderToDelete)
  94. except:
  95. print("error while deleting empty folders", sys.exc_info())
  96.  
  97.  
  98. if __name__ == "__main__":
  99. setParams(sys.argv)
  100. free_space_up_to(minDiskSpace, foldersToObserve)
  101. for folderToDelete in foldersToObserve:
  102. deleteEmptyFolders(folderToDelete)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement