#!/usr/bin/env python3
#
# SPDX-License-Identifier: GPL-2.0-only
#
# This script can be used to verify HOMEPAGE values for all recipes in
# the current configuration.
# The result is influenced by network environment, since the timeout of connect url is 5 seconds as default.

import sys
import os
import subprocess
import urllib.request


# Allow importing scripts/lib modules
scripts_path = os.path.abspath(os.path.dirname(os.path.realpath(__file__)) + '/..')
lib_path = scripts_path + '/lib'
sys.path = sys.path + [lib_path]
import scriptpath
import scriptutils

# Allow importing bitbake modules
bitbakepath = scriptpath.add_bitbake_lib_path()

import bb.tinfoil

logger = scriptutils.logger_create('verify_homepage')

def wgetHomepage(pn, homepage):
    result = subprocess.call('wget ' + '-q -T 5 -t 1 --spider ' + homepage, shell = True)
    if result:
        logger.warning("%s: failed to verify HOMEPAGE: %s " % (pn, homepage))
        return 1
    else:
        return 0

def verifyHomepage(bbhandler):
    pkg_pn = bbhandler.cooker.recipecaches[''].pkg_pn
    pnlist = sorted(pkg_pn)
    count = 0
    checked = []
    for pn in pnlist:
        for fn in pkg_pn[pn]:
            # There's no point checking multiple BBCLASSEXTENDed variants of the same recipe
            realfn, _, _ = bb.cache.virtualfn2realfn(fn)
            if realfn in checked:
                continue
            data = bbhandler.parse_recipe_file(realfn)
            homepage = data.getVar("HOMEPAGE")
            if homepage:
                try:
                    urllib.request.urlopen(homepage, timeout=5)
                except Exception:
                    count = count + wgetHomepage(os.path.basename(realfn), homepage)
            checked.append(realfn)
    return count

if __name__=='__main__':
    with bb.tinfoil.Tinfoil() as bbhandler:
        bbhandler.prepare()
        logger.info("Start verifying HOMEPAGE:")
        failcount = verifyHomepage(bbhandler)
        logger.info("Finished verifying HOMEPAGE.")
        logger.info("Summary: %s failed" % failcount)
