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