Backport Bitcoin #11881: Remove Python2 support (#2224)

* Merge #11881: Remove Python2 support

1874058 Make base58 python contrib code work with python3 (Evan Klitzke)
bc6fdf2 Change all python files to use Python3 (John Newbery)

Pull request description:

  Following discussion here: https://github.com/bitcoin/bitcoin/pull/11843#issuecomment-351033742

  It's easier for maintainers if all python tools/scripts support only a single version of Python. There are only a few scripts that aren't explicitly python3 at this point, so this PR changes those remaining scripts to explicitly require python3.

Tree-SHA512: 5d38eef6e0fc7d8515e23a1f4c75e8b4160fd0fe23cba52a1f41689b114e54a9e503e0724829e8b41982ef98f2d113df80d9e238213b74f09ceaed0344a19e24

* Merge #12829: Python3 fixup

f50975b [contrib] fixup symbol-check.py Python3 support (John Newbery)
5de2b18 [contrib] fixup security-check.py Python3 support (John Newbery)

Pull request description:

  security-check.py and symbol-check.py were broken by #11881. Fix them.

Tree-SHA512: 86de3d6dc3292b1ae4cc04c2d7d7dbbf39c9270551d7b224b8d8b19e3184c30c897dbf823200403706d06bb405c0decad5cfd690cb2c0312992a235a4ffcf6bf
This commit is contained in:
Alexander Block 2018-08-13 18:07:52 +02:00 committed by UdjinM6
parent 4d3518fe04
commit 7cf9572c26
13 changed files with 135 additions and 142 deletions

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# Copyright (c) 2015 The Bitcoin Core developers # Copyright (c) 2015 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
@ -15,29 +15,29 @@ import re
FOLDER_GREP = 'src' FOLDER_GREP = 'src'
FOLDER_TEST = 'src/test/' FOLDER_TEST = 'src/test/'
CMD_ROOT_DIR = '`git rev-parse --show-toplevel`/%s' % FOLDER_GREP CMD_ROOT_DIR = '`git rev-parse --show-toplevel`/{}'.format(FOLDER_GREP)
CMD_GREP_ARGS = r"egrep -r -I '(map(Multi)?Args(\.count\(|\[)|Get(Bool)?Arg\()\"\-[^\"]+?\"' %s | grep -v '%s'" % (CMD_ROOT_DIR, FOLDER_TEST) CMD_GREP_ARGS = r"egrep -r -I '(map(Multi)?Args(\.count\(|\[)|Get(Bool)?Arg\()\"\-[^\"]+?\"' {} | grep -v '{}'".format(CMD_ROOT_DIR, FOLDER_TEST)
CMD_GREP_DOCS = r"egrep -r -I 'HelpMessageOpt\(\"\-[^\"=]+?(=|\")' %s" % (CMD_ROOT_DIR) CMD_GREP_DOCS = r"egrep -r -I 'HelpMessageOpt\(\"\-[^\"=]+?(=|\")' {}".format(CMD_ROOT_DIR)
REGEX_ARG = re.compile(r'(?:map(?:Multi)?Args(?:\.count\(|\[)|Get(?:Bool)?Arg\()\"(\-[^\"]+?)\"') REGEX_ARG = re.compile(r'(?:map(?:Multi)?Args(?:\.count\(|\[)|Get(?:Bool)?Arg\()\"(\-[^\"]+?)\"')
REGEX_DOC = re.compile(r'HelpMessageOpt\(\"(\-[^\"=]+?)(?:=|\")') REGEX_DOC = re.compile(r'HelpMessageOpt\(\"(\-[^\"=]+?)(?:=|\")')
# list unsupported, deprecated and duplicate args as they need no documentation # list unsupported, deprecated and duplicate args as they need no documentation
SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-blockminsize']) SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-blockminsize'])
def main(): def main():
used = check_output(CMD_GREP_ARGS, shell=True) used = check_output(CMD_GREP_ARGS, shell=True, universal_newlines=True)
docd = check_output(CMD_GREP_DOCS, shell=True) docd = check_output(CMD_GREP_DOCS, shell=True, universal_newlines=True)
args_used = set(re.findall(REGEX_ARG,used)) args_used = set(re.findall(REGEX_ARG,used))
args_docd = set(re.findall(REGEX_DOC,docd)).union(SET_DOC_OPTIONAL) args_docd = set(re.findall(REGEX_DOC,docd)).union(SET_DOC_OPTIONAL)
args_need_doc = args_used.difference(args_docd) args_need_doc = args_used.difference(args_docd)
args_unknown = args_docd.difference(args_used) args_unknown = args_docd.difference(args_used)
print "Args used : %s" % len(args_used) print("Args used : {}".format(len(args_used)))
print "Args documented : %s" % len(args_docd) print("Args documented : {}".format(len(args_docd)))
print "Args undocumented: %s" % len(args_need_doc) print("Args undocumented: {}".format(len(args_need_doc)))
print args_need_doc print(args_need_doc)
print "Args unknown : %s" % len(args_unknown) print("Args unknown : {}".format(len(args_unknown)))
print args_unknown print(args_unknown)
exit(len(args_need_doc)) exit(len(args_need_doc))

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# #
#===- clang-format-diff.py - ClangFormat Diff Reformatter ----*- python -*--===# #===- clang-format-diff.py - ClangFormat Diff Reformatter ----*- python -*--===#
# #
@ -69,10 +69,10 @@ Example usage for git/svn users:
import argparse import argparse
import difflib import difflib
import io
import re import re
import string import string
import subprocess import subprocess
import StringIO
import sys import sys
@ -133,9 +133,9 @@ def main():
['-lines', str(start_line) + ':' + str(end_line)]) ['-lines', str(start_line) + ':' + str(end_line)])
# Reformat files containing changes in place. # Reformat files containing changes in place.
for filename, lines in lines_by_file.iteritems(): for filename, lines in lines_by_file.items():
if args.i and args.verbose: if args.i and args.verbose:
print 'Formatting', filename print('Formatting {}'.format(filename))
command = [binary, filename] command = [binary, filename]
if args.i: if args.i:
command.append('-i') command.append('-i')
@ -143,8 +143,11 @@ def main():
command.append('-sort-includes') command.append('-sort-includes')
command.extend(lines) command.extend(lines)
command.extend(['-style=file', '-fallback-style=none']) command.extend(['-style=file', '-fallback-style=none'])
p = subprocess.Popen(command, stdout=subprocess.PIPE, p = subprocess.Popen(command,
stderr=None, stdin=subprocess.PIPE) stdout=subprocess.PIPE,
stderr=None,
stdin=subprocess.PIPE,
universal_newlines=True)
stdout, stderr = p.communicate() stdout, stderr = p.communicate()
if p.returncode != 0: if p.returncode != 0:
sys.exit(p.returncode) sys.exit(p.returncode)
@ -152,11 +155,11 @@ def main():
if not args.i: if not args.i:
with open(filename) as f: with open(filename) as f:
code = f.readlines() code = f.readlines()
formatted_code = StringIO.StringIO(stdout).readlines() formatted_code = io.StringIO(stdout).readlines()
diff = difflib.unified_diff(code, formatted_code, diff = difflib.unified_diff(code, formatted_code,
filename, filename, filename, filename,
'(before formatting)', '(after formatting)') '(before formatting)', '(after formatting)')
diff_string = string.join(diff, '') diff_string = ''.join(diff)
if len(diff_string) > 0: if len(diff_string) > 0:
sys.stdout.write(diff_string) sys.stdout.write(diff_string)

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# Copyright (c) 2014-2015 The Bitcoin Core developers # Copyright (c) 2014-2015 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
@ -10,7 +10,7 @@ import os
import sys import sys
import subprocess import subprocess
import hashlib import hashlib
from PIL import Image from PIL import Image # pip3 install Pillow
def file_hash(filename): def file_hash(filename):
'''Return hash of raw file contents''' '''Return hash of raw file contents'''
@ -27,7 +27,7 @@ def content_hash(filename):
pngcrush = 'pngcrush' pngcrush = 'pngcrush'
git = 'git' git = 'git'
folders = ["src/qt/res/movies", "src/qt/res/icons", "src/qt/res/icons/crownium", "src/qt/res/icons/drkblue", "src/qt/res/icons/light", "src/qt/res/icons/light-retro", "src/qt/res/icons/trad", "src/qt/res/images", "src/qt/res/images/crownium", "src/qt/res/images/drkblue", "src/qt/res/images/light", "src/qt/res/images/light-retro", "src/qt/res/images/trad", "share/pixmaps"] folders = ["src/qt/res/movies", "src/qt/res/icons", "src/qt/res/icons/crownium", "src/qt/res/icons/drkblue", "src/qt/res/icons/light", "src/qt/res/icons/light-retro", "src/qt/res/icons/trad", "src/qt/res/images", "src/qt/res/images/crownium", "src/qt/res/images/drkblue", "src/qt/res/images/light", "src/qt/res/images/light-retro", "src/qt/res/images/trad", "share/pixmaps"]
basePath = subprocess.check_output([git, 'rev-parse', '--show-toplevel']).rstrip('\n') basePath = subprocess.check_output([git, 'rev-parse', '--show-toplevel'], universal_newlines=True).rstrip('\n')
totalSaveBytes = 0 totalSaveBytes = 0
noHashChange = True noHashChange = True
@ -37,42 +37,40 @@ for folder in folders:
for file in os.listdir(absFolder): for file in os.listdir(absFolder):
extension = os.path.splitext(file)[1] extension = os.path.splitext(file)[1]
if extension.lower() == '.png': if extension.lower() == '.png':
print("optimizing "+file+"..."), print("optimizing {}...".format(file), end =' ')
file_path = os.path.join(absFolder, file) file_path = os.path.join(absFolder, file)
fileMetaMap = {'file' : file, 'osize': os.path.getsize(file_path), 'sha256Old' : file_hash(file_path)} fileMetaMap = {'file' : file, 'osize': os.path.getsize(file_path), 'sha256Old' : file_hash(file_path)}
fileMetaMap['contentHashPre'] = content_hash(file_path) fileMetaMap['contentHashPre'] = content_hash(file_path)
pngCrushOutput = ""
try: try:
pngCrushOutput = subprocess.check_output( subprocess.call([pngcrush, "-brute", "-ow", "-rem", "gAMA", "-rem", "cHRM", "-rem", "iCCP", "-rem", "sRGB", "-rem", "alla", "-rem", "text", file_path],
[pngcrush, "-brute", "-ow", "-rem", "gAMA", "-rem", "cHRM", "-rem", "iCCP", "-rem", "sRGB", "-rem", "alla", "-rem", "text", file_path], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
stderr=subprocess.STDOUT).rstrip('\n')
except: except:
print "pngcrush is not installed, aborting..." print("pngcrush is not installed, aborting...")
sys.exit(0) sys.exit(0)
#verify #verify
if "Not a PNG file" in subprocess.check_output([pngcrush, "-n", "-v", file_path], stderr=subprocess.STDOUT): if "Not a PNG file" in subprocess.check_output([pngcrush, "-n", "-v", file_path], stderr=subprocess.STDOUT, universal_newlines=True):
print "PNG file "+file+" is corrupted after crushing, check out pngcursh version" print("PNG file "+file+" is corrupted after crushing, check out pngcursh version")
sys.exit(1) sys.exit(1)
fileMetaMap['sha256New'] = file_hash(file_path) fileMetaMap['sha256New'] = file_hash(file_path)
fileMetaMap['contentHashPost'] = content_hash(file_path) fileMetaMap['contentHashPost'] = content_hash(file_path)
if fileMetaMap['contentHashPre'] != fileMetaMap['contentHashPost']: if fileMetaMap['contentHashPre'] != fileMetaMap['contentHashPost']:
print "Image contents of PNG file "+file+" before and after crushing don't match" print("Image contents of PNG file {} before and after crushing don't match".format(file))
sys.exit(1) sys.exit(1)
fileMetaMap['psize'] = os.path.getsize(file_path) fileMetaMap['psize'] = os.path.getsize(file_path)
outputArray.append(fileMetaMap) outputArray.append(fileMetaMap)
print("done\n"), print("done")
print "summary:\n+++++++++++++++++" print("summary:\n+++++++++++++++++")
for fileDict in outputArray: for fileDict in outputArray:
oldHash = fileDict['sha256Old'] oldHash = fileDict['sha256Old']
newHash = fileDict['sha256New'] newHash = fileDict['sha256New']
totalSaveBytes += fileDict['osize'] - fileDict['psize'] totalSaveBytes += fileDict['osize'] - fileDict['psize']
noHashChange = noHashChange and (oldHash == newHash) noHashChange = noHashChange and (oldHash == newHash)
print fileDict['file']+"\n size diff from: "+str(fileDict['osize'])+" to: "+str(fileDict['psize'])+"\n old sha256: "+oldHash+"\n new sha256: "+newHash+"\n" print(fileDict['file']+"\n size diff from: "+str(fileDict['osize'])+" to: "+str(fileDict['psize'])+"\n old sha256: "+oldHash+"\n new sha256: "+newHash+"\n")
print "completed. Checksum stable: "+str(noHashChange)+". Total reduction: "+str(totalSaveBytes)+" bytes" print("completed. Checksum stable: "+str(noHashChange)+". Total reduction: "+str(totalSaveBytes)+" bytes")

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# Copyright (c) 2015-2016 The Bitcoin Core developers # Copyright (c) 2015-2016 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
@ -8,7 +8,6 @@ Exit status will be 0 if successful, and the program will be silent.
Otherwise the exit status will be 1 and it will log which executables failed which checks. Otherwise the exit status will be 1 and it will log which executables failed which checks.
Needs `readelf` (for ELF) and `objdump` (for PE). Needs `readelf` (for ELF) and `objdump` (for PE).
''' '''
from __future__ import division,print_function,unicode_literals
import subprocess import subprocess
import sys import sys
import os import os
@ -21,38 +20,38 @@ def check_ELF_PIE(executable):
''' '''
Check for position independent executable (PIE), allowing for address space randomization. Check for position independent executable (PIE), allowing for address space randomization.
''' '''
p = subprocess.Popen([READELF_CMD, '-h', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) p = subprocess.Popen([READELF_CMD, '-h', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True)
(stdout, stderr) = p.communicate() (stdout, stderr) = p.communicate()
if p.returncode: if p.returncode:
raise IOError('Error opening file') raise IOError('Error opening file')
ok = False ok = False
for line in stdout.split(b'\n'): for line in stdout.splitlines():
line = line.split() line = line.split()
if len(line)>=2 and line[0] == b'Type:' and line[1] == b'DYN': if len(line)>=2 and line[0] == 'Type:' and line[1] == 'DYN':
ok = True ok = True
return ok return ok
def get_ELF_program_headers(executable): def get_ELF_program_headers(executable):
'''Return type and flags for ELF program headers''' '''Return type and flags for ELF program headers'''
p = subprocess.Popen([READELF_CMD, '-l', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) p = subprocess.Popen([READELF_CMD, '-l', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True)
(stdout, stderr) = p.communicate() (stdout, stderr) = p.communicate()
if p.returncode: if p.returncode:
raise IOError('Error opening file') raise IOError('Error opening file')
in_headers = False in_headers = False
count = 0 count = 0
headers = [] headers = []
for line in stdout.split(b'\n'): for line in stdout.splitlines():
if line.startswith(b'Program Headers:'): if line.startswith('Program Headers:'):
in_headers = True in_headers = True
if line == b'': if line == '':
in_headers = False in_headers = False
if in_headers: if in_headers:
if count == 1: # header line if count == 1: # header line
ofs_typ = line.find(b'Type') ofs_typ = line.find('Type')
ofs_offset = line.find(b'Offset') ofs_offset = line.find('Offset')
ofs_flags = line.find(b'Flg') ofs_flags = line.find('Flg')
ofs_align = line.find(b'Align') ofs_align = line.find('Align')
if ofs_typ == -1 or ofs_offset == -1 or ofs_flags == -1 or ofs_align == -1: if ofs_typ == -1 or ofs_offset == -1 or ofs_flags == -1 or ofs_align == -1:
raise ValueError('Cannot parse elfread -lW output') raise ValueError('Cannot parse elfread -lW output')
elif count > 1: elif count > 1:
@ -69,9 +68,9 @@ def check_ELF_NX(executable):
have_wx = False have_wx = False
have_gnu_stack = False have_gnu_stack = False
for (typ, flags) in get_ELF_program_headers(executable): for (typ, flags) in get_ELF_program_headers(executable):
if typ == b'GNU_STACK': if typ == 'GNU_STACK':
have_gnu_stack = True have_gnu_stack = True
if b'W' in flags and b'E' in flags: # section is both writable and executable if 'W' in flags and 'E' in flags: # section is both writable and executable
have_wx = True have_wx = True
return have_gnu_stack and not have_wx return have_gnu_stack and not have_wx
@ -88,17 +87,17 @@ def check_ELF_RELRO(executable):
# However, the dynamic linker need to write to this area so these are RW. # However, the dynamic linker need to write to this area so these are RW.
# Glibc itself takes care of mprotecting this area R after relocations are finished. # Glibc itself takes care of mprotecting this area R after relocations are finished.
# See also http://permalink.gmane.org/gmane.comp.gnu.binutils/71347 # See also http://permalink.gmane.org/gmane.comp.gnu.binutils/71347
if typ == b'GNU_RELRO': if typ == 'GNU_RELRO':
have_gnu_relro = True have_gnu_relro = True
have_bindnow = False have_bindnow = False
p = subprocess.Popen([READELF_CMD, '-d', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) p = subprocess.Popen([READELF_CMD, '-d', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True)
(stdout, stderr) = p.communicate() (stdout, stderr) = p.communicate()
if p.returncode: if p.returncode:
raise IOError('Error opening file') raise IOError('Error opening file')
for line in stdout.split(b'\n'): for line in stdout.splitlines():
tokens = line.split() tokens = line.split()
if len(tokens)>1 and tokens[1] == b'(BIND_NOW)' or (len(tokens)>2 and tokens[1] == b'(FLAGS)' and b'BIND_NOW' in tokens[2]): if len(tokens)>1 and tokens[1] == '(BIND_NOW)' or (len(tokens)>2 and tokens[1] == '(FLAGS)' and 'BIND_NOW' in tokens[2]):
have_bindnow = True have_bindnow = True
return have_gnu_relro and have_bindnow return have_gnu_relro and have_bindnow
@ -106,13 +105,13 @@ def check_ELF_Canary(executable):
''' '''
Check for use of stack canary Check for use of stack canary
''' '''
p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True)
(stdout, stderr) = p.communicate() (stdout, stderr) = p.communicate()
if p.returncode: if p.returncode:
raise IOError('Error opening file') raise IOError('Error opening file')
ok = False ok = False
for line in stdout.split(b'\n'): for line in stdout.splitlines():
if b'__stack_chk_fail' in line: if '__stack_chk_fail' in line:
ok = True ok = True
return ok return ok
@ -122,13 +121,13 @@ def get_PE_dll_characteristics(executable):
Returns a tuple (arch,bits) where arch is 'i386:x86-64' or 'i386' Returns a tuple (arch,bits) where arch is 'i386:x86-64' or 'i386'
and bits is the DllCharacteristics value. and bits is the DllCharacteristics value.
''' '''
p = subprocess.Popen([OBJDUMP_CMD, '-x', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) p = subprocess.Popen([OBJDUMP_CMD, '-x', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True)
(stdout, stderr) = p.communicate() (stdout, stderr) = p.communicate()
if p.returncode: if p.returncode:
raise IOError('Error opening file') raise IOError('Error opening file')
arch = '' arch = ''
bits = 0 bits = 0
for line in stdout.split('\n'): for line in stdout.splitlines():
tokens = line.split() tokens = line.split()
if len(tokens)>=2 and tokens[0] == 'architecture:': if len(tokens)>=2 and tokens[0] == 'architecture:':
arch = tokens[1].rstrip(',') arch = tokens[1].rstrip(',')

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# Copyright (c) 2014 Wladimir J. van der Laan # Copyright (c) 2014 Wladimir J. van der Laan
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
@ -11,7 +11,6 @@ Example usage:
find ../gitian-builder/build -type f -executable | xargs python contrib/devtools/symbol-check.py find ../gitian-builder/build -type f -executable | xargs python contrib/devtools/symbol-check.py
''' '''
from __future__ import division, print_function, unicode_literals
import subprocess import subprocess
import re import re
import sys import sys
@ -47,28 +46,28 @@ MAX_VERSIONS = {
# Ignore symbols that are exported as part of every executable # Ignore symbols that are exported as part of every executable
IGNORE_EXPORTS = { IGNORE_EXPORTS = {
b'_edata', b'_end', b'_init', b'__bss_start', b'_fini', b'_IO_stdin_used' '_edata', '_end', '_init', '__bss_start', '_fini', '_IO_stdin_used'
} }
READELF_CMD = os.getenv('READELF', '/usr/bin/readelf') READELF_CMD = os.getenv('READELF', '/usr/bin/readelf')
CPPFILT_CMD = os.getenv('CPPFILT', '/usr/bin/c++filt') CPPFILT_CMD = os.getenv('CPPFILT', '/usr/bin/c++filt')
# Allowed NEEDED libraries # Allowed NEEDED libraries
ALLOWED_LIBRARIES = { ALLOWED_LIBRARIES = {
# bitcoind and bitcoin-qt # bitcoind and bitcoin-qt
b'libgcc_s.so.1', # GCC base support 'libgcc_s.so.1', # GCC base support
b'libc.so.6', # C library 'libc.so.6', # C library
b'libpthread.so.0', # threading 'libpthread.so.0', # threading
b'libanl.so.1', # DNS resolve 'libanl.so.1', # DNS resolve
b'libm.so.6', # math library 'libm.so.6', # math library
b'librt.so.1', # real-time (clock) 'librt.so.1', # real-time (clock)
b'ld-linux-x86-64.so.2', # 64-bit dynamic linker 'ld-linux-x86-64.so.2', # 64-bit dynamic linker
b'ld-linux.so.2', # 32-bit dynamic linker 'ld-linux.so.2', # 32-bit dynamic linker
# bitcoin-qt only # bitcoin-qt only
b'libX11-xcb.so.1', # part of X11 'libX11-xcb.so.1', # part of X11
b'libX11.so.6', # part of X11 'libX11.so.6', # part of X11
b'libxcb.so.1', # part of X11 'libxcb.so.1', # part of X11
b'libfontconfig.so.1', # font support 'libfontconfig.so.1', # font support
b'libfreetype.so.6', # font parsing 'libfreetype.so.6', # font parsing
b'libdl.so.2' # programming interface to dynamic linker 'libdl.so.2' # programming interface to dynamic linker
} }
class CPPFilt(object): class CPPFilt(object):
@ -78,10 +77,10 @@ class CPPFilt(object):
Use a pipe to the 'c++filt' command. Use a pipe to the 'c++filt' command.
''' '''
def __init__(self): def __init__(self):
self.proc = subprocess.Popen(CPPFILT_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE) self.proc = subprocess.Popen(CPPFILT_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True)
def __call__(self, mangled): def __call__(self, mangled):
self.proc.stdin.write(mangled + b'\n') self.proc.stdin.write(mangled + '\n')
self.proc.stdin.flush() self.proc.stdin.flush()
return self.proc.stdout.readline().rstrip() return self.proc.stdout.readline().rstrip()
@ -95,43 +94,43 @@ def read_symbols(executable, imports=True):
Parse an ELF executable and return a list of (symbol,version) tuples Parse an ELF executable and return a list of (symbol,version) tuples
for dynamic, imported symbols. for dynamic, imported symbols.
''' '''
p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True)
(stdout, stderr) = p.communicate() (stdout, stderr) = p.communicate()
if p.returncode: if p.returncode:
raise IOError('Could not read symbols for %s: %s' % (executable, stderr.strip())) raise IOError('Could not read symbols for %s: %s' % (executable, stderr.strip()))
syms = [] syms = []
for line in stdout.split(b'\n'): for line in stdout.splitlines():
line = line.split() line = line.split()
if len(line)>7 and re.match(b'[0-9]+:$', line[0]): if len(line)>7 and re.match('[0-9]+:$', line[0]):
(sym, _, version) = line[7].partition(b'@') (sym, _, version) = line[7].partition('@')
is_import = line[6] == b'UND' is_import = line[6] == 'UND'
if version.startswith(b'@'): if version.startswith('@'):
version = version[1:] version = version[1:]
if is_import == imports: if is_import == imports:
syms.append((sym, version)) syms.append((sym, version))
return syms return syms
def check_version(max_versions, version): def check_version(max_versions, version):
if b'_' in version: if '_' in version:
(lib, _, ver) = version.rpartition(b'_') (lib, _, ver) = version.rpartition('_')
else: else:
lib = version lib = version
ver = '0' ver = '0'
ver = tuple([int(x) for x in ver.split(b'.')]) ver = tuple([int(x) for x in ver.split('.')])
if not lib in max_versions: if not lib in max_versions:
return False return False
return ver <= max_versions[lib] return ver <= max_versions[lib]
def read_libraries(filename): def read_libraries(filename):
p = subprocess.Popen([READELF_CMD, '-d', '-W', filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) p = subprocess.Popen([READELF_CMD, '-d', '-W', filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True)
(stdout, stderr) = p.communicate() (stdout, stderr) = p.communicate()
if p.returncode: if p.returncode:
raise IOError('Error opening file') raise IOError('Error opening file')
libraries = [] libraries = []
for line in stdout.split(b'\n'): for line in stdout.splitlines():
tokens = line.split() tokens = line.split()
if len(tokens)>2 and tokens[1] == b'(NEEDED)': if len(tokens)>2 and tokens[1] == '(NEEDED)':
match = re.match(b'^Shared library: \[(.*)\]$', b' '.join(tokens[2:])) match = re.match('^Shared library: \[(.*)\]$', ' '.join(tokens[2:]))
if match: if match:
libraries.append(match.group(1)) libraries.append(match.group(1))
else: else:
@ -145,18 +144,18 @@ if __name__ == '__main__':
# Check imported symbols # Check imported symbols
for sym,version in read_symbols(filename, True): for sym,version in read_symbols(filename, True):
if version and not check_version(MAX_VERSIONS, version): if version and not check_version(MAX_VERSIONS, version):
print('%s: symbol %s from unsupported version %s' % (filename, cppfilt(sym).decode('utf-8'), version.decode('utf-8'))) print('%s: symbol %s from unsupported version %s' % (filename, cppfilt(sym), version))
retval = 1 retval = 1
# Check exported symbols # Check exported symbols
for sym,version in read_symbols(filename, False): for sym,version in read_symbols(filename, False):
if sym in IGNORE_EXPORTS: if sym in IGNORE_EXPORTS:
continue continue
print('%s: export of symbol %s not allowed' % (filename, cppfilt(sym).decode('utf-8'))) print('%s: export of symbol %s not allowed' % (filename, cppfilt(sym)))
retval = 1 retval = 1
# Check dependency libraries # Check dependency libraries
for library_name in read_libraries(filename): for library_name in read_libraries(filename):
if library_name not in ALLOWED_LIBRARIES: if library_name not in ALLOWED_LIBRARIES:
print('%s: NEEDED library %s is not allowed' % (filename, library_name.decode('utf-8'))) print('%s: NEEDED library %s is not allowed' % (filename, library_name))
retval = 1 retval = 1
exit(retval) exit(retval)

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# Copyright (c) 2014 Wladimir J. van der Laan # Copyright (c) 2014 Wladimir J. van der Laan
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
@ -15,7 +15,6 @@ It will do the following automatically:
TODO: TODO:
- auto-add new translations to the build system according to the translation process - auto-add new translations to the build system according to the translation process
''' '''
from __future__ import division, print_function
import subprocess import subprocess
import re import re
import sys import sys

View File

@ -1,8 +1,7 @@
#!/usr/bin/env python #!/usr/bin/env python3
# Copyright (c) 2013-2015 The Bitcoin Core developers # Copyright (c) 2013-2015 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
from __future__ import division,print_function,unicode_literals
import biplist import biplist
from ds_store import DSStore from ds_store import DSStore
from mac_alias import Alias from mac_alias import Alias

View File

@ -1,5 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
from __future__ import division, print_function, unicode_literals
# #
# Copyright (C) 2011 Patrick "p2k" Schneider <me@p2k-network.org> # Copyright (C) 2011 Patrick "p2k" Schneider <me@p2k-network.org>
# #
@ -203,7 +202,7 @@ def getFrameworks(binaryPath, verbose):
if verbose >= 3: if verbose >= 3:
print("Inspecting with otool: " + binaryPath) print("Inspecting with otool: " + binaryPath)
otoolbin=os.getenv("OTOOL", "otool") otoolbin=os.getenv("OTOOL", "otool")
otool = subprocess.Popen([otoolbin, "-L", binaryPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE) otool = subprocess.Popen([otoolbin, "-L", binaryPath], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
o_stdout, o_stderr = otool.communicate() o_stdout, o_stderr = otool.communicate()
if otool.returncode != 0: if otool.returncode != 0:
if verbose >= 1: if verbose >= 1:
@ -211,7 +210,7 @@ def getFrameworks(binaryPath, verbose):
sys.stderr.flush() sys.stderr.flush()
raise RuntimeError("otool failed with return code %d" % otool.returncode) raise RuntimeError("otool failed with return code %d" % otool.returncode)
otoolLines = o_stdout.decode().split("\n") otoolLines = o_stdout.split("\n")
otoolLines.pop(0) # First line is the inspected binary otoolLines.pop(0) # First line is the inspected binary
if ".framework" in binaryPath or binaryPath.endswith(".dylib"): if ".framework" in binaryPath or binaryPath.endswith(".dylib"):
otoolLines.pop(0) # Frameworks and dylibs list themselves as a dependency. otoolLines.pop(0) # Frameworks and dylibs list themselves as a dependency.
@ -716,22 +715,6 @@ elif config.sign:
if config.dmg is not None: if config.dmg is not None:
#Patch in check_output for Python 2.6
if "check_output" not in dir( subprocess ):
def f(*popenargs, **kwargs):
if 'stdout' in kwargs:
raise ValueError('stdout argument not allowed, it will be overridden.')
process = subprocess.Popen(stdout=subprocess.PIPE, *popenargs, **kwargs)
output, unused_err = process.communicate()
retcode = process.poll()
if retcode:
cmd = kwargs.get("args")
if cmd is None:
cmd = popenargs[0]
raise CalledProcessError(retcode, cmd)
return output
subprocess.check_output = f
def runHDIUtil(verb, image_basename, **kwargs): def runHDIUtil(verb, image_basename, **kwargs):
hdiutil_args = ["hdiutil", verb, image_basename + ".dmg"] hdiutil_args = ["hdiutil", verb, image_basename + ".dmg"]
if "capture_stdout" in kwargs: if "capture_stdout" in kwargs:
@ -749,7 +732,7 @@ if config.dmg is not None:
if not value is True: if not value is True:
hdiutil_args.append(str(value)) hdiutil_args.append(str(value))
return run(hdiutil_args) return run(hdiutil_args, universal_newlines=True)
if verbose >= 2: if verbose >= 2:
if fancy is None: if fancy is None:
@ -791,7 +774,7 @@ if config.dmg is not None:
except subprocess.CalledProcessError as e: except subprocess.CalledProcessError as e:
sys.exit(e.returncode) sys.exit(e.returncode)
m = re.search("/Volumes/(.+$)", output.decode()) m = re.search("/Volumes/(.+$)", output)
disk_root = m.group(0) disk_root = m.group(0)
disk_name = m.group(1) disk_name = m.group(1)

View File

@ -28,7 +28,9 @@ def b58encode(v):
""" """
long_value = 0 long_value = 0
for (i, c) in enumerate(v[::-1]): for (i, c) in enumerate(v[::-1]):
long_value += (256**i) * ord(c) if isinstance(c, str):
c = ord(c)
long_value += (256**i) * c
result = '' result = ''
while long_value >= __b58base: while long_value >= __b58base:
@ -41,7 +43,7 @@ def b58encode(v):
# leading 0-bytes in the input become leading-1s # leading 0-bytes in the input become leading-1s
nPad = 0 nPad = 0
for c in v: for c in v:
if c == '\0': nPad += 1 if c == 0: nPad += 1
else: break else: break
return (__b58chars[0]*nPad) + result return (__b58chars[0]*nPad) + result
@ -50,8 +52,10 @@ def b58decode(v, length = None):
""" decode v into a string of len bytes """ decode v into a string of len bytes
""" """
long_value = 0 long_value = 0
for (i, c) in enumerate(v[::-1]): for i, c in enumerate(v[::-1]):
long_value += __b58chars.find(c) * (__b58base**i) pos = __b58chars.find(c)
assert pos != -1
long_value += pos * (__b58base**i)
result = bytes() result = bytes()
while long_value >= 256: while long_value >= 256:
@ -62,10 +66,12 @@ def b58decode(v, length = None):
nPad = 0 nPad = 0
for c in v: for c in v:
if c == __b58chars[0]: nPad += 1 if c == __b58chars[0]:
else: break nPad += 1
continue
break
result = chr(0)*nPad + result result = bytes(nPad) + result
if length is not None and len(result) != length: if length is not None and len(result) != length:
return None return None

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# Copyright (c) 2012 The Bitcoin Core developers # Copyright (c) 2012 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
@ -46,8 +46,8 @@ def is_valid(v):
if result is None: if result is None:
return False return False
for template in templates: for template in templates:
prefix = str(bytearray(template[0])) prefix = bytearray(template[0])
suffix = str(bytearray(template[2])) suffix = bytearray(template[2])
if result.startswith(prefix) and result.endswith(suffix): if result.startswith(prefix) and result.endswith(suffix):
if (len(result) - len(prefix) - len(suffix)) == template[1]: if (len(result) - len(prefix) - len(suffix)) == template[1]:
return True return True
@ -57,20 +57,23 @@ def gen_valid_vectors():
'''Generate valid test vectors''' '''Generate valid test vectors'''
while True: while True:
for template in templates: for template in templates:
prefix = str(bytearray(template[0])) prefix = bytearray(template[0])
payload = os.urandom(template[1]) payload = bytearray(os.urandom(template[1]))
suffix = str(bytearray(template[2])) suffix = bytearray(template[2])
rv = b58encode_chk(prefix + payload + suffix) rv = b58encode_chk(prefix + payload + suffix)
assert is_valid(rv) assert is_valid(rv)
metadata = dict([(x,y) for (x,y) in zip(metadata_keys,template[3]) if y is not None]) metadata = {x: y for x, y in zip(metadata_keys,template[3]) if y is not None}
yield (rv, b2a_hex(payload), metadata) hexrepr = b2a_hex(payload)
if isinstance(hexrepr, bytes):
hexrepr = hexrepr.decode('utf8')
yield (rv, hexrepr, metadata)
def gen_invalid_vector(template, corrupt_prefix, randomize_payload_size, corrupt_suffix): def gen_invalid_vector(template, corrupt_prefix, randomize_payload_size, corrupt_suffix):
'''Generate possibly invalid vector''' '''Generate possibly invalid vector'''
if corrupt_prefix: if corrupt_prefix:
prefix = os.urandom(1) prefix = os.urandom(1)
else: else:
prefix = str(bytearray(template[0])) prefix = bytearray(template[0])
if randomize_payload_size: if randomize_payload_size:
payload = os.urandom(max(int(random.expovariate(0.5)), 50)) payload = os.urandom(max(int(random.expovariate(0.5)), 50))
@ -80,7 +83,7 @@ def gen_invalid_vector(template, corrupt_prefix, randomize_payload_size, corrupt
if corrupt_suffix: if corrupt_suffix:
suffix = os.urandom(len(template[2])) suffix = os.urandom(len(template[2]))
else: else:
suffix = str(bytearray(template[2])) suffix = bytearray(template[2])
return b58encode_chk(prefix + payload + suffix) return b58encode_chk(prefix + payload + suffix)

View File

@ -86,6 +86,11 @@ See detailed [change log](https://github.com/dashpay/dash/compare/v0.12.3.1...da
- [`f833e2ed6`](https://github.com/dashpay/dash/commit/f833e2ed6) Bump to 0.12.3.2 (#2173) - [`f833e2ed6`](https://github.com/dashpay/dash/commit/f833e2ed6) Bump to 0.12.3.2 (#2173)
Python Support
--------------
Support for Python 2 has been discontinued for all test files and tools.
Credits Credits
======= =======

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python #!/usr/bin/env python3
# Copyright (c) 2012-2016 The Bitcoin Core developers # Copyright (c) 2012-2016 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
@ -6,7 +6,6 @@
Extract _("...") strings for translation and convert to Qt stringdefs so that Extract _("...") strings for translation and convert to Qt stringdefs so that
they can be picked up by Qt linguist. they can be picked up by Qt linguist.
''' '''
from __future__ import division,print_function,unicode_literals
from subprocess import Popen, PIPE from subprocess import Popen, PIPE
import operator import operator
import os import os

View File

@ -1,4 +1,4 @@
#!/usr/bin/env python2 #!/usr/bin/env python3
# Copyright (c) 2015 The Bitcoin Core developers # Copyright (c) 2015 The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.