scripts-github-mirror/net/cm/cm.py

146 lines
4.7 KiB
Python

#!/usr/bin/env python3
import os
import re
import sys
import io
from subprocess import call, Popen, check_output
import time
__author__ = 'ty'
from bs4 import BeautifulSoup
from bs4 import Tag
from cmfile import CMFile
import requests
import json
def sha1_file(file_path):
import hashlib
sha = hashlib.sha1()
with open(file_path, 'rb') as s_f:
while True:
block = s_f.read(2 ** 10) # Magic number: one-megabyte blocks.
if not block:
break
sha.update(block)
return sha.hexdigest()
try:
mode = sys.argv[1]
except IndexError:
mode = "--download"
url = "http://download.cyanogenmod.org"
while True:
cmFiles_dict = {}
cmFiles = []
count = 0
download_dir = "/var/cyanogenmod/"
if os.path.exists("cm.json"):
with open('cm.json') as data_file:
data = json.load(data_file)
for d in data["cmFiles"]:
cmFile = CMFile()
cmFile.url = d["url"]
cmFile.sha1 = d["sha1"]
cmFiles.append(json.JSONDecoder().decode(cmFile.json()))
count += 1
r = requests.get(url, verify=False)
# print(r.text)
soup = BeautifulSoup(r.text)
if mode and (mode == "--list" or mode == "-l"):
td_list = soup.find_all('li', id=re.compile('device_.*'))
print("codename".ljust(20) + "fullname")
for td in td_list:
for content in td.contents[0].contents:
s = ""
if isinstance(content, Tag):
device = content.text.rsplit(' ', 1)
s = device[1].replace('(', '').replace(')', '')
s = s.ljust(20) + device[0]
print(s)
sys.exit(0)
else:
link_list = soup.find_all('a', href=re.compile('/get/jenkins/.*'))
for link in link_list:
if isinstance(link, Tag):
cmFile = CMFile()
cmFile.url = url + link.get('href')
parent = link.parent
if isinstance(parent, Tag):
sha1 = parent.find('small', class_='md5')
sha1 = sha1.text.replace('\n', '').strip().replace('sha1: ', '')
cmFile.sha1 = sha1
s = json.JSONDecoder().decode(cmFile.json())
if s in cmFiles:
print("downloaded, skip")
else:
while int(check_output('ps -ef | grep /root/bypy/bypy.py |grep -v grep |wc -l', shell=True)) >= 3:
print("wait other jobs done...")
time.sleep(3)
# download zip and recovery.img and check hash
print(cmFile.url)
index = cmFile.url.rfind('/')
filename = cmFile.url[index + 1:]
print(filename)
device = ""
if filename.endswith('.img'):
device = filename.replace('-recovery.img', '')
else:
device = filename.replace('.zip', '')
device = device[device.rfind('-') + 1:]
print(device)
out_file = "{}{}/{}".format(download_dir, device, filename)
call("mkdir -p {}{}".format(download_dir, device), shell=True)
call("wget --limit-rate=3000k --progress=dot:binary \"{}\" -O \"{}\" -o \"{}.wget.log\"".
format(cmFile.url, out_file, out_file), shell=True)
if sha1_file(out_file) == cmFile.sha1:
# upload file via bypy
call("sha1sum {} > {}.sha1".format(out_file, out_file), shell=True)
cmFiles.append(s)
count += 1
Popen("./cm.sh {}{} {} {}".format(download_dir, device, filename, device), shell=True)
Popen("./cm.sh {}{} {}.sha1 {}".format(download_dir, device, filename, device), shell=True)
Popen("./cm.sh {}{} {}.wget.log {}".format(download_dir, device, filename, device), shell=True)
else:
print("sha1 not match, continue")
continue
cmFiles_dict["count"] = count
cmFiles_dict["cmFiles"] = cmFiles
with io.open('cm.json', 'w') as f:
json.dump(cmFiles_dict, f, ensure_ascii=False, sort_keys=True, indent=4, separators=(',', ': '))
time.sleep(60)
print("job finished, restart now")