Skip to content

Instantly share code, notes, and snippets.

@ibrohimislam
Created May 3, 2023 11:07
Show Gist options
  • Save ibrohimislam/345b087c69bd70b785c2989ead1f8dc7 to your computer and use it in GitHub Desktop.
Save ibrohimislam/345b087c69bd70b785c2989ead1f8dc7 to your computer and use it in GitHub Desktop.
Script untuk update APN dan auto-connect LTE di PL100
import requests
import re
import subprocess
import time
def login(session):
stok_response = session.get("http://169.254.0.1/cgi-bin/login.cgi?Command=getLoginStok", headers = {'Referer': 'http://169.254.0.1/'})
stok = re.findall(r"<login_stok>(.*?)</login_stok>", stok_response.text, flags=0)[0]
login_data = {'Command': 'setLOGINvalue', 'input_URN': 'admin', 'rand_PWD': 'admin'}
login_response = session.post("http://169.254.0.1/cgi-bin/login.cgi", data = login_data, headers = {'Referer': 'http://169.254.0.1/', 'X-Stok': stok})
print(login_response.text)
def get_status(session):
status_response = session.get('http://169.254.0.1/cgi-bin/status.cgi?Command=getLocalNetworkStatusASP', headers = {'Referer': 'http://169.254.0.1/'})
status = re.findall(r"<ConnectedStatusStr>(.*?)</ConnectedStatusStr>", status_response.text, flags=0)[0]
wan_ip = re.findall(r"<getWanIp>(.*?)</getWanIp>", status_response.text, flags=0)[0]
return status, wan_ip
def send_connect(session):
apn_list_response = session.get('http://169.254.0.1/cgi-bin/apnprofilelist.cgi?Command=GetAPNlist', headers = {'Referer': 'http://169.254.0.1/lte_apn_profile.html'})
profile_list = re.findall(r"<profile_list>(.*?)</profile_list>", apn_list_response.text, flags=0)[0]
print(profile_list)
if "smartfren4g" not in profile_list:
lte_apn_profile_page_response = session.get('http://169.254.0.1/lte_apn_profile.html', headers = {'Referer': 'http://169.254.0.1/'})
lte_apn_profile_page_stok = re.findall(r"<meta name=\"stok\" content=\"(.*?)\">", lte_apn_profile_page_response.text, flags=0)[0]
print(lte_apn_profile_page_stok)
apn_data = {'Command': 'APNSetSetting', 'profile_name': 'smartfren4g', 'APN': 'smartfren4g', 'user_name': 'smartfren', 'lte_apn_password': 'smartfren', 'apn_auth_type': '2', 'edit_set_type': 'Set'}
apn_set_response = session.post("http://169.254.0.1/cgi-bin/apnprofilelist.cgi", data = apn_data, headers = {'Referer': 'http://169.254.0.1/lte_apn_profile.html', 'X-Stok': lte_apn_profile_page_stok})
print(apn_set_response.text)
init_state_response = session.get('http://169.254.0.1/cgi-bin/internetsetting.cgi?Command=GetInitState', headers = {'Referer': 'http://169.254.0.1/lte_internet_setting.html'})
data_pdn = re.findall(r"<data_pdn>(.*?)</data_pdn>", init_state_response.text, flags=0)[0]
print(data_pdn)
if data_pdn != "2,smartfren4g,0":
lte_internet_setting_page_response = session.get('http://169.254.0.1/lte_internet_setting.html', headers = {'Referer': 'http://169.254.0.1/'})
lte_internet_setting_page_stok = re.findall(r"<meta name=\"stok\" content=\"(.*?)\">", lte_internet_setting_page_response.text, flags=0)[0]
print(lte_internet_setting_page_stok)
internet_setting_data = {'Command': 'PDNcfgSetting', 'connection_mode': '2', 'profile_data': 'smartfren4g', 'pdp_type': '0', 'voip_connection_mode': '2', 'profile_voip': 'auto', 'voip_pdp_type': '0'}
internet_setting_response = session.post("http://169.254.0.1/cgi-bin/internetsetting.cgi", data = internet_setting_data, headers = {'Referer': 'http://169.254.0.1/lte_internet_setting.html', 'X-Stok': lte_internet_setting_page_stok})
print(internet_setting_response.text)
lte_internet_setting_page_response = session.get('http://169.254.0.1/lte_internet_setting.html', headers = {'Referer': 'http://169.254.0.1/'})
lte_internet_setting_page_stok = re.findall(r"<meta name=\"stok\" content=\"(.*?)\">", lte_internet_setting_page_response.text, flags=0)[0]
print(lte_internet_setting_page_stok)
internet_connect_data = {'Command': 'DataManualConnect', 'lte_manual_dataconn': 'Connect', 'profile_data': 'smartfren4g', 'pdp_type': '0'}
connect_response = session.post("http://169.254.0.1/cgi-bin/internetsetting.cgi", data = internet_connect_data, headers = {'Referer': 'http://169.254.0.1/lte_internet_setting.html', 'X-Stok': lte_internet_setting_page_stok})
print(connect_response.text)
def configure_interface(wan_ip):
proc = subprocess.Popen("ip addr show modem.103 | grep 'inet\s' | awk '{print $2}'", stdout=subprocess.PIPE, shell=True)
(result, err) = proc.communicate()
current_ip = result.decode().strip()
if current_ip != f"{wan_ip}/32":
print(f"ip addr del {current_ip} dev modem.103")
proc = subprocess.Popen(f"ip addr del {current_ip} dev modem.103", stdout=subprocess.PIPE, shell=True)
(result, err) = proc.communicate()
print(result.decode().strip())
print(f"ip addr add {wan_ip} dev modem.103")
proc = subprocess.Popen(f"ip addr add {wan_ip} dev modem.103", stdout=subprocess.PIPE, shell=True)
(result, err) = proc.communicate()
print(result.decode().strip())
print("ip route add default dev modem.103")
proc = subprocess.Popen("ip route add default dev modem.103", stdout=subprocess.PIPE, shell=True)
(result, err) = proc.communicate()
print(result.decode().strip())
with requests.Session() as session:
login(session)
status, wan_ip = get_status(session)
print(status)
if status == "Disconnected":
send_connect(session)
for trial in range(10):
time.sleep(10)
status, wan_ip = get_status(session)
if status == "Disconnected":
continue
configure_interface(wan_ip)
break
if status == "Connected":
print(wan_ip)
configure_interface(wan_ip)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment