~ubuntu-branches/debian/sid/hplip/sid

« back to all changes in this revision

Viewing changes to upgrade.py

  • Committer: Package Import Robot
  • Author(s): Mark Purcell, Till Kamppeter, Mark Purcell
  • Date: 2014-01-19 13:56:10 UTC
  • mfrom: (1.7.5)
  • Revision ID: package-import@ubuntu.com-20140119135610-7vvsrfbm2vfj0u1s
Tags: 3.14.1-1
* New upstream release 
  - CVE-2013-6427: hplip: insecure auto update feature
  - CVE-2013-6402: hplip: insecure temporary file handling in pkit.py

[ Till Kamppeter ]
* debian/control: Changed Depends/Recommends on foomatic-filters to
  "cups-filters (>= 1.0.42) | foomatic-filters" as foomatic-rip has
  moved to cups-filters from version 1.0.42 on (Closes: #734140).

[ Mark Purcell ]
* Ack NMU - thanks ~carnil
* Drop CVE-2013-6402.patch - addressed upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
 
31
31
# Local
32
32
from base.g import *
33
 
from base import utils, tui, module, os_utils
 
33
from base import utils, tui, module, os_utils, password, services, validation
34
34
from installer.core_install import *
35
35
 
36
36
 
37
 
 
38
37
USAGE = [(__doc__, "", "name", True),
39
38
         ("Usage: %s [OPTIONS]" % __mod__, "", "summary", True),
40
39
         utils.USAGE_SPACE,
49
48
         ("Check only available version:","--check","option",False),
50
49
         ("Non-interactive mode:","-n(Without asking permissions)(future use)","option",False),
51
50
         ("Download Path to install from local system:","-p<path>","option", False),
52
 
         ("Download HPLIP package location:","-d<path> (default location ~/.hplip/)","option", False),
 
51
         ("Download HPLIP package location:","-d<path> (default location ~/Downloads)","option", False),
53
52
         ("Override existing HPLIP installation even if latest vesrion is installed:","-o","option",False),
54
53
         ("Take options from the file instead of command line:","-f<file> (future use)","option",False)
55
54
        ]
56
55
 
 
56
mode = INTERACTIVE_MODE
 
57
EXISTING_PACKAGE_PATH=None
 
58
PATH_TO_DOWNLOAD_INSTALLER=os.path.expanduser('~/Downloads')
 
59
FORCE_INSTALL=False
 
60
CHECKING_ONLY=False
 
61
NOTIFY=False
 
62
HPLIP_VERSION_INFO_SOURCEFORGE_SITE ="http://hplip.sourceforge.net/hplip_web.conf"
 
63
HPLIP_WEB_SITE ="http://hplipopensource.com/hplip-web/index.html"
 
64
HPLIP_PACKAGE_SITE = "http://sourceforge.net/projects/hplip/files/hplip"
 
65
IS_QUIET_MODE = False
 
66
DONOT_CLOSE_TERMINAL = False
 
67
CURRENT_WORKING_DIR = ''
 
68
 
57
69
 
58
70
def hold_terminal():
59
71
    if DONOT_CLOSE_TERMINAL:
60
72
        log.info("\n\nPlease close this terminal manually. ")
61
73
        try:
62
74
            while 1:
 
75
                raw_input("")
63
76
                pass
64
77
        except KeyboardInterrupt:
65
78
            pass
75
88
 
76
89
def clean_exit(code=0, waitTerminal=True):
77
90
    if not NOTIFY and not CHECKING_ONLY and not IS_QUIET_MODE:
78
 
        log.info("Completed..")
 
91
        log.info("")
 
92
        log.info("Done.")
79
93
    change_spinner_state(True)
80
94
    mod.unlockInstance()
81
95
    hold_terminal()
92
106
    except IOError:
93
107
        log.error("Failed to get hplip version since %s file is not found."%hplip_version_file)
94
108
        return ver
 
109
 
95
110
    data = fp.read()
96
111
    for line in data.splitlines():
97
112
        if pat.search(line):
102
117
    return ver
103
118
 
104
119
 
 
120
def get_hplip_version_from_sourceforge():
 
121
    HPLIP_latest_ver="0.0.0"
 
122
 
 
123
    # get HPLIP version info from hplip_web.conf file
 
124
    sts, HPLIP_Ver_file = utils.download_from_network(HPLIP_VERSION_INFO_SOURCEFORGE_SITE)
 
125
    if sts is True:
 
126
        hplip_version_conf = ConfigBase(HPLIP_Ver_file)
 
127
        HPLIP_latest_ver = hplip_version_conf.get("HPLIP","Latest_version","0.0.0")
 
128
        os.unlink(HPLIP_Ver_file)
 
129
 
 
130
    return HPLIP_latest_ver
 
131
 
 
132
 
 
133
def get_hplip_version_from_hplipopensource():
 
134
    HPLIP_latest_ver="0.0.0"
 
135
    pat = re.compile(r"""The current version of the HPLIP solution is version (\d{1,}\.\d{1,}\.\d{1,}[a-z]{0,})\. \(.*""")
 
136
    sts, HPLIP_Ver_file = utils.download_from_network(HPLIP_WEB_SITE)
 
137
    if sts is True:
 
138
        HPLIP_latest_ver = parse_HPLIP_version(HPLIP_Ver_file, pat)
 
139
        os.unlink(HPLIP_Ver_file)
 
140
 
 
141
    return HPLIP_latest_ver
 
142
 
 
143
 
 
144
def get_latest_hplip_version():
 
145
    HPLIP_latest_ver = get_hplip_version_from_sourceforge()
 
146
 
 
147
    if HPLIP_latest_ver == "0.0.0":     ## if failed to connect the sourceforge site, then check HPLIP site.
 
148
        HPLIP_latest_ver = get_hplip_version_from_hplipopensource()
 
149
                           
 
150
    return HPLIP_latest_ver
 
151
 
 
152
 
 
153
def digital_signature_fail_confirmation(msg):
 
154
    log.error(log.bold(msg))
 
155
    ok,choice = tui.enter_choice("Do you want continue without Digital Signature verification (y=yes, n=no*):", ['y','n'],'n')
 
156
    if not ok or choice == 'n':
 
157
       return False
 
158
    else:
 
159
        return True
 
160
 
 
161
 
 
162
def download_hplip_installer(path_to_download, hplip_version):
 
163
    url="%s/%s/hplip-%s.run" %(HPLIP_PACKAGE_SITE, hplip_version, hplip_version)
 
164
    hplip_package = "%s/hplip-%s.run" %(path_to_download, hplip_version)
 
165
 
 
166
    log.info("Downloading hplip-%s.run file..... Please wait. "%hplip_version )
 
167
    sts,download_file = utils.download_from_network(url, hplip_package, True)
 
168
    log.info("")
 
169
 
 
170
    if not os.path.exists(hplip_package):
 
171
        log.error("Failed to download %s file."%hplip_package)
 
172
        return '',''
 
173
 
 
174
    log.info("Downloading hplip-%s.run.asc file..... Please wait. "%hplip_version )
 
175
    hplip_digsig =  hplip_package+".asc"
 
176
    url = url +".asc"
 
177
    sts,download_file = utils.download_from_network(url, hplip_digsig)
 
178
    log.info("")
 
179
 
 
180
    if not os.path.exists(hplip_digsig):
 
181
        log.error("Failed to download %s file."%hplip_package)
 
182
        return hplip_package, ''
 
183
 
 
184
    return hplip_package, hplip_digsig
 
185
 
 
186
 
 
187
###################### Main ###############
105
188
log.set_module(__mod__)
106
 
 
107
 
mode = INTERACTIVE_MODE
108
 
auto = False
109
 
HPLIP_PATH=None
110
 
TEMP_DIR=prop.user_dir
111
 
FORCE_INSTALL=False
112
 
CHECKING_ONLY=False
113
 
NOTIFY=False
114
 
HPLIP_VERSION_INFO_SITE ="http://hplip.sourceforge.net/hplip_web.conf"
115
 
HPLIP_WEB_SITE ="http://hplipopensource.com/hplip-web/index.html"
116
 
IS_QUIET_MODE = False
117
 
DONOT_CLOSE_TERMINAL = False
118
 
CURRENT_WORKING_DIR = ''
119
189
try:
120
190
    mod = module.Module(__mod__, __title__, __version__, __doc__, USAGE,
121
191
                    (INTERACTIVE_MODE, GUI_MODE),
125
195
               mod.parseStdOpts('hl:gniup:d:of:sw', ['notify','check','help', 'help-rest', 'help-man', 'help-desc', 'interactive', 'gui', 'lang=','logging=', 'debug'],
126
196
                     handle_device_printer=False)
127
197
 
128
 
 
129
 
 
130
198
except getopt.GetoptError, e:
131
199
    log.error(e.msg)
132
200
    usage()
166
234
        clean_exit(0,False)
167
235
 
168
236
    elif o == '-p':
169
 
        HPLIP_PATH=a
 
237
        EXISTING_PACKAGE_PATH=a
170
238
 
171
239
    elif o == '-d':
172
 
        TEMP_DIR=a
 
240
        PATH_TO_DOWNLOAD_INSTALLER=a
173
241
 
174
242
    elif o == '-o':
175
243
        FORCE_INSTALL = True
219
287
    core =  CoreInstall(MODE_CHECK)
220
288
    if not utils.check_network_connection():
221
289
        log.error("Either Internet is not working or Wget is not installed.")
222
 
        clean_exit(0)
 
290
        clean_exit(1)
223
291
 
224
292
    installed_version=sys_conf.get("hplip","version","0.0.0")
225
293
    log.debug("HPLIP previous installed version =%s." %installed_version)
226
294
 
227
 
 
228
 
 
229
 
    HPLIP_latest_ver="0.0.0"
230
 
    # get HPLIP version info from hplip_web.conf file
231
 
    sts, HPLIP_Ver_file = utils.download_from_network(HPLIP_VERSION_INFO_SITE)
232
 
    if sts is True:
233
 
        hplip_version_conf = ConfigBase(HPLIP_Ver_file)
234
 
        HPLIP_latest_ver = hplip_version_conf.get("HPLIP","Latest_version","0.0.0")
235
 
 
236
 
    # get HPLIP version info from hplip site
237
 
    if HPLIP_latest_ver == "0.0.0":     ## if failed to connect the sourceforge site, then check HPLIP site.
238
 
        pat = re.compile(r"""The current version of the HPLIP solution is version (\d{1,}\.\d{1,}\.\d{1,}[a-z]{0,})\. \(.*""")
239
 
        sts, HPLIP_Ver_file = utils.download_from_network(HPLIP_WEB_SITE)
240
 
        if sts is True:
241
 
            HPLIP_latest_ver = parse_HPLIP_version(HPLIP_Ver_file, pat)
242
 
 
243
 
    os.unlink(HPLIP_Ver_file)
 
295
    HPLIP_latest_ver = get_latest_hplip_version()
 
296
 
244
297
    if HPLIP_latest_ver == "0.0.0":
245
298
        log.error("Failed to get latest version of HPLIP.")
246
 
        clean_exit(0)
247
 
 
248
 
 
 
299
        clean_exit(1)
 
300
 
 
301
    user_conf.set('upgrade','latest_available_version',HPLIP_latest_ver)
249
302
    if CHECKING_ONLY is True:
250
 
        user_conf.set('upgrade','latest_available_version',HPLIP_latest_ver)
251
303
        log.debug("Available HPLIP version =%s."%HPLIP_latest_ver)
 
304
 
252
305
    elif NOTIFY is True:
253
 
        user_conf.set('upgrade','latest_available_version',HPLIP_latest_ver)
254
306
        if not utils.Is_HPLIP_older_version(installed_version, HPLIP_latest_ver):
255
307
            log.debug("Latest version of HPLIP is already installed.")
 
308
 
256
309
        else:
257
 
 
258
310
            msg = "Latest version of HPLIP-%s is available."%HPLIP_latest_ver
259
311
            if core.is_auto_installer_support():
260
312
                distro_type= 1
261
313
            else:
262
314
                distro_type= 2
263
315
 
264
 
 
265
316
            if ui_toolkit == 'qt3':
266
317
                if not utils.canEnterGUIMode():
267
318
                    log.error("%s requires GUI support. Is Qt3 Installed?.. Exiting." % __mod__)
274
325
                    log.error("Unable to load Qt3 support. Is it installed? ")
275
326
                    clean_exit(1)
276
327
 
277
 
 
278
328
                # create the main application object
279
329
                app = QApplication(sys.argv)
280
330
                QObject.connect(app, SIGNAL("lastWindowClosed()"), app, SLOT("quit()"))
284
334
                log.debug("Starting GUI loop...")
285
335
                app.exec_loop()
286
336
 
287
 
 
288
337
            else: #qt4
289
338
                if not utils.canEnterGUIMode4():
290
339
                    log.error("%s requires GUI support . Is Qt4 installed?.. Exiting." % __mod__)
300
349
                app = QApplication(sys.argv)
301
350
                dialog = UpgradeDialog(None, distro_type, msg)
302
351
 
303
 
 
304
352
                dialog.show()
305
353
                log.debug("Starting GUI loop...")
306
354
                app.exec_()
312
360
                    log.info("Newer version of HPLIP-%s is available."%HPLIP_latest_ver)
313
361
                ok,choice = tui.enter_choice("Press 'y' to continue to upgrade HPLIP-%s (y=yes*, n=no):"%HPLIP_latest_ver, ['y','n'],'y')
314
362
                if not ok or choice == 'n':
315
 
                    log.info("Recommended to install latesr version of HPLIP-%s"%HPLIP_latest_ver)
 
363
                    log.info("Recommended to install latest version of HPLIP-%s"%HPLIP_latest_ver)
316
364
                    clean_exit(0, False)
317
365
            else:
318
366
                log.info("Latest version of HPLIP is already installed.")
323
371
            log.info("Please install HPLIP manually as mentioned in 'http://hplipopensource.com/hplip-web/install/manual/index.html' site")
324
372
            clean_exit(0)
325
373
 
326
 
        # check systray is running?
327
 
        status,output = utils.Is_Process_Running('hp-systray')
328
 
        if status is True:
329
 
            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')
330
 
            if not ok or choice =='n':
331
 
                log.info("Manually close HPLIP applications and run hp-upgrade again.")
332
 
                clean_exit(0, False)
333
 
 
334
 
            try:
335
 
            # dBus
336
 
            #import dbus
337
 
                from dbus import SystemBus, lowlevel
338
 
            except ImportError:
339
 
                log.error("Unable to load DBus.")
340
 
                pass
341
 
            else:
342
 
                try:
343
 
                    args = ['', '', EVENT_SYSTEMTRAY_EXIT, prop.username, 0, '', '']
344
 
                    msg = lowlevel.SignalMessage('/', 'com.hplip.StatusService', 'Event')
345
 
                    msg.append(signature='ssisiss', *args)
346
 
                    log.debug("Sending close message to hp-systray ...")
347
 
                    SystemBus().send_message(msg)
348
 
                    time.sleep(0.5)
349
 
                except:
350
 
                    log.error("Failed to send DBus message to hp-systray/hp-toolbox.")
351
 
                    pass
352
 
 
353
 
 
354
 
        toolbox_status,output = utils.Is_Process_Running('hp-toolbox')
355
 
 
356
 
        if toolbox_status is True:
357
 
            log.error("Failed to close either HP-Toolbox/HP-Systray. Manually close and run hp-upgrade again.")
358
 
            clean_exit(0)
359
 
 
360
 
 
361
 
        if HPLIP_PATH is not None:
362
 
            if os.path.exists(HPLIP_PATH):
363
 
                download_file = HPLIP_PATH
364
 
            else:
365
 
                log.error("%s file is not present. Downloading from Net..." %HPLIP_PATH)
366
 
                HPLIP_PATH = None
367
 
 
368
 
        if HPLIP_PATH is None:
369
 
            url="http://sourceforge.net/projects/hplip/files/hplip/%s/hplip-%s.run/download" %(HPLIP_latest_ver, HPLIP_latest_ver)
370
 
            download_file = None
371
 
            if TEMP_DIR:
372
 
                download_file = "%s/hplip-%s.run" %(TEMP_DIR,HPLIP_latest_ver)
373
 
            log.info("Downloading hplip-%s.run file..... Please wait. "%HPLIP_latest_ver )
374
 
            sts,download_file = utils.download_from_network(url, download_file, True)
375
 
 
376
 
            if not os.path.exists(download_file):
377
 
                log.error("Failed to download %s file."%download_file)
378
 
                clean_exit()
 
374
        if not services.close_running_hp_processes():
 
375
            clean_exit(1)
 
376
 
 
377
        if EXISTING_PACKAGE_PATH:
 
378
            downloaded_file = "%s/hplip-%s.run"%(EXISTING_PACKAGE_PATH, HPLIP_latest_ver)
 
379
            digsig_file = "%s/hplip-%s.run.asc"%(EXISTING_PACKAGE_PATH, HPLIP_latest_ver)
 
380
            PATH_TO_DOWNLOAD_INSTALLER = EXISTING_PACKAGE_PATH
 
381
        else:
 
382
            downloaded_file, digsig_file = download_hplip_installer(PATH_TO_DOWNLOAD_INSTALLER, HPLIP_latest_ver)
 
383
 
 
384
        PasswordObj = password.Password(INTERACTIVE_MODE)
 
385
        PasswordObj.clearPassword()
 
386
        try:
 
387
            gpg_obj = validation.GPG_Verification()
 
388
        except Exception:
 
389
            digsig_sts = validation.DIGSIG_ERROR_GPG_CMD_NOT_FOUND
 
390
        else:
 
391
            digsig_sts = gpg_obj.validate(downloaded_file, digsig_file, PasswordObj)
 
392
 
 
393
        if digsig_sts != validation.DIGSIG_ERROR_NONE:
 
394
            if digsig_sts in (validation.DIGSIG_ERROR_INCORRECT_PASSWORD, validation.DIGSIG_ERROR_FILE_NOT_FOUND):
 
395
                clean_exit(1)
 
396
 
 
397
            elif digsig_sts == validation.DIGSIG_ERROR_DIGITAL_SIGN_NOT_FOUND:
 
398
                if not digital_signature_fail_confirmation("Digital signature file not found or failed to download. Unable to validate the installer file."):
 
399
                    clean_exit(1)
 
400
 
 
401
            elif digsig_sts == validation.DIGSIG_ERROR_GPG_CMD_NOT_FOUND:
 
402
                if not digital_signature_fail_confirmation("GPG command not found. Unable to validate the installer file."):
 
403
                    clean_exit(1)
 
404
 
 
405
            elif digsig_sts in (validation.DIGSIG_ERROR_DIGITAL_SIGN_BAD, validation.DIGSIG_ERROR_UNABLE_TO_RECV_KEYS):
 
406
                if not digital_signature_fail_confirmation("File does not match its digital signature. File may have been corrupted or altered"):
 
407
                    clean_exit(1)
 
408
 
 
409
            else:
 
410
                log.error("Failed to validate digital signature. Unknow error: %s"%digsig_sts)
 
411
                clean_exit(1)
 
412
 
379
413
        CURRENT_WORKING_DIR = os.getcwd()
380
 
        os.chdir(TEMP_DIR)
 
414
        os.chdir(PATH_TO_DOWNLOAD_INSTALLER)
 
415
 
381
416
        # Installing hplip run.
382
 
        cmd = "sh %s" %(download_file)
383
 
        log.debug("Upgrading  %s" % download_file)
 
417
        cmd = "sh %s" %(downloaded_file)
 
418
        log.debug("Upgrading  %s" % downloaded_file)
 
419
 
384
420
        sts = os_utils.execute(cmd)
385
421
        os.chdir(CURRENT_WORKING_DIR)
386
 
    if not NOTIFY and not CHECKING_ONLY:
 
422
 
387
423
        if sts == 0:
388
424
            log.info(log.bold("Upgrade is Completed."))
389
425
        else:
390
 
            log.info(log.bold("Upgrade Failed or Skipped."))
 
426
            log.info(log.bold("Upgrade Failed or Skipped. status: %s"%sts))
391
427
 
392
428
    change_spinner_state(True)
393
429
    mod.unlockInstance()
394
430
    hold_terminal()
395
431
 
396
 
#    log.info("HPLIP upgrade is completed")
397
432
except KeyboardInterrupt:
398
 
    change_spinner_state(True)
399
 
    mod.unlockInstance()
400
433
    if CURRENT_WORKING_DIR:
401
434
        os.chdir(CURRENT_WORKING_DIR)
 
435
 
402
436
    if not IS_QUIET_MODE:
403
437
        log.error("User exit")
404
438
 
405
 
    hold_terminal()
 
439
    clean_exit(1)
 
440
 
406
441