diff --git a/tools/donate-cpu-server.py b/tools/donate-cpu-server.py new file mode 100644 index 000000000..6dcb2e750 --- /dev/null +++ b/tools/donate-cpu-server.py @@ -0,0 +1,59 @@ + +# Server for 'donate-cpu.py' + +import os +import socket +import re + +resultPath = os.path.expanduser('~/donated-results') + +f = open('packages.txt', 'rt') +packages = f.readlines() +f.close() + +print('packages:'+str(len(packages))) + +if len(packages) == 0: + print('fatal: there are no packages') + sys.exit(1) + +packageIndex = 0 + +sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +server_address = ('', 8000) +sock.bind(server_address) + +sock.listen(1) + +while True: + # wait for a connection + print 'waiting for a connection' + connection, client_address = sock.accept() + + try: + cmd = connection.recv(16) + if cmd=='get\n': + connection.sendall(packages[packageIndex].strip()) + packageIndex += 1 + if packageIndex >= len(packages): + packageIndex = 0 + elif cmd.startswith('write\n'): + data = cmd[6:] + while True: + d = connection.recv(1024) + if d: + data += d + else: + break + pos = data.find('\n') + if data.startswith('ftp://') and pos > 10: + url = data[:pos] + res = re.match(r'ftp://.*pool/main/[^/]+/([^/]+)/[^/]*tar.gz',url) + if res and (url+'\n' in packages): + f = open(resultPath + '/' + res.group(1), 'wt') + f.write(data[pos+1:]) + f.close() + + finally: + connection.close() + diff --git a/tools/donate-cpu.py b/tools/donate-cpu.py new file mode 100644 index 000000000..559219256 --- /dev/null +++ b/tools/donate-cpu.py @@ -0,0 +1,113 @@ +# Donate CPU +# +# A script a user can run to donate CPU to cppcheck project +# +# 1. Check requirements +# 2. Pull & compile Cppcheck +# 3. Select a package +# 4. Download package +# 5. Analyze source code +# 6. Upload results +# 7. Repeat from step 2 + +import shutil +import glob +import os +import subprocess +import sys +import socket +import time + +def checkRequirements(): + result = True + for app in ['g++', 'git', 'make', 'wget', 'tar']: + try: + subprocess.call([app, '--version']) + except OSError: + print(app + ' is required') + result = False + return result + +def getCppcheck(workPath): + print('Get Cppcheck..') + cppcheckPath = workPath + '/cppcheck' + if os.path.exists(cppcheckPath): + os.chdir(cppcheckPath) + subprocess.call(['git', 'checkout', '-f']) + subprocess.call(['git', 'pull']) + else: + subprocess.call(['git', 'clone', 'http://github.com/danmar/cppcheck.git', cppcheckPath]) + +def compile(cppcheckPath): + print('Compiling Cppcheck..') + subprocess.call(['make', 'SRCDIR=build', 'CXXFLAGS=-O2']) + +def getPackage(): + print('Connecting to server to get assigned work..') + package = None + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_address = ('cppcheck.osuosl.org', 8000) + sock.connect(server_address) + try: + sock.sendall('get\n') + package = sock.recv(256) + finally: + sock.close() + return package + +def wget(url, destfile): + subprocess.call( + ['wget', '--tries=10', '--timeout=300', '-O', destfile, url]) + if os.path.isfile(destfile): + return True + print('Sleep for 10 seconds..') + time.sleep(10) + return False + +def scanPackage(workPath, package): + print('Download package ' + package) + destfile = workPath + '/temp.tgz' + if not wget(package, destfile): + if not wget(filepath, destfile): + return None + print('Unpacking..') + tempPath = workPath + '/temp' + subprocess.call(['rm', '-rf', tempPath]) + os.mkdir(tempPath) + os.chdir(tempPath) + subprocess.call(['tar', 'xzvf', destfile]) + os.chdir(workPath) + print('Analyze..') + cmd = 'nice ' + workPath + '/cppcheck/cppcheck -D__GCC__ --enable=style --library=posix --platform=unix64 --template=daca2 -rp=temp temp' + print(cmd) + p = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE) + comm = p.communicate() + return comm[1] + +def uploadResults(package, results): + print('Uploading results..') + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + server_address = ('cppcheck.osuosl.org', 8000) + sock.connect(server_address) + try: + sock.sendall('write\n' + package + '\n' + results) + finally: + sock.close() + return package + + +print('Thank you!') +if not checkRequirements(): + sys.exit(1) +workpath = os.path.expanduser('~/cppcheck-donate-cpu-workfolder') +if not os.path.exists(workpath): + os.mkdir(workpath) +cppcheckPath = workpath + '/cppcheck' +while True: + getCppcheck(workpath) + compile(cppcheckPath) + package = getPackage() + results = scanPackage(workpath, package) + if results: + uploadResults(package, results) + break