Statistiques
| Branche: | Tag: | Révision :

dockonsurf / modules / utilities.py @ 78fcb188

Historique | Voir | Annoter | Télécharger (2,82 ko)

1 af3e2441 Carles Marti
import logging
2 78fcb188 Carles Martí
3 af3e2441 Carles Marti
logger = logging.getLogger('DockOnSurf')
4 af3e2441 Carles Marti
5 af3e2441 Carles Marti
6 f8c4eafe Carles
def tail(f, lines=20):
7 f8c4eafe Carles
    total_lines_wanted = lines
8 f8c4eafe Carles
9 f8c4eafe Carles
    block_size = 1024
10 f8c4eafe Carles
    f.seek(0, 2)
11 f8c4eafe Carles
    block_end_byte = f.tell()
12 f8c4eafe Carles
    lines_to_go = total_lines_wanted
13 f8c4eafe Carles
    block_number = -1
14 f8c4eafe Carles
    blocks = []
15 f8c4eafe Carles
    while lines_to_go > 0 and block_end_byte > 0:
16 f8c4eafe Carles
        if block_end_byte - block_size > 0:
17 f8c4eafe Carles
            f.seek(block_number * block_size, 2)
18 f8c4eafe Carles
            blocks.append(f.read(block_size))
19 f8c4eafe Carles
        else:
20 f8c4eafe Carles
            f.seek(0, 0)
21 f8c4eafe Carles
            blocks.append(f.read(block_end_byte))
22 f8c4eafe Carles
        lines_found = blocks[-1].count(b'\n')
23 f8c4eafe Carles
        lines_to_go -= lines_found
24 f8c4eafe Carles
        block_end_byte -= block_size
25 f8c4eafe Carles
        block_number -= 1
26 f8c4eafe Carles
    all_read_text = b''.join(reversed(blocks))
27 f8c4eafe Carles
    return b'\n'.join(all_read_text.splitlines()[-total_lines_wanted:]).decode()
28 69d17e8b Carles
29 69d17e8b Carles
30 69d17e8b Carles
def check_bak(file_name):
31 69d17e8b Carles
    """Checks if a file already exists and backs it up if so.
32 69d17e8b Carles
    @param file_name: file to be checked if exists
33 69d17e8b Carles
    """
34 69d17e8b Carles
    import os
35 69d17e8b Carles
    new_name = file_name
36 69d17e8b Carles
    bak_num = 0
37 69d17e8b Carles
    while os.path.isdir(new_name) or os.path.isfile(new_name):
38 69d17e8b Carles
        bak_num += 1
39 69d17e8b Carles
        new_name = new_name.split(".bak")[0] + f".bak{bak_num}"
40 69d17e8b Carles
    if bak_num > 0:
41 69d17e8b Carles
        os.rename(file_name, new_name)
42 69d17e8b Carles
        logger.warning(f"'{file_name}' already present. Backed it up to "
43 695dcff8 Carles Marti
                       f"{new_name}.")
44 69d17e8b Carles
45 69d17e8b Carles
46 69d17e8b Carles
def try_command(command, expct_error_types: list, *args, **kwargs):
47 69d17e8b Carles
    """Try to run a command and record exceptions (expected and not) on a log.
48 69d17e8b Carles

49 69d17e8b Carles
    @param command: method or function, the command to be executed.
50 42fed021 Carles Marti
    @param expct_error_types: list of tuples, every inner tuple is supposed to
51 69d17e8b Carles
    contain an exception type (eg. ValueError, TypeError, etc.) to be caught and
52 69d17e8b Carles
    a message to print in the log and on the screen explaining the exception.
53 69d17e8b Carles
    Error types that are not allow to be called with a custom message as only
54 69d17e8b Carles
    error argument are not supported.
55 69d17e8b Carles
    The outer tuple encloses all couples of error types and their relative
56 69d17e8b Carles
    messages.
57 69d17e8b Carles
    *args and **kwargs: arguments and keyword-arguments of the command to be
58 69d17e8b Carles
    executed.
59 69d17e8b Carles
    When trying to run 'command' with its args and kwargs, if an exception
60 69d17e8b Carles
    present on the 'error_types' occurs, its relative error message is recorded
61 69d17e8b Carles
    on the log and a same type exception is raised with the custom message.
62 69d17e8b Carles
    """
63 af3e2441 Carles Marti
    unexp_error = "An unexpected error occurred"
64 69d17e8b Carles
65 69d17e8b Carles
    err = False
66 69d17e8b Carles
    try:
67 69d17e8b Carles
        return_val = command(*args, **kwargs)
68 69d17e8b Carles
    except Exception as e:
69 69d17e8b Carles
        for expct_err in expct_error_types:
70 69d17e8b Carles
            if isinstance(e, expct_err[0]):
71 69d17e8b Carles
                logger.error(expct_err[1])
72 69d17e8b Carles
                err = expct_err[0](expct_err[1])
73 69d17e8b Carles
                break
74 69d17e8b Carles
        else:
75 69d17e8b Carles
            logger.exception(unexp_error)
76 69d17e8b Carles
            err = e
77 69d17e8b Carles
    else:
78 69d17e8b Carles
        err = False
79 69d17e8b Carles
        return return_val
80 69d17e8b Carles
    finally:
81 69d17e8b Carles
        if isinstance(err, BaseException):
82 78fcb188 Carles Martí
            raise err