forgejoupdate.py
· 2.3 KiB · Python
原始文件
# HOW TO USE THIS SCRIPT
# download this file and run
# python3 forgejoupdate.py
#
# If you aren't root, use sudo or doas.
#
# If you use an init system to run Forgejo, you can let this script automatically restart Forgejo for you
# (Assuming Forgejo's service name is `forgejo`)
# By passsing the arguments `systemd` or `openrc`
#
# python3 forgejoupdate.py systemd
from tqdm import tqdm
import requests
import subprocess
import sys
import hashlib
import os
import stat
print("Checking latest version...")
req = requests.get("https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest").json()
latest = req["tag_name"][1:]
download = ""
sha = ""
for asset in req["assets"]:
if asset["name"] == f"forgejo-{latest}-linux-amd64":
download = asset["browser_download_url"]
if asset["name"] == f"forgejo-{latest}-linux-amd64.sha256":
sha = requests.get(asset["browser_download_url"]).content.decode().strip().split(" ")[0]
print(f"Latest: {latest}")
print(f"Download Exists: {download != ''}")
print(f"Checksum Exists: {sha != ''}")
# 5
try:
current = subprocess.run(["forgejo", "-v"], stdout=subprocess.PIPE).stdout.decode().strip().split(" ")[5][:-1]
except:
current = 0
print(f"Current: {current if current != 0 else 'Not installed!'}")
if current == latest:
print("No need to update.")
sys.exit()
print("Downloading latest version...")
response = requests.get(download, stream=True)
total_size = int(response.headers.get("content-length", 0))
block_size = 1024
h = hashlib.sha256()
with tqdm(total=total_size, unit="B", unit_scale=True, leave=False) as progress_bar:
with open("forgejo.part", "wb") as file:
for data in response.iter_content(block_size):
progress_bar.update(len(data))
file.write(data)
h.update(data)
if sha != h.hexdigest():
print(f"ERROR: SHA256 doesn't match! {hex} ≠ {h.hexdigest()}")
os.remove("forgejo.part")
sys.exit(1)
else:
print("Checksum verify success!")
os.chmod("forgejo.part", stat.S_IXOTH | stat.S_IROTH | stat.S_IWUSR)
os.rename("forgejo.part", "/usr/local/bin/forgejo")
if len(sys.argv) == 2:
print("Restarting...")
if sys.argv[1] == "systemd":
os.system("systemctl restart forgejo")
elif sys.argv[1] == "openrc":
os.system("rc-service forgejo restart")
1 | # HOW TO USE THIS SCRIPT |
2 | # download this file and run |
3 | # python3 forgejoupdate.py |
4 | # |
5 | # If you aren't root, use sudo or doas. |
6 | # |
7 | # If you use an init system to run Forgejo, you can let this script automatically restart Forgejo for you |
8 | # (Assuming Forgejo's service name is `forgejo`) |
9 | # By passsing the arguments `systemd` or `openrc` |
10 | # |
11 | # python3 forgejoupdate.py systemd |
12 | |
13 | from tqdm import tqdm |
14 | import requests |
15 | import subprocess |
16 | import sys |
17 | import hashlib |
18 | import os |
19 | import stat |
20 | print("Checking latest version...") |
21 | req = requests.get("https://codeberg.org/api/v1/repos/forgejo/forgejo/releases/latest").json() |
22 | latest = req["tag_name"][1:] |
23 | download = "" |
24 | sha = "" |
25 | for asset in req["assets"]: |
26 | if asset["name"] == f"forgejo-{latest}-linux-amd64": |
27 | download = asset["browser_download_url"] |
28 | if asset["name"] == f"forgejo-{latest}-linux-amd64.sha256": |
29 | sha = requests.get(asset["browser_download_url"]).content.decode().strip().split(" ")[0] |
30 | |
31 | print(f"Latest: {latest}") |
32 | print(f"Download Exists: {download != ''}") |
33 | print(f"Checksum Exists: {sha != ''}") |
34 | |
35 | # 5 |
36 | try: |
37 | current = subprocess.run(["forgejo", "-v"], stdout=subprocess.PIPE).stdout.decode().strip().split(" ")[5][:-1] |
38 | except: |
39 | current = 0 |
40 | print(f"Current: {current if current != 0 else 'Not installed!'}") |
41 | if current == latest: |
42 | print("No need to update.") |
43 | sys.exit() |
44 | |
45 | print("Downloading latest version...") |
46 | |
47 | response = requests.get(download, stream=True) |
48 | |
49 | total_size = int(response.headers.get("content-length", 0)) |
50 | block_size = 1024 |
51 | |
52 | h = hashlib.sha256() |
53 | |
54 | with tqdm(total=total_size, unit="B", unit_scale=True, leave=False) as progress_bar: |
55 | with open("forgejo.part", "wb") as file: |
56 | for data in response.iter_content(block_size): |
57 | progress_bar.update(len(data)) |
58 | file.write(data) |
59 | h.update(data) |
60 | |
61 | if sha != h.hexdigest(): |
62 | print(f"ERROR: SHA256 doesn't match! {hex} ≠ {h.hexdigest()}") |
63 | os.remove("forgejo.part") |
64 | sys.exit(1) |
65 | else: |
66 | print("Checksum verify success!") |
67 | |
68 | os.chmod("forgejo.part", stat.S_IXOTH | stat.S_IROTH | stat.S_IWUSR) |
69 | |
70 | os.rename("forgejo.part", "/usr/local/bin/forgejo") |
71 | |
72 | if len(sys.argv) == 2: |
73 | print("Restarting...") |
74 | if sys.argv[1] == "systemd": |
75 | os.system("systemctl restart forgejo") |
76 | elif sys.argv[1] == "openrc": |
77 | os.system("rc-service forgejo restart") |
78 |