mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	* DB : Add support for MySQL 8
- Splits commands to create user and grant access on database, the old
statement is no longer supported by MySQL 8.x
- `NO_AUTO_CREATE_USER` is no longer supported by MySQL 8.x so remove
that from db.properties conn parameters
For mysql-server 8.x setup the following changes were added/tested to
make it work with CloudStack in /etc/mysql/mysql.conf.d/mysqld.cnf and
then restart the mysql-server process:
    server_id = 1
    sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,ERROR_FOR_DIVISION_BY_ZERO,NO_ZERO_DATE,NO_ZERO_IN_DATE,NO_ENGINE_SUBSTITUTION"
    innodb_rollback_on_timeout=1
    innodb_lock_wait_timeout=600
    max_connections=1000
    log-bin=mysql-bin
    binlog-format = 'ROW'
    default-authentication-plugin=mysql_native_password
Notice the last line above, this is to reset the old password based
authentication used by MySQL 5.x.
Developers can set empty password as follows:
    > sudo mysql -u root
    ALTER USER 'root'@'localhost' IDENTIFIED BY '';
In libvirt repository, there are two related commits
2019-08-23 13:13 Daniel P. Berrangé            ● rpm: don't enable socket activation in upgrade if --listen present
2019-08-22 14:52 Daniel P. Berrangé            ● remote: forbid the --listen arg when systemd socket activation
In libvirt.spec.in
        /bin/systemctl mask libvirtd.socket >/dev/null 2>&1 || :
        /bin/systemctl mask libvirtd-ro.socket >/dev/null 2>&1 || :
        /bin/systemctl mask libvirtd-admin.socket >/dev/null 2>&1 || :
        /bin/systemctl mask libvirtd-tls.socket >/dev/null 2>&1 || :
        /bin/systemctl mask libvirtd-tcp.socket >/dev/null 2>&1 || :
Co-authored-by: Wei Zhou <w.zhou@global.leaseweb.com>
Co-authored-by: Abhishek Kumar <abhishek.mrt22@gmail.com>
Co-authored-by: Rohit Yadav <rohit.yadav@shapeblue.com>
		
	
			
		
			
				
	
	
		
			178 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| # Licensed to the Apache Software Foundation (ASF) under one
 | |
| # or more contributor license agreements.  See the NOTICE file
 | |
| # distributed with this work for additional information
 | |
| # regarding copyright ownership.  The ASF licenses this file
 | |
| # to you 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 re
 | |
| import tempfile
 | |
| import shutil
 | |
| from .utilities import bash
 | |
| class configFileOps:
 | |
|     class entry:
 | |
|         def __init__(self, name, value, op, separator):
 | |
|             self.name = name
 | |
|             self.value = value
 | |
|             self.state = "new"
 | |
|             self.op = op
 | |
|             self.separator = separator
 | |
|         def setState(self, state):
 | |
|             self.state = state 
 | |
|         def getState(self):
 | |
|             return self.state
 | |
| 
 | |
|     def __init__(self, fileName, cfg=None):
 | |
|         self.fileName = fileName
 | |
|         self.entries = []
 | |
|         self.backups = []
 | |
|         
 | |
|         if cfg is not None:
 | |
|             cfg.cfoHandlers.append(self)
 | |
| 
 | |
|     def addEntry(self, name, value, separator="="):
 | |
|         e = self.entry(name, value, "add", separator)
 | |
|         self.entries.append(e)
 | |
|     
 | |
|     def rmEntry(self, name, value, separator="="):
 | |
|         entry = self.entry(name, value, "rm", separator)
 | |
|         self.entries.append(entry)
 | |
|     
 | |
|     def getEntry(self, name, separator="="):
 | |
|         try:
 | |
|             ctx = open(self.fileName).read(-1)
 | |
|             match = re.search("^" + name + ".*", ctx, re.MULTILINE)
 | |
|             if match is None:
 | |
|                 return ""
 | |
|             line = match.group(0).split(separator, 1)
 | |
|             return line[1]
 | |
|         except:
 | |
|             return ""
 | |
| 
 | |
|     def save(self):
 | |
|         fp = open(self.fileName, "r")
 | |
|         newLines = []
 | |
|         for line  in fp.readlines():
 | |
|             matched = False
 | |
|             for entry in self.entries:
 | |
|                 if entry.op == "add":
 | |
|                     if entry.separator == "=":
 | |
|                         matchString = "^\ *" + entry.name + ".*"
 | |
|                     elif entry.separator == " ":
 | |
|                         matchString = "^\ *" + entry.name + "\ *" + entry.value
 | |
|                 else:
 | |
|                     if entry.separator == "=":
 | |
|                         matchString = "^\ *" + entry.name + "\ *=\ *" + entry.value
 | |
|                     else:
 | |
|                         matchString = "^\ *" + entry.name + "\ *" + entry.value
 | |
|                 
 | |
|                 match = re.match(matchString, line)
 | |
|                 if match is not None:
 | |
|                     if entry.op == "add" and entry.separator == "=":
 | |
|                         newline = "\n" + entry.name + "=" + entry.value + "\n"
 | |
|                         entry.setState("set")
 | |
|                         newLines.append(newline)
 | |
|                         self.backups.append([line, newline])
 | |
|                         matched = True
 | |
|                         break
 | |
|                     elif entry.op == "rm":
 | |
|                         entry.setState("set")
 | |
|                         self.backups.append([line, None])
 | |
|                         matched = True
 | |
|                         break  
 | |
|                     
 | |
|             if not matched: 
 | |
|                 newLines.append(line)
 | |
| 
 | |
|         for entry in self.entries:
 | |
|             if entry.getState() != "set":
 | |
|                 if entry.op == "add":
 | |
|                     newline = entry.name + entry.separator + entry.value + "\n"
 | |
|                     newLines.append(newline)
 | |
|                     self.backups.append([None, newline])
 | |
|                     entry.setState("set")
 | |
| 
 | |
|         fp.close()
 | |
|         
 | |
|         open(self.fileName, "w").writelines(newLines)
 | |
| 
 | |
|     def replace_line(self, startswith,stanza,always_add=False):
 | |
|         lines = [ s.strip() for s in open(self.fileName).readlines() ]
 | |
|         newlines = []
 | |
|         replaced = False
 | |
|         for line in lines:
 | |
|             if re.search(startswith, line):
 | |
|                 if stanza is not None:
 | |
|                     newlines.append(stanza)
 | |
|                     self.backups.append([line, stanza])
 | |
|                 replaced = True
 | |
|             else: newlines.append(line)
 | |
|         if not replaced and always_add:
 | |
|             newlines.append(stanza)
 | |
|             self.backups.append([None, stanza])
 | |
|         newlines = [ s + '\n' for s in newlines ]
 | |
|         open(self.fileName,"w").writelines(newlines)
 | |
| 
 | |
|     def replace_or_add_line(self, startswith,stanza):
 | |
|         return self.replace_line(startswith,stanza,always_add=True)
 | |
| 
 | |
|     def add_lines(self, lines, addToBackup=True):
 | |
|         fp = open(self.fileName).read(-1) 
 | |
|         sh = re.escape(lines)
 | |
|         match = re.search(sh, fp, re.MULTILINE) 
 | |
|         if match is not None:
 | |
|             return
 | |
|     
 | |
|         fp += lines
 | |
|         open(self.fileName, "w").write(fp)
 | |
|         self.backups.append([None, lines])
 | |
|         
 | |
|     def replace_lines(self, src, dst, addToBackup=True):
 | |
|         fp = open(self.fileName).read(-1) 
 | |
|         sh = re.escape(src)
 | |
|         if dst is None:
 | |
|             dst = ""
 | |
|         repl,nums = re.subn(sh, dst, fp)
 | |
|         if nums <=0:
 | |
|             return
 | |
|         open(self.fileName, "w").write(repl)
 | |
|         if addToBackup:
 | |
|             self.backups.append([src, dst])
 | |
| 
 | |
|     def append_lines(self, match_lines, append_lines):
 | |
|         fp = open(self.fileName).read(-1)
 | |
|         sh = re.escape(match_lines)
 | |
|         match = re.search(sh, fp, re.MULTILINE)
 | |
|         if match is None:
 | |
|             return
 | |
| 
 | |
|         sh = re.escape(append_lines)
 | |
|         if re.search(sh, fp, re.MULTILINE) is not None:
 | |
|             return
 | |
| 
 | |
|         newlines = []
 | |
|         for line in open(self.fileName).readlines():
 | |
|             if re.search(match_lines, line) is not None:
 | |
|                 newlines.append(line + append_lines)
 | |
|                 self.backups.append([line, line + append_lines])
 | |
|             else:
 | |
|                 newlines.append(line)
 | |
| 
 | |
|         open(self.fileName, "w").writelines(newlines)
 | |
|             
 | |
|     def backup(self):
 | |
|         for oldLine, newLine in self.backups:
 | |
|             if newLine is None:
 | |
|                 self.add_lines(oldLine, False)
 | |
|             else:
 | |
|                 self.replace_lines(newLine, oldLine, False)
 |