Completed
Push — master ( 168d52...8ea8b2 )
by John
03:05
created

frozen_args()   A

Complexity

Conditions 2

Size

Total Lines 21

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
c 0
b 0
f 0
dl 0
loc 21
rs 9.3142
1
#!/usr/bin/env python3
2
"""Get software release for one/many OS versions."""
3
4
import sys  # load arguments
5
import requests  # session
6
from bbarchivist import networkutils  # lookup
7
from bbarchivist import utilities  # incrementer
8
from bbarchivist import smtputils  # email
9
from bbarchivist import scriptutils  # default parser
10
from bbarchivist import decorators  # Ctrl+C wrapper
11
12
__author__ = "Thurask"
13
__license__ = "WTFPL v2"
14
__copyright__ = "2015-2017 Thurask"
15
16
17
def grab_args():
18
    """
19
    Parse arguments from argparse/questionnaire.
20
21
    Invoke :func:`autolookup.autolookup_main` with those arguments.
22
    """
23
    if len(sys.argv) > 1:
24
        parser = scriptutils.default_parser("bb-autolookup", "Get software releases")
25
        parser.add_argument("os", help="OS version, 10.x.y.zzzz")
26
        parser.add_argument(
27
            "-l", "--loop",
28
            dest="recurse",
29
            help="Loop lookup, CTRL-C to quit",
30
            action="store_true",
31
            default=False)
32
        parser.add_argument(
33
            "-o", "--output",
34
            dest="log",
35
            help="Output to file",
36
            action="store_true",
37
            default=False)
38
        parser.add_argument(
39
            "-a", "--autogen",
40
            dest="autogen",
41
            help="Generate links for availables",
42
            action="store_true",
43
            default=False)
44
        parser.add_argument(
45
            "-q", "--quiet",
46
            dest="quiet",
47
            help="Only print if available (implies -p)",
48
            action="store_true",
49
            default=False)
50
        parser.add_argument(
51
            "-i", "--increment",
52
            dest="increment",
53
            help="Loop increment, default = 3",
54
            default=3,
55
            type=utilities.positive_integer,
56
            metavar="INT")
57
        parser = frozen_args(parser)
58
        parser.add_argument(
59
            "-c", "--ceiling",
60
            dest="ceiling",
61
            help="When to stop script, default = 9996",
62
            default=9996,
63
            type=int,
64
            choices=range(1, 9997),
65
            metavar="INT")
66
        parser.add_argument(
67
            "-p", "--prod-only",
68
            dest="production",
69
            help="Only check production server",
70
            action="store_true",
71
            default=False)
72
        parser.add_argument(
73
            "-n2", "--no-2",
74
            dest="no2",
75
            help="Skip checking Alpha/Beta 2 servers",
76
            action="store_true",
77
            default=False)
78
        args = parser.parse_args(sys.argv[1:])
79
        parser.set_defaults()
80
        execute_args(args)
81
    else:
82
        questionnaire()
83
84
85
def frozen_args(parser):
86
    """
87
    Add args to parser if not frozen.
88
89
    :param parser: Parser to modify.
90
    :type parser: argparse.ArgumentParser
91
    """
92
    if not getattr(sys, 'frozen', False):
93
        parser.add_argument(
94
            "-s", "--sql",
95
            dest="sql",
96
            help="Add valid links to database",
97
            action="store_true",
98
            default=False)
99
        parser.add_argument(
100
            "-e", "--email",
101
            dest="email",
102
            help="Email valid links to self",
103
            action="store_true",
104
            default=False)
105
    return parser
106
107
108
def execute_args(args):
109
    """
110
    Get args and decide what to do with them.
111
112
    :param args: Arguments.
113
    :type args: argparse.Namespace
114
    """
115
    if getattr(sys, 'frozen', False):
116
        args.sql = False
117
        args.email = False
118
    if args.quiet:
119
        args.production = True  # impossible otherwise
120
    autolookup_main(args.os, args.recurse, args.log, args.autogen, args.increment, args.sql, args.quiet, args.ceiling, args.email, args.production, args.no2)
121
122
123
def questionnaire():
124
    """
125
    Questions to ask if no arguments given.
126
    """
127
    osversion = input("OS VERSION: ")
128
    recurse = utilities.s2b(input("LOOP (Y/N)?: "))
129
    if recurse:
130
        print("Press Ctrl+C to stop loop")
131
    print(" ")
132
    autolookup_main(osversion, recurse, True, False, 3, False, False, 9996, False, False)
133
    decorators.enter_to_exit(True)
134
135
136
@decorators.wrap_keyboard_except
137
def autolookup_main(osversion, loop=False, log=False, autogen=False, inc=3, sql=False, quiet=False, ceiling=9996, mailer=False, prod=False, no2=False):
138
    """
139
    Lookup a software release from an OS. Can iterate.
140
141
    :param osversion: OS version, 10.x.y.zzzz.
142
    :type osversion: str
143
144
    :param loop: Whether or not to automatically lookup. Default is false.
145
    :type loop: bool
146
147
    :param log: Whether to log. Default is false.
148
    :type log: bool
149
150
    :param autogen: Whether to create text links. Default is false.
151
    :type autogen: bool
152
153
    :param inc: Lookup increment. Default is 3.
154
    :type inc: int
155
156
    :param sql: Whether to add valid lookups to a database. Default is false.
157
    :type sql: bool
158
159
    :param quiet: Whether to only output if release exists. Default is false.
160
    :type quiet: bool
161
162
    :param ceiling: When to stop loop. Default is 9996 (i.e. 10.x.y.9996).
163
    :type ceiling: int
164
165
    :param mailer: Whether to email new valid links. Default is false.
166
    :type mailer: bool
167
168
    :param prod: Whether to check only the production server. Default is false.
169
    :type prod: bool
170
171
    :param no2: Whether to skip Alpha2/Beta2 servers. Default is false.
172
    :type no2: bool
173
    """
174
    if mailer:
175
        sql = True
176
        smtpc = smtputils.smtp_config_loader()
177
        smtpc = smtputils.smtp_config_generator(smtpc)
178
        smtpc['homepath'] = None
179
        pword = smtpc['password']
180
        smtputils.smtp_config_writer(**smtpc)
181
    else:
182
        pword = None
183
    scriptutils.slim_preamble("AUTOLOOKUP")
184
    record = utilities.prep_logfile() if log else None
185
    sess = requests.Session()
186
    while True:
187
        if loop and int(osversion.split(".")[3]) > ceiling:
188
            raise KeyboardInterrupt
189
        print("NOW SCANNING: {0}".format(osversion), end="\r")
190
        if not prod:
191
            results = networkutils.sr_lookup_bootstrap(osversion, sess, no2)
192
        else:
193
            res = networkutils.sr_lookup(osversion, networkutils.SERVERS["p"], sess)
194
            results = {"p": res, "a1": None, "a2": None, "b1": None, "b2": None}
195
        if results is None:
196
            raise KeyboardInterrupt
197
        a1rel, a1av = networkutils.clean_availability(results, 'a1')
198
        if not no2:
199
            a2rel, a2av = networkutils.clean_availability(results, 'a2')
200
        else:
201
            a2rel = "SR not in system"
202
            a2av = "  "
203
        b1rel, b1av = networkutils.clean_availability(results, 'b1')
204
        b2rel, b2av = networkutils.clean_availability(results, 'b2')
205
        prel, pav, avail = scriptutils.prod_avail(results, mailer, osversion, pword)
206
        avpack = (a1av, a2av, b1av, b2av, pav)
207
        swrelease = scriptutils.clean_swrel(set([a1rel, a2rel, b1rel, b2rel, prel]))
208
        if swrelease != "":
209
            out = scriptutils.autolookup_output(osversion, swrelease, avail, avpack, sql)
210
            scriptutils.autolookup_printer(out, avail, log, quiet, record)
211
        if autogen and avail == "Available":
212
            rad = utilities.increment(osversion, 1)
213
            scriptutils.linkgen(osversion, rad, prel)
214
        if not loop:
215
            raise KeyboardInterrupt  # hack, but whatever
216
        else:
217
            if int(osversion.split(".")[3]) > ceiling:
218
                raise KeyboardInterrupt
219
            else:
220
                osversion = utilities.increment(osversion, inc)
221
                swrelease = ""
222
                continue
223
224
225
if __name__ == "__main__":
226
    grab_args()
227