chiark / gitweb /
Switch all headers to python3
[fdroidserver.git] / fdroidserver / verify.py
1 #!/usr/bin/env python3
2 #
3 # verify.py - part of the FDroid server tools
4 # Copyright (C) 2013, Ciaran Gultnieks, ciaran@ciarang.com
5 #
6 # This program is free software: you can redistribute it and/or modify
7 # it under the terms of the GNU Affero General Public License as published by
8 # the Free Software Foundation, either version 3 of the License, or
9 # (at your option) any later version.
10 #
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU Affero General Public License for more details.
15 #
16 # You should have received a copy of the GNU Affero General Public License
17 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
19 import sys
20 import os
21 import glob
22 from argparse import ArgumentParser
23 import logging
24
25 import common
26 import net
27 from common import FDroidException
28
29 options = None
30 config = None
31
32
33 def main():
34
35     global options, config
36
37     # Parse command line...
38     parser = ArgumentParser(usage="%(prog)s [options] [APPID[:VERCODE] [APPID[:VERCODE] ...]]")
39     common.setup_global_opts(parser)
40     parser.add_argument("appid", nargs='*', help="app-id with optional versioncode in the form APPID[:VERCODE]")
41     options = parser.parse_args()
42
43     config = common.read_config(options)
44
45     tmp_dir = 'tmp'
46     if not os.path.isdir(tmp_dir):
47         logging.info("Creating temporary directory")
48         os.makedirs(tmp_dir)
49
50     unsigned_dir = 'unsigned'
51     if not os.path.isdir(unsigned_dir):
52         logging.error("No unsigned directory - nothing to do")
53         sys.exit(0)
54
55     verified = 0
56     notverified = 0
57
58     vercodes = common.read_pkg_args(options.appid, True)
59
60     for apkfile in sorted(glob.glob(os.path.join(unsigned_dir, '*.apk'))):
61
62         apkfilename = os.path.basename(apkfile)
63         appid, vercode = common.apknameinfo(apkfile)
64
65         if vercodes and appid not in vercodes:
66             continue
67         if vercodes[appid] and vercode not in vercodes[appid]:
68             continue
69
70         try:
71
72             logging.info("Processing " + apkfilename)
73
74             remoteapk = os.path.join(tmp_dir, apkfilename)
75             if os.path.exists(remoteapk):
76                 os.remove(remoteapk)
77             url = 'https://f-droid.org/repo/' + apkfilename
78             logging.info("...retrieving " + url)
79             net.download_file(url, dldir=tmp_dir)
80
81             compare_result = common.compare_apks(
82                 os.path.join(unsigned_dir, apkfilename),
83                 remoteapk,
84                 tmp_dir)
85             if compare_result:
86                 raise FDroidException(compare_result)
87
88             logging.info("...successfully verified")
89             verified += 1
90
91         except FDroidException as e:
92             logging.info("...NOT verified - {0}".format(e))
93             notverified += 1
94
95     logging.info("Finished")
96     logging.info("{0} successfully verified".format(verified))
97     logging.info("{0} NOT verified".format(notverified))
98
99 if __name__ == "__main__":
100     main()