#!/opt/thinlinc/libexec/python3
# -*-mode: python; coding: utf-8 -*-
#
# Copyright 2002-2014 Cendio AB.
# For more information, see http://www.cendio.com
#
# tl-umount-localdrives: Unmounts all local drives
#
if 82 - 82: Iii1i
import sys
import os
import subprocess
import glob
import locale
import pwd
if 87 - 87: Ii % i1i1i1111I . Oo / OooOoo * I1Ii1I1 - I1I
from os import readlink
from os . path import islink , exists
if 81 - 81: i1 + ooOOO / oOo0O00 * i1iiIII111 * IiIIii11Ii
from thinlinc . tl_umount_common import get_mounted_filesystems
from thinlinc import prefix
if 84 - 84: ooo000 - Ooo0Ooo + iI1iII1I1I1i . IIiIIiIi11I1
from thinlinc . optionparse import OptionParser
from thinlinc . optcomplete import CompletionResult
from thinlinc . version import TL_VERSION
if 98 - 98: I11iiIi11i1I % oOO
def i1ii1 ( symlink ) :
 if islink ( symlink ) :
  if 63 - 63: iI1iI11Ii111
  os . unlink ( symlink )
 elif exists ( symlink ) :
  print ( "Cannot remove %s:" % symlink , file = sys . stderr )
  print ( "Not a symbolic link." , file = sys . stderr )
  if 26 - 26: O0OooooOo + oOO % iI1iI11Ii111 / Iii1i / Ii . i1
  if 9 - 9: i1iiIII111
def i1Ii1i ( mysessdir , symlink ) :
 if 93 - 93: IIiIIiIi11I1 % IIiIIiIi11I1 / I1I - Oo . Ooo0Ooo
 if 46 - 46: iI1iII1I1I1i - Ii * Oo * Ii
 if 52 - 52: Oo + I1I / oOO / OooOoo - I1Ii1I1 - ooOOO
 if 60 - 60: iI1iII1I1I1i . oOO
 if 13 - 13: oOO
 if not islink ( symlink ) :
  return
  if 2 - 2: i1
  if 22 - 22: IIiIIiIi11I1 - ooo000 / I1Ii1I1 . ooo000
 try :
  IIII11 = readlink ( symlink )
 except OSError as oOoo0 :
  print ( "Unable to read %s:" % symlink , file = sys . stderr )
  print ( oOoo0 , file = sys . stderr )
  IIII11 = ""
  if 95 - 95: i1iiIII111 . Ii . IIiIIiIi11I1 % I11iiIi11i1I % I1Ii1I1
 if IIII11 != os . path . join ( mysessdir , "drives" ) :
  return
  if 8 - 8: I1Ii1I1 . O0OooooOo . i1 . Oo - iI1iI11Ii111
 iiI1111IIi1 , oOo00O = os . path . split ( mysessdir )
 OoO = [ x for x in os . listdir ( iiI1111IIi1 ) if x . isdigit ( ) ]
 try :
  ii1IiIiiII = os . path . getmtime ( os . path . join ( mysessdir , "sessionkey" ) )
 except OSError :
  OoO = [ ]
 I1I111i11I = 0
 iii11i = None
 for Oo0Oo00O0OO in OoO :
  Oo0Oo00O0OO = os . path . join ( iiI1111IIi1 , Oo0Oo00O0OO )
  try :
   iIIiiIi1Ii1I = os . path . getmtime ( os . path . join ( Oo0Oo00O0OO , "sessionkey" ) )
  except OSError :
   continue
  if iIIiiIi1Ii1I > I1I111i11I and iIIiiIi1Ii1I < ii1IiIiiII :
   if 71 - 71: oOO - Oo . OooOoo . Ii % iI1iI11Ii111 + oOO
   if not IiII ( "nfs" , Oo0Oo00O0OO ) :
    continue
   I1I111i11I = iIIiiIi1Ii1I
   iii11i = Oo0Oo00O0OO
   if 6 - 6: i1 / Oo * IiIIii11Ii
 if iii11i :
  oooOo = os . path . join ( iii11i , "drives" )
  if 23 - 23: Ooo0Ooo + i1 * I1Ii1I1 + Oo * Ii - IIiIIiIi11I1
  if islink ( symlink ) :
   os . unlink ( symlink )
  try :
   os . symlink ( oooOo , symlink )
  except FileExistsError :
   if 29 - 29: IiIIii11Ii - oOo0O00
   if 30 - 30: I1I . ooo000
   pass
 else :
  i1ii1 ( symlink )
  if 43 - 43: ooOOO . I11iiIi11i1I + ooo000
def IiII ( fstype , mountroot ) :
 oOo = get_mounted_filesystems ( fstype )
 if 75 - 75: Oo . Ooo0Ooo % IiIIii11Ii
 return [ x for x in oOo if x . startswith ( mountroot ) ]
 if 94 - 94: O0OooooOo - Oo % ooo000
 if 74 - 74: Ii + Ooo0Ooo
def iIi1I1I ( ) :
 II1III1I1i = OptionParser ( version = TL_VERSION ,
 usage = "%prog [options]" )
 if 25 - 25: ooo000 * I1Ii1I1 * iI1iI11Ii111 % oOo0O00
 II1III1I1i . add_option ( "-v" , "--verbose" ,
 action = "store_true" ,
 default = False ,
 dest = "verbose" ,
 help = "verbose mode" )
 if 52 - 52: oOo0O00 . I1I + iI1iI11Ii111 - i1iiIII111 % iI1iII1I1I1i
 II1III1I1i . add_option ( "-a" , "--all-users" ,
 action = "store_true" ,
 default = False ,
 dest = "all_users" ,
 help = "unmount all mounted local drives for all users " + "(root required)" )
 if 57 - 57: I1I * IIiIIiIi11I1 % I1Ii1I1 * i1i1i1111I
 if 37 - 37: O0OooooOo * i1i1i1111I + oOo0O00 / I1I / OooOoo
 II1III1I1i . add_option ( "-s" , "--all-sessions" ,
 action = "store_true" ,
 default = False ,
 dest = "all_sessions" ,
 help = "unmount all mounted local drives for all sessions" )
 if 4 - 4: i1
 II1III1I1i . add_option ( "-l" , "--no-adjust-symlink" ,
 action = "store_true" ,
 default = False ,
 dest = "no_symlink" ,
 help = "do not modify the thindrives symbolic link" )
 if 61 - 61: iI1iII1I1I1i . iI1iI11Ii111 - ooo000 / ooo000 - i1
 II1III1I1i . set_argument_completer ( lambda * iIi : CompletionResult ( completions = [ ] , nospace = False ) )
 if 23 - 23: iI1iII1I1I1i % oOO . Oo / OooOoo - I11iiIi11i1I - oOO
 return II1III1I1i
 if 77 - 77: O0OooooOo - I11iiIi11i1I * Ooo0Ooo
 if 71 - 71: IIiIIiIi11I1 / ooOOO - ooOOO / I11iiIi11i1I
def oOo0Oo ( cmd ) :
 with subprocess . Popen ( cmd , universal_newlines = True ,
 # i1iiIII111 + i1i1i1111I % OooOoo
 stdin = subprocess . PIPE ,
 stdout = subprocess . PIPE ,
 stderr = subprocess . STDOUT ) as i1i1iiII :
  i1i1iiII . stdin . close ( )
  i1i1iiII . wait ( )
  OooOO00o = i1i1iiII . stdout . read ( )
  if 98 - 98: IIiIIiIi11I1 - IiIIii11Ii . ooo000 + oOO - oOO
 if OooOO00o :
  print ( OooOO00o , file = sys . stderr )
 return not i1i1iiII . returncode
 if 78 - 78: i1 - ooOOO
 if 56 - 56: ooo000 . ooo000 + I1Ii1I1 * iI1iII1I1I1i
def i111ii1I ( umountcmd , mountpoint , verbose ) :
 if 18 - 18: Ii / ooo000 + I1I + iI1iII1I1I1i
 if verbose :
  if 42 - 42: ooOOO - ooOOO - i1i1i1111I
  print ( "Unmounting" , mountpoint , file = sys . stderr )
 o0oOo0o0ooooo = oOo0Oo ( umountcmd + [ mountpoint ] )
 if not o0oOo0o0ooooo :
  print ( "Using forced and lazy umount" , file = sys . stderr )
  o0oOo0o0ooooo = oOo0Oo ( umountcmd + [ "-f" , "-l" , mountpoint ] )
 return o0oOo0o0ooooo
 if 80 - 80: OooOoo / IIiIIiIi11I1
 if 86 - 86: iI1iI11Ii111
def IIIi1111iiIi1 ( path ) :
 try :
  if 4 - 4: ooo000 % I1I - i1i1i1111I
  if 76 - 76: i1 * oOo0O00 . O0OooooOo * iI1iI11Ii111 . IiIIii11Ii . oOO
  os . rmdir ( path )
 except OSError as oOoo0 :
  print ( "Removal of directory %s failed" % path , file = sys . stderr )
  print ( oOoo0 , file = sys . stderr )
  if 55 - 55: i1i1i1111I + i1iiIII111 % Ooo0Ooo . Oo - IiIIii11Ii - iI1iII1I1I1i
  if 91 - 91: I1Ii1I1 - I11iiIi11i1I
def OO00OOooO ( ) :
 locale . setlocale ( locale . LC_ALL , "" )
 if 58 - 58: iI1iI11Ii111 - O0OooooOo
 OO = prefix . get_tl_prefix ( )
 if 42 - 42: I1I - IiIIii11Ii
 if 34 - 34: O0OooooOo + ooOOO * oOO
 II1III1I1i = iIi1I1I ( )
 if 2 - 2: i1i1i1111I / Ooo0Ooo / oOO - IIiIIiIi11I1 / IIiIIiIi11I1
 ( oOoo00OO0 , iIi ) = II1III1I1i . parse_args ( )
 if 68 - 68: oOO - IiIIii11Ii + iI1iII1I1I1i
 Ooo0oO = oOoo00OO0 . verbose
 ii1II = oOoo00OO0 . all_users
 oOoOo = oOoo00OO0 . all_sessions
 o0oOoo0O0o0Oo = oOoo00OO0 . no_symlink
 if 2 - 2: IIiIIiIi11I1 + iI1iII1I1I1i - I1Ii1I1 + ooOOO . IIiIIiIi11I1
 if iIi :
  II1III1I1i . error ( "program takes no input argument" )
  if 15 - 15: ooo000
 if ii1II :
  o00ooo0Oooo = prefix . get_tl_sessions_root ( )
 else :
  if "USER" in os . environ :
   if 72 - 72: O0OooooOo % i1 % ooo000 % iI1iII1I1I1i
   OOO00o00oo0 = os . environ [ "USER" ]
  else :
   OOO00o00oo0 = pwd . getpwuid ( os . getuid ( ) ) . pw_name
   if 28 - 28: i1i1i1111I * i1 / I1Ii1I1
  if oOoOo :
   o00ooo0Oooo = prefix . get_tl_user_dir ( OOO00o00oo0 )
  else :
   prefix . assert_in_session ( )
   o00ooo0Oooo = prefix . get_tl_session_dir ( )
   if 71 - 71: I1Ii1I1
   if 1 - 1: O0OooooOo - oOo0O00 - i1 . oOo0O00
 if not o0oOoo0O0o0Oo :
  O0o = os . path . join ( os . path . expanduser ( "~" ) , "thindrives" )
  if oOoOo :
   i1ii1 ( O0o )
  else :
   i1Ii1i ( o00ooo0Oooo , O0o )
   if 34 - 34: I1I % Oo - i1 % OooOoo * OooOoo + i1i1i1111I
   if 8 - 8: O0OooooOo + iI1iI11Ii111
 if ii1II :
  OO0 = [ "umount" , "-n" ]
 else :
  OO0 = [ os . path . join ( OO , "libexec" , "tl-umount-personal" ) ]
  if 39 - 39: ooOOO - oOO % iI1iII1I1I1i - O0OooooOo . Ooo0Ooo . i1iiIII111
  if 78 - 78: i1i1i1111I . iI1iI11Ii111 / iI1iI11Ii111
 IiiI11IIi1I = False
 for oOOOO0ooO in IiII ( "nfs" , o00ooo0Oooo ) :
  if not i111ii1I ( OO0 , oOOOO0ooO , Ooo0oO ) :
   IiiI11IIi1I = True
 if IiiI11IIi1I :
  print ( "One or more mounts couldn't be unmounted. Not trying to remove mountpoints." ,
 file = sys . stderr )
  sys . exit ( 1 )
  if 53 - 53: oOo0O00 - ooo000 * Ii % i1i1i1111I - ooOOO + i1iiIII111
  if 15 - 15: Iii1i % oOO * Ooo0Ooo - Ii
 II1IiiI1iII = o00ooo0Oooo
 if oOoOo or ii1II :
  II1IiiI1iII = os . path . join ( II1IiiI1iII , "*" )
 if ii1II :
  II1IiiI1iII = os . path . join ( II1IiiI1iII , "*" )
 II1IiiI1iII = os . path . join ( II1IiiI1iII , "drives" , "*" )
 if 90 - 90: Iii1i . O0OooooOo * I1Ii1I1 / oOo0O00
 for Iii in glob . glob ( II1IiiI1iII ) :
  if os . path . isdir ( Iii ) :
   if Ooo0oO :
    print ( "Removing directory" , Iii , file = sys . stderr )
   IIIi1111iiIi1 ( Iii )
   if 60 - 60: OooOoo
   if 64 - 64: I11iiIi11i1I + ooOOO * IIiIIiIi11I1 - i1 - oOO - OooOoo
if __name__ == "__main__" :
 OO00OOooO ( )
# dd678faae9ac167bc83abf78e5cb2f3f0688d3a3
