summaryrefslogtreecommitdiff
path: root/upgrade.py
diff options
context:
space:
mode:
Diffstat (limited to 'upgrade.py')
-rwxr-xr-xupgrade.py243
1 files changed, 139 insertions, 104 deletions
diff --git a/upgrade.py b/upgrade.py
index 9d7cc3540..c00b98f7a 100755
--- a/upgrade.py
+++ b/upgrade.py
@@ -30,11 +30,10 @@ import getopt, os, sys, re, time
# Local
from base.g import *
-from base import utils, tui, module, os_utils
+from base import utils, tui, module, os_utils, password, services, validation
from installer.core_install import *
-
USAGE = [(__doc__, "", "name", True),
("Usage: %s [OPTIONS]" % __mod__, "", "summary", True),
utils.USAGE_SPACE,
@@ -49,17 +48,31 @@ USAGE = [(__doc__, "", "name", True),
("Check only available version:","--check","option",False),
("Non-interactive mode:","-n(Without asking permissions)(future use)","option",False),
("Download Path to install from local system:","-p<path>","option", False),
- ("Download HPLIP package location:","-d<path> (default location ~/.hplip/)","option", False),
+ ("Download HPLIP package location:","-d<path> (default location ~/Downloads)","option", False),
("Override existing HPLIP installation even if latest vesrion is installed:","-o","option",False),
("Take options from the file instead of command line:","-f<file> (future use)","option",False)
]
+mode = INTERACTIVE_MODE
+EXISTING_PACKAGE_PATH=None
+PATH_TO_DOWNLOAD_INSTALLER=os.path.expanduser('~/Downloads')
+FORCE_INSTALL=False
+CHECKING_ONLY=False
+NOTIFY=False
+HPLIP_VERSION_INFO_SOURCEFORGE_SITE ="http://hplip.sourceforge.net/hplip_web.conf"
+HPLIP_WEB_SITE ="http://hplipopensource.com/hplip-web/index.html"
+HPLIP_PACKAGE_SITE = "http://sourceforge.net/projects/hplip/files/hplip"
+IS_QUIET_MODE = False
+DONOT_CLOSE_TERMINAL = False
+CURRENT_WORKING_DIR = ''
+
def hold_terminal():
if DONOT_CLOSE_TERMINAL:
log.info("\n\nPlease close this terminal manually. ")
try:
while 1:
+ raw_input("")
pass
except KeyboardInterrupt:
pass
@@ -75,7 +88,8 @@ def usage(typ='text'):
def clean_exit(code=0, waitTerminal=True):
if not NOTIFY and not CHECKING_ONLY and not IS_QUIET_MODE:
- log.info("Completed..")
+ log.info("")
+ log.info("Done.")
change_spinner_state(True)
mod.unlockInstance()
hold_terminal()
@@ -92,6 +106,7 @@ def parse_HPLIP_version(hplip_version_file, pat):
except IOError:
log.error("Failed to get hplip version since %s file is not found."%hplip_version_file)
return ver
+
data = fp.read()
for line in data.splitlines():
if pat.search(line):
@@ -102,20 +117,75 @@ def parse_HPLIP_version(hplip_version_file, pat):
return ver
-log.set_module(__mod__)
+def get_hplip_version_from_sourceforge():
+ HPLIP_latest_ver="0.0.0"
-mode = INTERACTIVE_MODE
-auto = False
-HPLIP_PATH=None
-TEMP_DIR=prop.user_dir
-FORCE_INSTALL=False
-CHECKING_ONLY=False
-NOTIFY=False
-HPLIP_VERSION_INFO_SITE ="http://hplip.sourceforge.net/hplip_web.conf"
-HPLIP_WEB_SITE ="http://hplipopensource.com/hplip-web/index.html"
-IS_QUIET_MODE = False
-DONOT_CLOSE_TERMINAL = False
-CURRENT_WORKING_DIR = ''
+ # get HPLIP version info from hplip_web.conf file
+ sts, HPLIP_Ver_file = utils.download_from_network(HPLIP_VERSION_INFO_SOURCEFORGE_SITE)
+ if sts is True:
+ hplip_version_conf = ConfigBase(HPLIP_Ver_file)
+ HPLIP_latest_ver = hplip_version_conf.get("HPLIP","Latest_version","0.0.0")
+ os.unlink(HPLIP_Ver_file)
+
+ return HPLIP_latest_ver
+
+
+def get_hplip_version_from_hplipopensource():
+ HPLIP_latest_ver="0.0.0"
+ pat = re.compile(r"""The current version of the HPLIP solution is version (\d{1,}\.\d{1,}\.\d{1,}[a-z]{0,})\. \(.*""")
+ sts, HPLIP_Ver_file = utils.download_from_network(HPLIP_WEB_SITE)
+ if sts is True:
+ HPLIP_latest_ver = parse_HPLIP_version(HPLIP_Ver_file, pat)
+ os.unlink(HPLIP_Ver_file)
+
+ return HPLIP_latest_ver
+
+
+def get_latest_hplip_version():
+ HPLIP_latest_ver = get_hplip_version_from_sourceforge()
+
+ if HPLIP_latest_ver == "0.0.0": ## if failed to connect the sourceforge site, then check HPLIP site.
+ HPLIP_latest_ver = get_hplip_version_from_hplipopensource()
+
+ return HPLIP_latest_ver
+
+
+def digital_signature_fail_confirmation(msg):
+ log.error(log.bold(msg))
+ ok,choice = tui.enter_choice("Do you want continue without Digital Signature verification (y=yes, n=no*):", ['y','n'],'n')
+ if not ok or choice == 'n':
+ return False
+ else:
+ return True
+
+
+def download_hplip_installer(path_to_download, hplip_version):
+ url="%s/%s/hplip-%s.run" %(HPLIP_PACKAGE_SITE, hplip_version, hplip_version)
+ hplip_package = "%s/hplip-%s.run" %(path_to_download, hplip_version)
+
+ log.info("Downloading hplip-%s.run file..... Please wait. "%hplip_version )
+ sts,download_file = utils.download_from_network(url, hplip_package, True)
+ log.info("")
+
+ if not os.path.exists(hplip_package):
+ log.error("Failed to download %s file."%hplip_package)
+ return '',''
+
+ log.info("Downloading hplip-%s.run.asc file..... Please wait. "%hplip_version )
+ hplip_digsig = hplip_package+".asc"
+ url = url +".asc"
+ sts,download_file = utils.download_from_network(url, hplip_digsig)
+ log.info("")
+
+ if not os.path.exists(hplip_digsig):
+ log.error("Failed to download %s file."%hplip_package)
+ return hplip_package, ''
+
+ return hplip_package, hplip_digsig
+
+
+###################### Main ###############
+log.set_module(__mod__)
try:
mod = module.Module(__mod__, __title__, __version__, __doc__, USAGE,
(INTERACTIVE_MODE, GUI_MODE),
@@ -125,8 +195,6 @@ try:
mod.parseStdOpts('hl:gniup:d:of:sw', ['notify','check','help', 'help-rest', 'help-man', 'help-desc', 'interactive', 'gui', 'lang=','logging=', 'debug'],
handle_device_printer=False)
-
-
except getopt.GetoptError, e:
log.error(e.msg)
usage()
@@ -166,10 +234,10 @@ for o, a in opts:
clean_exit(0,False)
elif o == '-p':
- HPLIP_PATH=a
+ EXISTING_PACKAGE_PATH=a
elif o == '-d':
- TEMP_DIR=a
+ PATH_TO_DOWNLOAD_INSTALLER=a
elif o == '-o':
FORCE_INSTALL = True
@@ -219,49 +287,32 @@ try:
core = CoreInstall(MODE_CHECK)
if not utils.check_network_connection():
log.error("Either Internet is not working or Wget is not installed.")
- clean_exit(0)
+ clean_exit(1)
installed_version=sys_conf.get("hplip","version","0.0.0")
log.debug("HPLIP previous installed version =%s." %installed_version)
+ HPLIP_latest_ver = get_latest_hplip_version()
-
- HPLIP_latest_ver="0.0.0"
- # get HPLIP version info from hplip_web.conf file
- sts, HPLIP_Ver_file = utils.download_from_network(HPLIP_VERSION_INFO_SITE)
- if sts is True:
- hplip_version_conf = ConfigBase(HPLIP_Ver_file)
- HPLIP_latest_ver = hplip_version_conf.get("HPLIP","Latest_version","0.0.0")
-
- # get HPLIP version info from hplip site
- if HPLIP_latest_ver == "0.0.0": ## if failed to connect the sourceforge site, then check HPLIP site.
- pat = re.compile(r"""The current version of the HPLIP solution is version (\d{1,}\.\d{1,}\.\d{1,}[a-z]{0,})\. \(.*""")
- sts, HPLIP_Ver_file = utils.download_from_network(HPLIP_WEB_SITE)
- if sts is True:
- HPLIP_latest_ver = parse_HPLIP_version(HPLIP_Ver_file, pat)
-
- os.unlink(HPLIP_Ver_file)
if HPLIP_latest_ver == "0.0.0":
log.error("Failed to get latest version of HPLIP.")
- clean_exit(0)
-
+ clean_exit(1)
+ user_conf.set('upgrade','latest_available_version',HPLIP_latest_ver)
if CHECKING_ONLY is True:
- user_conf.set('upgrade','latest_available_version',HPLIP_latest_ver)
log.debug("Available HPLIP version =%s."%HPLIP_latest_ver)
+
elif NOTIFY is True:
- user_conf.set('upgrade','latest_available_version',HPLIP_latest_ver)
if not utils.Is_HPLIP_older_version(installed_version, HPLIP_latest_ver):
log.debug("Latest version of HPLIP is already installed.")
- else:
+ else:
msg = "Latest version of HPLIP-%s is available."%HPLIP_latest_ver
if core.is_auto_installer_support():
distro_type= 1
else:
distro_type= 2
-
if ui_toolkit == 'qt3':
if not utils.canEnterGUIMode():
log.error("%s requires GUI support. Is Qt3 Installed?.. Exiting." % __mod__)
@@ -274,7 +325,6 @@ try:
log.error("Unable to load Qt3 support. Is it installed? ")
clean_exit(1)
-
# create the main application object
app = QApplication(sys.argv)
QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
@@ -284,7 +334,6 @@ try:
log.debug("Starting GUI loop...")
app.exec_loop()
-
else: #qt4
if not utils.canEnterGUIMode4():
log.error("%s requires GUI support . Is Qt4 installed?.. Exiting." % __mod__)
@@ -300,7 +349,6 @@ try:
app = QApplication(sys.argv)
dialog = UpgradeDialog(None, distro_type, msg)
-
dialog.show()
log.debug("Starting GUI loop...")
app.exec_()
@@ -312,7 +360,7 @@ try:
log.info("Newer version of HPLIP-%s is available."%HPLIP_latest_ver)
ok,choice = tui.enter_choice("Press 'y' to continue to upgrade HPLIP-%s (y=yes*, n=no):"%HPLIP_latest_ver, ['y','n'],'y')
if not ok or choice == 'n':
- log.info("Recommended to install latesr version of HPLIP-%s"%HPLIP_latest_ver)
+ log.info("Recommended to install latest version of HPLIP-%s"%HPLIP_latest_ver)
clean_exit(0, False)
else:
log.info("Latest version of HPLIP is already installed.")
@@ -323,84 +371,71 @@ try:
log.info("Please install HPLIP manually as mentioned in 'http://hplipopensource.com/hplip-web/install/manual/index.html' site")
clean_exit(0)
- # check systray is running?
- status,output = utils.Is_Process_Running('hp-systray')
- if status is True:
- ok,choice = tui.enter_choice("\nSome HPLIP applications are running. Press 'y' to close applications or press 'n' to quit upgrade(y=yes*, n=no):",['y','n'],'y')
- if not ok or choice =='n':
- log.info("Manually close HPLIP applications and run hp-upgrade again.")
- clean_exit(0, False)
-
- try:
- # dBus
- #import dbus
- from dbus import SystemBus, lowlevel
- except ImportError:
- log.error("Unable to load DBus.")
- pass
- else:
- try:
- args = ['', '', EVENT_SYSTEMTRAY_EXIT, prop.username, 0, '', '']
- msg = lowlevel.SignalMessage('/', 'com.hplip.StatusService', 'Event')
- msg.append(signature='ssisiss', *args)
- log.debug("Sending close message to hp-systray ...")
- SystemBus().send_message(msg)
- time.sleep(0.5)
- except:
- log.error("Failed to send DBus message to hp-systray/hp-toolbox.")
- pass
+ if not services.close_running_hp_processes():
+ clean_exit(1)
+ if EXISTING_PACKAGE_PATH:
+ downloaded_file = "%s/hplip-%s.run"%(EXISTING_PACKAGE_PATH, HPLIP_latest_ver)
+ digsig_file = "%s/hplip-%s.run.asc"%(EXISTING_PACKAGE_PATH, HPLIP_latest_ver)
+ PATH_TO_DOWNLOAD_INSTALLER = EXISTING_PACKAGE_PATH
+ else:
+ downloaded_file, digsig_file = download_hplip_installer(PATH_TO_DOWNLOAD_INSTALLER, HPLIP_latest_ver)
- toolbox_status,output = utils.Is_Process_Running('hp-toolbox')
+ PasswordObj = password.Password(INTERACTIVE_MODE)
+ PasswordObj.clearPassword()
+ try:
+ gpg_obj = validation.GPG_Verification()
+ except Exception:
+ digsig_sts = validation.DIGSIG_ERROR_GPG_CMD_NOT_FOUND
+ else:
+ digsig_sts = gpg_obj.validate(downloaded_file, digsig_file, PasswordObj)
- if toolbox_status is True:
- log.error("Failed to close either HP-Toolbox/HP-Systray. Manually close and run hp-upgrade again.")
- clean_exit(0)
+ if digsig_sts != validation.DIGSIG_ERROR_NONE:
+ if digsig_sts in (validation.DIGSIG_ERROR_INCORRECT_PASSWORD, validation.DIGSIG_ERROR_FILE_NOT_FOUND):
+ clean_exit(1)
+ elif digsig_sts == validation.DIGSIG_ERROR_DIGITAL_SIGN_NOT_FOUND:
+ if not digital_signature_fail_confirmation("Digital signature file not found or failed to download. Unable to validate the installer file."):
+ clean_exit(1)
+
+ elif digsig_sts == validation.DIGSIG_ERROR_GPG_CMD_NOT_FOUND:
+ if not digital_signature_fail_confirmation("GPG command not found. Unable to validate the installer file."):
+ clean_exit(1)
+
+ elif digsig_sts in (validation.DIGSIG_ERROR_DIGITAL_SIGN_BAD, validation.DIGSIG_ERROR_UNABLE_TO_RECV_KEYS):
+ if not digital_signature_fail_confirmation("File does not match its digital signature. File may have been corrupted or altered"):
+ clean_exit(1)
- if HPLIP_PATH is not None:
- if os.path.exists(HPLIP_PATH):
- download_file = HPLIP_PATH
else:
- log.error("%s file is not present. Downloading from Net..." %HPLIP_PATH)
- HPLIP_PATH = None
-
- if HPLIP_PATH is None:
- url="http://sourceforge.net/projects/hplip/files/hplip/%s/hplip-%s.run/download" %(HPLIP_latest_ver, HPLIP_latest_ver)
- download_file = None
- if TEMP_DIR:
- download_file = "%s/hplip-%s.run" %(TEMP_DIR,HPLIP_latest_ver)
- log.info("Downloading hplip-%s.run file..... Please wait. "%HPLIP_latest_ver )
- sts,download_file = utils.download_from_network(url, download_file, True)
-
- if not os.path.exists(download_file):
- log.error("Failed to download %s file."%download_file)
- clean_exit()
+ log.error("Failed to validate digital signature. Unknow error: %s"%digsig_sts)
+ clean_exit(1)
+
CURRENT_WORKING_DIR = os.getcwd()
- os.chdir(TEMP_DIR)
+ os.chdir(PATH_TO_DOWNLOAD_INSTALLER)
+
# Installing hplip run.
- cmd = "sh %s" %(download_file)
- log.debug("Upgrading %s" % download_file)
+ cmd = "sh %s" %(downloaded_file)
+ log.debug("Upgrading %s" % downloaded_file)
+
sts = os_utils.execute(cmd)
os.chdir(CURRENT_WORKING_DIR)
- if not NOTIFY and not CHECKING_ONLY:
+
if sts == 0:
log.info(log.bold("Upgrade is Completed."))
else:
- log.info(log.bold("Upgrade Failed or Skipped."))
+ log.info(log.bold("Upgrade Failed or Skipped. status: %s"%sts))
change_spinner_state(True)
mod.unlockInstance()
hold_terminal()
-# log.info("HPLIP upgrade is completed")
except KeyboardInterrupt:
- change_spinner_state(True)
- mod.unlockInstance()
if CURRENT_WORKING_DIR:
os.chdir(CURRENT_WORKING_DIR)
+
if not IS_QUIET_MODE:
log.error("User exit")
- hold_terminal()
+ clean_exit(1)
+