]>
git.proxmox.com Git - mirror_edk2.git/blob - BaseTools/Source/Python/UPT/Core/FileHook.py
2 # This file hooks file and directory creation and removal
4 # Copyright (c) 2014 - 2018, Intel Corporation. All rights reserved.<BR>
6 # SPDX-License-Identifier: BSD-2-Clause-Patent
17 from time
import sleep
18 from Library
import GlobalData
20 __built_in_remove__
= os
.remove
21 __built_in_mkdir__
= os
.mkdir
22 __built_in_rmdir__
= os
.rmdir
23 __built_in_chmod__
= os
.chmod
24 __built_in_open__
= open
32 gBACKUPFILE
= 'file.backup'
33 gEXCEPTION_LIST
= ['Conf'+os
.sep
+'DistributionPackageDatabase.db', '.tmp', gBACKUPFILE
]
36 def __init__(self
, action
, path
, mode
=-1):
42 def __init__(self
, workspace
):
45 self
.workspace
= os
.path
.normpath(workspace
)
46 self
.backupfile
= gBACKUPFILE
47 self
.zipfile
= os
.path
.join(self
.workspace
, gBACKUPFILE
)
52 self
.zip = zipfile
.ZipFile(self
.zipfile
, 'w', zipfile
.ZIP_DEFLATED
)
54 def _save(self
, tmp
, path
):
55 if not self
._tryhook
(path
):
57 self
.rlist
.append(_PathInfo(tmp
, path
))
59 def bkrmfile(self
, path
):
60 arc
= self
._tryhook
(path
)
61 if arc
and os
.path
.isfile(path
):
63 self
.zip.write(path
, arc
.encode('utf_8'))
65 oldmode
= stat
.S_IMODE(sta
.st_mode
)
66 self
.rlist
.append(_PathInfo(_CHMOD
, path
, oldmode
))
67 self
.rlist
.append(_PathInfo(_RMFILE
, path
))
68 __built_in_remove__(path
)
70 def bkmkfile(self
, path
, mode
, bufsize
):
71 if not os
.path
.exists(path
):
72 self
._save
(_MKFILE
, path
)
73 return __built_in_open__(path
, mode
, bufsize
)
75 def bkrmdir(self
, path
):
76 if os
.path
.exists(path
):
78 oldmode
= stat
.S_IMODE(sta
.st_mode
)
79 self
.rlist
.append(_PathInfo(_CHMOD
, path
, oldmode
))
80 self
._save
(_RMDIR
, path
)
81 __built_in_rmdir__(path
)
83 def bkmkdir(self
, path
, mode
):
84 if not os
.path
.exists(path
):
85 self
._save
(_MKDIR
, path
)
86 __built_in_mkdir__(path
, mode
)
88 def bkchmod(self
, path
, mode
):
89 if self
._tryhook
(path
) and os
.path
.exists(path
):
91 oldmode
= stat
.S_IMODE(sta
.st_mode
)
92 self
.rlist
.append(_PathInfo(_CHMOD
, path
, oldmode
))
93 __built_in_chmod__(path
, mode
)
99 index
= len(self
.rlist
) - 1
101 item
= self
.rlist
[index
]
102 exist
= os
.path
.exists(item
.path
)
103 if item
.action
== _MKFILE
and exist
:
104 #if not os.access(item.path, os.W_OK):
105 # os.chmod(item.path, S_IWUSR)
106 __built_in_remove__(item
.path
)
107 elif item
.action
== _RMFILE
and not exist
:
109 self
.zip = zipfile
.ZipFile(self
.zipfile
, 'r', zipfile
.ZIP_DEFLATED
)
110 arcname
= os
.path
.normpath(item
.path
)
111 arcname
= arcname
[len(self
.workspace
)+1:].encode('utf_8')
112 if os
.sep
!= "/" and os
.sep
in arcname
:
113 arcname
= arcname
.replace(os
.sep
, '/')
114 mtime
= self
.zip.getinfo(arcname
).date_time
115 content
= self
.zip.read(arcname
)
116 filep
= __built_in_open__(item
.path
, "wb")
119 intime
= time
.mktime(mtime
+ (0, 0, 0))
120 os
.utime(item
.path
, (intime
, intime
))
121 elif item
.action
== _MKDIR
and exist
:
124 __built_in_rmdir__(item
.path
)
127 # Sleep a short time and try again
128 # The anti-virus software may delay the file removal in this directory
130 elif item
.action
== _RMDIR
and not exist
:
131 __built_in_mkdir__(item
.path
)
132 elif item
.action
== _CHMOD
and exist
:
134 __built_in_chmod__(item
.path
, item
.mode
)
135 except EnvironmentError:
143 __built_in_remove__(self
.zipfile
)
145 # Check if path needs to be hooked
146 def _tryhook(self
, path
):
147 path
= os
.path
.normpath(path
)
148 works
= self
.workspace
if str(self
.workspace
).endswith(os
.sep
) else (self
.workspace
+ os
.sep
)
149 if not path
.startswith(works
):
151 for exceptdir
in gEXCEPTION_LIST
:
152 full
= os
.path
.join(self
.workspace
, exceptdir
)
153 if full
== path
or path
.startswith(full
+ os
.sep
) or os
.path
.split(full
)[0] == path
:
155 return path
[len(self
.workspace
)+1:]
158 if GlobalData
.gRECOVERMGR
:
159 GlobalData
.gRECOVERMGR
.bkrmfile(path
)
161 __built_in_remove__(path
)
163 def _hookmkdir(path
, mode
=0o777):
164 if GlobalData
.gRECOVERMGR
:
165 GlobalData
.gRECOVERMGR
.bkmkdir(path
, mode
)
167 __built_in_mkdir__(path
, mode
)
169 def _hookrmdir(path
):
170 if GlobalData
.gRECOVERMGR
:
171 GlobalData
.gRECOVERMGR
.bkrmdir(path
)
173 __built_in_rmdir__(path
)
175 def _hookmkfile(path
, mode
='r', bufsize
=-1):
176 if GlobalData
.gRECOVERMGR
:
177 return GlobalData
.gRECOVERMGR
.bkmkfile(path
, mode
, bufsize
)
178 return __built_in_open__(path
, mode
, bufsize
)
180 def _hookchmod(path
, mode
):
181 if GlobalData
.gRECOVERMGR
:
182 GlobalData
.gRECOVERMGR
.bkchmod(path
, mode
)
184 __built_in_chmod__(path
, mode
)
186 def SetRecoverMgr(mgr
):
187 GlobalData
.gRECOVERMGR
= mgr
190 os
.mkdir
= _hookmkdir
191 os
.rmdir
= _hookrmdir
192 os
.chmod
= _hookchmod
193 __FileHookOpen__
= _hookmkfile