#!/opt/thinlinc/libexec/python3
# -*-mode: python; coding: utf-8 -*-
#
# Copyright 2002-2021 Cendio AB.
# For more information, see http://www.cendio.com
# Author: Peter Åstrand <astrand@cendio.se>
if 82 - 82: Iii1i
import os
import sys
import glob
import logging
import _thread
import traceback
import readline
import locale
if 87 - 87: Ii % i1i1i1111I . Oo / OooOoo * I1Ii1I1 - I1I
from thinlinc import prefix , sudorelaunch
from thinlinc import tlgtk , wizard
from thinlinc import rpm , deb
from thinlinc . systemtype import *
if 81 - 81: i1 + ooOOO / oOo0O00 * i1iiIII111 * IiIIii11Ii
OOoOoo000O00 = "/var/log/thinlinc-install.log"
Ooo0Ooo = "https://www.cendio.com/thinlinc/docs/platforms"
if 15 - 15: IiII1I1I1i1 * IIiIIiIi11I1
iI111iiIi11i = "ThinLinc Server Installer"
if 77 - 77: iIiii1i - ooo0O0oO00 . o00o0OO00O
if 57 - 57: iiIi1 - ii % iiI * o00o0OO00O . i1
O0o00 = iI111iiIi11i
if 74 - 74: ooo0O0oO00 / I1I - Oo . IIiIIiIi11I1
if 46 - 46: iIiii1i - Ii * Oo * Ii
if 52 - 52: Oo + I1I / iiIi1 / OooOoo - I1Ii1I1 - ooOOO
oO0 = "\nPlease send a copy of %s to the ThinLinc support.\nVisit https://www.cendio.com/thinlinc/support for information on how to contact us." % OOoOoo000O00
if 13 - 13: iiIi1
if 2 - 2: i1
if 22 - 22: ooo0O0oO00 - IiII1I1I1i1 / I1Ii1I1 . IiII1I1I1i1
def IIII11 ( text , secondary_text ) :
 if tlgtk . has_gtk :
  if 72 - 72: ooo0O0oO00 * I1I / I1I + ii . iiIi1 * Ii
  if 96 - 96: Ii . ooo0O0oO00 % o00o0OO00O
  iiii1i1iIi = None
  for iiI1111IIi1 in tlgtk . Gtk . Window . list_toplevels ( ) :
   if iiI1111IIi1 . get_property ( "visible" ) :
    iiii1i1iIi = iiI1111IIi1
    if 92 - 92: ooOOO / OooOoo - oOo0O00
  OoO = tlgtk . Gtk . MessageDialog ( transient_for = iiii1i1iIi ,
 modal = True ,
 message_type = tlgtk . Gtk . MessageType . ERROR ,
 buttons = tlgtk . Gtk . ButtonsType . OK ,
 text = text )
  OoO . set_skip_taskbar_hint ( False )
  OoO . set_title ( iI111iiIi11i )
  OoO . format_secondary_markup ( secondary_text )
  OoO . run ( )
  OoO . destroy ( )
 else :
  wizard . text_print_wrapped ( text )
  wizard . text_print_wrapped ( secondary_text )
  if 80 - 80: i1i1i1111I . I1I % ooOOO % IiIIii11Ii / i1i1i1111I
def IiI11I ( ) :
 if 79 - 79: Iii1i % iiIi1 * Oo + ooOOO / Oo . iiIi1
 if 20 - 20: iiI + i1iiIII111 / I1I
 if 88 - 88: o00o0OO00O + ooOOO - i1i1i1111I . IIiIIiIi11I1 * Ii + Iii1i
 if 43 - 43: ooOOO * I1Ii1I1
 if 95 - 95: IIiIIiIi11I1 % Iii1i % i1i1i1111I . OooOoo
 if 70 - 70: IiIIii11Ii
 for IiII in [ "LC_ALL" , "LC_CTYPE" , "LANG" ] :
  if IiII in os . environ :
   I1i1i = os . environ [ IiII ]
   break
 else :
  I1i1i = None
  if 46 - 46: iiI - OooOoo * I1Ii1I1 / IIiIIiIi11I1 / Iii1i
  if 23 - 23: IIiIIiIi11I1 + i1 * I1Ii1I1 + Oo * Ii - ooo0O0oO00
 for iIIiii1iI in [ "LANGUAGE" , "LANG" , "LC_ALL" , "LC_COLLATE" , "LC_CTYPE" ,
 "LC_MESSAGES" , "LC_MONETARY" , "LC_NUMERIC" , "LC_TIME" ] :
  if iIIiii1iI in os . environ :
   del os . environ [ iIIiii1iI ]
   if 43 - 43: ooOOO . o00o0OO00O + IiII1I1I1i1
   if 87 - 87: Iii1i + ooOOO . ii / Ii + Oo
 if I1i1i is not None :
  os . environ [ "LC_CTYPE" ] = I1i1i
  if 77 - 77: i1iiIII111 + iiI - Oo % IiII1I1I1i1
  if 74 - 74: Ii + IIiIIiIi11I1
  if 1 - 1: I1I % IIiIIiIi11I1 + i1iiIII111 . i1iiIII111 % Oo
OOOO0O0ooO0O = None
if 87 - 87: iiI / oOo0O00 % iiIi1 - oOo0O00 . I1I + IIiIIiIi11I1
def OO0o0O0o0 ( wzd ) :
 wzd . add_text_handler ( I111Iii1Ii )
 wzd . add_gui_handler ( iiIiII11i11II )
 if 52 - 52: Iii1i / Oo
def o00O ( s ) :
 if 7 - 7: Oo / OooOoo - o00o0OO00O - iiI % i1iiIII111
 if 97 - 97: o00o0OO00O % iiIi1 - I1Ii1I1 - ooo0O0oO00
 O0O0O = prefix . get_tl_prefix ( ) + "/../packages"
 O0O0O = os . path . normpath ( O0O0O )
 if 81 - 81: iIiii1i + i1i1i1111I
 oOO0oo = glob . glob ( os . path . join ( O0O0O , s ) )
 oOO0oo = filter ( os . path . isfile , oOO0oo )
 if not oOO0oo :
  logging . error ( "The ThinLinc source directory is not complete. The file %s is missing." % s )
  return [ None ]
  if 20 - 20: OooOoo - I1I
 return oOO0oo
 if 9 - 9: i1iiIII111 - iIiii1i % Ii - I1I
def O0o0OOoOOOO ( ) :
 if PACKAGE_FORMAT is RPM :
  if 69 - 69: iiIi1 * i1 % i1 - IIiIIiIi11I1 + Iii1i - IiII1I1I1i1
  if 44 - 44: IiII1I1I1i1 * I1Ii1I1 * OooOoo - iiIi1 % IiII1I1I1i1 . ii
  iIiIiiIIIiII = "thinlinc-%s-[0-9]*-*.%s.rpm"
  OOOoOo = "noarch"
  if CPU_ARCH is I686 :
   I1i1iii1ii = "i?86"
  elif CPU_ARCH is X86_64 :
   I1i1iii1ii = "x86_64"
   Ii1iI1IIi111 = "i?86"
 elif PACKAGE_FORMAT is DEB :
  iIiIiiIIIiII = "thinlinc-%s_*-*_%s.deb"
  OOOoOo = "all"
  if CPU_ARCH is I686 :
   I1i1iii1ii = "i386"
  elif CPU_ARCH is X86_64 :
   I1i1iii1ii = "amd64"
   Ii1iI1IIi111 = "amd64"
 else :
  return None
  if 92 - 92: I1Ii1I1
 ooO00OO0oo0 = [ ]
 if 89 - 89: Oo / oOo0O00 * iiI * ii . IiIIii11Ii . iiIi1
 ooO00OO0oo0 . extend ( o00O ( iIiIiiIIIiII % ( "tlmisc" , I1i1iii1ii ) ) )
 if 55 - 55: i1i1i1111I + i1iiIII111 % IIiIIiIi11I1 . Oo - IiIIii11Ii - iIiii1i
 if 91 - 91: I1Ii1I1 - o00o0OO00O
 if CPU_ARCH is I686 :
  ooO00OO0oo0 . extend ( o00O ( iIiIiiIIIiII % ( "tlmisc*libs32" , I1i1iii1ii ) ) )
 elif CPU_ARCH is X86_64 :
  if 84 - 84: iiIi1 % iIiii1i - IIiIIiIi11I1
  if 94 - 94: i1iiIII111 + i1i1i1111I / iIiii1i + iIiii1i / ii
  ooO00OO0oo0 . extend ( o00O ( iIiIiiIIIiII % ( "tlmisc*libs" , I1i1iii1ii ) ) )
  ooO00OO0oo0 . extend ( o00O ( iIiIiiIIIiII % ( "tlmisc*libs32" , Ii1iI1IIi111 ) ) )
 else :
  ooO00OO0oo0 . extend ( o00O ( iIiIiiIIIiII % ( "tlmisc*libs" , I1i1iii1ii ) ) )
  if 79 - 79: i1iiIII111 - ooo0O0oO00 . I1Ii1I1 + I1I - ooOOO + i1iiIII111
 ooO00OO0oo0 . extend ( o00O ( iIiIiiIIIiII % ( "vsm" , I1i1iii1ii ) ) )
 ooO00OO0oo0 . extend ( o00O ( iIiIiiIIIiII % ( "vnc*server" , I1i1iii1ii ) ) )
 ooO00OO0oo0 . extend ( o00O ( iIiIiiIIIiII % ( "tladm" , I1i1iii1ii ) ) )
 ooO00OO0oo0 . extend ( o00O ( iIiIiiIIIiII % ( "tlprinter" , OOOoOo ) ) )
 ooO00OO0oo0 . extend ( o00O ( iIiIiiIIIiII % ( "webaccess" , OOOoOo ) ) )
 if 36 - 36: ooOOO * Iii1i % I1I % i1 . IIiIIiIi11I1
 if 63 - 63: ooo0O0oO00 / ooo0O0oO00 * Iii1i - oOo0O00 . i1
 if None in ooO00OO0oo0 :
  return None
  if 52 - 52: oOo0O00 / ii * ooo0O0oO00 + o00o0OO00O % IIiIIiIi11I1 + iiIi1
 return ooO00OO0oo0
 if 43 - 43: iIiii1i * oOo0O00 + ooOOO
def iiIi111iii1II ( ) :
 oOoOo = O0o0OOoOOOO ( )
 if oOoOo is None :
  return None
  if 39 - 39: iiIi1
 if PACKAGE_FORMAT is RPM :
  IioOoo0OOOOOoo = rpm . determine_upgrade ( oOoOo )
 elif PACKAGE_FORMAT is DEB :
  IioOoo0OOOOOoo = deb . determine_upgrade ( oOoOo )
 else :
  IioOoo0OOOOOoo = None
  if 33 - 33: i1i1i1111I . ooo0O0oO00 - ii . Ii
 if IioOoo0OOOOOoo is not None :
  if len ( IioOoo0OOOOOoo [ "remove" ] ) > 0 :
   logging . info ( "Packages to remove: %s" % ", " . join ( IioOoo0OOOOOoo [ "remove" ] ) )
  if len ( IioOoo0OOOOOoo [ "install" ] ) > 0 :
   logging . info ( "Packages to install: %s" % ", " . join ( map ( os . path . basename , IioOoo0OOOOOoo [ "install" ] ) ) )
  if len ( IioOoo0OOOOOoo [ "upgrade" ] ) > 0 :
   logging . info ( "Packages to upgrade: %s" % ", " . join ( map ( os . path . basename , IioOoo0OOOOOoo [ "upgrade" ] ) ) )
  if len ( IioOoo0OOOOOoo [ "ignore" ] ) > 0 :
   logging . info ( "Packages to ignore: %s" % ", " . join ( map ( os . path . basename , IioOoo0OOOOOoo [ "ignore" ] ) ) )
  if len ( IioOoo0OOOOOoo [ "obsolete" ] ) > 0 :
   logging . info ( "Obsolete packages: %s" % ", " . join ( IioOoo0OOOOOoo [ "obsolete" ] ) )
   if 20 - 20: oOo0O00 % i1i1i1111I
 return IioOoo0OOOOOoo
 if 32 - 32: iiIi1
oOOOO0OO00 = "Determining packages to install..."
if 8 - 8: Oo * I1I / i1i1i1111I + i1 / I1Ii1I1
iI = "There was an error determining which packages to install."
OooO0O = "This system already has an up to date installation of ThinLinc."
if 90 - 90: i1 . ii + I1I * IIiIIiIi11I1
iiIiiiiI111I = "The following packages will be removed:"
o0O0OO00O = "The following packages will be installed:"
ooO0O0Oooo0 = "The following packages will be upgraded:"
if 74 - 74: ooOOO . Ii % ooo0O0oO00 / iIiii1i % ooOOO
def I111Iii1Ii ( ) :
 global OOOO0O0ooO0O
 if 24 - 24: ooo0O0oO00 - ooo0O0oO00 . IIiIIiIi11I1 + i1iiIII111 + Oo
 print ( oOOOO0OO00 , end = ' ' )
 sys . stdout . flush ( )
 if 21 - 21: ooo0O0oO00 - IiII1I1I1i1 + iiIi1
 IioOoo0OOOOOoo = iiIi111iii1II ( )
 print ( "done." )
 print ( )
 if 5 - 5: i1iiIII111 . i1iiIII111 + IiII1I1I1i1 . o00o0OO00O
 if IioOoo0OOOOOoo is None :
  wizard . text_print_wrapped ( iI + oO0 )
  sys . exit ( os . EX_SOFTWARE )
  if 1 - 1: iIiii1i % Ii - o00o0OO00O / iiI + iIiii1i - Ii
  if 27 - 27: OooOoo % iIiii1i + ooo0O0oO00
 for type in ( "remove" , "install" , "upgrade" ) :
  if len ( IioOoo0OOOOOoo [ type ] ) > 0 :
   break
 else :
  wizard . text_print_wrapped ( OooO0O )
  sys . exit ( os . EX_OK )
  if 16 - 16: iiI
 OOOO0O0ooO0O = IioOoo0OOOOOoo
 if 31 - 31: oOo0O00 / Iii1i % IIiIIiIi11I1 % i1 . iIiii1i . Oo
 if len ( IioOoo0OOOOOoo [ "remove" ] + IioOoo0OOOOOoo [ "obsolete" ] ) > 0 :
  wizard . text_print_wrapped ( iiIiiiiI111I )
  print ( )
  if 83 - 83: oOo0O00 - o00o0OO00O
  for OOoO0oOo0 in IioOoo0OOOOOoo [ "remove" ] + IioOoo0OOOOOoo [ "obsolete" ] :
   print ( "\t" , OOoO0oOo0 )
  print ( )
  if 66 - 66: i1i1i1111I / IIiIIiIi11I1 + o00o0OO00O + Iii1i + oOo0O00 + ii
 if len ( IioOoo0OOOOOoo [ "install" ] ) > 0 :
  wizard . text_print_wrapped ( o0O0OO00O )
  print ( )
  if 75 - 75: OooOoo - iiIi1 - IiIIii11Ii - iiIi1 + IiII1I1I1i1 % iIiii1i
  for OOoO0oOo0 in map ( os . path . basename , IioOoo0OOOOOoo [ "install" ] ) :
   print ( "\t" , OOoO0oOo0 )
  print ( )
  if 42 - 42: i1 * ii
 if len ( IioOoo0OOOOOoo [ "upgrade" ] ) > 0 :
  wizard . text_print_wrapped ( ooO0O0Oooo0 )
  print ( )
  if 50 - 50: Ii - i1iiIII111
  for OOoO0oOo0 in map ( os . path . basename , IioOoo0OOOOOoo [ "upgrade" ] ) :
   print ( "\t" , OOoO0oOo0 )
  print ( )
  if 96 - 96: IiII1I1I1i1 * OooOoo - Ii - OooOoo
 wizard . text_wait_prompt ( )
 print ( )
 if 65 - 65: Oo + Oo - iIiii1i % OooOoo . IIiIIiIi11I1
def iII11I1iI ( page , notebook , package_vbox , actions ) :
 global OOOO0O0ooO0O
 if 87 - 87: i1iiIII111 - ooo0O0oO00 * Ii % i1i1i1111I % i1
 if 81 - 81: i1 + i1i1i1111I * Oo - Oo * I1Ii1I1 - oOo0O00
 for iiIIIIi in ( "remove" , "install" , "upgrade" ) :
  if len ( actions [ iiIIIIi ] ) > 0 :
   break
 else :
  notebook . set_current_page ( 3 )
  page . set_page_busy ( False )
  page . set_page_forwardable ( False )
  return
  if 32 - 32: ii - I1Ii1I1 * I1Ii1I1 / iiI . IiII1I1I1i1
 notebook . set_current_page ( 1 )
 page . set_page_busy ( False )
 if 80 - 80: ooo0O0oO00 / OooOoo % iIiii1i / ooOOO * ooOOO - Iii1i
 OOOO0O0ooO0O = actions
 if 60 - 60: iiIi1 * i1i1i1111I / iIiii1i
 package_vbox . foreach ( package_vbox . remove )
 if 45 - 45: IIiIIiIi11I1 + ooOOO * oOo0O00 - IiII1I1I1i1 / ooo0O0oO00
 if len ( actions [ "remove" ] + actions [ "obsolete" ] ) > 0 :
  i1I1I1Ii = "<b>%s</b>" % iiIiiiiI111I
  O0 = tlgtk . factory . label_list ( actions [ "remove" ] + actions [ "obsolete" ] ,
 title = i1I1I1Ii )
  package_vbox . pack_start ( O0 , expand = False , fill = False , padding = 0 )
  if 88 - 88: iiI . ooo0O0oO00 * i1 + IiIIii11Ii % I1I / iiI
 if len ( actions [ "install" ] ) > 0 :
  i1I1I1Ii = "<b>%s</b>" % o0O0OO00O
  O0 = tlgtk . factory . label_list ( list ( map ( os . path . basename , actions [ "install" ] ) ) ,
 title = i1I1I1Ii )
  package_vbox . pack_start ( O0 , expand = False , fill = False , padding = 0 )
  if 33 - 33: OooOoo * Oo * Ii * iIiii1i + ii . IiIIii11Ii
 if len ( actions [ "upgrade" ] ) > 0 :
  i1I1I1Ii = "<b>%s</b>" % ooO0O0Oooo0
  O0 = tlgtk . factory . label_list ( list ( map ( os . path . basename , actions [ "upgrade" ] ) ) ,
 title = i1I1I1Ii )
  package_vbox . pack_start ( O0 , expand = False , fill = False , padding = 0 )
  if 94 - 94: oOo0O00 . i1iiIII111
 package_vbox . show_all ( )
 if 96 - 96: I1I / iiIi1 / o00o0OO00O + o00o0OO00O
def oOO0Oo ( page , notebook ) :
 notebook . set_current_page ( 2 )
 page . set_page_busy ( False )
 page . set_page_forwardable ( False )
 if 60 - 60: OooOoo
def IIiIiI1iII ( page , notebook , package_vbox ) :
 IioOoo0OOOOOoo = iiIi111iii1II ( )
 if 87 - 87: ooOOO * IiII1I1I1i1 % IiIIii11Ii * i1 . Iii1i - iiI
 if IioOoo0OOOOOoo is None :
  tlgtk . GLib . idle_add ( oOO0Oo ,
 page , notebook )
  return
  if 72 - 72: i1 % i1i1i1111I * iIiii1i
 tlgtk . GLib . idle_add ( iII11I1iI ,
 page , notebook , package_vbox , IioOoo0OOOOOoo )
 if 90 - 90: IIiIIiIi11I1 * OooOoo . Ii
def Iiii1iIII ( page , wizard , first , notebook , package_vbox ) :
 if not first :
  return
  if 86 - 86: iiIi1 * ii - OooOoo * Oo - iiI - IIiIIiIi11I1
 notebook . set_current_page ( 0 )
 page . set_page_busy ( True )
 if 36 - 36: IiIIii11Ii
 _thread . start_new_thread ( IIiIiI1iII , ( page , notebook , package_vbox ) )
 if 28 - 28: i1 - Oo + IiIIii11Ii * iiIi1
def iiIiII11i11II ( wizard ) :
 oOooOo0o = wizard . add_page ( "Packages" , "Review the packages that will be installed" )
 if 83 - 83: Iii1i % i1iiIII111 . OooOoo / I1I % iiIi1 . I1I
 ii1iIii = tlgtk . Gtk . Notebook ( )
 ii1iIii . set_show_tabs ( False )
 ii1iIii . set_show_border ( False )
 oOooOo0o . add ( ii1iIii )
 if 70 - 70: Oo / Iii1i * OooOoo
 if 2 - 2: ii / Iii1i + I1Ii1I1
 o0O0 = tlgtk . factory . spinner_text ( oOOOO0OO00 )
 ii1iIii . append_page ( o0O0 )
 if 15 - 15: ooo0O0oO00 . IiIIii11Ii - ii % iIiii1i . i1 % iiI
 if 6 - 6: o00o0OO00O * iIiii1i + Iii1i * ooo0O0oO00 . IIiIIiIi11I1 - Oo
 if 63 - 63: i1i1i1111I - i1iiIII111 . OooOoo % OooOoo . iiI + ii
 O0OO00Oo0o0 = tlgtk . Gtk . Box ( orientation = tlgtk . Gtk . Orientation . VERTICAL )
 O0OO00Oo0o0 . set_spacing ( 12 )
 if 84 - 84: I1I * iIiii1i - IIiIIiIi11I1 / iIiii1i + IiII1I1I1i1
 oOO0OOo = tlgtk . factory . scrolled_view ( O0OO00Oo0o0 )
 ii1iIii . append_page ( oOO0OOo )
 if 88 - 88: i1i1i1111I . i1i1i1111I . Oo - IiIIii11Ii
 if 17 - 17: ii . iiIi1 % Oo + IiIIii11Ii - IIiIIiIi11I1
 if 93 - 93: oOo0O00
 O00 = tlgtk . Gtk . Label ( label = iI + oO0 ,
 max_width_chars = 0 ,
 wrap = True ,
 xalign = 0 ,
 halign = tlgtk . Gtk . Align . FILL ,
 valign = tlgtk . Gtk . Align . START )
 O00 . set_use_markup ( True )
 ii1iIii . append_page ( O00 )
 if 28 - 28: ooo0O0oO00 * i1
 if 14 - 14: IiIIii11Ii % ooOOO . ii
 if 29 - 29: iiI % iiIi1 % iiI . ooOOO
 O00 = tlgtk . Gtk . Label ( label = OooO0O ,
 max_width_chars = 0 ,
 wrap = True ,
 xalign = 0 ,
 halign = tlgtk . Gtk . Align . FILL ,
 valign = tlgtk . Gtk . Align . START )
 ii1iIii . append_page ( O00 )
 if 4 - 4: oOo0O00 + i1iiIII111
 if 45 - 45: I1Ii1I1
 if 19 - 19: IiII1I1I1i1 * OooOoo . Iii1i * o00o0OO00O . I1I
 ii1iIii . show_all ( )
 if 49 - 49: i1iiIII111 - IiIIii11Ii / i1iiIII111 + ii
 oOooOo0o . connect ( "page-show" , Iiii1iIII , ii1iIii , O0OO00Oo0o0 )
 if 77 - 77: Ii
 if 20 - 20: Ii % i1i1i1111I
 if 35 - 35: IIiIIiIi11I1 * iiI - IIiIIiIi11I1 - ooOOO
def iIiI111 ( wzd ) :
 wzd . add_text_handler ( Oooo )
 wzd . add_gui_handler ( oOOO )
 if 16 - 16: ooo0O0oO00
oO00 = "Performing package installation..."
if 30 - 30: IiIIii11Ii % IiII1I1I1i1 . Ii * Iii1i - iIiii1i
II1I11IIiIi = "There was an error installing the packages."
oO0OoOooO0O = "All packages were installed successfully."
if 68 - 68: IiII1I1I1i1
def OOoo0 ( progress_cb ) :
 if 82 - 82: o00o0OO00O
 if 66 - 66: IiIIii11Ii + OooOoo
 iIii = os . getcwd ( )
 os . chdir ( "/tmp" )
 if 78 - 78: i1i1i1111I * I1Ii1I1
 if PACKAGE_FORMAT is RPM :
  O0O00000O0O = rpm . perform_upgrade ( OOOO0O0ooO0O , progress_cb )
 elif PACKAGE_FORMAT is DEB :
  O0O00000O0O = deb . perform_upgrade ( OOOO0O0ooO0O , progress_cb )
 else :
  O0O00000O0O = False
  if 20 - 20: ooo0O0oO00 . oOo0O00 - ii + Ii
 os . chdir ( iIii )
 if 46 - 46: oOo0O00 . iIiii1i - Ii . oOo0O00 + i1i1i1111I
 return O0O00000O0O
 if 83 - 83: iiI
def O00oO00oO0O ( percent ) :
 print ( "\r%s%d%%" % ( oO00 , percent ) , end = ' ' )
 sys . stdout . flush ( )
 if 65 - 65: iIiii1i . Oo
def Oooo ( ) :
 print ( oO00 , end = ' ' )
 sys . stdout . flush ( )
 if 44 - 44: o00o0OO00O . I1Ii1I1 * i1 . iIiii1i * o00o0OO00O - o00o0OO00O
 O0O00000O0O = OOoo0 ( O00oO00oO0O )
 if 79 - 79: IiIIii11Ii + oOo0O00
 print ( "\r%s done." % oO00 )
 print ( )
 if 50 - 50: iiI + i1iiIII111 . i1iiIII111 . Oo
 if not O0O00000O0O :
  wizard . text_print_wrapped ( II1I11IIiIi + oO0 )
  sys . exit ( os . EX_SOFTWARE )
  if 72 - 72: oOo0O00 - iiI + i1iiIII111 / ii . OooOoo * IiIIii11Ii
 wizard . text_print_wrapped ( oO0OoOooO0O )
 print ( )
 if 40 - 40: IiII1I1I1i1 * iiI / i1i1i1111I * iiIi1 + i1iiIII111 - OooOoo
 wizard . text_wait_prompt ( )
 print ( )
 if 86 - 86: o00o0OO00O * IIiIIiIi11I1 . IiIIii11Ii % IiIIii11Ii . I1Ii1I1 + I1I
def Ooooo ( progress , percent ) :
 tlgtk . GLib . idle_add ( progress . set_fraction ,
 float ( percent ) / 100.0 )
 if 38 - 38: o00o0OO00O
def Ii1Iiii11i1 ( page , text , progress ) :
 page . set_page_busy ( False )
 page . set_page_backable ( False )
 if 57 - 57: IIiIIiIi11I1
 text . set_text ( oO0OoOooO0O )
 progress . set_fraction ( 1.0 )
 if 47 - 47: i1 * iiI - iIiii1i + iiIi1 / oOo0O00 / ooo0O0oO00
def I1IIII11Iii1 ( page , text ) :
 page . set_page_busy ( False )
 page . set_page_backable ( False )
 page . set_page_forwardable ( False )
 if 18 - 18: ooo0O0oO00 . iiIi1 + Oo
 text . set_markup ( II1I11IIiIi + oO0 )
 if 92 - 92: oOo0O00 . I1Ii1I1 . iIiii1i + OooOoo % IIiIIiIi11I1
def iIiIiI1Ii ( page , text , progress ) :
 oooOo00 = lambda ooOO : Ooooo ( progress , ooOO )
 O0O00000O0O = OOoo0 ( oooOo00 )
 if 90 - 90: ooo0O0oO00 * iIiii1i
 if not O0O00000O0O :
  tlgtk . GLib . idle_add ( I1IIII11Iii1 ,
 page , text )
  return
 tlgtk . GLib . idle_add ( Ii1Iiii11i1 ,
 page , text , progress )
 if 79 - 79: i1i1i1111I
def Ii111 ( page , wizard , first , text , progress ) :
 if not first :
  return
  if 68 - 68: oOo0O00 . oOo0O00 / Ii . i1
 page . set_page_busy ( True )
 if 54 - 54: iIiii1i % Oo . iiI - Iii1i % o00o0OO00O * ii
 _thread . start_new_thread ( iIiIiI1Ii , ( page , text , progress ) )
 if 31 - 31: oOo0O00 / Iii1i - IiIIii11Ii % ii / I1Ii1I1 - i1i1i1111I
def oOOO ( wizard ) :
 oOooOo0o = wizard . add_page ( "Installing" , "Installing the required packages" )
 if 68 - 68: o00o0OO00O . o00o0OO00O % o00o0OO00O
 Ii1III1iI = tlgtk . Gtk . Box ( orientation = tlgtk . Gtk . Orientation . VERTICAL ,
 valign = tlgtk . Gtk . Align . CENTER )
 Ii1III1iI . set_spacing ( 12 )
 oOooOo0o . add ( Ii1III1iI )
 if 9 - 9: Oo / i1iiIII111 % OooOoo
 O00 = tlgtk . Gtk . Label ( label = oO00 ,
 max_width_chars = 0 ,
 wrap = True ,
 xalign = 0 ,
 halign = tlgtk . Gtk . Align . FILL ,
 valign = tlgtk . Gtk . Align . CENTER )
 Ii1III1iI . pack_start ( O00 , expand = False , fill = False , padding = 0 )
 if 6 - 6: i1iiIII111 % I1Ii1I1 * iIiii1i
 oo0O = tlgtk . Gtk . ProgressBar ( valign = tlgtk . Gtk . Align . CENTER )
 Ii1III1iI . pack_start ( oo0O , expand = False , fill = False , padding = 0 )
 if 5 - 5: Ii / Ii / i1iiIII111
 Ii1III1iI . show_all ( )
 if 40 - 40: iiIi1 - ooOOO - I1I . IiIIii11Ii + Ii
 oOooOo0o . connect ( "page-show" , Ii111 , O00 , oo0O )
 if 84 - 84: Oo + IIiIIiIi11I1 + IiII1I1I1i1
 if 96 - 96: i1iiIII111 - ooo0O0oO00 / ooo0O0oO00 * IiIIii11Ii
 if 67 - 67: IIiIIiIi11I1 . IIiIIiIi11I1 . iiI
IiiI1II = None
if 58 - 58: IIiIIiIi11I1 * iIiii1i / iIiii1i + IiIIii11Ii . iiI
def Ooo00OO000oo ( wzd ) :
 wzd . add_text_handler ( IiiIII1i1i1III )
 wzd . add_gui_handler ( oo0OOO0Oooo )
 if 95 - 95: o00o0OO00O - IiII1I1I1i1
I1Ii1I = "The installation of ThinLinc has completed successfully"
if 89 - 89: Oo / i1i1i1111I / I1Ii1I1 - iIiii1i
II1i11IIi111 = "Before using ThinLinc, you must configure it using /opt/thinlinc/sbin/tl-setup."
IiiiiiIiI1 = "Run ThinLinc Setup now"
if 74 - 74: iiIi1 - iiI / i1i1i1111I
def IiiIII1i1i1III ( ) :
 global IiiI1II
 if 9 - 9: ooo0O0oO00 - IIiIIiIi11I1 % IIiIIiIi11I1
 wizard . text_print_wrapped ( I1Ii1I )
 print ( )
 if 74 - 74: OooOoo
 wizard . text_print_wrapped ( II1i11IIi111 )
 print ( )
 if 41 - 41: iIiii1i . o00o0OO00O - OooOoo + ii % OooOoo / IIiIIiIi11I1
 iiIiiI1iI1 = wizard . text_prompt ( IiiiiiIiI1 , [ "Yes" , "no" ] )
 print ( )
 if 37 - 37: ooOOO
 IiiI1II = iiIiiI1iI1 == "yes"
 if 26 - 26: ooOOO % oOo0O00 / iiIi1 % o00o0OO00O . I1Ii1I1 * ii
def i111I1iiii11 ( page , wizard , first , text , check ) :
 global IiiI1II
 if 34 - 34: ii / iiI - Iii1i * iiIi1 - oOo0O00 + ooo0O0oO00
 if not first :
  return
  if 32 - 32: oOo0O00 - i1i1i1111I - Ii * iIiii1i / ooo0O0oO00 - iIiii1i
 text . set_text ( tlgtk . sanitise_wrap ( II1i11IIi111 ) )
 check . show ( )
 IiiI1II = True
 if 27 - 27: OooOoo % i1iiIII111 + IiIIii11Ii
 if 52 - 52: o00o0OO00O + iiIi1
 if 14 - 14: iIiii1i / ooOOO . iIiii1i
 if 32 - 32: Ii . oOo0O00
 if 50 - 50: i1 - i1iiIII111 / i1iiIII111 % I1Ii1I1 / ooo0O0oO00
 wizard . close_button . set_label ( "Close" )
 OOooO0 = wizard . close_button . get_preferred_size ( ) . minimum_size . width
 wizard . close_button . set_label ( "Continue" )
 o0Ooo = wizard . close_button . get_preferred_size ( ) . minimum_size . width
 if 37 - 37: ooo0O0oO00 % iiIi1 + Oo . IIiIIiIi11I1
 wizard . close_button . set_size_request ( max ( OOooO0 , o0Ooo ) , - 1 )
 if 18 - 18: IiIIii11Ii * IiIIii11Ii - Ii
def o0oO0OoO0O0 ( widget , wizard ) :
 global IiiI1II
 IiiI1II = widget . get_active ( )
 if IiiI1II :
  wizard . close_button . set_label ( "Continue" )
 else :
  wizard . close_button . set_label ( "Close" )
  if 36 - 36: iiI * OooOoo . IiII1I1I1i1 . i1iiIII111 + iiIi1
def oo0OOO0Oooo ( wizard ) :
 oOooOo0o = wizard . add_finish ( I1Ii1I , None )
 if 47 - 47: iiI / o00o0OO00O
 Ii1III1iI = tlgtk . Gtk . Box ( orientation = tlgtk . Gtk . Orientation . VERTICAL )
 Ii1III1iI . set_spacing ( 12 )
 oOooOo0o . add ( Ii1III1iI )
 if 52 - 52: Ii . OooOoo . i1iiIII111 * o00o0OO00O - iIiii1i
 O00 = tlgtk . Gtk . Label ( max_width_chars = 0 ,
 wrap = True ,
 xalign = 0 ,
 halign = tlgtk . Gtk . Align . FILL ,
 valign = tlgtk . Gtk . Align . START )
 Ii1III1iI . pack_start ( O00 , expand = False , fill = False , padding = 0 )
 if 20 - 20: OooOoo % iiI + I1Ii1I1 + iiI - oOo0O00
 O0OOoOO0oO0O0 = tlgtk . Gtk . CheckButton ( label = IiiiiiIiI1 ,
 margin_left = 12 )
 O0OOoOO0oO0O0 . set_active ( True )
 O0OOoOO0oO0O0 . connect ( "toggled" , o0oO0OoO0O0 , wizard )
 Ii1III1iI . pack_start ( O0OOoOO0oO0O0 , expand = False , fill = False , padding = 0 )
 if 89 - 89: iiI . ooOOO - ii * i1 % Ii * ii
 Ii1III1iI . show_all ( )
 if 62 - 62: iiI % IiII1I1I1i1
 oOooOo0o . connect ( "page-show" , i111I1iiii11 , O00 , O0OOoOO0oO0O0 )
 if 19 - 19: Ii / Oo % Iii1i / i1iiIII111 - OooOoo - IIiIIiIi11I1
 if 89 - 89: o00o0OO00O - iiI
 if 61 - 61: Ii * OooOoo * I1I % i1iiIII111 % ooo0O0oO00 * o00o0OO00O
def OO0O ( ) :
 try :
  locale . setlocale ( locale . LC_ALL , "" )
 except locale . Error as OOooO0OoOO0 :
  print ( "\nWarning: Can't set the locale (%s); make sure $LC_* and $LANG are correct\n" %
 OOooO0OoOO0 , file = sys . stderr )
  if 27 - 27: ooo0O0oO00 * ooo0O0oO00 + iiIi1 + ooOOO * Oo + ii
  if 87 - 87: IiII1I1I1i1 - OooOoo + Ii + i1i1i1111I + IiIIii11Ii
  if 57 - 57: ooo0O0oO00 + I1I / ooOOO % ooOOO % Oo / iiI
  if 95 - 95: i1 / o00o0OO00O . i1 / Oo . IIiIIiIi11I1
  if 43 - 43: Oo - OooOoo * iiIi1 . IIiIIiIi11I1 / ooo0O0oO00 * ooo0O0oO00
 sys . excepthook = II1ii11
 sys . unraisablehook = iIiiO0Oo # novermin
 if 2 - 2: iiI % i1iiIII111 . oOo0O00
 if 59 - 59: o00o0OO00O % OooOoo - iIiii1i % I1I + i1iiIII111 . I1Ii1I1
 IiI11I ( )
 if 94 - 94: ooOOO * I1Ii1I1 * i1iiIII111 . oOo0O00
 if 73 - 73: I1Ii1I1 / IiII1I1I1i1 % o00o0OO00O - i1i1i1111I + Oo - I1Ii1I1
 if 18 - 18: i1 + ooOOO . i1 - iIiii1i
 if 97 - 97: oOo0O00 + ii % Iii1i
 Ooo0oOOoO000O = os . getenv ( "PATH" , "" )
 Ooo0oOOoO000O += ":/sbin:/usr/sbin:/usr/local/sbin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin"
 os . environ [ "PATH" ] = Ooo0oOOoO000O
 if 89 - 89: oOo0O00
 if not tlgtk . init ( wmclass = O0o00 ) :
  wizard . text_print_wrapped ( "Could not start GTK+. Using text mode fallback..." )
  print ( )
  if 48 - 48: i1 / ooo0O0oO00 / iIiii1i / iiI * IiIIii11Ii
  if 54 - 54: ooo0O0oO00 % I1I % iiI / o00o0OO00O . o00o0OO00O - IiIIii11Ii
  if 10 - 10: Ii . o00o0OO00O % ii / OooOoo % I1Ii1I1
  if not os . isatty ( sys . stdin . fileno ( ) ) :
   print ( "Not attached to a TTY. Cannot proceed with text mode..." )
   sys . exit ( os . EX_USAGE )
   if 42 - 42: Oo - I1I * ii * i1i1i1111I - o00o0OO00O
   if 58 - 58: iIiii1i
 if tlgtk . has_gtk :
  global oO0 , Ooo0Ooo
  oO0 = tlgtk . linkify_text ( oO0 )
  Ooo0Ooo = tlgtk . linkify_text ( Ooo0Ooo )
  if 17 - 17: iIiii1i - Ii % iIiii1i % oOo0O00 * Iii1i
  if 51 - 51: I1I . i1i1i1111I % Ii
 if CPU_ARCH in ( I686 , X86_64 ) :
  if 55 - 55: i1i1i1111I * Ii % i1i1i1111I
  if PACKAGE_FORMAT not in ( RPM , DEB ) :
   IIII11 ( "Unsupported packaged format" ,
 "Could not find a supported package format (RPM or DEB) on this system, " + "or multiple package formats were detected. Please install the packages " + "manually and run /opt/thinlinc/sbin/tl-setup." )
   if 61 - 61: oOo0O00
   if 53 - 53: IIiIIiIi11I1 / IiIIii11Ii
   sys . exit ( os . EX_CONFIG )
 else :
  IIII11 ( "Unsupported architecture" ,
 "Your architecture (%s) is not supported by ThinLinc.\n" "Please refer to the documentation for a list of " "supported platforms." % CPU_ARCH )
  if 49 - 49: IiII1I1I1i1 - iiIi1 . IiIIii11Ii / Oo
  if 23 - 23: o00o0OO00O - i1 / Iii1i . iIiii1i + iiIi1
  sys . exit ( os . EX_CONFIG )
  if 55 - 55: i1 - iIiii1i / OooOoo + I1I + Oo
 if os . getuid ( ) != 0 :
  sudorelaunch . sudo_question ( iI111iiIi11i , iI111iiIi11i )
  if 5 - 5: iiI - i1 . i1i1i1111I / iiI . iIiii1i . iiI
  sys . exit ( os . EX_NOPERM )
  if 87 - 87: i1 . Ii * iIiii1i - iiIi1 / Ii / OooOoo
  if 65 - 65: ii / ii + iiI
  if 99 - 99: i1 + OooOoo + o00o0OO00O * IIiIIiIi11I1 / ooOOO + Ii
  if 72 - 72: I1Ii1I1 * IIiIIiIi11I1 * ooo0O0oO00 % IiIIii11Ii . IiII1I1I1i1
 try :
  OoOOo0Oo = logging . getLogger ( )
  IiIi1II11iIiI = logging . Formatter ( '%(asctime)s: %(message)s' )
  IiIIi11iiII1 = logging . FileHandler ( OOoOoo000O00 , "a" )
  IiIIi11iiII1 . setFormatter ( IiIi1II11iIiI )
  OoOOo0Oo . addHandler ( IiIIi11iiII1 )
  OoOOo0Oo . setLevel ( logging . DEBUG )
 except OSError as OOooO0OoOO0 :
  IIII11 ( "Could not open log file" ,
 "Error opening '%s': %s" % ( OOoOoo000O00 , OOooO0OoOO0 ) )
  sys . exit ( os . EX_OSFILE )
  if 78 - 78: i1i1i1111I . ii / iiIi1 * ooo0O0oO00 / I1I
 logging . info ( "*** ThinLinc installer started ***" )
 if 43 - 43: I1I . Oo / ooo0O0oO00
 logging . info ( "Architecture: %s" % CPU_ARCH )
 logging . info ( "Distribution: %s" % DISTRIBUTION )
 logging . info ( "Package format: %s" % PACKAGE_FORMAT )
 if 32 - 32: I1I % i1 - i1iiIII111 % IiII1I1I1i1 + iiIi1 - IiIIii11Ii
 O0OOo0O = wizard . Wizard ( )
 if 98 - 98: IiIIii11Ii / IIiIIiIi11I1 + Ii
 O0OOo0O . set_title ( iI111iiIi11i )
 O0OOo0O . set_intro ( "Welcome to the ThinLinc Server Installation Wizard" ,
 """This program will help you install the ThinLinc software packages on your system.

Before installing, please see the Platform Specific Notes at
%s""" % Ooo0Ooo )
 if 73 - 73: OooOoo * Iii1i
 OO0o0O0o0 ( O0OOo0O )
 iIiI111 ( O0OOo0O )
 Ooo00OO000oo ( O0OOo0O )
 if 34 - 34: ii % IIiIIiIi11I1 * OooOoo + i1iiIII111 / i1
 O0O00000O0O = O0OOo0O . run ( )
 if not O0O00000O0O :
  logging . error ( "Installation aborted by user" )
  sys . exit ( os . EX_USAGE )
  if 49 - 49: ooo0O0oO00 / i1iiIII111 % ooo0O0oO00 + ooo0O0oO00 * iIiii1i
 logging . info ( "Installation complete." )
 if 22 - 22: I1Ii1I1 + iiIi1 / I1Ii1I1 - Ii % Ii % i1i1i1111I
 if IiiI1II :
  logging . info ( "Starting tl-setup..." )
  os . execlp ( "/opt/thinlinc/sbin/tl-setup" , "/opt/thinlinc/sbin/tl-setup" )
  if 86 - 86: Iii1i
  if 53 - 53: i1 * i1i1i1111I
i1IIi = _thread . get_ident ( )
if 80 - 80: iiI * ooo0O0oO00 - Iii1i . iiIi1 % Iii1i - Iii1i
def O0oo0 ( ) :
 try :
  if 20 - 20: iiI / o00o0OO00O
  if tlgtk . has_gtk and _thread . get_ident ( ) != i1IIi :
   tlgtk . GLib . idle_add ( O0oo0 )
   return
   if 33 - 33: IiII1I1I1i1 + IiIIii11Ii . IiII1I1I1i1
  IIII11 ( "Internal error" ,
 "The ThinLinc Server Installation Wizard will now terminate. " + oO0 )
  if 59 - 59: i1 / i1i1i1111I + Ii * IiII1I1I1i1 . IiII1I1I1i1
 except :
  pass
  if 49 - 49: Ii - Iii1i * I1Ii1I1 * ooo0O0oO00 . IIiIIiIi11I1
 sys . exit ( os . EX_SOFTWARE )
 if 83 - 83: Oo % Ii % i1
def II1ii11 ( exc_type , exc_value , exc_traceback ) :
 try :
  Iii1I1 = traceback . format_exception ( exc_type , exc_value , exc_traceback )
  if 73 - 73: I1Ii1I1 . Iii1i + ii / IiII1I1I1i1 / oOo0O00 . I1Ii1I1
  if 73 - 73: IiII1I1I1i1 % iiIi1
  if 43 - 43: OooOoo * i1i1i1111I * IiIIii11Ii % Ii
  for IiI11 in Iii1I1 :
   for O0OoO0OOo00 in IiI11 . splitlines ( ) :
    logging . error ( O0OoO0OOo00 )
 except :
  pass
  if 85 - 85: iiI . i1 + i1i1i1111I * i1i1i1111I
 O0oo0 ( )
 if 35 - 35: OooOoo - IiII1I1I1i1
def iIiiO0Oo ( e ) :
 II1ii11 ( e . exc_type , e . exc_value , e . exc_traceback )
 if 41 - 41: i1i1i1111I . oOo0O00 . iIiii1i
 if 47 - 47: OooOoo . I1Ii1I1 . IIiIIiIi11I1
if __name__ == "__main__" :
 OO0O ( )
# dd678faae9ac167bc83abf78e5cb2f3f0688d3a3
