#-*- coding: utf-8 -*- # Copyright 2010 Mir Calculate Ltd. http://www.calculate-linux.org # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import os, sys, re, time from cl_utils import pathJoin from cl_print import color_print from encrypt import encrypt from cl_lang import lang lang().setLanguage(sys.modules[__name__]) class _shareData: """Share class""" _reNumb = re.compile("^\d+$") def getDataInFile(self, fileName='', lenData=7): """Get data list from file""" return filter(lambda x: len(x)==lenData, map(lambda x: x.rstrip().split(":"), open(fileName))) class migrateGroups(_shareData): """Migrate group to new system""" maxGid = 65000 minGid = 500 fileGroups = "/etc/group" def __init__(self, prefixNewSystem): self.prefixNewSystem = prefixNewSystem def getData(self, fileName=''): if not fileName: fileName = self.fileGroups return self.getDataInFile(fileName=fileName, lenData=4) def getThisData(self): """Get data migrate groups in this system""" return filter(lambda x:\ self._reNumb.match(x[2]) and self.minGid<=int(x[2])<=self.maxGid, self.getData()) def getNewData(self): """Get data migrate groups in new system""" fileName = pathJoin(self.prefixNewSystem, self.fileGroups) return filter(lambda x:\ self._reNumb.match(x[2]) and self.minGid<=int(x[2])<=self.maxGid, self.getData(fileName=fileName)) def getNewDataSystemGroups(self): """Get data system groups in new system""" fileName = pathJoin(self.prefixNewSystem, self.fileGroups) return filter(lambda x:\ self._reNumb.match(x[2]) and int(x[2])=self.minSysId, self.dataUsers): return True else: # add user guest pwd = "guest" encryptObj = encrypt() pwdHash = encryptObj.getHashPasswd(pwd, "shadow_ssha256") if pwdHash is False: return False self.addUser("guest", pwdHash) return True def migrate(self, addUsersList=[], pwdUsersList=[]): """Migrate users ang groups to new system""" if not self.checkPermFiles(): return False dataGroups = self.objGroups.getNewProcessedData() dataUsers = self.objUsers.getNewProcessedData() newSystemUsers,newUsers,thisUsers = map(lambda x: map(lambda y: y[0],x), dataUsers) objShadow = migrateShadow(newSystemUsers, newUsers, thisUsers, self.prefixNewSystem) dataShadow = objShadow.getNewProcessedData() self.dataGroups = reduce(lambda x,y: x+y, dataGroups, []) self.dataUsers = reduce(lambda x,y: x+y, dataUsers, []) self.dataShadow = reduce(lambda x,y: x+y, dataShadow, []) self.addThisUsersToGroups(thisUsers) for userName, pwdHash in addUsersList: if self.isSystemUser(userName): self.printERROR(_("%s is a system user") %userName) return False self.addUser(userName, pwdHash) for userName, pwdHash, maxDays, warnDays in pwdUsersList: if not self.changePassword(userName, pwdHash, maxDays=maxDays, warnDays=warnDays): return False if not addUsersList: # add user guest if not self.createUserGuest(): return False self.saveNewFiles() return True