@ -22,13 +22,16 @@ import pwd
import time
import traceback
from calculate . desktop . _cl_keys import getKey , clearKey
from datavars import DataVarsDesktop , DataVars , __version__ , __app__
from calculate . lib . cl_template import Template , ProgressTemplate , TemplatesError
from calculate . lib . cl_template import ( Template , ProgressTemplate ,
TemplatesError , templateFunction , iniParser )
from calculate . lib . utils . files import runOsCommand , isMount , process , \
getRunCommands
getRunCommands , STDOUT
from calculate . lib . utils . common import getpathenv , appendProgramToEnvFile , \
removeProgramToEnvFile
removeProgramToEnvFile , mountEcryptfs , \
CommonError
from calculate . core . server . func import safetyWrapper
from calculate . lib . cl_lang import setLocalTranslate , getLazyLocalTranslate
@ -54,7 +57,31 @@ class Desktop:
self . clTempl = None
self . clVars = None
def createUserDir ( self , uid , gid , userDir , mode = 0700 ) :
def createCryptDir ( self , userName , uid , gud , userDir ) :
"""
Создать шифрование домашней директории , или подключить существующую
"""
userPwd = getKey ( userName )
if not userPwd or userPwd == " XXXXXXXX " :
raise DesktopError ( _ ( " User password not found " ) )
ecryptfsPath = path . join ( ' /home/.ecryptfs ' , userName )
if path . exists ( ecryptfsPath ) :
for d in ( " .ecryptfs " , " .Private " ) :
source , target = path . join ( ecryptfsPath , d ) , path . join ( userDir , d )
if not path . lexists ( target ) :
os . symlink ( source , target )
try :
if not mountEcryptfs ( userName , userPwd , userDir ) :
raise DesktopError ( _ ( " Failed to mount ecrypt " ) )
except CommonError as e :
raise DesktopError ( _ ( " Failed to mount ecrypt " ) + " : \" %s \" " % str ( e ) )
else :
e = process ( ' /usr/bin/ecryptfs-setup-private ' , ' -u ' , userName , ' -b ' , ' -l ' , userPwd , stderr = STDOUT )
if e . failed ( ) :
raise DesktopError ( e . read ( ) +
_ ( " Failed to create encrypt user profile " ) )
def createUserDir ( self , userName , uid , gid , userDir , mode = 0700 ) :
"""
Create user directory with need uid and gid
"""
@ -135,7 +162,7 @@ class Desktop:
break
return ret
@safetyWrapper ( native_errors = ( TemplatesError , DesktopError ),
@safetyWrapper ( native_errors = ( TemplatesError , DesktopError ,CommonError ),
man_int = __ ( " Configuration manually interrupted " ) ,
post_action = umountUserRes )
def createHome ( self , datavars = None ) :
@ -171,17 +198,28 @@ class Desktop:
self . homeDir = path . join ( rootPath , self . homeDir [ 1 : ] )
if not path . exists ( self . homeDir ) :
self . startTask ( _ ( " Creating the home directory for %s " ) % self . homeDir )
self . createUserDir ( uid , gid , self . homeDir )
self . createUserDir ( userName , uid , gid , self . homeDir )
self . endTask ( )
if self . clVars . Get ( ' ur_home_crypt_set ' ) == ' on ' :
self . createCryptDir ( userName , uid , gid , self . homeDir )
domainUser = self . clVars . Get ( ' ur_domain_set ' ) == ' on '
lastTimestamp = templateFunction . getLastElog ( )
iniEnv = path . join ( self . homeDir , ' .calculate/ini.env ' )
userIni = iniParser ( iniEnv )
userTimestamp = userIni . getVar ( ' main ' , ' elog ' ) . encode ( ' utf-8 ' )
if ( domainUser or not path . exists ( iniEnv ) or
userTimestamp != lastTimestamp ) :
# action - "user profile configuration"
self . clVars . Set ( " cl_action " , " desktop " , True )
# apply user profiles
self . startTask ( _ ( " Setting up the user profile " ) , progress = True )
dirsAndFiles = self . applyTemplatesFromUser ( )
self . endTask ( )
# action - "user profile configuration"
self . clVars . Set ( " cl_action " , " desktop " , True )
# apply user profiles
self . startTask ( _ ( " Setting up the user profile " ) , progress = True )
dirsAndFiles = self . applyTemplatesFromUser ( )
self . endTask ( )
if not dirsAndFiles :
raise DesktopError ( _ ( " Failed to apply user profile templates " ) )
self . printSUCCESS ( _ ( " User account %s is configured " ) % userName + " ... " )
if not dirsAndFiles :
raise DesktopError ( _ ( " Failed to apply user profile templates " ) )
self . printSUCCESS ( _ ( " User account %s is configured " ) % userName + " ... " )
return True
def getMountUserPaths ( self , homeDir = False ) :