0.5.0 2/4

This commit is contained in:
Vyvir
2024-07-19 11:09:36 +03:00
committed by GitHub
parent 69772cd23e
commit 3dd181272d
2 changed files with 152 additions and 229 deletions
+46 -120
View File
@@ -1,105 +1,50 @@
# ⚠️UNMAINTAINED/DEPRECATED⚠️
Currently, we are undergoing the process of privately testing and preparing a V2 release of AltLinux, the current public version (V1) has been deprecated, and is no longer guaranteed to work. We apologize for the inconvenience.
### FAQ
> When will AltLinux V2 be released?
Our team is currently facing some challenges with respect to the release date of V2. Recently, one of our core members became inactive, while we only have one active developer capable of working on the project right now. As a result, the timeline for its launch remains uncertain.
> V1 isn't working, how can I get support?
We no longer provide support for this version of AltLinux. If you need to sideload apps, we recommend using the official AltStore repo for the timebeing, using windows.
> I would like updates/I have a question about AltLinux
Please join [the Discord server](https://discord.gg/DZwRbyXq5Z) and we will be happy to answer any inquiries you may have.
# AltLinux
<img src="https://github.com/i-love-altlinux/AltLinux/blob/main/resources/4.png" alt="AltLinux Logo">
AltLinux is a GUI for AltServer-Linux that allows to easily sideload apps onto an iPhone, an iPad, or an iPod Touch. It supports iOS 12.2 and later.
AltLinux is a GUI for AltServer-Linux that allows to easily sideload apps onto an iPhone, an iPad, or an iPod Touch. It supports iOS 15 and later.
Features:
- A straightforward GUI
- A tray menu that works just like on Windows
- Sideloading AltStore
- Sideloading apps without AltStore
- While the tray icon is present, AltServer runs in the background in tethered mode
- Launching the tray icon on start-up
This app is in a very early state, so if you're experiencing issues or want to help, you can create a [pull request](https://github.com/i-love-altlinux/AltLinux/pulls), [report an issue](https://github.com/i-love-altlinux/AltLinux/issues), or join [the Discord server](https://discord.gg/DZwRbyXq5Z).
The program is in its very early state, so if you're experiencing issues or want to help, you can join [the Discord server](https://discord.gg/DZwRbyXq5Z).
## Instructions
## Install AltLinux
⚠️ (Note: This version of AltLinux is deprecated, we cannot guarentee these instructions will work as intended) ⚠️
### Ubuntu
AltLinux is available for Ubuntu 22.04 and Ubuntu 20.04.
Install the latest version from [releases](https://github.com/i-love-altlinux/AltLinux/releases/latest).
Derivatives, such as Linux Mint and Pop!_ OS should also work. To make sure which DEB package to pick, run the following command:
### Other Linux distributions
#### Dependencies
Ubuntu:
```
python3 --version
sudo apt install software-properties-common
```
| Python 3.10 | Python 3.8 |
|:--------------------:|:-----------------:|
| Ubuntu 22.04 | Ubuntu 20.04 |
| Pop!_OS 22.04 | Pop!_OS 20.04 |
| Linux Mint 21 | Linux Mint 20 |
| elementary OS 7 | elementary OS 6 |
| Zorin OS 17 | Zorin OS 16 |
If you're running Ubuntu 22.04 or any distro based on it (such as Mint 21), install the DEB package [from here](https://github.com/i-love-altlinux/AltLinux/releases).
If you're running Ubuntu 20.04 or any distro based on it (such as Mint 20), run the following commands:
```
sudo add-apt-repository ppa:apandada1/libhandy-1
sudo apt update
sudo apt install libhandy-1-0 libhandy-1-dev
```
Then you can install the DEB package [from here](https://github.com/i-love-altlinux/AltLinux/releases).
If you use Arch Linux, you can use [the AUR package](https://aur.archlinux.org/packages/altlinux).
There is also a [git version](https://aur.archlinux.org/packages/altlinux-git) of AltLinux available as an AUR package.
If you use Fedora, you can [run the script without installing](#run-the-script-without-installing).
## Uninstall AltLinux
If you want to uninstall AltLinux, run the following commands:
```
sudo apt purge altlinux
```
```
sudo rm -rf /usr/lib/altlinux
```
```
rm -rf $HOME/.local/share/altlinux
```
## Run the script without installing
### Ubuntu:
Add the `universe` repository:
```
sudo add-apt-repository universe -y
```
Install the dependencies:
```
sudo apt-get install binutils python3-pip git gir1.2-appindicator3-0.1 usbmuxd libimobiledevice6 libimobiledevice-utils wget curl libavahi-compat-libdnssd-dev zlib1g-dev unzip usbutils
sudo apt-get install binutils python3-pip git gir1.2-appindicator3-0.1 usbmuxd libimobiledevice6 libimobiledevice-utils wget curl libavahi-compat-libdnssd-dev zlib1g-dev unzip usbutils libhandy-1-dev gir1.2-notify-0.7 python3-requests psmisc
```
IF YOU'RE RUNNING UBUNTU 20.04 OR ITS [DERIVATIVES](https://github.com/i-love-altlinux/AltLinux#install-altlinux):
Fedora:
```
sudo add-apt-repository ppa:apandada1/libhandy-1
sudo apt update
sudo apt install libhandy-1-0 libhandy-1-dev
sudo dnf install binutils python3-pip git libappindicator-gtk3 usbmuxd libimobiledevice-devel libimobiledevice-utils wget curl avahi-compat-libdns_sd-devel dnf-plugins-core unzip usbutils psmisc
```
Arch Linux:
```
sudo pacman -S binutils wget curl git python-pip libappindicator-gtk3 usbmuxd libimobiledevice avahi zlib unzip usbutils psmisc
```
Run the following commands:
OpenSUSE:
```
sudo zypper in binutils wget curl git python311-gobject-Gdk libhandy-devel libappindicator3-1 typelib-1_0-AppIndicator3-0_1 imobiledevice-tools libdns_sd libnotify-devel psmisc
```
#### Running AltLinux
Once the dependencies are installed, run the following commands:
```
git clone https://github.com/i-love-altlinux/AltLinux
```
@@ -112,56 +57,28 @@ cd AltLinux
python3 main.py
```
### Fedora:
Install the dependencies:
Note: if you're running OpenSUSE Leap, run the following command instead:
```
sudo dnf install binutils python3-pip git libappindicator-gtk3 usbmuxd libimobiledevice-devel libimobiledevice-utils wget curl avahi-compat-libdns_sd-devel dnf-plugins-core unzip usbutils
```
Run the following commands:
```
git clone https://github.com/i-love-altlinux/AltLinux
```
```
cd AltLinux
```
```
python3 main.py
```
### Arch Linux
Install the dependencies:
```
sudo pacman -S binutils wget curl git python-pip libappindicator-gtk3 usbmuxd libimobiledevice avahi zlib unzip usbutils
```
Run the following commands:
```
git clone https://github.com/i-love-altlinux/AltLinux
```
```
cd AltLinux
```
```
python3 main.py
python3.11 main.py
```
## Compile the DEB package
Feel free to create a [pull request](https://github.com/i-love-altlinux/AltLinux/pulls) or [report an issue](https://github.com/i-love-altlinux/AltLinux/issues).
Add the `universe` repository:
```
sudo apt install software-properties-common
```
```
sudo add-apt-repository universe -y
```
Install the dependencies:
```
sudo apt-get install binutils python3-pip git gir1.2-appindicator3-0.1 usbmuxd libimobiledevice6 libimobiledevice-utils wget curl libavahi-compat-libdnssd-dev zlib1g-dev unzip usbutils
sudo apt-get install binutils python3-pip git gir1.2-appindicator3-0.1 usbmuxd libimobiledevice6 libimobiledevice-utils wget curl libavahi-compat-libdnssd-dev zlib1g-dev unzip usbutils libhandy-1-dev gir1.2-notify-0.7 python3-requests psmisc pipx
```
If you're running Ubuntu 20.04 or any distro based on it (such as Mint 20), run the following commands:
@@ -173,10 +90,16 @@ sudo apt install libhandy-1-0 libhandy-1-dev
Install pyinstaller:
Ubuntu 22.04:
```
pip3 install pyinstaller
```
Ubuntu 24.04:
```
pip3 install pyinstaller --break-system-packages
```
Reboot your computer for changes to take effect.
After that, proceed by running the following commands:
@@ -195,8 +118,11 @@ cd AltLinux
The DEB file is ready! You can install it now.
## Credits
AltLinux made by [vyvir](https://github.com/vyvir)
AltServer-Linux made by [NyaMisty](https://github.com/NyaMisty)
Artwork by [Nebula](https://github.com/itsnebulalol)
Provision by [Dadoum](https://github.com/Dadoum)
Artwork by [Nebula](https://github.com/itsnebulalol)
+106 -109
View File
@@ -3,20 +3,28 @@ import os
import errno
from re import T
from shutil import rmtree
import gi
import json
import urllib.request
from urllib.request import urlopen
import urllib.parse
import requests
import subprocess
import signal
import threading
from time import sleep
# PyGObject
import gi
gi.require_version("Gtk", "3.0")
gi.require_version("Handy", "1")
gi.require_version("AppIndicator3", "0.1")
gi.require_version("Notify", "0.7")
from gi.repository import Gtk, AppIndicator3 as appindicator
try:
gi.require_version("AppIndicator3", "0.1")
from gi.repository import Gtk, AppIndicator3 as appindicator
except ValueError: # Fix for Solus and other Ayatana users
gi.require_version('AyatanaAppIndicator3', '0.1')
from gi.repository import Gtk, AyatanaAppIndicator3 as appindicator
from gi.repository import GLib
from gi.repository import GObject, Handy
from gi.repository import GdkPixbuf
@@ -27,21 +35,20 @@ GObject.type_ensure(Handy.ActionRow)
installedcheck = False
def resource_path(relative_path):
global installedcheck
CheckRun10 = subprocess.run(
f"find /usr/lib/altlinux/altlinux 2>/dev/null >dev/null", shell=True
f"find /usr/lib/altlinux/altlinux > /dev/null 2>&1", shell=True
)
if CheckRun10.returncode == 0:
installedcheck = True
base_path = "/usr/lib/altlinux/altlinux"
base_path = "/usr/lib/altlinux"
else:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
# List of global variables
# Global variables
ermcheck = False # Checks if the IPA path has been defined by user
savedcheck = False
InsAltStore = subprocess.Popen(
@@ -52,12 +59,10 @@ AppleID = "lol"
Password = "lol"
Warnmsg = "warn"
Failmsg = "fail"
file_name = resource_path("resources/1.png")
icon_name = "view-conceal-symbolic.symbolic"
icon_name = "changes-prevent-symbolic"
command_six = Gtk.CheckMenuItem(label="Launch at Login")
AppIcon = resource_path("resources/2.png")
AltServer = "$HOME/.local/share/altlinux/AltServer"
AnisetteServer = "$HOME/.local/share/altlinux/anisette_server"
AnisetteServer = "$HOME/.local/share/altlinux/anisette-server"
AltStore = "$HOME/.local/share/altlinux/AltStore.ipa"
PATH = AltStore
AutoStart = resource_path("resources/AutoStart.sh")
@@ -79,56 +84,24 @@ def connectioncheck():
with open(resource_path("resources/version"), "r", encoding="utf-8") as f:
LocalVersion = f.readline().strip()
def main():
GLib.set_prgname("AltLinux") # Sets the global program name
global altlinuxpath
global file_name
#global file_name
if not os.path.exists(altlinuxpath): # Creates $HOME/.local/share/altlinux
os.mkdir(altlinuxpath)
global installedcheck
command1 = 'echo $XDG_CURRENT_DESKTOP | grep -q "GNOME"' # Check if the current DE is GNOME
CheckRun8 = subprocess.run(command1, shell=True)
if CheckRun8.returncode == 0:
file_name = resource_path("resources/1.png") # If GNOME, use the b&w tray icon
else:
command2 = 'echo $XDG_CURRENT_DESKTOP | grep -q "X-Cinnamon"' # Check if the current DE is Cinnamon
CheckRunLol = subprocess.run(command2, shell=True)
if CheckRunLol.returncode == 0:
file_name = resource_path(
"resources/1.png"
) # If Cinnamon, use the b&w tray icon
else:
file_name = resource_path(
"resources/2.png"
) # If other DE, use a colored tray icon
if CheckRun8.returncode == 1 or (
CheckRun8.returncode == 0 and Gtk.StatusIcon.is_embedded
):
if Gtk.StatusIcon.is_embedded:
if connectioncheck():
global indicator
indicator = appindicator.Indicator.new(
"customtray",
os.path.abspath(file_name),
"altlinux-tray-icon",
resource_path("resources/1.png"),
appindicator.IndicatorCategory.APPLICATION_STATUS,
)
indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
indicator.set_menu(menu())
indicator.set_status(appindicator.IndicatorStatus.PASSIVE)
if (
not os.path.isfile(f"{(altlinuxpath)}/AltServer")
or not os.path.isfile(f"{(altlinuxpath)}/AltStore.ipa")
or not os.path.isfile(f"{(altlinuxpath)}/anisette_server")
):
# If AltServer or AltStore aren't present, show splash screen
openwindow(SplashScreen)
else:
# If AltServer or AltStore are present, don't show splash screen
subprocess.run(
f"""export ALTSERVER_ANISETTE_SERVER='http://127.0.0.1:6969' & {(altlinuxpath)}/AltServer &""",
shell=True,
)
indicator.set_status(appindicator.IndicatorStatus.ACTIVE)
openwindow(SplashScreen)
else:
openwindow(OopsInternet) # Notify the user there is no Internet connection
else:
@@ -199,10 +172,10 @@ def on_abtdlg(self):
)
about.set_logo(pixbuf)
about.set_program_name("AltLinux")
about.set_version("0.4.2-2")
about.set_version("0.5.0")
about.set_authors(
[
"maxasix",
"vyvir",
"AltServer-Linux",
"made by NyaMisty",
"Provision",
@@ -213,7 +186,7 @@ def on_abtdlg(self):
about.set_comments("A GUI for AltServer-Linux written in Python.")
about.set_website("https://github.com/i-love-altlinux/AltLinux")
about.set_website_label("Github")
about.set_copyright("GUI by maxasix")
about.set_copyright("GUI by vyvir")
about.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
about.run()
about.destroy()
@@ -296,20 +269,19 @@ class SplashScreen(Handy.Window):
GLib.timeout_add(200, self.wait_for_t, self.t)
def lol321actualfunction(self):
global installedcheck
self.lbl1.set_text("Checking if anisette_server is already running...")
self.lbl1.set_text("Checking if anisette-server is already running...")
self.loadaltlinux.set_fraction(0.1)
command = 'curl 127.0.0.1:6969 | grep -q "{"'
CheckRun = subprocess.run(command, shell=True)
if not os.path.isfile(f"{(altlinuxpath)}/anisette_server"):
self.lbl1.set_text("Downloading anisette_server...")
if not os.path.isfile(f"{(altlinuxpath)}/anisette-server"):
self.lbl1.set_text("Downloading anisette-server...")
r = requests.get(
"https://github.com/Dadoum/Provision/releases/download/2.1.0/anisette_server-x86_64",
"https://github.com/i-love-altlinux/AltLinux/releases/download/0.5.0/anisette-server-x86_64",
allow_redirects=True,
)
open(f"{(altlinuxpath)}/anisette_server", "wb").write(r.content)
subprocess.run(f"chmod +x {(altlinuxpath)}/anisette_server", shell=True)
subprocess.run(f"chmod 755 {(altlinuxpath)}/anisette_server", shell=True)
open(f"{(altlinuxpath)}/anisette-server", "wb").write(r.content)
subprocess.run(f"chmod +x {(altlinuxpath)}/anisette-server", shell=True)
subprocess.run(f"chmod 755 {(altlinuxpath)}/anisette-server", shell=True)
self.loadaltlinux.set_fraction(0.2)
self.lbl1.set_text("Downloading Apple Music APK...")
r = requests.get(
@@ -330,8 +302,8 @@ class SplashScreen(Handy.Window):
)
silentremove(f"{(altlinuxpath)}/am.apk")
self.loadaltlinux.set_fraction(0.4)
self.lbl1.set_text("Starting anisette_server...")
subprocess.run(f"cd {(altlinuxpath)} && ./anisette_server &", shell=True)
self.lbl1.set_text("Starting anisette-server...")
subprocess.run(f"cd {(altlinuxpath)} && ./anisette-server &", shell=True)#-n 127.0.0.1 -p 6969 &", shell=True)
self.loadaltlinux.set_fraction(0.5)
finished = False
while not finished:
@@ -350,22 +322,22 @@ class SplashScreen(Handy.Window):
open(f"{(altlinuxpath)}/AltServer", "wb").write(r.content)
subprocess.run(f"chmod +x {(altlinuxpath)}/AltServer", shell=True)
subprocess.run(f"chmod 755 {(altlinuxpath)}/AltServer", shell=True)
self.loadaltlinux.set_fraction(0.8)
if not os.path.isfile(f"{(altlinuxpath)}/AltStore.ipa"):
self.lbl1.set_text("Downloading AltStore...")
self.loadaltlinux.set_fraction(0.7)
r = requests.get(
"https://cdn.altstore.io/file/altstore/altstore.ipa",
allow_redirects=True,
)
open(f"{(altlinuxpath)}/AltStore.ipa", "wb").write(r.content)
subprocess.run(f"chmod 755 {(altlinuxpath)}/AltStore.ipa", shell=True)
altstoredownload("Download")
else:
self.lbl1.set_text("Checking latest AltStore version...")
if not altstoredownload("Check"):
self.lbl1.set_text("Downloading new version of AltStore...")
altstoredownload("Download")
self.lbl1.set_text("Starting AltServer...")
self.loadaltlinux.set_fraction(1.0)
subprocess.run(f"{(altlinuxpath)}/AltServer &", shell=True)
return 0
class login(Gtk.Window):
class login(Gtk.Window):#
def __init__(self):
super().__init__(title="Login")
self.present()
@@ -399,12 +371,15 @@ class login(Gtk.Window):
grid.attach(self.entry, 1, 2, 1, 1)
grid.attach_next_to(self.button, self.entry, Gtk.PositionType.RIGHT, 1, 1)
silentremove(f"{(altlinuxpath)}/log.txt")
def on_click_me_clicked1(self):
self.realthread1 = threading.Thread(target=self.onclickmethread)
self.realthread1.start()
GLib.idle_add(self.ermlol)
def on_click_me_clicked(self, button):
silentremove(f"{(altlinuxpath)}/log.txt")
if not os.path.isfile(f"{(altlinuxpath)}/saved.txt"):
self.set_position(Gtk.WindowPosition.CENTER_ALWAYS)
dialog = Gtk.MessageDialog(
@@ -436,21 +411,7 @@ class login(Gtk.Window):
GLib.idle_add(self.ermlol)
def onclickmethread(self):
silentremove(f"{(altlinuxpath)}/ideviceinfo.txt")
subprocess.run(f"ideviceinfo > {(altlinuxpath)}/ideviceinfo.txt", shell=True)
result = "result"
pathsy = f"{(altlinuxpath)}/ideviceinfo.txt"
with open(pathsy) as file:
# Iterate through lines
for line in file.readlines():
# Find the start of the word
index = line.find("ProductVersion: ")
# If the word is inside the line
if index != -1:
result = line[:-1][16:]
silentremove(f"{(altlinuxpath)}/ideviceinfo.txt")
print(result)
if result >= "12.2":
if checkiosver() >= "15.0":
global savedcheck
global AppleID
global Password
@@ -461,20 +422,20 @@ class login(Gtk.Window):
global InsAltStore
print(PATH)
silentremove(f"{(altlinuxpath)}/log.txt")
f = open(f"{(altlinuxpath)}/log.txt", "w")
f.close()
#f = open(f"{(altlinuxpath)}/log.txt", "w")
#f.close()
if os.path.isdir(f'{ os.environ["HOME"] }/.adi'):
rmtree(f'{ os.environ["HOME"] }/.adi')
InsAltStoreCMD = f"""export ALTSERVER_ANISETTE_SERVER='http://127.0.0.1:6969' & {(AltServer)} -u {UDID} -a {AppleID} -p {Password} {PATH} > {("$HOME/.local/share/altlinux/log.txt")}"""
InsAltStoreCMD = f"""export ALTSERVER_ANISETTE_SERVER='http://127.0.0.1:6969' ; {(AltServer)} -u {UDID} -a {AppleID} -p {Password} {PATH} > {("$HOME/.local/share/altlinux/log.txt")}"""
InsAltStore = subprocess.Popen(
InsAltStoreCMD,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
shell=True,
)
else: # If the iOS version is lower than 12.2, AltServer-Linux won't run
else: # If the iOS version is lower than 15.0, AltServer-Linux won't run
global Failmsg
Failmsg = "iOS 12.2 or later is required."
Failmsg = "iOS 15.0 or later is required."
dialog2 = DialogExample3(self)
dialog2.run()
dialog2.destroy()
@@ -593,16 +554,17 @@ class login(Gtk.Window):
def on_icon_toggled(self, widget, icon, event):
global icon_name
if icon_name == "view-conceal-symbolic.symbolic":
icon_name = "view-reveal-symbolic.symbolic"
if icon_name == "changes-prevent-symbolic":
icon_name = "changes-allow-symbolic"
self.entry.set_visibility(True)
elif icon_name == "view-reveal-symbolic.symbolic":
icon_name = "view-conceal-symbolic.symbolic"
elif icon_name == "changes-allow-symbolic":
icon_name = "changes-prevent-symbolic"
self.entry.set_visibility(False)
self.entry.set_icon_from_icon_name(Gtk.EntryIconPosition.SECONDARY, icon_name)
def on_editable_toggled(self, widget):
print("lol")
#
#def on_editable_toggled(self, widget):
# print("lol")
class PairWindow(Handy.Window):
@@ -939,21 +901,10 @@ def notify():
)
if LatestVersion > LocalVersion:
Notify.init("MyProgram")
command2 = 'echo $XDG_CURRENT_DESKTOP | grep -q "GNOME"'
command3 = 'echo $XDG_CURRENT_DESKTOP | grep -q "X-Cinnamon"'
CheckRun9 = subprocess.run(command2, shell=True)
if CheckRun9.returncode == 0:
file_name1 = resource_path("resources/1.png")
else:
CheckRun10 = subprocess.run(command3, shell=True)
if CheckRun10.returncode == 0:
file_name1 = resource_path("resources/1.png")
else:
file_name1 = resource_path("resources/2.png")
n = Notify.Notification.new(
"An update is available!",
"Click 'Download Update' in the tray menu.",
os.path.abspath(file_name1),
resource_path("resources/3.png"),
)
n.set_timeout(Notify.EXPIRES_DEFAULT)
# n.add_action("newupd", "Download", actionCallback)
@@ -967,7 +918,7 @@ def notify():
def showurl(_):
Gtk.show_uri_on_window(
None, "https://github.com/maxasix/AltLinux/releases", Gdk.CURRENT_TIME
None, "https://github.com/i-love-altlinux/AltLinux/releases", Gdk.CURRENT_TIME
)
quitit()
@@ -989,12 +940,13 @@ def restartaltserver(_):
subprocess.run(f"killall {AnisetteServer}", shell=True)
subprocess.run("idevicepair pair", shell=True)
subprocess.run(
f"""export ALTSERVER_ANISETTE_SERVER='http://127.0.0.1:6969' & {(altlinuxpath)}/AltServer &""",
f"""export ALTSERVER_ANISETTE_SERVER='http://127.0.0.1:6969' ; {(altlinuxpath)}/AltServer &""",
shell=True,
)
def winerm():
silentremove(f"{(altlinuxpath)}/log.txt")
dialog = Gtk.MessageDialog(
# transient_for=self,
flags=0,
@@ -1061,6 +1013,51 @@ def silentremove(filename):
if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
raise # re-raise exception if a different error occurred
def altstoredownload(value):
# setting the base URL value
baseUrl = "https://cdn.altstore.io/file/altstore/apps.json"
# retrieving data from JSON Data
json_data = requests.get(baseUrl)
if json_data.status_code == 200:
data = json_data.json()
for app in data['apps']:
if app['name'] == "AltStore":
if value == "Check":
size = app['versions'][0]['size']
return size == os.path.getsize(f'{(altlinuxpath)}/AltStore.ipa')
break
if value == "Download":
latest = app['versions'][0]['downloadURL']
r = requests.get(
latest,
allow_redirects=True,
)
latest_filename = latest.split('/')[-1]
open(f"{(altlinuxpath)}/{(latest_filename)}", "wb").write(r.content)
os.rename(f"{(altlinuxpath)}/{(latest_filename)}", f"{(altlinuxpath)}/AltStore.ipa")
subprocess.run(f"chmod 755 {(altlinuxpath)}/AltStore.ipa", shell=True)
break
return True
else:
return False
def checkiosver():
silentremove(f"{(altlinuxpath)}/ideviceinfo.txt")
subprocess.run(f"ideviceinfo > {(altlinuxpath)}/ideviceinfo.txt", shell=True)
result = "result"
pathsy = f"{(altlinuxpath)}/ideviceinfo.txt"
with open(pathsy) as file:
# Iterate through lines
for line in file.readlines():
# Find the start of the word
index = line.find("ProductVersion: ")
# If the word is inside the line
if index != -1:
result = line[:-1][16:]
silentremove(f"{(altlinuxpath)}/ideviceinfo.txt")
print(result)
return(result)
if __name__ == "__main__":
main()