Add old bump weekly script

This commit is contained in:
Geaaru
2020-10-17 18:25:37 +02:00
parent e2c1cb0d71
commit 8969ecc169
+202
View File
@@ -0,0 +1,202 @@
#!/usr/bin/python
import bz2
import os
import shutil
import subprocess
import sys
import tempfile
import time
sys.path.insert(0, "/usr/lib/entropy/lib")
import entropy.tools
from entropy.db.sqlite import EntropySQLiteRepository
def notify_update(exit_st):
proc = subprocess.Popen(
("/usr/bin/mail", "-s", "sabayon-weekly updated", "root"),
stdin=subprocess.PIPE)
proc.stdin.write("Hello boys and girls, sabayon-weekly has been "
"updated, exit: %d\n" % (exit_st,))
proc.stdin.close()
return proc.wait()
def fault_tolerant_exec(args):
count = 3
while count >= 0:
proc = subprocess.Popen(args)
exit_st = proc.wait()
if exit_st == 0:
return 0
sys.stderr.write("%s failed. retry: %d\n" % (
" ".join(args), exit_st))
time.sleep(60.0)
return 1
def fixup_repository(repository_dir):
print("Repository fixup for %s" % (repository_dir,))
bz2_path = os.path.join(repository_dir, "packages.db.bz2")
db_path = entropy.tools.unpack_bzip2(bz2_path)
repo = EntropySQLiteRepository(
dbFile=db_path,
name="sabayon-weekly",
indexing=False,
skipChecks=True)
updates = repo.listAllTreeUpdatesActions()
new_updates = []
for idupdate, repository, command, branch, date in updates:
if repository == "sabayonlinux.org":
repository = "sabayon-weekly"
new_updates.append(
(idupdate, repository, command, branch, date))
repo.bumpTreeUpdatesActions(new_updates)
repo.clean()
repo.dropAllIndexes()
repo.dropContentSafety()
repo.vacuum()
repo.commit()
# now close, amen
repo.close()
# update packages.db.bz2
f_out = bz2.BZ2File(bz2_path + ".tmp", "wb")
with open(db_path, "rb") as f_in:
data = f_in.read(1024000)
while data:
f_out.write(data)
data = f_in.read(1024000)
f_out.close()
os.rename(bz2_path + ".tmp", bz2_path)
entropy.tools.create_md5_file(bz2_path)
# update packages.db.light.bz2, reopen repo
repo = EntropySQLiteRepository(
dbFile=db_path,
name="sabayon-weekly",
indexing=False,
skipChecks=True)
repo.dropContent()
repo.dropChangelog()
repo.vacuum()
repo.commit()
# update packages.db.dumplight
dumplight_path = os.path.join(repository_dir, "packages.db.dumplight.bz2")
f_out = bz2.BZ2File(dumplight_path + ".tmp", "wb")
repo.exportRepository(f_out)
f_out.close()
os.rename(dumplight_path + ".tmp", dumplight_path)
entropy.tools.create_md5_file(dumplight_path)
# now close, amen
repo.close()
light_path = os.path.join(repository_dir, "packages.db.light.bz2")
f_out = bz2.BZ2File(light_path + ".tmp", "wb")
with open(db_path, "rb") as f_in:
data = f_in.read(1024000)
while data:
f_out.write(data)
data = f_in.read(1024000)
f_out.close()
os.rename(light_path + ".tmp", light_path)
entropy.tools.create_md5_file(light_path)
os.remove(db_path)
# add UPDATE_EAPI=2 to packages.db.webservices
ws_path = os.path.join(repository_dir, "packages.db.webservices")
if os.path.isfile(ws_path):
with open(ws_path, "a+") as ws:
ws.write("\n")
ws.write("UPDATE_EAPI=2\n")
def sync(source_dir, dest_dir, ssh_id):
ionice_args = ["/usr/bin/ionice", "-c", "3"]
rsync_path = "/usr/bin/rsync"
ionice_rsync_path = " ".join(ionice_args) + " " + rsync_path
minimal_rsync_args = [rsync_path, "-avP", "--delay-updates"]
ssh_minimal_args = ["/usr/bin/ssh", "-i", ssh_id,
"-p", "2222"]
remote_host = "entropy@sabayon.org"
remote_dir = "~/standard/sabayon-weekly"
ssh_args = ssh_minimal_args + [remote_host]
base_rsync_params = [
"--exclude", "packages*/*",
"--exclude", "*.asc",
"--delete", "--delete-during",
"--delete-excluded"]
temp_dest_dir = None
try:
# rsync to a staging dir, to fix treeupdates
temp_dest_dir = tempfile.mkdtemp(prefix="update_sabayon_weekly_repo")
args = ionice_args + minimal_rsync_args + [
source_dir + "/", temp_dest_dir + "/"] + base_rsync_params
exit_st = fault_tolerant_exec(args)
if exit_st != 0:
return exit_st
# recreate:
# - packages.db.bz2
# - packages.db.dumplight.bz2
# - packages.db.light.bz2
db_dir = os.path.join(temp_dest_dir, "database")
for arch in os.listdir(db_dir):
arch_dir = os.path.join(db_dir, arch)
if not os.path.isdir(arch_dir):
continue
for branch in os.listdir(arch_dir):
branch_dir = os.path.join(arch_dir, branch)
if not os.path.isdir(branch_dir):
continue
fixup_repository(branch_dir)
# rsync from the staging directory to the final
args = ionice_args + minimal_rsync_args + [
temp_dest_dir + "/", dest_dir + "/"]
exit_st = fault_tolerant_exec(args)
if exit_st != 0:
return exit_st
# create remote directory
args = ssh_args + ["mkdir", "-p", remote_dir]
exit_st = fault_tolerant_exec(args)
if exit_st != 0:
return exit_st
# push the repo to packages.sabayon.org
args = minimal_rsync_args + [
"--rsync-path=%s" % (ionice_rsync_path,),
"--rsh=%s" % (" ".join(ssh_minimal_args),),
dest_dir + "/", remote_host + ":" + remote_dir + "/"]
exit_st = fault_tolerant_exec(args)
if exit_st != 0:
return exit_st
db_dir = os.path.join(dest_dir, "database")
for arch in os.listdir(db_dir):
arch_dir = os.path.join(db_dir, arch)
if not os.path.isdir(arch_dir):
continue
for branch in os.listdir(arch_dir):
branch_dir = os.path.join(arch_dir, branch)
if not os.path.isdir(branch_dir):
continue
weekly_db = os.path.join(
temp_dest_dir, "database", arch,
branch, "packages.db.bz2")
print(
"Doing %s, arch: %s, branch: %s" % (
weekly_db, arch, branch))
remote_weekly_dir = os.path.join(
remote_dir, "database", arch, branch)
remote_weekly_db = os.path.join(
remote_weekly_dir, "packages.db.bz2")
args = minimal_rsync_args + [
"--rsync-path=%s" % (ionice_rsync_path,),
"--rsh=%s" % (" ".join(ssh_minimal_args),),
weekly_db, remote_host + ":" + remote_weekly_db]
exit_st = fault_tolerant_exec(args)
if exit_st != 0:
return exit_st
# final touch to notify the web service
remote_weekly_eapi3_upd = os.path.join(
remote_weekly_dir, "packages.db.eapi3_updates")
args = ssh_args + ["touch", remote_weekly_eapi3_upd]
exit_st = fault_tolerant_exec(args)
if exit_st != 0:
return exit_st
finally:
if temp_dest_dir is not None:
shutil.rmtree(temp_dest_dir, True)
return 0
if __name__ == "__main__":
_base_dir = "/sabayon/rsync/rsync.sabayon.org/entropy/standard"
_source_dir = os.path.join(_base_dir, "sabayonlinux.org")
_dest_dir = os.path.join(_base_dir, "sabayon-weekly")
_ssh_id = "/sabayon/conf/ssh/id_rsa"
_exit_st = sync(_source_dir, _dest_dir, _ssh_id)
notify_update(_exit_st)
raise SystemExit(_exit_st)