Commit a6dacf46 authored by Marco Mariani's avatar Marco Mariani

cli: moved the rest of cache.py under cli/, do not pass configp around

parent 204b6a99
# -*- coding: utf-8 -*-
import ast
import hashlib
import json
import re
import requests
import sys
import prettytable
from slapos.grid import networkcache
from slapos.grid.distribution import patched_linux_distribution
def looks_like_md5(s):
"""
Return True if the parameter looks like an hashed value.
Not 100% precise, but we're actually more interested in filtering out URLs and pathnames.
"""
return re.match('[0-9a-f]{32}', s)
def do_lookup(logger, configp, software_url):
cache_dir = configp.get('networkcache', 'download-binary-dir-url')
if looks_like_md5(software_url):
md5 = software_url
else:
md5 = hashlib.md5(software_url).hexdigest()
try:
url = '%s/%s' % (cache_dir, md5)
logger.debug('Connecting to %s', url)
req = requests.get(url, timeout=5)
except (requests.Timeout, requests.ConnectionError):
logger.critical('Cannot connect to cache server at %s', url)
sys.exit(10)
if not req.ok:
if req.status_code == 404:
logger.critical('Object not in cache: %s', software_url)
else:
logger.critical('Error while looking object %s: %s', software_url, req.reason)
sys.exit(10)
entries = req.json()
if not entries:
logger.info('Object found in cache, but has no binary entries.')
return
ostable = sorted(ast.literal_eval(json.loads(entry[0])['os']) for entry in entries)
pt = prettytable.PrettyTable(['distribution', 'version', 'id', 'compatible?'])
linux_distribution = patched_linux_distribution()
for os in ostable:
compatible = 'yes' if networkcache.os_matches(os, linux_distribution) else 'no'
pt.add_row([os[0], os[1], os[2], compatible])
meta = json.loads(entries[0][0])
logger.info('Software URL: %s', meta['software_url'])
logger.info('MD5: %s', md5)
for line in pt.get_string(border=True, padding_width=0, vrules=prettytable.NONE).split('\n'):
logger.info(line)
# -*- coding: utf-8 -*-
import ast
import hashlib
import json
import re
import requests
import sys
import prettytable
from slapos.grid import networkcache
from slapos.grid.distribution import patched_linux_distribution
from slapos.cli.config import ConfigCommand
from slapos.cache import do_lookup
class CacheLookupCommand(ConfigCommand):
......@@ -23,4 +33,58 @@ class CacheLookupCommand(ConfigCommand):
def take_action(self, args):
configp = self.fetch_config(args)
do_lookup(self.app.log, configp, args.software_url)
cache_dir = configp.get('networkcache', 'download-binary-dir-url')
do_lookup(self.app.log, cache_dir, args.software_url)
def looks_like_md5(s):
"""
Return True if the parameter looks like an hashed value.
Not 100% precise, but we're actually more interested in filtering out URLs and pathnames.
"""
return re.match('[0-9a-f]{32}', s)
def do_lookup(logger, cache_dir, software_url):
if looks_like_md5(software_url):
md5 = software_url
else:
md5 = hashlib.md5(software_url).hexdigest()
try:
url = '%s/%s' % (cache_dir, md5)
logger.debug('Connecting to %s', url)
req = requests.get(url, timeout=5)
except (requests.Timeout, requests.ConnectionError):
logger.critical('Cannot connect to cache server at %s', url)
sys.exit(10)
if not req.ok:
if req.status_code == 404:
logger.critical('Object not in cache: %s', software_url)
else:
logger.critical('Error while looking object %s: %s', software_url, req.reason)
sys.exit(10)
entries = req.json()
if not entries:
logger.info('Object found in cache, but has no binary entries.')
return
ostable = sorted(ast.literal_eval(json.loads(entry[0])['os']) for entry in entries)
pt = prettytable.PrettyTable(['distribution', 'version', 'id', 'compatible?'])
linux_distribution = patched_linux_distribution()
for os in ostable:
compatible = 'yes' if networkcache.os_matches(os, linux_distribution) else 'no'
pt.add_row([os[0], os[1], os[2], compatible])
meta = json.loads(entries[0][0])
logger.info('Software URL: %s', meta['software_url'])
logger.info('MD5: %s', md5)
for line in pt.get_string(border=True, padding_width=0, vrules=prettytable.NONE).split('\n'):
logger.info(line)
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment