[tests] adapt events tests to recent changes
[leap_pycommon.git] / src / leap / common / files.py
1 # -*- coding: utf-8 -*-
2 # files.py
3 # Copyright (C) 2013 LEAP
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License as published by
7 # the Free Software Foundation, either version 3 of the License, or
8 # (at your option) any later version.
9 #
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 # GNU General Public License for more details.
14 #
15 # You should have received a copy of the GNU General Public License
16 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 """
18 Implements file helper methods
19 """
20
21 import errno
22 import logging
23 import os
24 import stat
25 import time
26
27 logger = logging.getLogger(__name__)
28
29
30 def check_and_fix_urw_only(cert):
31     """
32     Test for 600 mode and try to set it if anything different found
33
34     Might raise OSError
35
36     :param cert: Certificate path
37     :type cert: str
38     """
39     mode = stat.S_IMODE(os.stat(cert).st_mode)
40
41     if mode != int('600', 8):
42         try:
43             logger.warning('Bad permission on %s attempting to set 600' %
44                            (cert,))
45             os.chmod(cert, stat.S_IRUSR | stat.S_IWUSR)
46         except OSError:
47             logger.error('Error while trying to chmod 600 %s' %
48                          cert)
49             raise
50
51
52 def get_mtime(filename):
53     """
54     Returns the modified time or None if the file doesn't exist
55
56     :param filename: path to check
57     :type filename: str
58
59     :rtype: str
60     """
61     try:
62         mtime = time.ctime(os.path.getmtime(filename)) + " GMT"
63         return mtime
64     except OSError:
65         return None
66
67
68 def mkdir_p(path):
69     """
70     Creates the path and all the intermediate directories that don't
71     exist
72
73     Might raise OSError
74
75     :param path: path to create
76     :type path: str
77     """
78     try:
79         os.makedirs(path)
80     except OSError as exc:
81         if exc.errno == errno.EEXIST and os.path.isdir(path):
82             pass
83         else:
84             raise
85
86
87 # Twisted implementation of which
88 def which(name, flags=os.X_OK, path_extension="/usr/sbin:/sbin"):
89     """
90     Search PATH for executable files with the given name.
91
92     On newer versions of MS-Windows, the PATHEXT environment variable will be
93     set to the list of file extensions for files considered executable. This
94     will normally include things like ".EXE". This fuction will also find files
95     with the given name ending with any of these extensions.
96
97     On MS-Windows the only flag that has any meaning is os.F_OK. Any other
98     flags will be ignored.
99
100     :type name: C{str}
101     :param name: The name for which to search.
102
103     :type flags: C{int}
104     :param flags: Arguments to L{os.access}.
105
106     :rtype: C{list}
107     :param: A list of the full paths to files found, in the
108     order in which they were found.
109     """
110
111     result = []
112     exts = filter(None, os.environ.get('PATHEXT', '').split(os.pathsep))
113     path = os.environ.get('PATH', None)
114     path = path_extension + os.pathsep + path
115     if path is None:
116         return []
117     parts = path.split(os.pathsep)
118     for p in parts:
119         p = os.path.join(p, name)
120         if os.access(p, flags):
121             result.append(p)
122         for e in exts:
123             pext = p + e
124             if os.access(pext, flags):
125                 result.append(pext)
126     return result