def doit(self, tarball): """ really restore data """ # create full path fullpath = re.sub('\.tar\.bzip2', '', tarball) # noqa topath = Path(fullpath).absolute() # untar Backup print("\nExtracting tarball ... in progress ...") if os.path.isdir(fullpath) is False: #tar -xf $HOME/etc.backup.tar -C /tmp/data #-C extract to Dir os.system("mkdir -p %s" % fullpath) cmd = "tar xfj %s -C %s" % (tarball, topath) os.system(cmd) print("done ...") else: print("Tarball is already extracted ... skipping ...") files = self.search_files(fullpath, "*.sql") if self.debug is False: for f in files: print("Importing %s ..." % os.path.basename(f)) filename, file_extension = os.path.splitext( os.path.basename(f)) # noqa dbname = filename # first drop DB self.doMySQL("DROP DATABASE IF EXISTS %s;" % dbname) # create DB new self.doMySQL("CREATE DATABASE %s;" % dbname) sleep(0.5) # now import new one cmd = "mysql --defaults-extra-file=%s %s < %s" % ( self.extrafile, dbname, f) os.system(cmd) # change to InnoDB #self.doMySQL("ALTER TABLE mysql.db ENGINE=InnoDB;") #self.doMySQL("ALTER TABLE mysql.columns_priv ENGINE=InnoDB;") # restoring User Privileges # read yaml File path = os.path.join(fullpath, 'users.yaml') with open(path, 'rt') as f: users = yaml.safe_load(f.read()) self.Users = [] for block in users.values(): u = User() for k, v in block.items(): if k in "username": u.set_username(v) if k in "hosts": u.set_hosts(v) if k in "pwd": u.set_pwd(v) if k in "privs": u.set_privileges(v) self.Users.append(u) for u in self.Users: print("Creating User: %s" % u.get_username()) # delete user if exists self.doMySQL("DROP USER IF EXISTS \"%s\"@\"%s\";" % (u.get_username(), u.get_hosts())) self.doMySQL("CREATE USER \"%s\"@\"%s\" IDENTIFIED BY \"%s\";" % (u.get_username(), u.get_hosts(), u.get_pwd())) self.doMySQL( "ALTER USER \"%s\"@\"%s\" IDENTIFIED WITH mysql_native_password BY \"%s\";" % (u.get_username(), u.get_hosts(), u.get_pwd())) for p in u.get_privileges(): # replace ' with " p = re.sub('\'', '"', p) # noqa self.doMySQL(p) self.doMySQL("FLUSH PRIVILEGES;")
def backupUsers(self): """ backup Users and Privileges to a yaml file """ self.Users = [] runner = CmdRunner() cmd = "mysql --defaults-extra-file=%s -e 'SELECT host,user,authentication_string FROM mysql.user;'" % self.extrafile runner.runCmd(cmd) errors = runner.getStderr() if errors: print(errors) userdata = runner.getLines() # remove first line userdata.pop(0) for line in userdata: if line: parts = line.split() username = parts[1] if username not in [ "root", "debian-sys-maint", "mysql.sys", "mysql.session" ]: u = User() u.set_hosts(parts[0]) u.set_username(parts[1]) u.set_pwd(parts[2]) self.Users.append(u) # now get Privileges for u in self.Users: # all hosts cmd = "mysql --defaults-extra-file=%s -e \"SHOW GRANTS FOR '%s'@'%s';\"" % ( self.extrafile, u.get_username(), "%") runner.runCmd(cmd) errors = runner.getStderr() userdata = runner.getLines() # remove first element, only info userdata.pop(0) for line in userdata: if "error" not in line.lower(): if len(line) > 0: u.add_privilege(line) # localhost cmd = "mysql --defaults-extra-file=%s -e \"SHOW GRANTS FOR '%s'@'localhost';\"" % ( self.extrafile, u.get_username()) runner.runCmd(cmd) errors = runner.getStderr() userdata = runner.getLines() # remove first element, only info userdata.pop(0) for line in userdata: if "error" not in line.lower(): if len(line) > 0: u.add_privilege(line) # create yAMl File dict_file = {} for u in self.Users: data = {} data['privs'] = u.get_privileges() data['username'] = u.get_username() data['hosts'] = u.get_hosts() data['pwd'] = u.get_pwd() dict_file[u.get_username()] = data path = os.path.join(self.backup_path, self.thisbackup_path, 'users.yaml') with open(path, 'w') as file: documents = yaml.dump(dict_file, file) # noqa