98 lines
3.0 KiB
Python
98 lines
3.0 KiB
Python
#!/usr/bin/python
|
|
|
|
import os
|
|
import sys
|
|
import rpm
|
|
import fcntl
|
|
import struct
|
|
import termios
|
|
|
|
from mic import msger
|
|
from mic.utils import runner
|
|
from mic.utils.errors import CreatorError
|
|
|
|
from urlgrabber import grabber
|
|
from urlgrabber import __version__ as grabber_version
|
|
|
|
if rpm.labelCompare(grabber_version.split('.'), '3.9.0'.split('.')) == -1:
|
|
msger.warning("Version of python-urlgrabber is %s, lower than '3.9.0', "
|
|
"you may encounter some network issues" % grabber_version)
|
|
|
|
def myurlgrab(url, filename, proxies, progress_obj = None):
|
|
g = grabber.URLGrabber()
|
|
if progress_obj is None:
|
|
progress_obj = TextProgress()
|
|
|
|
if url.startswith("file:/"):
|
|
filepath = "/%s" % url.replace("file:", "").lstrip('/')
|
|
if not os.path.exists(filepath):
|
|
raise CreatorError("URLGrabber error: can't find file %s" % url)
|
|
if url.endswith('.rpm'):
|
|
return filepath
|
|
else:
|
|
# untouch repometadata in source path
|
|
runner.show(['cp', '-f', filepath, filename])
|
|
|
|
else:
|
|
try:
|
|
filename = g.urlgrab(url=str(url),
|
|
filename=filename,
|
|
ssl_verify_host=False,
|
|
ssl_verify_peer=False,
|
|
proxies=proxies,
|
|
http_headers=(('Pragma', 'no-cache'),),
|
|
quote=0,
|
|
progress_obj=progress_obj)
|
|
except grabber.URLGrabError, err:
|
|
msg = str(err)
|
|
if msg.find(url) < 0:
|
|
msg += ' on %s' % url
|
|
raise CreatorError(msg)
|
|
|
|
return filename
|
|
|
|
def terminal_width(fd=1):
|
|
""" Get the real terminal width """
|
|
try:
|
|
buf = 'abcdefgh'
|
|
buf = fcntl.ioctl(fd, termios.TIOCGWINSZ, buf)
|
|
return struct.unpack('hhhh', buf)[1]
|
|
except: # IOError
|
|
return 80
|
|
|
|
def truncate_url(url, width):
|
|
return os.path.basename(url)[0:width]
|
|
|
|
class TextProgress(object):
|
|
# make the class as singleton
|
|
_instance = None
|
|
def __new__(cls, *args, **kwargs):
|
|
if not cls._instance:
|
|
cls._instance = super(TextProgress, cls).__new__(cls, *args, **kwargs)
|
|
|
|
return cls._instance
|
|
|
|
def __init__(self, totalnum = None):
|
|
self.total = totalnum
|
|
self.counter = 1
|
|
|
|
def start(self, filename, url, *args, **kwargs):
|
|
self.url = url
|
|
self.termwidth = terminal_width()
|
|
msger.info("\r%-*s" % (self.termwidth, " "))
|
|
if self.total is None:
|
|
msger.info("\rRetrieving %s ..." % truncate_url(self.url, self.termwidth - 15))
|
|
else:
|
|
msger.info("\rRetrieving %s [%d/%d] ..." % (truncate_url(self.url, self.termwidth - 25), self.counter, self.total))
|
|
|
|
def update(self, *args):
|
|
pass
|
|
|
|
def end(self, *args):
|
|
if self.counter == self.total:
|
|
msger.raw("\n")
|
|
|
|
if self.total is not None:
|
|
self.counter += 1
|
|
|